/* ---------- El portal público ----------
   Hoja propia, separada de la del área privada. Son dos cosas distintas: ésta se ve una
   vez, sin cuenta y desde cualquier lado; aquélla se mira ocho horas por día. Compartirlas
   obligaría a que cada regla sirva para las dos.

   El lenguaje visual, en cinco decisiones:

     · Una sola tipografía —Outfit—, con los titulares en peso alto y el interletrado
       cerrado. Limpia, geométrica y sin el aire acartonado de una serif institucional.
     · Superficies redondeadas sobre un fondo apenas gris: tarjetas de 28 px de radio,
       píldoras para todo lo que se aprieta y sombras largas y suaves en lugar de bordes
       marcados.
     · El verde de la corporación como único acento, y en grande donde manda: la portada,
       la franja de transparencia y cada estado activo.
     · Movimiento en todo lo que se toca. La curva tiene un rebote mínimo al final, que es
       lo que separa una interfaz que responde de una que se limita a cambiar de color.
     · Tema claro y oscuro, tamaño de letra, contraste alto, enlaces subrayados y quietud:
       cinco preferencias que viven en un solo lugar —el dock de abajo a la izquierda— y
       que el navegador recuerda.

   Índice
   1. Variables y base            9. Sesiones
   2. Utilidades y controles      9 bis. Las sesiones grabadas
   3. Animaciones (wow)          10. Mesa directiva
   4. Encabezado y menú          11. Transparencia
   5. Portada                    12. Pie
   6. Cifras                     13. Flotantes, aviso y 404
   7. Accesos y secciones        14. Páginas internas
   8. Noticias                   15. Tamaños de pantalla
                                 15 bis. El teléfono, diseñado como teléfono
                                 16. Accesibilidad: el dock y las preferencias
*/

/* ============================================================
   1. Variables y base
   ============================================================ */

:root{
	/* El verde de la corporación, en cinco pesos. Es el único acento del portal. */
	--verde: #0b6b4f;
	--verde-vivo: #12a06f;
	--verde-menta: #7fe3bb;
	--verde-hondo: #062a20;
	--verde-noche: #041c15;

	/* El verde lavado de los fondos chicos: el círculo del ícono, la fecha de la agenda,
	   la etiqueta del cargo. Es un token y no un color-mix() para que la página se vea
	   igual en un navegador que todavía no conoce esa función: son los fondos de media
	   interfaz, y sin ellos quedarían transparentes. */
	--verde-tenue: #e2f0eb;
	--gris-tenue: #e3e9e6;

	/* El único color del portal que no es verde. Se usa donde algo salió mal —un campo
	   mal llenado, una solicitud que no entró— y en el distintivo de una sesión en vivo.
	   Es un rojo apagado a propósito: avisa sin gritar. */
	--rojo: #d64545;

	/* El fondo del encabezado, que va translúcido para que el contenido se lea por
	   debajo. */
	--tope-fondo: rgba(233, 238, 235, .82);

	/* Las superficies. El fondo no es gris neutro: lleva una gota de verde, que es lo
	   que hace que el acento no se vea pegado encima. */
	--fondo: #e9eeeb;
	--tarjeta: #f2f6f4;
	--superficie: #fff;

	--tinta: #12211d;
	--tinta-2: #5f706a;

	--linea: rgba(6, 42, 32, .09);

	/* Sombras teñidas de verde y muy abiertas: separan la tarjeta del fondo sin
	   dibujarle un borde. */
	--sombra-1: 0 2px 10px rgba(6, 42, 32, .05);
	--sombra-2: 0 10px 30px rgba(6, 42, 32, .08);
	--sombra-3: 0 20px 50px rgba(6, 42, 32, .14);
	--sombra-verde: 0 15px 30px rgba(11, 107, 79, .3);

	--radio: 28px;
	--radio-2: 18px;
	--radio-3: 14px;

	/* Dos curvas. La primera tiene un rebote mínimo al final y es la de todo lo que se
	   toca; la segunda arranca rápido y frena largo, para lo que entra en pantalla. */
	--curva: cubic-bezier(.175, .885, .32, 1.275);
	--curva-2: cubic-bezier(.16, 1, .3, 1);

	--govco-alto: 32px;
	--govco-azul: #407bd4;
	--tope-alto: 120px;
	--ancho: 1240px;

	/* El aire de los costados. Es una variable y no un número suelto porque hay piezas que
	   necesitan salirse justo esa distancia para tocar el borde de la pantalla —la tira de
	   categorías del teléfono es una—, y cuando el valor estaba escrito dos veces, cambiar
	   el de un corte dejaba a la otra pieza desalineada por cuatro píxeles. */
	--aire: 24px;

	/* Cada cuánto pasa sola la portada. Está acá y no sólo en el script porque la barra
	   que se llena debajo del titular tiene que durar exactamente lo mismo. */
	--ritmo: 7s;
}

/* ---- El tema oscuro ----
   Lo pone el atributo data-theme en <html>: el botón flotante lo cambia y el navegador lo
   recuerda. El HTML lo escribe antes de pintar nada —hay un script de tres líneas en el
   <head>— para que la página no aparezca en claro y salte a oscuro un cuadro después.

   El verde sube de tono: el de la corporación, sobre un fondo casi negro, se apaga. */
[data-theme="dark"]{
	--verde: #2fc98f;
	--verde-vivo: #35d89a;
	--verde-tenue: rgba(47, 201, 143, .14);
	--gris-tenue: rgba(255, 255, 255, .08);

	/* Sobre el fondo casi negro, el rojo de arriba se apaga: sube de tono, igual que el verde. */
	--rojo: #e8746f;
	--tope-fondo: rgba(17, 22, 20, .82);

	--fondo: #111614;
	--tarjeta: #1a211e;
	--superficie: #202826;

	--tinta: #eaefec;
	--tinta-2: #9aa8a3;

	--linea: rgba(255, 255, 255, .1);

	--sombra-1: 0 2px 10px rgba(0, 0, 0, .3);
	--sombra-2: 0 10px 30px rgba(0, 0, 0, .4);
	--sombra-3: 0 20px 50px rgba(0, 0, 0, .5);
	--sombra-verde: 0 15px 30px rgba(47, 201, 143, .22);
}

*{ margin: 0; padding: 0; box-sizing: border-box; }

/* El "display" que el navegador le da a [hidden] lo pisa cualquier regla de clase, y
   el botón de volver arriba es un grid. Sin esto se queda a la vista desde el principio,
   que es justo cuando no sirve para nada. */
[hidden]{ display: none !important; }

html{
	scroll-behavior: smooth;
	scroll-padding-top: calc(var(--tope-alto) + 20px);
	/* El dock de accesibilidad mueve esto en tres escalones. Todo el sitio está medido en
	   rem justamente para que ese solo cambio agrande el portal entero sin romper una caja. */
	font-size: 100%;
	-webkit-text-size-adjust: 100%;
}

/* ---- El tamaño del texto ----
   Tres escalones y no un interruptor de sí o no: entre el 100 % y el 137,5 % hay dos
   paradas intermedias, y quien necesita letra grande casi nunca necesita justo el tope.
   El salto es de un octavo cada vez, que es el mínimo que se nota sin que la página dé un
   respingo. Por encima del 137,5 % el encabezado deja de entrar en un teléfono, así que
   ahí termina la escala: más allá está el zoom del navegador, que reacomoda otras cosas. */
html[data-texto="1"]{ font-size: 112.5%; }
html[data-texto="2"]{ font-size: 125%; }
html[data-texto="3"]{ font-size: 137.5%; }

body{
	font-family: Outfit, 'Segoe UI', Helvetica, Arial, sans-serif;
	font-size: 1rem;
	font-weight: 400;
	line-height: 1.65;
	color: var(--tinta-2);
	background: var(--fondo);
	overflow-x: hidden;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	transition: background-color .3s ease, color .3s ease;
}

img{ max-width: 100%; display: block; }

h1, h2, h3, h4{
	font-weight: 700;
	line-height: 1.15;
	letter-spacing: -.03em;
	color: var(--tinta);
}

/* La palabra que va en verde adentro de un titular. Se marca con <em> y no lleva
   cursiva: el color ya distingue. */
em{ font-style: normal; color: var(--verde); }

/* El ancho del contenido y el aire de los costados. El padding usa max() con las áreas
   seguras del sistema: en un teléfono con muesca, girado de lado, el sistema reserva unos
   cuarenta píxeles de un borde, y sin esto el texto queda debajo de la muesca. Donde no
   hay muesca, env() vale cero y manda el número de siempre. */
.contenedor{
	width: 100%;
	max-width: var(--ancho);
	margin: 0 auto;
	padding-left: max(var(--aire), env(safe-area-inset-left));
	padding-right: max(var(--aire), env(safe-area-inset-right));
}

/* ============================================================
   2. Utilidades y controles
   ============================================================ */

.visualmente-oculto{
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
	border: 0;
}

/* El salto al contenido vive fuera de la pantalla hasta que recibe el foco. Un portal
   público lo necesita: quien navega con teclado no tiene por qué recorrer el menú entero
   en cada página para llegar a lo que vino a leer. */
.saltar{
	position: fixed;
	top: -80px;
	left: 20px;
	z-index: 3000;
	padding: 12px 22px;
	font-size: .9rem;
	font-weight: 600;
	color: #fff;
	background: var(--verde);
	text-decoration: none;
	border-radius: 0 0 12px 12px;
	transition: top .25s var(--curva-2);
}

.saltar:focus{ top: 0; }

/* Un foco visible en todo el portal. El contorno que trae el navegador se pierde sobre
   tanto claro. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible{
	outline: 2px solid var(--verde);
	outline-offset: 3px;
}

/* ---- La etiqueta ----
   Versalita chica, muy espaciada y con un punto verde delante. */
.etiqueta{
	display: inline-flex;
	align-items: center;
	gap: 10px;
	font-size: .76rem;
	font-weight: 700;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: var(--verde);
}

.etiqueta::before{
	content: "";
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background: currentColor;
	flex: none;
}

.etiqueta.is-claro{ color: var(--verde-menta); }

/* ---- Los botones ----
   Píldora, peso alto y un salto de cinco píxeles al pasar por encima, con la sombra
   verde debajo. Es el gesto que se repite en todo lo que se aprieta. */
.boton{
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	padding: 16px 32px;
	font-family: inherit;
	font-size: .98rem;
	font-weight: 600;
	letter-spacing: -.01em;
	color: #fff;
	background: var(--verde);
	border: 2px solid var(--verde);
	border-radius: 999px;
	text-decoration: none;
	cursor: pointer;
	transition: transform .4s var(--curva), box-shadow .4s var(--curva), background-color .3s ease, color .3s ease, border-color .3s ease;
}

.boton:hover{
	transform: translateY(-5px);
	background: var(--verde-hondo);
	border-color: var(--verde-hondo);
	box-shadow: var(--sombra-verde);
}

.boton svg{
	width: 17px;
	height: 17px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	transition: transform .35s var(--curva);
}

.boton:hover svg{ transform: translateX(4px); }

.boton.is-linea{
	color: var(--tinta);
	background: transparent;
	border-color: var(--linea);
}

.boton.is-linea:hover{
	color: #fff;
	background: var(--verde);
	border-color: var(--verde);
}

/* Sobre las superficies verdes —la portada y la franja— se invierten: el lleno va blanco
   y el de línea se dibuja con el borde. */
.is-oscuro .boton{
	color: var(--verde-hondo);
	background: #fff;
	border-color: #fff;
}

.is-oscuro .boton:hover{
	color: var(--verde-hondo);
	background: var(--verde-menta);
	border-color: var(--verde-menta);
	box-shadow: 0 15px 30px rgba(0, 0, 0, .35);
}

.is-oscuro .boton.is-linea{
	color: #fff;
	background: transparent;
	border-color: rgba(255, 255, 255, .45);
}

.is-oscuro .boton.is-linea:hover{ color: var(--verde-hondo); background: #fff; border-color: #fff; }

/* ---- El enlace de texto ----
   La raya crece de izquierda a derecha en lugar de aparecer de golpe. */
.enlace{
	position: relative;
	align-self: flex-start;
	font-size: .92rem;
	font-weight: 600;
	color: var(--verde);
	text-decoration: none;
	padding-bottom: 4px;
	white-space: nowrap;
}

.enlace::after{
	content: "";
	position: absolute;
	left: 0;
	bottom: 0;
	width: 100%;
	height: 2px;
	background: currentColor;
	border-radius: 2px;
	transform: scaleX(0);
	transform-origin: left;
	transition: transform .4s var(--curva-2);
}

.enlace:hover::after{ transform: scaleX(1); }
.enlace.is-corto{ font-size: .84rem; }

/* ---- La tarjeta ----
   La pieza que arma casi todo el portal: superficie clara, radio grande, borde apenas
   insinuado y un salto con sombra al pasar por encima. */
.tarjeta{
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: var(--radio);
	box-shadow: var(--sombra-1);
	transition: transform .4s var(--curva), box-shadow .4s var(--curva), background-color .3s ease, border-color .3s ease;
}

.tarjeta.is-viva:hover{ transform: translateY(-10px); box-shadow: var(--sombra-3); }

/* ============================================================
   3. Animaciones
   ============================================================ */

/* La biblioteca de entradas, en la línea de animate.css, y el motor que las dispara es
   el de WOW: un elemento con class="wow fadeInUp" queda escondido hasta que llega a la
   pantalla, y ahí recibe la clase "animated" y corre su animación una sola vez.
   data-wow-delay, data-wow-duration, data-wow-offset y data-wow-iteration funcionan igual
   que en la biblioteca original. El motor está en script.js.

   Lo que esconde el bloque es un style= en línea que escribe el JavaScript, nunca esta
   hoja. Es a propósito: si ese archivo no llega a correr —falla, tarda, está bloqueado—
   la página se ve entera y quieta, que es lo único aceptable en un portal público. Un
   opacity: 0 escrito acá dejaría media página en blanco para siempre. */

.animated{
	animation-duration: .8s;
	animation-fill-mode: both;
}

@keyframes fadeIn{
	from{ opacity: 0; }
	to{ opacity: 1; }
}

@keyframes fadeInUp{
	from{ opacity: 0; transform: translate3d(0, 28px, 0); }
	to{ opacity: 1; transform: none; }
}

@keyframes fadeInLeft{
	from{ opacity: 0; transform: translate3d(-32px, 0, 0); }
	to{ opacity: 1; transform: none; }
}

@keyframes fadeInRight{
	from{ opacity: 0; transform: translate3d(32px, 0, 0); }
	to{ opacity: 1; transform: none; }
}

@keyframes zoomIn{
	from{ opacity: 0; transform: scale3d(.92, .92, .92); }
	to{ opacity: 1; transform: none; }
}

.fadeIn{ animation-name: fadeIn; }
.fadeInUp{ animation-name: fadeInUp; }
.fadeInLeft{ animation-name: fadeInLeft; }
.fadeInRight{ animation-name: fadeInRight; }
.zoomIn{ animation-name: zoomIn; }

/* Para lo que ya está a la vista y sólo tiene que latir: el punto de "en sesión". */
@keyframes latido{
	0%, 100%{ opacity: 1; }
	50%{ opacity: .2; }
}

/* ---- Menos movimiento, no menos portal ----

   Con la preferencia activa se apaga todo lo que se desplaza, se acerca o late —el
   movimiento es lo que marea, y para eso existe la preferencia—, pero los bloques siguen
   entrando con un fundido corto de opacidad, que no desplaza nada y que la norma no
   objeta.

   No es un caso de borde: Windows apaga los efectos de animación él solo en cuanto entra
   el ahorro de energía, así que "menos movimiento" es también lo que pide cualquier
   visitante con la batería baja. Dejar media página estática por eso sería de más. */
@media (prefers-reduced-motion: reduce){
	html{ scroll-behavior: auto; }

	.animated,
	.portada-slide.is-activa .portada-sello,
	.portada-slide.is-activa .portada-titulo,
	.portada-slide.is-activa .portada-texto,
	.portada-slide.is-activa .portada-botones,
	.arriba{
		animation-name: fadeIn !important;
		animation-duration: .5s !important;
		animation-timing-function: ease !important;
	}

	.portada-aurora span,
	.portada-foto.is-activa,
	.vivo-estado.is-vivo::before,
	.video-vivo::before,
	.portada-guia span{
		animation: none !important;
	}

	.portada-punto.is-activo::after{ animation: none !important; transform: scaleX(1); }

	/* Y nada salta al pasar por encima: los estados se siguen viendo, con el color y la
	   sombra, pero sin desplazamiento. */
	.boton:hover,
	.tarjeta.is-viva:hover,
	.atajo:hover,
	.social a:hover,
	.flotante:hover,
	.arriba:hover{ transform: none; }
}

/* ============================================================
   4. Encabezado y menú
   ============================================================ */

/* Fijo, translúcido y con el fondo desenfocado por detrás: el contenido pasa por debajo
   y se lee a través. La altura no cambia al desplazar; lo único que se mueve es la línea
   de progreso del filo de abajo.

   El desenfoque va en un ::before y no en el encabezado, y eso es a propósito: un
   backdrop-filter —como cualquier transform o filter— convierte al elemento en el bloque
   contenedor de sus descendientes position: fixed, y el panel del menú del teléfono es
   uno. Puesto en el encabezado, el panel quedaba recortado adentro de sus ochenta y ocho
   píxeles en lugar de ocupar la pantalla. En un pseudo-elemento, el efecto es el mismo y
   el panel se mide contra la ventana. */
/* El encabezado va por encima del velo del menú (1100) y no por debajo. El panel del
   teléfono vive adentro de este <header>, y un position: fixed con z-index arma un
   contexto de apilamiento: el 1200 que declara el panel sólo compite contra sus hermanos
   de adentro, nunca contra el velo, que cuelga del <body>. Con el encabezado en 1000 el
   velo le caía encima al panel entero —desenfocándolo y oscureciéndolo junto con la
   página que debía tapar—. Arriba del velo, el panel se lee nítido y el botón que lo
   abrió queda a la vista para cerrarlo. */
/* La barra de GOV.CO va arriba de todo y se queda en la página: al desplazar se va con el
   contenido y el encabezado sube a ocupar su lugar. `--govco-resto` es cuánto de ella sigue
   a la vista, y lo escribe script.js en cada cuadro; sin JavaScript vale el alto entero.
   `--tope-alto` sigue midiendo las dos juntas, que es lo que tapa la portada arriba de
   todo, así que los rellenos que se calculan con él no cambian.

   Sólo con la barra delante (`.govco ~ .tope`): el 404 no la lleva, y ahí el encabezado
   ocupa desde arriba el alto entero. */
.tope{
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	z-index: 1200;
	height: var(--tope-alto);
	display: flex;
	flex-direction: column;
	align-items: stretch;
	border-bottom: 1px solid transparent;
	transition: height .4s var(--curva-2), border-color .3s ease;
}

.govco ~ .tope{
	top: var(--govco-resto, var(--govco-alto));
	height: calc(var(--tope-alto) - var(--govco-alto));
}

.govco{
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	z-index: 1050;
	display: flex;
	align-items: center;
	height: var(--govco-alto);
	background: var(--govco-azul);
}

.govco-enlace{
	display: inline-flex;
	align-items: center;
	text-decoration: none;
}

.govco-marca{
	display: block;
	width: 112px;
	height: 26px;
	background: url("img/govco-barra.jpg") -112px -4px no-repeat;
}

.tope-caja{ flex: 1; min-height: 0; }

.tope::before{
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background: var(--tope-fondo);
	backdrop-filter: blur(20px);
	-webkit-backdrop-filter: blur(20px);
	transition: background-color .3s ease;
}

/* Apenas se desplaza, el encabezado se afirma: aparece su línea de abajo y la sombra
   corta. Arriba de todo no lleva ninguna de las dos, para que la portada empiece limpia. */
.tope.is-corto{
	border-bottom-color: var(--linea);
	box-shadow: var(--sombra-1);
}

.tope-caja{
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
	width: 100%;
}

/* ---- Cuánto se leyó ---- */

.tope-progreso{
	position: absolute;
	left: 0;
	right: 0;
	bottom: -1px;
	height: 3px;
	pointer-events: none;
}

.tope-progreso span{
	display: block;
	height: 100%;
	width: 100%;
	background: linear-gradient(90deg, var(--verde), var(--verde-vivo));
	/* Se dibuja entera y se estira con scaleX: así el navegador no tiene que volver a
	   calcular la caja en cada píxel de desplazamiento. */
	transform: scaleX(0);
	transform-origin: left;
}

/* ---- La marca ---- */

.marca{
	display: inline-flex;
	align-items: center;
	gap: 14px;
	text-decoration: none;
	flex: none;
	min-width: 0;
}

.marca-sello{ flex: none; display: flex; align-items: center; }

/* El escudo es un PNG con fondo transparente y proporción fija: se ata la altura y el
   ancho se acomoda solo, que es lo que mantiene la firma sin deformar. */
.marca-img{
	height: 38px;
	width: auto;
	display: block;
	flex: none;
	transition: height .4s var(--curva-2);
}

.marca-img.is-compacto{ display: none; }

.marca-texto{
	display: flex;
	flex-direction: column;
	line-height: 1.15;
	min-width: 0;
}

.marca-nombre{
	font-size: 1rem;
	font-weight: 800;
	letter-spacing: -.04em;
	color: var(--tinta);
	white-space: nowrap;
}

.marca-bajada{
	font-size: .7rem;
	font-weight: 600;
	letter-spacing: .18em;
	text-transform: uppercase;
	color: var(--verde);
}

/* ---- El menú ---- */

/* La fila del encabezado —firma, siete secciones y los tres controles— vive dentro de la
   misma columna de 1240 px que el resto de la página, y ahí caben 1192 px de contenido.
   Ese número es el techo: la columna no crece por más ancho que tenga el monitor, así que
   si la fila se pasa, se pasa en todos los tamaños y la firma queda alineada con el texto
   mientras el botón de la derecha se sale por el borde.

   Medido con las siete secciones actuales: firma 286 + menú 665 + controles 171 + dos
   huecos de 24 = 1170. Quedan 22 px de margen. Por eso los tamaños de acá están medidos y
   no elegidos: cuatro píxeles más de aire en cada hueco del menú y la fila ya no cierra.
   Si mañana se agrega una sección más, hay que volver a medir —o bajar el corte del
   panel—, no confiar en que entre. */
.nav{
	display: flex;
	align-items: center;
	gap: 15px;
	margin-left: auto;
}

.nav-link{
	position: relative;
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 6px 0;
	font-family: inherit;
	font-size: .87rem;
	font-weight: 600;
	color: var(--tinta);
	background: none;
	border: 0;
	text-decoration: none;
	cursor: pointer;
	white-space: nowrap;
	transition: color .3s ease;
}

.nav-link::after{
	content: "";
	position: absolute;
	left: 0;
	bottom: 0;
	width: 100%;
	height: 2px;
	border-radius: 2px;
	background: var(--verde);
	transform: scaleX(0);
	transform-origin: left;
	transition: transform .4s var(--curva-2);
}

.nav-link:hover{ color: var(--verde); }
.nav-link:hover::after{ transform: scaleX(1); }

.nav-link.is-activa{ color: var(--verde); }
.nav-link.is-activa::after{ transform: scaleX(1); }

.nav-flecha{
	width: 14px;
	height: 14px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	transition: transform .35s var(--curva-2);
}

.nav-grupo{ position: relative; }

.nav-grupo:hover .nav-flecha,
.nav-grupo.is-abierto .nav-flecha{ transform: rotate(180deg); }

.nav-caja{
	position: absolute;
	top: calc(100% + 18px);
	left: -14px;
	min-width: 250px;
	padding: 12px;
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: var(--radio-2);
	box-shadow: var(--sombra-2);

	/* Escondido con opacidad y no con display:none para que la transición tenga algo que
	   animar. pointer-events lo saca del camino mientras está cerrado. */
	opacity: 0;
	visibility: hidden;
	transform: translateY(-10px);
	pointer-events: none;
	transition: opacity .28s var(--curva-2), transform .28s var(--curva-2), visibility .28s;
}

/* El puente invisible entre el enlace y el panel: sin él, el panel se cierra en el hueco
   de dieciocho píxeles que hay entre los dos. */
.nav-grupo::after{
	content: "";
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
	height: 20px;
}

.nav-grupo:hover .nav-caja,
.nav-grupo.is-abierto .nav-caja,
.nav-caja:focus-within{
	opacity: 1;
	visibility: visible;
	transform: none;
	pointer-events: auto;
}

.nav-caja a{
	display: block;
	padding: 10px 14px;
	font-size: .92rem;
	font-weight: 500;
	color: var(--tinta-2);
	text-decoration: none;
	border-radius: 10px;
	transition: background-color .22s ease, color .22s ease, transform .3s var(--curva-2);
}

.nav-caja a:hover{
	background: var(--verde-tenue);
	color: var(--verde);
	transform: translateX(5px);
}

/* ---- Los controles de la derecha ---- */

.tope-acciones{
	display: flex;
	align-items: center;
	gap: 10px;
	flex: none;
}

/* El botón redondo: el de tamaño de texto, el de tema en pantallas chicas y el del menú.
   Todos miden 46 px, que es lo que pide un objetivo táctil. */
.redondo{
	display: grid;
	place-items: center;
	width: 44px;
	height: 44px;
	font-family: inherit;
	font-size: .8rem;
	font-weight: 700;
	color: var(--tinta);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: 50%;
	cursor: pointer;
	transition: transform .35s var(--curva), color .3s ease, background-color .3s ease, border-color .3s ease;
}

.redondo:hover{ transform: translateY(-3px); color: var(--verde); border-color: var(--verde); }

.redondo svg{
	width: 19px;
	height: 19px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
}

/* La entrada al sistema interno: el único enlace del encabezado que no lleva a una
   página pública, así que se ve distinto. */
.nav-entrar{
	display: inline-flex;
	align-items: center;
	gap: 10px;
	padding: 12px 20px;
	font-size: .9rem;
	font-weight: 600;
	color: #fff;
	background: var(--verde);
	border: 0;
	border-radius: 999px;
	text-decoration: none;
	white-space: nowrap;
	transition: transform .4s var(--curva), box-shadow .4s var(--curva), background-color .3s ease;
}

.nav-entrar:hover{ transform: translateY(-4px); background: var(--verde-hondo); box-shadow: var(--sombra-verde); }

.nav-entrar svg{
	width: 16px;
	height: 16px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	transition: transform .35s var(--curva);
}

.nav-entrar:hover svg{ transform: translateX(4px); }

/* El velo que cubre la página detrás del panel del menú. Lo arma script.js, y arriba del
   ancho del panel no tiene nada que hacer. */
.nav-velo{ display: none; }

/* ---- El botón del menú ----
   Dos rayas en lugar de tres, y al abrir se cruzan. Menos dibujo para el mismo gesto. */
.nav-toggle{
	display: none;
	flex-direction: column;
	justify-content: center;
	gap: 6px;
	padding: 0 12px;
}

.nav-toggle span{
	display: block;
	width: 20px;
	height: 2px;
	background: currentColor;
	border-radius: 2px;
	transition: transform .35s var(--curva-2);
}

.nav-toggle.is-abierto span:nth-child(1){ transform: translateY(4px) rotate(45deg); }
.nav-toggle.is-abierto span:nth-child(2){ transform: translateY(-4px) rotate(-45deg); }

/* ============================================================
   5. Portada
   ============================================================ */

/* Pantalla completa, la fotografía a sangre y encima un velo verde: el de la corporación,
   no un gris. Debajo del velo se mueven tres manchas de color —la aurora— y la fotografía
   se acerca muy despacio. Los tres destacados se turnan adentro: cambia el texto y cambia
   la foto, y la composición se queda quieta. */
.portada{
	position: relative;
	display: flex;
	align-items: center;
	min-height: 100vh;
	min-height: 100svh;
	padding: calc(var(--tope-alto) + 40px) 0 150px;
	overflow: hidden;
	background: var(--verde-noche);
	color: rgba(255, 255, 255, .8);
}

/* ---- Las fotografías ----
   Se cruzan con opacidad adentro de la misma capa. Van nombradas en --foto desde el HTML,
   una por destacado. */
.portada-fotos{
	position: absolute;
	inset: 0;
	overflow: hidden;
}

.portada-foto{
	position: absolute;
	inset: 0;
	background-image: var(--foto);
	background-size: cover;
	background-position: var(--foco, center);
	opacity: 0;
	transition: opacity 1s ease;
}

.portada-foto.is-activa{
	opacity: 1;
	/* El acercamiento dura más que el turno (RITMO son 7 s en script.js): así el
	   movimiento nunca llega al final ni se ve el salto de vuelta al empezar. */
	animation: acercarFoto 13s ease-out forwards;
}

@keyframes acercarFoto{
	from{ transform: scale(1.02); }
	to{ transform: scale(1.12); }
}

/* El velo. Cargado a la izquierda, que es donde cae el texto, y más abierto a la derecha
   para que la fotografía se siga viendo: sin él, un titular blanco sobre una foto clara es
   ilegible justo en la primera pantalla del portal. */
.portada-velo{
	position: absolute;
	inset: 0;
	background:
		linear-gradient(100deg, rgba(4, 28, 21, .95) 0%, rgba(6, 42, 32, .88) 40%, rgba(6, 42, 32, .6) 72%, rgba(6, 42, 32, .45) 100%),
		linear-gradient(180deg, rgba(4, 28, 21, .5) 0%, transparent 35%);
}

/* ---- La aurora ----
   Tres manchas de verde que se cruzan despacio. Son degradados radiales y no cajas con
   filter: blur(). El desenfoque de un rectángulo de seiscientos píxeles hay que
   recalcularlo en cada cuadro de la animación, y en una máquina sin aceleración por
   hardware —o en un teléfono de gama baja, que es la mitad de las visitas de un portal
   público— eso se lleva la página entera por delante. Un degradado que termina en
   transparente ya nace suave: mismo dibujo, y lo único que se mueve es un transform. */
.portada-aurora{
	position: absolute;
	inset: 0;
	overflow: hidden;
	pointer-events: none;
}

.portada-aurora span{
	position: absolute;
	display: block;
	border-radius: 50%;
	will-change: transform;
	/* Arranca en pausa y la suelta el script cuando la portada está a la vista. Una
	   animación de tres capas del tamaño de la pantalla corriendo mientras alguien lee el
	   pie no se ve —la portada quedó ocho pantallas más arriba— y sigue costando batería y
	   cuadros en cualquier equipo sin aceleración por hardware. */
	animation-play-state: paused;
}

.portada.is-viendo .portada-aurora span{ animation-play-state: running; }

.portada-aurora span:nth-child(1){
	width: 62vw;
	height: 62vw;
	top: -26vw;
	left: -18vw;
	background: radial-gradient(circle closest-side, rgba(18, 160, 111, .5), rgba(18, 160, 111, .16) 55%, transparent 78%);
	animation: auroraA 19s ease-in-out infinite alternate;
}

.portada-aurora span:nth-child(2){
	width: 54vw;
	height: 54vw;
	bottom: -28vw;
	left: 16vw;
	background: radial-gradient(circle closest-side, rgba(11, 107, 79, .62), rgba(11, 107, 79, .2) 55%, transparent 78%);
	animation: auroraB 23s ease-in-out infinite alternate;
}

.portada-aurora span:nth-child(3){
	width: 46vw;
	height: 46vw;
	top: -16vw;
	right: -14vw;
	background: radial-gradient(circle closest-side, rgba(127, 227, 187, .2), rgba(127, 227, 187, .06) 55%, transparent 78%);
	animation: auroraC 27s ease-in-out infinite alternate;
}

@keyframes auroraA{
	from{ transform: translate3d(0, 0, 0) scale(1); }
	to{ transform: translate3d(9vw, 7vw, 0) scale(1.16); }
}

@keyframes auroraB{
	from{ transform: translate3d(0, 0, 0) scale(1.08); }
	to{ transform: translate3d(-11vw, -6vw, 0) scale(.94); }
}

@keyframes auroraC{
	from{ transform: translate3d(0, 0, 0) scale(.96); }
	to{ transform: translate3d(-7vw, 9vw, 0) scale(1.2); }
}

.portada-caja{
	position: relative;
	z-index: 2;
	width: 100%;
}

/* Los destacados se apilan en la misma celda de la grilla y se cruzan con opacidad.
   Apilados y no en fila porque así la altura la manda el más largo: con un carrusel que
   se desplaza de costado, cambiar de destacado movería el resto de la página. */
.portada-pista{ display: grid; }

.portada-slide{
	grid-area: 1 / 1;
	max-width: 800px;
	opacity: 0;
	visibility: hidden;
	transition: opacity .5s ease;
}

.portada-slide.is-activa{ opacity: 1; visibility: visible; }

/* La entrada del contenido: sello, titular, bajada y botones suben escalonados cada vez
   que el destacado toma su turno. Es lo que hace que un cambio se lea como algo que pasa
   y no como un texto que se reemplazó. */
.portada-slide.is-activa .portada-sello,
.portada-slide.is-activa .portada-titulo,
.portada-slide.is-activa .portada-texto,
.portada-slide.is-activa .portada-botones{
	animation: fadeInUp .75s var(--curva-2) backwards;
}

.portada-slide.is-activa .portada-sello{ animation-delay: .05s; }
.portada-slide.is-activa .portada-titulo{ animation-delay: .14s; }
.portada-slide.is-activa .portada-texto{ animation-delay: .24s; }
.portada-slide.is-activa .portada-botones{ animation-delay: .34s; }

/* El sello: una píldora de vidrio sobre la fotografía. */
.portada-sello{
	display: inline-flex;
	align-items: center;
	gap: 10px;
	padding: 9px 18px;
	font-size: .78rem;
	font-weight: 600;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: #fff;
	background: rgba(255, 255, 255, .12);
	border: 1px solid rgba(255, 255, 255, .22);
	border-radius: 999px;
	backdrop-filter: blur(8px);
	-webkit-backdrop-filter: blur(8px);
}

.portada-sello::before{
	content: "";
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background: var(--verde-menta);
	flex: none;
}

.portada-titulo{
	margin-top: 26px;
	font-size: clamp(2.4rem, 5.6vw, 4.4rem);
	font-weight: 800;
	line-height: 1.05;
	letter-spacing: -.045em;
	color: #fff;
	text-wrap: balance;
}

.portada-titulo em{ color: var(--verde-menta); }

.portada-texto{
	max-width: 58ch;
	margin-top: 22px;
	font-size: 1.12rem;
	font-weight: 300;
	color: rgba(255, 255, 255, .88);
}

.portada-botones{
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 16px;
	margin-top: 38px;
}

/* ---- Los controles ----
   Debajo del titular: las barritas que cuentan el turno del destacado que está a la vista
   y las dos flechas. */
.portada-barra{
	position: relative;
	z-index: 2;
	display: flex;
	align-items: center;
	gap: 22px;
	margin-top: 52px;
}

.portada-puntos{
	display: flex;
	align-items: center;
	gap: 10px;
}

/* El punto que se ve son 3 px de alto, pero el botón mide 26: en un teléfono nadie le
   acierta a una raya de tres píxeles con el pulgar. La raya se dibuja en un ::before y el
   resto del botón es área de toque transparente. */
/* El botón mide 44 px de alto aunque la raya visible tenga 3: el área de toque es la caja
   entera y el dibujo va en un ::before centrado. Con la pantalla apagada de detalles, lo
   que decide si se acierta con el pulgar es el rectángulo invisible, no la raya. */
.portada-punto{
	position: relative;
	width: 58px;
	height: 44px;
	padding: 0;
	background: none;
	border: 0;
	cursor: pointer;
}

.portada-punto::before,
.portada-punto::after{
	content: "";
	position: absolute;
	left: 0;
	top: 50%;
	width: 100%;
	height: 3px;
	margin-top: -1.5px;
	border-radius: 3px;
}

.portada-punto::before{ background: rgba(255, 255, 255, .25); }

/* La segunda raya es el reloj: se llena en los mismos siete segundos que dura el turno, y
   se detiene con el puntero encima o con la pestaña al fondo, igual que el carrusel. Es la
   única forma honesta de decir "esto se va a mover solo dentro de un rato". */
.portada-punto::after{
	background: var(--verde-menta);
	transform: scaleX(0);
	transform-origin: left;
}

.portada-punto:hover::before{ background: rgba(255, 255, 255, .5); }

.portada-punto.is-activo::after{ animation: llenarPunto var(--ritmo) linear forwards; }
.portada-puntos.is-pausa .portada-punto.is-activo::after{ animation-play-state: paused; }

/* Sin avance automático —la preferencia de menos movimiento— la barra se queda llena:
   marca cuál está a la vista y no promete un cambio que no viene. */
.portada-puntos.is-quieto .portada-punto.is-activo::after{ animation: none; transform: scaleX(1); }

@keyframes llenarPunto{
	from{ transform: scaleX(0); }
	to{ transform: scaleX(1); }
}

.portada-punto:focus-visible{ outline-color: var(--verde-menta); }

.portada-flechas{
	display: flex;
	align-items: center;
	gap: 10px;
}

.portada-flecha{
	display: grid;
	place-items: center;
	width: 48px;
	height: 48px;
	color: #fff;
	background: rgba(255, 255, 255, .1);
	border: 1px solid rgba(255, 255, 255, .25);
	border-radius: 50%;
	cursor: pointer;
	backdrop-filter: blur(8px);
	-webkit-backdrop-filter: blur(8px);
	transition: transform .35s var(--curva), background-color .3s ease, border-color .3s ease;
}

.portada-flecha:hover{ transform: translateY(-3px); background: rgba(255, 255, 255, .2); border-color: rgba(255, 255, 255, .55); }
.portada-flecha:focus-visible{ outline-color: var(--verde-menta); }

.portada-flecha svg{
	width: 18px;
	height: 18px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
}

/* ---- La guía de desplazamiento ----
   Una línea vertical con un punto que baja en bucle, pegada al filo inferior. Dice que
   abajo sigue habiendo página, que es lo que una portada a pantalla completa no deja ver. */
/* Va por encima del borde donde empieza la tarjeta de cifras —que sube ochenta píxeles
   sobre la portada—: apoyada más abajo, las dos se superponen. */
.portada-guia{
	position: absolute;
	left: 50%;
	bottom: 100px;
	z-index: 2;
	width: 1px;
	height: 54px;
	overflow: hidden;
	background: rgba(255, 255, 255, .2);
	transform: translateX(-50%);
}

.portada-guia span{
	display: block;
	width: 100%;
	height: 18px;
	background: var(--verde-menta);
	animation: bajarGuia 2.4s ease-in-out infinite;
}

@keyframes bajarGuia{
	0%{ transform: translateY(-20px); }
	100%{ transform: translateY(54px); }
}

/* ============================================================
   6. Cifras
   ============================================================ */

/* Cuatro números en una tarjeta que pisa el borde de la portada. Se cuentan solos la
   primera vez que entran a la vista; el motor está en script.js. */
.cifras{
	position: relative;
	z-index: 3;
	margin-top: -80px;
}

.cifras-caja{
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 8px;
	padding: 34px 20px;
	border-radius: var(--radio);
	background: var(--superficie);
	border: 1px solid var(--linea);
	box-shadow: var(--sombra-2);
}

.cifra{
	position: relative;
	padding: 6px 24px;
	text-align: center;
}

.cifra + .cifra::before{
	content: "";
	position: absolute;
	left: 0;
	top: 8px;
	bottom: 8px;
	width: 1px;
	background: var(--linea);
}

.cifra-num{
	display: block;
	font-size: clamp(2rem, 3.2vw, 2.8rem);
	font-weight: 800;
	line-height: 1.1;
	letter-spacing: -.045em;
	font-variant-numeric: tabular-nums;
	color: var(--verde);
}

.cifra-num small{ font-size: .55em; font-weight: 700; }

.cifra-pie{
	display: block;
	margin-top: 6px;
	font-size: .82rem;
	font-weight: 500;
	line-height: 1.45;
	color: var(--tinta-2);
}

/* ============================================================
   7. Accesos rápidos y secciones
   ============================================================ */

.seccion{ padding: clamp(64px, 8vw, 100px) 0; }
.seccion.is-tenue{ background: var(--tarjeta); }

/* Dos secciones seguidas sobre el mismo fondo no son dos secciones: son una, partida por
   el constructor. Éste cierra la columna de prosa y abre otra cada vez que aparece un
   bloque ancho —una rejilla de diputados, un mapa—, así que /diputados/ llegaba a tener
   tres `.seccion` encadenadas y, entre una y otra, doscientos píxeles de nada.

   El aire de arriba se va cuando la de antes ya lo puso; se queda donde el fondo cambia,
   que es el único caso en que las dos franjas se leen como piezas distintas.

   Va colgado de `.portadilla ~`, o sea sólo en las páginas internas: la portada apila sus
   siete secciones a propósito y cada una es de verdad una parada distinta. */
.portadilla ~ .seccion + .seccion:not(.is-tenue){ padding-top: 0; }
.portadilla ~ .seccion.is-tenue + .seccion:not(.is-tenue){ padding-top: clamp(64px, 8vw, 100px); }

/* La cabecera de sección: el título a la izquierda con su bajada, y a la derecha lo que
   corresponda —un enlace o los filtros—, alineados por abajo. */
.cabeza{
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 24px 40px;
	margin-bottom: clamp(32px, 4vw, 48px);
}

.cabeza-titulo{ max-width: 58ch; }

/* El enlace de la derecha se apoya en la base del bloque de título y no en su borde de
   arriba: alineado con la bajada, se lee como parte de la misma cabecera. */
.cabeza > .enlace{ align-self: flex-end; margin-bottom: 4px; }

.titulo{
	margin-top: 14px;
	font-size: clamp(1.9rem, 3.4vw, 2.7rem);
	font-weight: 800;
	letter-spacing: -.04em;
}

.bajada{
	margin-top: 10px;
	font-size: .98rem;
	color: var(--tinta-2);
	max-width: 52ch;
}

/* ---- Accesos rápidos ----
   Los cuatro trámites que la gente viene a hacer. Van antes que las noticias a propósito:
   quien entra a buscar una ordenanza no debería tener que pasar por lo que publicamos
   nosotros para encontrarla. */
.atajos{ padding-top: clamp(56px, 7vw, 88px); }

.atajos-rejilla{
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: 24px;
}

.atajo{
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 30px 28px 32px;
	text-decoration: none;
	overflow: hidden;
	position: relative;
}

.atajo:hover{ transform: translateY(-10px); box-shadow: var(--sombra-3); }

/* El ícono en su círculo verde claro, que se llena al pasar por encima. */
.atajo-icono{
	display: grid;
	place-items: center;
	width: 54px;
	height: 54px;
	margin-bottom: 4px;
	color: var(--verde);
	background: var(--verde-tenue);
	border-radius: 18px;
	transition: transform .45s var(--curva), background-color .35s ease, color .35s ease;
}

.atajo-icono svg{
	width: 24px;
	height: 24px;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.7;
	stroke-linecap: round;
	stroke-linejoin: round;
}

.atajo:hover .atajo-icono{ color: #fff; background: var(--verde); transform: rotate(-6deg) scale(1.06); }

.atajo-titulo{
	font-size: 1.24rem;
	font-weight: 700;
	letter-spacing: -.03em;
	color: var(--tinta);
}

.atajo-texto{
	font-size: .88rem;
	line-height: 1.5;
	color: var(--tinta-2);
}

.atajo-mas{
	display: inline-flex;
	align-items: center;
	gap: 8px;
	margin-top: auto;
	padding-top: 14px;
	font-size: .85rem;
	font-weight: 600;
	color: var(--verde);
}

.atajo-mas svg{
	width: 16px;
	height: 16px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	transition: transform .4s var(--curva);
}

.atajo:hover .atajo-mas svg{ transform: translateX(6px); }

/* ---- Los filtros ----
   Píldoras que encienden en verde. Filtran las noticias sin recargar la página; el que
   está puesto se ve y los demás esperan. */
.filtros{
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
}

.filtro{
	padding: 11px 22px;
	font-family: inherit;
	font-size: .9rem;
	font-weight: 600;
	color: var(--tinta);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: 999px;
	cursor: pointer;
	white-space: nowrap;
	transition: transform .35s var(--curva), color .3s ease, background-color .3s ease, border-color .3s ease;
}

.filtro:hover{ transform: translateY(-3px); color: var(--verde); border-color: var(--verde); }

.filtro.is-activo{
	color: #fff;
	background: var(--verde);
	border-color: var(--verde);
}

/* ============================================================
   8. Noticias
   ============================================================ */

.noticias-rejilla{
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 24px;
}

/* Al cambiar de filtro, lo que queda vuelve a entrar. Sin esto las tarjetas aparecen y
   desaparecen de golpe y no se entiende qué pasó.

   Va sobre la clase del filtro y no sobre .noticia: el mismo filtro ordena las noticias
   por sección y los diputados por bancada, y la tarjeta es distinta en cada caso. */
.is-entrando{ animation: fadeInUp .45s var(--curva-2) both; }
.noticia[hidden],
.miembro[hidden]{ display: none; }

.noticia-liga{
	display: flex;
	flex-direction: column;
	height: 100%;
	text-decoration: none;
	overflow: hidden;
	border-radius: var(--radio);
}

.noticia-foto{
	position: relative;
	display: block;
	aspect-ratio: 16 / 10;
	overflow: hidden;
	background-color: var(--verde-hondo);
	background-image: var(--foto);
	background-size: cover;
	background-position: center;
	transition: transform .6s var(--curva-2);
}

.noticia:hover .noticia-foto{ transform: scale(1.05); }

/* La estampilla de la sección, en vidrio sobre la fotografía. */
.noticia-marca{
	position: absolute;
	top: 16px;
	left: 16px;
	padding: 7px 15px;
	font-size: .74rem;
	font-weight: 700;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: var(--verde-hondo);
	background: rgba(255, 255, 255, .92);
	border-radius: 999px;
	box-shadow: var(--sombra-1);
}

.noticia-cuerpo{
	display: flex;
	flex-direction: column;
	gap: 10px;
	flex: 1;
	padding: 24px 26px 26px;
}

.noticia-fecha{
	font-size: .8rem;
	font-weight: 600;
	color: var(--tinta-2);
}

.noticia-titulo{
	font-size: 1.22rem;
	font-weight: 700;
	line-height: 1.3;
	letter-spacing: -.03em;
	color: var(--tinta);
	text-wrap: pretty;
	transition: color .25s ease;
}

.noticia:hover .noticia-titulo{ color: var(--verde); }

.noticia-texto{
	font-size: .9rem;
	color: var(--tinta-2);
}

.noticia-mas{
	display: inline-flex;
	align-items: center;
	gap: 8px;
	margin-top: auto;
	padding-top: 16px;
	font-size: .88rem;
	font-weight: 600;
	color: var(--verde);
}

.noticia-mas svg{
	width: 16px;
	height: 16px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	transition: transform .4s var(--curva);
}

.noticia:hover .noticia-mas svg{ transform: translateX(6px); }

/* Cuando un filtro no deja nada. No debería pasar con el contenido de muestra, pero el
   día que se conecte a la base va a pasar. */
.noticias-vacio{
	grid-column: 1 / -1;
	padding: 48px 20px;
	text-align: center;
	color: var(--tinta-2);
}

/* ============================================================
   9. Sesiones
   ============================================================ */

/* Tres columnas iguales, y ésa es la regla: tres tarjetas que dicen lo mismo —las tres
   comisiones, por ejemplo— tienen que medir lo mismo. La primera crecía un 40 % en todas
   las páginas porque la rejilla nació para la portada, donde el primer bloque es el
   reproductor de la transmisión; en /comisiones/ eso dejaba a la Comisión Primera con 471
   px contra 336 de las otras dos, sin ninguna razón que lo explicara.

   Las pistas van en minmax(0, …) y los bloques con min-width: 0, y no es adorno: sin eso,
   una rejilla le da a cada ítem el ancho mínimo de su contenido, y adentro hay un recuadro
   con aspect-ratio: 16/9 y min-height: 200px —o sea, 355 px de ancho mínimo intrínseco—.
   Esa cuenta se propagaba a la pista y empujaba la fila hasta 402 px dentro de un teléfono
   de 288: la página entera se desplazaba de costado. El alto mínimo sigue haciendo su
   trabajo; lo que se corta es que decida el ancho. */
.sesiones-rejilla{
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 24px;
	align-items: stretch;
}

/* La excepción, y sólo donde se justifica: la columna del reproductor. Un vídeo en 16/9
   necesita ancho para que el recuadro no quede del tamaño de un sello, y la rejilla se lo
   da únicamente cuando esa tarjeta está presente. Atado al contenido y no a una clase
   suelta en el HTML: el día que una página nueva use esta rejilla sin transmisión, sus
   tarjetas nacen iguales sin que nadie tenga que acordarse de nada.

   Donde :has() no exista, todas quedan iguales —el reproductor pierde su ancho extra pero
   nada se rompe—, que es la degradación correcta. */
.sesiones-rejilla:has(.vivo){ grid-template-columns: 1.4fr minmax(0, 1fr) minmax(0, 1fr); }

.sesiones-rejilla > *{ min-width: 0; }

.bloque{
	display: flex;
	flex-direction: column;
	padding: 28px;
}

/* Se parte en dos renglones antes que empujar la página. Es la misma cabecera en cinco
   secciones, y basta una etiqueta larga —"Artículo 18 de la Ordenanza 003 de 2010" mide
   289 px— para que en un teléfono el título y la etiqueta juntos pidan 388 px donde hay
   297: sin el salto, lo que sobra se lo lleva la página entera de costado. */
.bloque-cabeza{
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 8px 12px;
	margin-bottom: 20px;
}

.bloque-titulo{
	font-size: 1.22rem;
	font-weight: 700;
	letter-spacing: -.03em;
}

.bloque-pie{
	max-width: 52ch;
	margin-top: 18px;
	font-size: .82rem;
	color: var(--tinta-2);
}

/* ---- Transmisión ---- */

.vivo-estado{
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 6px 14px;
	font-size: .74rem;
	font-weight: 700;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: var(--tinta-2);
	background: var(--gris-tenue);
	border-radius: 999px;
	white-space: nowrap;
}

.vivo-estado::before{
	content: '';
	width: 7px;
	height: 7px;
	background: currentColor;
	border-radius: 50%;
}

.vivo-estado.is-vivo{ color: #d64545; background: rgba(214, 69, 69, .12); }

/* En sesión el punto late. La animación se apaga sola para quien pidió menos movimiento
   en su sistema: un punto parpadeando es exactamente lo que molesta. */
.vivo-estado.is-vivo::before{ animation: latido 1.6s ease-in-out infinite; }

.vivo-marco{
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 18px;
	aspect-ratio: 16 / 9;
	padding: 24px;
	text-align: center;
	overflow: hidden;
	border-radius: var(--radio-2);
	background: var(--verde-noche);
}

/* Un resplandor verde detrás del botón: el recuadro vacío deja de ser un rectángulo
   negro y se vuelve parte de la misma superficie que la portada. */
.vivo-marco::before{
	content: "";
	position: absolute;
	width: 80%;
	aspect-ratio: 1;
	background: radial-gradient(circle closest-side, rgba(18, 160, 111, .4), rgba(18, 160, 111, .12) 55%, transparent 80%);
}

.vivo-marco iframe{
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
	z-index: 2;
}

.vivo-boton{
	position: relative;
	display: grid;
	place-items: center;
	width: 62px;
	height: 62px;
	border: 1px solid rgba(255, 255, 255, .3);
	border-radius: 50%;
	transition: transform .45s var(--curva), background-color .3s ease, border-color .3s ease;
}

.vivo-boton svg{ width: 24px; height: 24px; fill: rgba(255, 255, 255, .85); }

.vivo:hover .vivo-boton{
	transform: scale(1.1);
	background: rgba(255, 255, 255, .14);
	border-color: var(--verde-menta);
}

.vivo-nota{
	position: relative;
	max-width: 320px;
	font-size: .84rem;
	color: rgba(255, 255, 255, .6);
}

/* ---- Agenda ---- */

.agenda{ list-style: none; display: flex; flex-direction: column; gap: 6px; }

.agenda-item{
	display: flex;
	align-items: center;
	gap: 16px;
	padding: 14px;
	border-radius: var(--radio-3);
	transition: background-color .3s ease, transform .35s var(--curva);
}

.agenda-item:hover{ background: var(--verde-tenue); transform: translateX(5px); }

/* La fecha en su cuadradito verde: el día grande y el mes debajo. */
.agenda-fecha{
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	flex: none;
	width: 54px;
	height: 54px;
	line-height: 1;
	color: var(--verde);
	background: var(--verde-tenue);
	border-radius: var(--radio-3);
}

.agenda-fecha strong{
	font-size: 1.3rem;
	font-weight: 800;
	letter-spacing: -.04em;
	font-variant-numeric: tabular-nums;
}

.agenda-fecha small{
	margin-top: 2px;
	font-size: .66rem;
	font-weight: 700;
	letter-spacing: .1em;
	text-transform: uppercase;
}

.agenda-titulo{
	font-size: .98rem;
	font-weight: 600;
	letter-spacing: -.02em;
}

.agenda-texto{
	margin-top: 2px;
	font-size: .82rem;
	color: var(--tinta-2);
}

/* ---- Participa ---- */

.participa{ display: flex; flex-direction: column; gap: 4px; }

.participa-link{
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	padding: 13px 16px;
	font-size: .94rem;
	font-weight: 500;
	color: var(--tinta);
	text-decoration: none;
	border-radius: var(--radio-3);
	transition: background-color .3s ease, color .3s ease, padding-left .35s var(--curva);
}

.participa-link svg{
	width: 16px;
	height: 16px;
	flex: none;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	opacity: .4;
	transition: transform .4s var(--curva), opacity .3s ease;
}

.participa-link:hover{
	padding-left: 22px;
	color: var(--verde);
	background: var(--verde-tenue);
}

.participa-link:hover svg{ opacity: 1; transform: translateX(4px); }

/* ============================================================
   9 bis. Las sesiones grabadas
   ============================================================ */

/* El archivo del canal de YouTube. Ninguna de estas tarjetas está escrita en el HTML: las
   arma `sesiones.js` con lo que devuelve el servidor, así que acá se estila una pieza que
   todavía no existe cuando la página se pinta por primera vez.

   Se parece a la tarjeta de una noticia y no lo es. La diferencia es la miniatura: la de
   una noticia es una fotografía elegida para la tarjeta, y ésta es el cuadro que YouTube
   sacó del video. Eso trae dos cosas que hay que resolver acá y no en la otra:

     · la proporción. Un video es 16/9 y la miniatura de un video viejo viene en 4/3, con
       barras negras arriba y abajo. `cover` sobre un recuadro 16/9 recorta justo esas
       barras, así que las dos generaciones de miniatura se ven igual de bien.
     · el triángulo. Una foto no dice qué pasa al tocarla; un video sí tiene que decirlo. */

.videos-rejilla{
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 24px;
}

.video-liga{
	display: flex;
	flex-direction: column;
	height: 100%;
	text-decoration: none;
	overflow: hidden;
	border-radius: var(--radio);
}

.video-foto{
	position: relative;
	display: grid;
	place-items: center;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	background-color: var(--verde-noche);
	background-image: var(--foto);
	background-size: cover;
	background-position: center;
	transition: transform .6s var(--curva-2);
}

.video:hover .video-foto{ transform: scale(1.05); }

/* El triángulo, en vidrio sobre la miniatura. Más chico que el de la transmisión en vivo
   —aquel es el centro de su tarjeta y éste es una marca sobre una imagen— y con un velo
   detrás: una miniatura clara lo dejaría invisible. */
.video-play{
	position: relative;
	display: grid;
	place-items: center;
	width: 54px;
	height: 54px;
	background: rgba(4, 28, 21, .55);
	border: 1px solid rgba(255, 255, 255, .35);
	border-radius: 50%;
	backdrop-filter: blur(3px);
	transition: transform .45s var(--curva), background-color .3s ease, border-color .3s ease;
}

.video-play svg{ width: 22px; height: 22px; fill: rgba(255, 255, 255, .92); }

.video:hover .video-play{
	transform: scale(1.12);
	background: var(--verde);
	border-color: var(--verde-menta);
}

/* Qué clase de sesión es, en la misma estampilla que lleva la tarjeta de una noticia.
   Sale de leer el título en el servidor: el canal no clasifica nada. */
.video-marca{
	position: absolute;
	top: 14px;
	left: 14px;
	padding: 6px 13px;
	font-size: .7rem;
	font-weight: 700;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: var(--verde-hondo);
	background: rgba(255, 255, 255, .92);
	border-radius: 999px;
	box-shadow: var(--sombra-1);
}

/* Cuánto dura, abajo a la derecha y en números de ancho fijo, que es donde y como lo
   escribe cualquier reproductor. Sólo aparece cuando se sabe: sin credencial del canal el
   servidor no la conoce y el elemento no se dibuja. */
.video-duracion{
	position: absolute;
	right: 12px;
	bottom: 12px;
	padding: 4px 9px;
	font-size: .76rem;
	font-weight: 600;
	font-variant-numeric: tabular-nums;
	color: #fff;
	background: rgba(4, 28, 21, .78);
	border-radius: 8px;
}

/* Una sesión al aire en este momento. Mismo rojo y mismo latido que el cartel de la
   transmisión, porque es exactamente lo mismo dicho en otro lugar de la página. */
.video-vivo{
	position: absolute;
	top: 14px;
	right: 14px;
	display: inline-flex;
	align-items: center;
	gap: 7px;
	padding: 6px 13px;
	font-size: .7rem;
	font-weight: 700;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: #fff;
	background: #d64545;
	border-radius: 999px;
}

.video-vivo::before{
	content: '';
	width: 6px;
	height: 6px;
	background: currentColor;
	border-radius: 50%;
	animation: latido 1.6s ease-in-out infinite;
}

.video-cuerpo{
	display: flex;
	flex-direction: column;
	gap: 8px;
	flex: 1;
	padding: 22px 24px 24px;
}

.video-fecha{
	font-size: .8rem;
	font-weight: 600;
	color: var(--tinta-2);
}

/* Dos renglones y punto. Los títulos del canal son largos y desparejos —"Sesión ordinaria
   No. 12 del periodo…"— y sin el corte una tarjeta mide el doble que la de al lado por
   una numeración. `-webkit-line-clamp` es lo que entienden todos los navegadores de hoy;
   el `line-clamp` de al lado es el nombre definitivo de la propiedad. */
.video-titulo{
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	line-clamp: 2;
	overflow: hidden;
	font-size: 1.08rem;
	font-weight: 700;
	line-height: 1.34;
	letter-spacing: -.02em;
	color: var(--tinta);
	text-wrap: pretty;
	transition: color .25s ease;
}

.video:hover .video-titulo{ color: var(--verde); }

.video-texto{
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	line-clamp: 2;
	overflow: hidden;
	font-size: .86rem;
	color: var(--tinta-2);
}

.videos-vacio{
	grid-column: 1 / -1;
	padding: 48px 20px;
	text-align: center;
	color: var(--tinta-2);
}

/* El pie del listado: cuántas se ven, el botón que trae más y el enlace al canal. En una
   línea mientras entren, y en tres renglones centrados cuando no. */
.videos-pie{
	display: flex;
	align-items: center;
	justify-content: center;
	flex-wrap: wrap;
	gap: 16px 24px;
	margin-top: clamp(28px, 3.5vw, 40px);
}

.videos-cuenta{
	font-size: .84rem;
	font-weight: 600;
	color: var(--tinta-2);
	font-variant-numeric: tabular-nums;
}

/* ---- El adelanto de la portada ---- */

/* Tres grabaciones debajo de la transmisión y la agenda, con su propio encabezado chico:
   es una pieza más de la sección de sesiones y no una sección nueva, así que no lleva
   título de sección ni el aire de una. */
.videos-adelanto{ margin-top: 24px; }

.videos-cabeza{
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 8px 16px;
	margin-bottom: 18px;
}

/* ---- El reproductor ---- */

/* Se abre encima de la página en lugar de mandar a YouTube: quien recorre el archivo
   quiere mirar un rato y seguir buscando, y cada salida a otra pestaña es una vuelta que
   hay que deshacer.

   Es un <dialog> nativo, así que el fondo, el foco atrapado adentro y Escape los pone el
   navegador. Acá sólo se lo viste. */
/* El ancho lo puede fijar el alto, y hace falta: el recuadro es 16/9, así que 960 px de
   ancho son 540 de alto y en una ventana de 500 el video se sale por abajo con los
   controles de YouTube afuera. Los 150vh son ese mismo 16/9 medido al revés —un 16/9 que
   entra en el 84 % del alto—, y dejan sitio para el título de abajo. */
.visor{
	width: min(960px, 92vw, 150vh);
	padding: 0;
	color: var(--tinta);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: var(--radio-2);
	box-shadow: var(--sombra-3);
	overflow: hidden;
}

.visor::backdrop{ background: rgba(4, 28, 21, .72); }

.visor-marco{
	position: relative;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	background: var(--verde-noche);
	border-radius: var(--radio-2) var(--radio-2) 0 0;
}

.visor-marco iframe{
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
}

.visor-pie{
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 10px 20px;
	padding: 18px 22px 20px;
}

.visor-titulo{
	font-size: 1.02rem;
	font-weight: 700;
	letter-spacing: -.02em;
}

.visor-enlace{
	flex: none;
	font-size: .86rem;
	font-weight: 600;
	color: var(--verde);
	text-decoration: none;
}

.visor-enlace:hover{ text-decoration: underline; }

/* Adentro del recuadro y arriba a la derecha. Estuvo un rato afuera, flotando encima del
   diálogo, que es más limpio… hasta que la ventana es baja: ahí el diálogo arranca pegado
   al borde de arriba y la cruz queda fuera de la pantalla, o sea que no hay forma de
   cerrar salvo Escape. Adentro entra siempre, y el fondo oscuro la despega del video. */
.visor-cerrar{
	position: absolute;
	top: 12px;
	right: 12px;
	z-index: 2;
	display: grid;
	place-items: center;
	width: 36px;
	height: 36px;
	font-family: inherit;
	font-size: 1rem;
	line-height: 1;
	color: #fff;
	background: rgba(4, 28, 21, .66);
	border: 1px solid rgba(255, 255, 255, .28);
	border-radius: 50%;
	cursor: pointer;
	backdrop-filter: blur(3px);
	transition: background-color .3s ease, transform .35s var(--curva);
}

.visor-cerrar:hover{ background: rgba(4, 28, 21, .88); transform: scale(1.08); }

/* ============================================================
   9 ter. La galería
   ============================================================ */

/* Las fotografías de la corporación. Ninguna está escrita en el HTML: las arma
   `galeria.js` con lo que devuelve el servidor, así que acá se estila una pieza que
   todavía no existe cuando la página se pinta por primera vez.

   Es una rejilla de cuadros y no una tira de tarjetas, y la diferencia está en qué se
   mira: en una noticia se lee el título y la foto acompaña; acá la foto ES el contenido y
   el título es el pie que la explica. Por eso los cuadros son cuadrados —una rejilla
   pareja se recorre con la vista de una pasada— y por eso el pie es chico y va debajo, sin
   competir con la imagen.

   `auto-fill` con un mínimo y no un número fijo de columnas: una galería crece de a una
   foto, y con columnas fijas la última fila queda coja cada vez que el total no es
   múltiplo de tres. Con `auto-fill` la rejilla se acomoda sola a lo que haya y al ancho
   que tenga. */
.galeria-rejilla{
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
	gap: 18px;
}

.galeria-cuadro{
	position: relative;
	margin: 0;
	overflow: hidden;
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: var(--radio-2);
	box-shadow: var(--sombra-1);
	transition: transform .35s var(--curva), box-shadow .35s var(--curva), border-color .3s ease;
}

.galeria-cuadro:hover{
	transform: translateY(-4px);
	border-color: var(--verde-linea);
	box-shadow: var(--sombra-2);
}

/* El botón que abre el visor. Es un botón y no un enlace a propósito —la foto no tiene
   página propia, así que no hay dirección honesta que poner debajo—, y por eso hay que
   devolverle a mano todo lo que un <button> trae puesto: el fondo, el borde, la fuente. */
.galeria-liga{
	position: relative;
	display: block;
	width: 100%;
	padding: 0;
	font-family: inherit;
	background: none;
	border: 0;
	cursor: zoom-in;
}

/* Cuadrado. Una galería con fotos de proporciones distintas es una rejilla con escalones,
   y el recorte de `cover` le cuesta menos a la mirada que el desorden. La foto entera se
   ve en el visor, que es donde alguien de verdad la está mirando. */
.galeria-foto{
	display: block;
	width: 100%;
	aspect-ratio: 1 / 1;
	object-fit: cover;
	background: var(--verde-tenue);
	transition: transform .6s var(--curva);
}

.galeria-cuadro:hover .galeria-foto{ transform: scale(1.05); }

/* La lupa: el único indicio de que el cuadro hace algo al tocarlo. Aparece al pasar por
   encima Y al enfocar con el teclado: si sólo respondiera al ratón, quien navega con
   tabulador no tendría ninguna señal de dónde está parado. */
.galeria-lupa{
	position: absolute;
	top: 12px;
	right: 12px;
	width: 34px;
	height: 34px;
	padding: 7px;
	color: #fff;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	background: rgba(4, 28, 21, .58);
	border-radius: 50%;
	opacity: 0;
	transform: scale(.85);
	backdrop-filter: blur(3px);
	transition: opacity .3s ease, transform .35s var(--curva);
}

.galeria-cuadro:hover .galeria-lupa,
.galeria-liga:focus-visible .galeria-lupa{ opacity: 1; transform: none; }

/* El pie. Sale sólo si hay algo que decir —`galeria.js` no lo crea cuando la foto no tiene
   ni título ni fecha— para que una foto sin datos no lleve una barra vacía debajo. */
.galeria-pie{
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding: 12px 14px 14px;
}

.galeria-titulo{
	font-size: .9rem;
	font-weight: 600;
	line-height: 1.35;
	color: var(--tinta);
	/* Dos renglones y lo que sobre se corta. Un pie largo estiraría su cuadro y rompería
	   la altura pareja de la fila, que es justamente lo que hace legible la rejilla. */
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	overflow: hidden;
}

.galeria-fecha{
	font-size: .76rem;
	font-weight: 600;
	color: var(--tinta-3);
	font-variant-numeric: tabular-nums;
}

/* El aviso de rejilla vacía. Ocupa la fila entera: adentro de una sola columna quedaría
   como un cuadro más, y lo que dice es de toda la sección. */
.galeria-vacio{
	grid-column: 1 / -1;
	padding: 48px 20px;
	text-align: center;
	color: var(--tinta-2);
}

/* ---- El visor de una foto ---- */

/* El mismo <dialog> que el reproductor de las sesiones, vestido para una imagen. Lo que
   cambia es la forma: un video es siempre 16/9 y una fotografía no, así que acá el alto lo
   fija la ventana y el ancho lo pone la imagen. */
.visor.is-foto{
	width: auto;
	max-width: 94vw;
	background: var(--superficie);
}

.visor-foto{
	display: grid;
	place-items: center;
	background: var(--verde-noche);
	border-radius: var(--radio-2) var(--radio-2) 0 0;
}

/* `max-height` en vh y no en porcentaje: el diálogo no tiene alto propio —lo toma de su
   contenido—, así que un porcentaje no tendría contra qué medirse y la foto saldría a
   tamaño completo. El 76 deja sitio para el pie y para los márgenes del diálogo. */
.visor-foto img{
	display: block;
	max-width: 100%;
	max-height: 76vh;
	object-fit: contain;
}

/* Las flechas, encima de la foto y pegadas a los lados. Adentro del recuadro y no afuera,
   por lo mismo que la cruz de cerrar: afuera se salen de la pantalla en cuanto la ventana
   es angosta, y ahí no hay forma de pasar de foto salvo con el teclado. */
.visor-flecha{
	position: absolute;
	top: 50%;
	z-index: 2;
	display: grid;
	place-items: center;
	width: 42px;
	height: 42px;
	font-family: inherit;
	font-size: 1.6rem;
	line-height: 1;
	color: #fff;
	background: rgba(4, 28, 21, .58);
	border: 1px solid rgba(255, 255, 255, .26);
	border-radius: 50%;
	cursor: pointer;
	transform: translateY(-50%);
	backdrop-filter: blur(3px);
	transition: background-color .3s ease, transform .35s var(--curva);
}

.visor-flecha:hover{ background: rgba(4, 28, 21, .88); }
.visor-flecha.is-antes{ left: 12px; }
.visor-flecha.is-despues{ right: 12px; }

.visor-flecha.is-antes:hover{ transform: translateY(-50%) translateX(-3px); }
.visor-flecha.is-despues:hover{ transform: translateY(-50%) translateX(3px); }

/* El pie del visor pasa a columna: acá hay un título, una descripción y la cuenta, y en
   una sola fila —como en el reproductor— la descripción no tendría dónde caber. */
.visor.is-foto .visor-pie{
	flex-direction: column;
	align-items: flex-start;
	gap: 4px;
}

.visor-texto{
	font-size: .88rem;
	line-height: 1.5;
	color: var(--tinta-2);
}

.visor-cuenta{
	font-size: .78rem;
	font-weight: 600;
	color: var(--tinta-3);
	font-variant-numeric: tabular-nums;
}

/* ---- La agenda que se llena sola ---- */

/* El hueco del bloque "La agenda de sesiones" es un <div> y no un <ul>, así que no hereda
   nada de `.agenda`. La separación entre renglones ya se la da `.agenda-lista`, junto a
   las tablas de documentos —sección 16—; el resto lo pone `.agenda-item`, que es el mismo
   marcado en las dos formas. Lo que falta es el aviso de cuando no hay nada anunciado. */
.agenda-vacio{
	padding: 24px 4px;
	color: var(--tinta-2);
}

/* ============================================================
   10. Mesa directiva
   ============================================================ */

.mesa-rejilla{
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 24px;
}

.miembro{ overflow: hidden; }

/* El hueco del retrato. Con la fotografía real va un <img> adentro y las iniciales quedan
   de fondo, que es justo lo que se ve mientras la imagen carga. */
.miembro-retrato{
	position: relative;
	display: grid;
	place-items: center;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	background: linear-gradient(150deg, var(--verde-vivo), var(--verde-hondo));
}

.miembro-retrato[data-tono="b"]{ background: linear-gradient(150deg, #12a06f, #0a3a35); }
.miembro-retrato[data-tono="c"]{ background: linear-gradient(150deg, #2fb886, #113526); }

/* Una luz que cruza el retrato al pasar por encima. Es el único brillo del portal, y dura
   menos de un segundo. */
.miembro-retrato::after{
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(105deg, transparent 35%, rgba(255, 255, 255, .18) 50%, transparent 65%);
	transform: translateX(-100%);
	transition: transform .9s var(--curva-2);
}

.miembro:hover .miembro-retrato::after{ transform: translateX(100%); }

.miembro-retrato span{
	font-size: 2.2rem;
	font-weight: 800;
	letter-spacing: .02em;
	color: rgba(255, 255, 255, .9);
}

.miembro-retrato img{ width: 100%; height: 100%; object-fit: cover; }

.miembro-cuerpo{ padding: 24px 26px 26px; }

.miembro-cargo{
	display: inline-block;
	margin-bottom: 8px;
	padding: 5px 13px;
	font-size: .72rem;
	font-weight: 700;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--verde);
	background: var(--verde-tenue);
	border-radius: 999px;
}

.miembro-nombre{
	font-size: 1.2rem;
	font-weight: 700;
	letter-spacing: -.03em;
}

.miembro-texto{
	margin-top: 8px;
	font-size: .88rem;
	color: var(--tinta-2);
}

/* ---- El secretario general ----
   Debajo de la rejilla de la mesa y a lo ancho: no es uno más de los tres cargos de la
   mesa, así que no ocupa una celda de ella. Retrato a la izquierda, datos a la derecha. */
.mesa-secretario{ margin-top: 24px; }
.mesa-secretario:empty{ display: none; }

.miembro.is-secretario{
	display: grid;
	grid-template-columns: minmax(160px, 240px) 1fr;
	align-items: stretch;
}

.miembro.is-secretario .miembro-retrato{ aspect-ratio: auto; min-height: 200px; }
.miembro.is-secretario .miembro-cuerpo{ display: flex; flex-direction: column; justify-content: center; padding: 28px 32px; }
.miembro.is-secretario .miembro-nombre{ font-size: 1.35rem; }
.miembro-mas{ margin-top: 14px; align-self: flex-start; }

@media (max-width: 640px){
	.miembro.is-secretario{ grid-template-columns: 1fr; }
	.miembro.is-secretario .miembro-retrato{ aspect-ratio: 4 / 3; min-height: 0; }
	.miembro.is-secretario .miembro-cuerpo{ padding: 22px 22px 24px; }
}

.mesa-nota{
	max-width: 68ch;
	margin: clamp(28px, 4vw, 44px) auto 0;
	text-align: center;
	font-size: .9rem;
	color: var(--tinta-2);
}

/* ============================================================
   11. Transparencia
   ============================================================ */

/* La segunda superficie verde del portal, y la que cierra el contenido: una tarjeta
   grande, con la misma aurora que la portada pero quieta —dos fondos moviéndose en la
   misma página se pelean—. */
.franja{ padding: 0 0 clamp(64px, 8vw, 100px); }

.franja-caja{
	position: relative;
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: clamp(32px, 4vw, 64px);
	padding: clamp(40px, 5vw, 68px);
	overflow: hidden;
	border-radius: var(--radio);
	background: var(--verde-hondo);
	color: rgba(255, 255, 255, .78);
}

.franja .portada-aurora span{ animation: none; opacity: .8; }

.franja-texto,
.franja-links{ position: relative; z-index: 2; }

.franja-titulo{
	margin-top: 18px;
	font-size: clamp(1.9rem, 3.4vw, 2.7rem);
	font-weight: 800;
	letter-spacing: -.04em;
	color: #fff;
	text-wrap: balance;
}

.franja-titulo em{ color: var(--verde-menta); }

.franja-bajada{
	max-width: 46ch;
	margin-top: 16px;
	font-size: .98rem;
	color: rgba(255, 255, 255, .68);
}

.franja-links{ display: grid; gap: 6px; align-content: start; }

.franja-links a{
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	padding: 15px 18px;
	font-size: .98rem;
	font-weight: 500;
	color: rgba(255, 255, 255, .85);
	text-decoration: none;
	border-radius: var(--radio-3);
	transition: background-color .3s ease, color .3s ease, padding-left .35s var(--curva);
}

.franja-links a:hover{
	padding-left: 26px;
	color: #fff;
	background: rgba(255, 255, 255, .1);
}

.franja-links svg{
	width: 17px;
	height: 17px;
	flex: none;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	opacity: .35;
	transition: transform .4s var(--curva), opacity .3s ease;
}

.franja-links a:hover svg{ opacity: 1; transform: translateX(5px); }
.franja-links a:focus-visible{ outline-color: var(--verde-menta); }

/* ============================================================
   11 bis. Enlaces de interés
   ============================================================ */

/* Un carrusel de tarjetas iguales, alineado con el resto de la página. Sin JavaScript es
   una fila que se desplaza de costado con el dedo o la rueda y se ancla tarjeta por
   tarjeta; script.js le suma las flechas, los puntos y el avance solo.

   Las tarjetas son blancas en los dos temas porque los logos vienen sobre blanco: una
   tarjeta oscura los dejaría como recortes pegados encima. Los archivos son cuadrados de
   200 px con mucho aire alrededor —unos logos son apaisados y otros casi cuadrados—, así
   que la imagen se dibuja más grande que la tarjeta y la tarjeta recorta el aire común.
   Al 78 % del ancho, el logo más alto (Sirvo a mi país) todavía entra entero. */
.aliados{
	--aliados-por-vista: 5;
	--aliados-hueco: 18px;
	padding: clamp(32px, 4.5vw, 52px) 0 clamp(28px, 4vw, 44px);
	background: var(--tarjeta);
	border-top: 1px solid var(--linea);
}

.aliados-cabeza{
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	margin-bottom: clamp(16px, 2vw, 22px);
}

.aliados-rotulo{
	margin: 0;
	font-size: .72rem;
	font-weight: 700;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--tinta-2);
}

.aliados-controles{
	display: flex;
	gap: 8px;
}

.aliados-flecha{
	display: grid;
	place-items: center;
	width: 40px;
	height: 40px;
	padding: 0;
	border: 1px solid var(--linea);
	border-radius: 50%;
	background: var(--fondo);
	color: var(--tinta);
	cursor: pointer;
	transition: background-color .25s ease, border-color .25s ease, color .25s ease, transform .25s var(--curva);
}

.aliados-flecha svg{
	width: 18px;
	height: 18px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
}

.aliados-flecha:hover{
	background: var(--verde);
	border-color: var(--verde);
	color: #fff;
}

.aliados-flecha:active{ transform: scale(.92); }
.aliados-flecha:focus-visible{ outline: 2px solid var(--verde); outline-offset: 3px; }

.aliados-cinta{
	max-width: var(--ancho);
	margin: 0 auto;
	padding-left: max(var(--aire), env(safe-area-inset-left));
	padding-right: max(var(--aire), env(safe-area-inset-right));
	scroll-padding-inline: max(var(--aire), env(safe-area-inset-left));
	overflow-x: auto;
	overscroll-behavior-x: contain;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
}

.aliados-cinta::-webkit-scrollbar{ display: none; }

.aliados-pista{
	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: calc((100% - var(--aliados-hueco) * (var(--aliados-por-vista) - 1)) / var(--aliados-por-vista));
	gap: var(--aliados-hueco);
	margin: 0;
	/* Aire arriba y abajo para que la tarjeta que sube al pasarle el puntero y su sombra
	   no queden cortadas por el borde de la fila, que recorta todo lo que desborda. */
	padding: 6px 0 14px;
	list-style: none;
}

.aliados-pista > li{ scroll-snap-align: start; }

.aliado{
	position: relative;
	display: block;
	aspect-ratio: 3 / 2;
	overflow: hidden;
	border: 1px solid var(--linea);
	border-radius: var(--radio-3);
	background: #fff;
	box-shadow: var(--sombra-1);
	transition: transform .35s var(--curva), box-shadow .3s ease, border-color .3s ease;
}

.aliado:hover{
	transform: translateY(-4px);
	border-color: color-mix(in srgb, var(--verde) 45%, transparent);
	box-shadow: var(--sombra-2);
}

.aliado:focus-visible{ outline: 2px solid var(--verde); outline-offset: 3px; }

.aliado img{
	position: absolute;
	top: 50%;
	left: 50%;
	width: 78%;
	height: auto;
	max-width: none;
	aspect-ratio: 1;
	transform: translate(-50%, -50%);
	pointer-events: none;
}

.aliados-puntos{
	display: flex;
	justify-content: center;
	gap: 6px;
	margin-top: 8px;
}

.aliados-puntos:empty{ display: none; }

.aliados-punto{
	width: 8px;
	height: 8px;
	padding: 0;
	border: 0;
	border-radius: 999px;
	background: var(--linea);
	cursor: pointer;
	transition: width .35s var(--curva-2, ease), background-color .3s ease;
}

html[data-theme="dark"] .aliados-punto{ background: rgba(255, 255, 255, .2); }

.aliados-punto.is-activo,
html[data-theme="dark"] .aliados-punto.is-activo{
	width: 26px;
	background: var(--verde);
}

.aliados-punto:focus-visible{ outline: 2px solid var(--verde); outline-offset: 3px; }

@media (max-width: 1100px){ .aliados{ --aliados-por-vista: 4; } }
@media (max-width: 860px){ .aliados{ --aliados-por-vista: 3; --aliados-hueco: 14px; } }
@media (max-width: 560px){
	.aliados{ --aliados-por-vista: 2; --aliados-hueco: 12px; }
	.aliados-flecha{ width: 36px; height: 36px; }
}

html[data-movimiento="reducido"] .aliado,
html[data-movimiento="reducido"] .aliados-punto{ transition: none; }
html[data-movimiento="reducido"] .aliado:hover{ transform: none; }

@media (prefers-reduced-motion: reduce){
	.aliado, .aliados-punto, .aliados-flecha{ transition: none; }
	.aliado:hover{ transform: none; }
}



/* ============================================================
   12. Pie
   ============================================================ */

.pie{
	padding: clamp(56px, 6vw, 76px) 0 28px;
	background: var(--tarjeta);
	border-top: 1px solid var(--linea);
	transition: background-color .3s ease;
}

.pie-rejilla{
	display: grid;
	grid-template-columns: 2fr 1fr 1.4fr 1fr;
	gap: 44px;
	padding-bottom: 44px;
}

.pie .marca{ margin-bottom: 18px; }
.pie .marca-img{ height: 42px; }

.pie-titulo{
	margin-bottom: 20px;
	font-size: 1.05rem;
	font-weight: 700;
	letter-spacing: -.02em;
	color: var(--tinta);
}

.pie-texto{
	font-size: .9rem;
	color: var(--tinta-2);
	max-width: 36ch;
}

.pie-texto + .pie-titulo{ margin-top: 26px; }

.pie-texto a{ color: var(--tinta-2); text-decoration: none; }
.pie-texto a:hover{ color: var(--verde); }

.pie-nav{ display: flex; flex-direction: column; gap: 12px; }

.pie-nav a{
	width: fit-content;
	font-size: .9rem;
	font-weight: 500;
	color: var(--tinta-2);
	text-decoration: none;
	transition: color .25s ease, transform .35s var(--curva);
}

.pie-nav a:hover{ color: var(--verde); transform: translateX(5px); }

/* Las marcas de las redes van rellenas: son logotipos, y dibujados a trazo no se
   reconocen. */
.social{ display: flex; gap: 12px; margin-top: 20px; }

.social a{
	display: grid;
	place-items: center;
	width: 42px;
	height: 42px;
	color: var(--tinta);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: 50%;
	box-shadow: var(--sombra-1);
	transition: transform .35s var(--curva), color .3s ease, background-color .3s ease;
}

.social a:hover{ transform: translateY(-4px); color: #fff; background: var(--verde); }
.social svg{ width: 17px; height: 17px; fill: currentColor; }

.pie-legal{
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 14px 28px;
	padding-top: 26px;
	border-top: 1px solid var(--linea);
}

.pie-legal-nav{ display: flex; flex-wrap: wrap; gap: 8px 24px; }

.pie-legal-nav a{
	font-size: .84rem;
	color: var(--tinta-2);
	text-decoration: none;
	transition: color .25s ease;
}

.pie-legal-nav a:hover{ color: var(--verde); }
.pie-copy{ font-size: .84rem; color: var(--tinta-2); }

/* ============================================================
   13. Flotantes, aviso y página que no existe
   ============================================================ */

/* El círculo que vive encima de la página. Es sólo la forma: dónde se para cada uno lo
   dicen `.acc` —el dock de abajo a la izquierda, sección 16— y `.arriba`, que se queda en
   la esquina opuesta para no pelearse con él.

   Antes esta clase traía su propio `position: fixed` con las coordenadas adentro, y por eso
   no podía haber dos: el segundo se paraba exactamente encima del primero. Sacarlas de acá
   es lo que deja que el dock apile los suyos en una fila. */
.flotante{
	display: grid;
	place-items: center;
	width: 50px;
	height: 50px;
	color: var(--tinta);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: 50%;
	box-shadow: var(--sombra-2);
	cursor: pointer;
	transition: transform .35s var(--curva), color .3s ease, background-color .3s ease, border-color .3s ease;
}

.flotante:hover{ transform: translateY(-4px); color: var(--verde); border-color: var(--verde); }

.flotante svg{
	width: 20px;
	height: 20px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
}

/* El sol y la luna comparten el botón: se muestra el que corresponde al tema puesto. */
.flotante .is-sol{ display: none; }
[data-theme="dark"] .flotante .is-sol{ display: block; color: #ffce6b; }
[data-theme="dark"] .flotante .is-luna{ display: none; }

.arriba{
	position: fixed;
	right: max(24px, env(safe-area-inset-right));
	bottom: max(24px, env(safe-area-inset-bottom));
	z-index: 1500;
	color: #fff;
	background: var(--verde);
	border-color: var(--verde);
	animation: zoomIn .35s var(--curva);
}

.arriba:hover{ color: #fff; background: var(--verde-hondo); border-color: var(--verde-hondo); box-shadow: var(--sombra-verde); }

/* ---- El aviso ----
   Aparece abajo a la derecha, dura tres segundos y se va solo. Lo usa el botón de tamaño
   de texto y el de tema para confirmar lo que acaba de pasar: son dos cambios que no
   siempre se notan a simple vista. */
.aviso{
	position: fixed;
	right: max(24px, env(safe-area-inset-right));
	bottom: calc(88px + env(safe-area-inset-bottom));
	z-index: 2000;
	max-width: min(340px, calc(100vw - 48px));
	padding: 14px 22px;
	font-size: .9rem;
	font-weight: 500;
	color: #fff;
	background: var(--verde-hondo);
	border-radius: var(--radio-3);
	box-shadow: var(--sombra-3);
	opacity: 0;
	visibility: hidden;
	transform: translateY(16px);
	transition: opacity .3s ease, transform .3s var(--curva), visibility .3s;
}

.aviso.is-visible{ opacity: 1; visibility: visible; transform: none; }

/* ---- Página que no existe ---- */

.perdido{
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 16px;
	min-height: 78vh;
	padding: calc(var(--tope-alto) + 60px) 24px 110px;
	text-align: center;
}

.perdido-num{
	font-size: clamp(4.5rem, 14vw, 8rem);
	font-weight: 800;
	line-height: 1;
	letter-spacing: -.06em;
	color: var(--verde);
}

.perdido-titulo{
	font-size: clamp(1.5rem, 3vw, 2.1rem);
	font-weight: 700;
}

.perdido-texto{
	max-width: 52ch;
	margin-bottom: 20px;
	font-size: .96rem;
	color: var(--tinta-2);
}

/* ============================================================
   14. Páginas internas
   ============================================================ */
/* Todo lo que la portada no necesita y las secciones sí: la cabecera corta con las migas,
   los bloques de texto largo, las tablas de documentos, la ficha de una publicación y la
   lista de pasos.

   La regla que ordena esta sección: una página interna se lee, no se mira. Por eso el
   ancho del texto está limitado a poco más de setenta caracteres, la cabecera ocupa el
   alto que necesita en lugar de la pantalla entera, y el verde se usa para señalar —la
   norma que respalda un bloque, el número de un paso— y no para llenar superficie. */

/* ---- La portadilla ----
   El lugar que en la portada ocupa la fotografía a sangre. Acá es una franja verde de
   alto medido: nombra la sección, dice de qué va y muestra por dónde se llegó. */
.portadilla{
	position: relative;
	padding: calc(var(--tope-alto) + clamp(48px, 6vw, 76px)) 0 clamp(44px, 5vw, 64px);
	overflow: hidden;
	background-color: var(--verde-hondo);
	background-image:
		linear-gradient(115deg, rgba(4, 28, 21, .96) 0%, rgba(4, 28, 21, .89) 52%, rgba(4, 28, 21, .8) 100%),
		var(--portadilla-foto);
	background-size: cover;
	background-position: var(--portadilla-foco);
}

/* Cada página interna elige su fotografía con `data-foto`; sin atributo queda el pleno. */
.portadilla{ --portadilla-foto: url("/img/portadillas/pleno.jpg"); --portadilla-foco: center 40%; }
.portadilla[data-foto="recinto"]{ --portadilla-foto: url("/img/portadillas/recinto.jpg"); --portadilla-foco: center 45%; }
.portadilla[data-foto="escudo"]{ --portadilla-foto: url("/img/portadillas/escudo.jpg"); --portadilla-foco: center 40%; }
.portadilla[data-foto="deliberacion"]{ --portadilla-foto: url("/img/portadillas/deliberacion.jpg"); --portadilla-foco: center 50%; }
.portadilla[data-foto="oracion"]{ --portadilla-foto: url("/img/portadillas/oracion.jpg"); --portadilla-foco: center 40%; }
.portadilla[data-foto="apertura"]{ --portadilla-foto: url("/img/portadillas/apertura.jpg"); --portadilla-foco: center 24%; }
.portadilla[data-foto="diputados"]{ --portadilla-foto: url("/img/portadillas/diputados.jpg"); --portadilla-foco: center 45%; }
.portadilla[data-foto="debate"]{ --portadilla-foto: url("/img/portadillas/debate.jpg"); --portadilla-foco: center 42%; }
.portadilla[data-foto="intervencion"]{ --portadilla-foto: url("/img/portadillas/intervencion.jpg"); --portadilla-foco: center 30%; }

.portadilla .portada-aurora{ display: none; }

.portadilla-caja{ position: relative; z-index: 2; }

.portadilla-titulo{
	margin-top: 16px;
	font-size: clamp(2rem, 4vw, 3.1rem);
	font-weight: 800;
	letter-spacing: -.04em;
	line-height: 1.08;
	color: #fff;
	text-wrap: balance;
	max-width: 22ch;
}

.portadilla-bajada{
	max-width: 62ch;
	margin-top: 16px;
	font-size: 1.02rem;
	color: rgba(255, 255, 255, .72);
}

/* ---- Las migas ----
   Dónde está parada la página dentro del portal. Van arriba del título y no debajo: es lo
   primero que se mira cuando uno llegó desde un buscador y no sabe en qué sección cayó. */
.migas{
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 4px;
	font-size: .8rem;
	color: rgba(255, 255, 255, .55);
}

.migas a{
	padding: 3px 2px;
	color: rgba(255, 255, 255, .72);
	text-decoration: none;
	border-radius: 6px;
	transition: color .25s ease;
}

.migas a:hover{ color: var(--verde-menta); }
.migas a:focus-visible{ outline-color: var(--verde-menta); }
.migas [aria-current]{ color: rgba(255, 255, 255, .55); }

.migas-sep{
	width: 14px;
	height: 14px;
	flex: none;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	opacity: .45;
}

/* ---- El enlace con flecha ----
   Algunos enlaces de texto llevan la flecha del portal. El subrayado de .enlace lo dibuja
   un ::after al ancho del elemento, así que la flecha va adentro; el tamaño se le fija
   acá porque un <svg> sin ancho declarado se estira hasta donde le dé el contenedor. */
.enlace{ display: inline-flex; align-items: center; gap: 8px; }

.enlace svg{
	width: 16px;
	height: 16px;
	flex: none;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	transition: transform .4s var(--curva);
}

.enlace:hover svg{ transform: translateX(4px); }

/* El enlace que cierra una sección y lleva al listado completo. Centrado y separado: es
   la salida de la sección, no una línea más de su contenido. */
.seccion-mas{
	display: flex;
	justify-content: center;
	margin-top: clamp(32px, 4vw, 44px);
}

/* ---- Texto largo ----
   El ancho de lectura, y nada más. Setenta y pico de caracteres es lo que el ojo sigue sin
   perder el renglón; una columna de mil doscientos píxeles de ancho, no.

   Ojo con la unidad: `ch` mide el ancho del cero de la fuente, y el de Outfit es angosto,
   así que un límite de 72ch deja pasar renglones de noventa y siete caracteres reales
   —medidos, no estimados—. De ahí que la medida vaya en 52ch, que en esta fuente son los
   setenta que se buscaban. Si algún día se cambia la tipografía, este número hay que
   volver a medirlo, no a copiarlo. */
.prosa-caja{ max-width: 980px; }

.prosa{ max-width: 52ch; }

.prosa p + p{ margin-top: 16px; }

/* ---- Un solo ancho por página ----
   Una página interna alterna dos clases de bloque: la columna de lectura y los que traen su
   propio ancho —una rejilla de fichas, un mapa—. El constructor mete a los segundos en un
   `.contenedor` de 1240 px, y contra una columna de texto centrada de 600 la diferencia era
   de un factor dos: en /diputados/ el párrafo de arriba arrancaba a 260 px del borde y las
   tarjetas de abajo a 20, y las dos cosas no se leían como partes de la misma página.

   Acá todo baja al ancho de la columna de prosa. No es sólo prolijidad: cuatro fichas en
   980 px miden 220 cada una, que es el tamaño al que un retrato cuadrado y un nombre de
   dos renglones se ven bien; en 1240 quedaban de 290 y la ficha era casi toda aire.

   Cuelga de `.portadilla ~`, o sea sólo las páginas internas. La portada tiene otro
   trabajo: es un escaparate, y sus rejillas usan la pantalla entera a propósito. */
.portadilla ~ .seccion > .contenedor{ max-width: 980px; }

/* ---- La columna, centrada ----
   Una página interna del portal es hoy una sola columna de texto: el constructor la arma
   como `.prosa-caja > .prosa` y no hay nada a su derecha. Alineada a la izquierda de una
   caja de 980 px dentro de un contenedor de 1240, eso dejaba media pantalla vacía a un
   lado y la página entera descolgada del centro —lo que en un monitor ancho se lee como
   un error de carga, no como una decisión—.

   Va calificado con `.prosa-caja >` y no suelto en `.prosa` a propósito: donde la columna
   convive con algo al lado —las dos columnas de `.bloques-duo`— sigue arrimada a su borde,
   que es donde tiene que estar. */
.prosa-caja > .prosa{ margin-inline: auto; }

.prosa-entrada{
	font-size: 1.14rem;
	font-weight: 500;
	line-height: 1.6;
	letter-spacing: -.01em;
}

/* ---- El ritmo de una página armada con el constructor ----
   El constructor no anida: escupe los bloques uno detrás de otro —un título, tres
   párrafos, una lista, un subtítulo— como hermanos directos de `.prosa`. Sin reglas de
   separación entre ellos, un título quedaba pegado al párrafo anterior y la página entera
   se leía como un solo bloque gris de dos metros.

   El ritmo se escribe en `em` y no en píxeles porque cada nivel tiene su propio cuerpo: el
   aire debajo de un título crece con el título, no con la raíz. Y la separación es
   asimétrica —mucho antes de un encabezado, poco después— que es lo que ata visualmente el
   encabezado a lo que titula en lugar de dejarlo flotando entre dos bloques. */
.prosa > * + *{ margin-top: 1.05em; }

.prosa > h1 + *,
.prosa > h2 + *,
.prosa > h3 + *{ margin-top: .6em; }

.prosa > * + .prosa-subtitulo{ margin-top: clamp(26px, 3.2vw, 36px); }

/* El título de sección, cuando manda una página entera y no la cabecera de una tarjeta.
   Crece —1,22 rem era el cuerpo de un título dentro de una tarjeta, y acá es lo más grande
   de la página después del de la portadilla— y se separa con una línea al canto.

   La línea es el único adorno que se permite esta sección: divide una página larga en
   partes que se cuentan de un vistazo sin agregar ni una caja ni un color. */
.prosa > .bloque-titulo{
	font-size: clamp(1.32rem, 2.2vw, 1.6rem);
	line-height: 1.2;
	text-wrap: balance;
}

.prosa > * + .bloque-titulo{
	margin-top: clamp(38px, 4.6vw, 54px);
	padding-top: clamp(26px, 3vw, 34px);
	border-top: 1px solid var(--linea);
}

/* El ritmo entre bloques que se apilan uno debajo de otro en el flujo normal.

   El `.tarjeta + .tarjeta` va calificado con `.prosa-caja >` a propósito, y conviene no
   quitarle esa calificación: sin ella alcanzaba a cualquier tarjeta que tuviera otra
   delante, incluidas las que coloca una rejilla. Dentro de una rejilla la separación la
   pone `gap`, así que ese margen no separaba nada: empujaba hacia abajo a todas las
   tarjetas menos a la primera. En una fila de tres noticias, la primera quedaba 44 px más
   arriba que sus hermanas —medido: 1614 contra 1658— y las tres terminaban al ras, que es
   lo que delataba el desajuste. Eran 41 tarjetas en nueve páginas.

   Las tarjetas que sí se apilan en el flujo viven todas dentro de .prosa-caja: las de
   /ordenanzas/ y /convocatorias/. Son las únicas que necesitan el margen. */
.prosa + .bloques-duo,
.prosa + .atajos-rejilla,
.bloques-duo + .prosa,
.bloques-duo + .bloques-duo,
.prosa-caja > .tarjeta + .tarjeta,
.prosa-nota + .tarjeta,
.cabeza + .tarjeta{ margin-top: clamp(28px, 4vw, 44px); }

.prosa-subtitulo{
	margin: 22px 0 10px;
	font-size: 1rem;
	font-weight: 700;
	letter-spacing: -.02em;
}

/* La nota al pie de un bloque de texto: lo que matiza lo anterior sin ser parte del hilo
   principal. Se marca con una línea verde al costado en lugar de achicar la letra. */
.prosa-nota{
	max-width: 52ch;
	padding-left: 18px;
	border-left: 3px solid var(--verde-tenue);
	font-size: .92rem;
	color: var(--tinta-2);
}

/* Las listas numeradas de las funciones. El número va en verde y colgado al margen: la
   lista se recorre por el número cuando alguien busca "el numeral 7". */
.prosa-lista{
	display: grid;
	gap: 12px;
	margin: 0;
	padding: 0;
	list-style: none;
	counter-reset: punto;
}

.prosa-lista li{
	position: relative;
	padding-left: 34px;
	font-size: .95rem;
	line-height: 1.62;
}

.prosa-lista li::before{
	counter-increment: punto;
	content: counter(punto) ".";
	position: absolute;
	left: 0;
	top: 0;
	font-size: .84rem;
	font-weight: 700;
	color: var(--verde);
	font-variant-numeric: tabular-nums;
}

/* La misma lista sin numerar, para lo que no es una enumeración legal. */
.prosa-lista.is-puntos li::before{
	content: "";
	top: .62em;
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background: var(--verde);
}

/* Dos bloques uno al lado del otro. Es la disposición de casi toda página interna: el
   texto principal y lo que lo respalda. */
.bloques-duo{
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 24px;
	align-items: start;
}

.atajos-rejilla.is-duo{ grid-template-columns: repeat(2, minmax(0, 1fr)); }

/* La norma que respalda un bloque, al lado de su título. No es un botón ni un enlace:
   es la cita, y se ve como una cita. */
.marca-norma{
	flex: 0 1 auto;
	min-width: 0;
	padding: 5px 12px;
	font-size: .7rem;
	font-weight: 700;
	letter-spacing: .05em;
	text-transform: uppercase;
	color: var(--verde);
	background: var(--verde-tenue);
	border-radius: 999px;
	text-align: center;
}

/* Lo que todavía no está publicado se dice en gris, no en verde: el verde es del portal
   y marcaría como logro lo que es una falta. */
.marca-norma.is-pendiente{
	color: var(--tinta-2);
	background: var(--gris-tenue);
}

/* El pie de un bloque, cuando en realidad va arriba del contenido y no debajo. */
.bloque-pie.is-arriba{ margin-top: 0; margin-bottom: 18px; font-size: .92rem; }

.bloque-cabeza + .prosa-lista,
.bloque-cabeza + .tabla-caja{ margin-top: 4px; }

.bloque > .enlace{ align-self: flex-start; margin-top: 18px; }
.bloque > .boton{ align-self: flex-start; margin-top: 24px; }

/* ---- Fichas de persona ----
   Las mismas tarjetas de la mesa directiva de la portada, acá en rejilla de cuatro y con
   las redes de cada diputado debajo del partido. */
.mesa-rejilla.is-cuatro{ grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 24px; }

.miembro.is-grande .miembro-retrato{ aspect-ratio: 1 / 1; }

.diputado .miembro-retrato{ aspect-ratio: 1 / 1; }
.diputado .miembro-cuerpo{ padding: 20px 22px 22px; }
.diputado .miembro-nombre{ font-size: 1.06rem; }

/* La fila de redes de una ficha: los mismos círculos del pie, más chicos. */
.social.is-chico{ margin-top: 14px; gap: 8px; }
.social.is-chico a{ width: 32px; height: 32px; }
.social.is-chico svg{ width: 15px; height: 15px; }

/* La ficha se esconde igual que una noticia cuando el filtro la deja afuera: el script
   es el mismo y trabaja sobre .noticia, así que la clase viaja con la tarjeta. */
.mesa-rejilla .noticias-vacio{ grid-column: 1 / -1; }

/* ---- Periodos de sesiones ---- */
.periodos{ display: grid; gap: 14px; list-style: none; }

.periodo{
	display: grid;
	gap: 4px;
	padding-left: 16px;
	border-left: 3px solid var(--verde-tenue);
}

.periodo-titulo{ font-size: .95rem; font-weight: 700; letter-spacing: -.02em; }
.periodo-texto{ font-size: .9rem; color: var(--tinta-2); line-height: 1.6; }

.periodos-rejilla{
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: 20px;
}

.periodo-ficha{ padding: 26px 24px; }
.periodo-ficha .periodo-titulo{ display: block; margin-bottom: 8px; font-size: 1.05rem; }
.periodo-ficha:hover{ transform: translateY(-8px); box-shadow: var(--sombra-3); }

/* ---- Comisiones ---- */
.comision-materia{
	margin-bottom: 20px;
	font-size: .92rem;
	color: var(--tinta-2);
}

.integrantes{ display: grid; gap: 12px; list-style: none; }

.integrante{ display: flex; align-items: center; gap: 12px; }

.integrante-retrato{
	flex: none;
	width: 44px;
	height: 44px;
	overflow: hidden;
	border-radius: 50%;
	background: linear-gradient(150deg, var(--verde-vivo), var(--verde-hondo));
}

.integrante-retrato img{ width: 100%; height: 100%; object-fit: cover; }

.integrante-texto{ display: grid; gap: 2px; }
.integrante-texto strong{ font-size: .94rem; font-weight: 600; letter-spacing: -.02em; }

.integrante-texto small{
	font-size: .74rem;
	font-weight: 700;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--verde);
}

/* La transmisión, cuando es lo principal de la página y no una tarjeta más de la fila. */
.vivo.is-ancho{ grid-column: span 2; }

/* ---- Tablas de documentos ----
   Lo que manda el servidor es una tabla, y tiene que seguir siéndolo: de ahí saca el panel
   qué ranura le toca a cada PDF y dónde va cada texto corregido. Lo que se ve en un
   navegador con JavaScript son los cuadros de más abajo —`documentos.js` lee esta tabla y
   la reemplaza—, así que estas reglas son las que valen cuando eso no corre.

   Y siguen valiendo: sin JavaScript la tabla se lee y se usa igual que siempre.

   El argumento viejo —"una tabla y no tarjetas, porque cien ordenanzas en tarjetas son
   imposibles de recorrer"— era cierto mientras no hubiera con qué buscar. Con el campo de
   arriba ya nadie recorre: escribe. Lo que gana el cuadro es que el estado se vea sin
   leerlo, que es lo que una tabla de tres columnas nunca hizo bien.

   La tabla no se parte: se arrastra de costado dentro de esta caja. El arrastre se queda
   acá adentro —igual que en la tira de categorías—: al llegar al extremo, el teléfono se
   lo daba al navegador y lo leía como el gesto de "atrás". */
.tabla-caja{ overflow-x: auto; overscroll-behavior-x: contain; margin: 0 -6px; padding: 0 6px; }

/* Una vigencia sin documentos todavía no se muestra: una tarjeta con el título y una tabla
   vacía debajo se lee como un error de carga. La tabla existe en el HTML para que la
   plataforma pueda cargarle filas; en cuanto el servidor inyecta la primera, el <tbody>
   deja de estar vacío y la tarjeta aparece sola. */
.bloque:has(tbody[data-docs]:empty){ display: none; }

/* El aviso de una página cuyas tablas están todas vacías. Se va con la primera fila. */
.prosa-caja:has(tbody[data-docs]:not(:empty)) .docs-vacio{ display: none; }

.tabla-doc{
	width: 100%;
	min-width: 520px;
	border-collapse: collapse;
	font-size: .92rem;
}

.tabla-doc th,
.tabla-doc td{
	padding: 13px 14px;
	text-align: left;
	vertical-align: top;
	border-bottom: 1px solid var(--linea);
}

.tabla-doc thead th{
	font-size: .72rem;
	font-weight: 700;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--tinta-2);
	border-bottom-width: 2px;
}

.tabla-doc tbody th{ font-weight: 600; letter-spacing: -.02em; }
.tabla-doc tbody tr:last-child th,
.tabla-doc tbody tr:last-child td{ border-bottom: 0; }

.tabla-doc tbody tr{ transition: background-color .25s ease; }
.tabla-doc tbody tr:hover{ background: var(--verde-tenue); }

.doc-fecha{ white-space: nowrap; font-variant-numeric: tabular-nums; }
.doc-estado{ white-space: nowrap; }

/* El documento que todavía no se subió. Dice lo que pasa en lugar de ofrecer un enlace
   que no lleva a ninguna parte: un enlace muerto en un portal público se lee como
   información escondida. */
.pendiente{
	display: inline-block;
	padding: 4px 11px;
	font-size: .72rem;
	font-weight: 600;
	letter-spacing: .03em;
	color: var(--tinta-2);
	background: var(--gris-tenue);
	border-radius: 999px;
}

/* El documento que sí está. Es la misma píldora, en verde y clicable: la fila no cambia
   de forma cuando se le carga el PDF, sólo de color, y las dos se leen de un vistazo en
   una tabla de veintiocho renglones.

   Lleva su propio fondo y su propio color y no depende de :has() para verse bien. Un
   navegador que no lo soporte pinta la píldora gris con el enlace verde adentro, que
   sigue siendo legible y sigue siendo clicable; el :has() de abajo es lo que además le
   saca el gris. */
.doc-link{
	display: inline-flex;
	align-items: center;
	gap: 7px;
	font-size: .72rem;
	font-weight: 700;
	letter-spacing: .03em;
	color: var(--verde);
	text-decoration: none;
	white-space: nowrap;
}

.doc-link:hover{ text-decoration: underline; }

/* Cuánto pesa, al lado del "Ver PDF". Va en la página y no sólo en el panel porque el
   tamaño es lo que decide si alguien con datos móviles lo abre ahora o después. */
.doc-peso{
	font-weight: 500;
	font-variant-numeric: tabular-nums;
	color: var(--tinta-2);
}

/* La píldora que contiene un enlace deja de ser la de "pendiente". El span sigue siendo
   el mismo elemento del HTML —es el que lleva la clave con la que se edita ese texto— así
   que lo que cambia es cómo se pinta, no qué etiqueta es. */
.pendiente:has(> .doc-link){
	background: var(--verde-tenue);
	padding: 4px 12px;
}

/* Las ponencias, detrás del documento principal y en la misma celda. */
.doc-anexos{
	display: inline-flex;
	flex-wrap: wrap;
	gap: 4px 12px;
	margin-left: 10px;
}

.doc-anexo{ color: var(--verde); }

/* ---- Los documentos, en cuadros ----
   Lo que se ve de verdad en estas tres páginas. Lo arma `documentos.js` leyendo la tabla
   de arriba y poniéndose en su lugar.

   La forma es la misma del panel de administración —un cuadro por documento, con el estado
   en el borde izquierdo— y eso es a propósito: quien sube un PDF desde el panel tiene que
   reconocer en el portal lo que acaba de publicar, sin traducir de una pantalla a otra. */

/* ---- El buscador ---- */

.docs-barra{
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 12px;
	margin-bottom: 22px;
}

.docs-buscar{
	position: relative;
	flex: 1 1 280px;
	min-width: 0;
}

.docs-buscar-campo{
	width: 100%;
	padding: 15px 44px 15px 46px;
	font-family: inherit;
	/* Los 16 px son los de iOS: por debajo, Safari acerca la página sola al enfocar y deja
	   al lector dentro de un formulario ampliado del que tiene que salir pellizcando. */
	font-size: max(16px, .95rem);
	color: var(--tinta);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: 999px;
	outline: none;
	box-shadow: var(--sombra-1);
	transition: border-color .25s var(--curva-2), box-shadow .25s var(--curva-2);
}

.docs-buscar-campo::placeholder{ color: var(--tinta-2); }

.docs-buscar-campo:focus{
	border-color: var(--verde);
	box-shadow: var(--sombra-2);
}

/* El navegador dibuja su propia "x" en un input[type=search] y queda encima de la nuestra,
   que además sabe devolverle el foco al campo. */
.docs-buscar-campo::-webkit-search-cancel-button{ display: none; }

.docs-buscar-icono{
	position: absolute;
	top: 50%;
	left: 18px;
	width: 17px;
	height: 17px;
	transform: translateY(-50%);
	fill: none;
	stroke: var(--tinta-2);
	stroke-width: 2;
	stroke-linecap: round;
	pointer-events: none;
}

.docs-buscar-limpiar{
	position: absolute;
	top: 50%;
	right: 8px;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 34px;
	transform: translateY(-50%);
	font-family: inherit;
	font-size: 1.15rem;
	line-height: 1;
	color: var(--tinta-2);
	background: transparent;
	border: 0;
	border-radius: 50%;
	cursor: pointer;
	transition: color .2s, background .2s;
}

.docs-buscar-limpiar:hover{ color: var(--tinta); background: var(--gris-tenue); }

/* Un interruptor y no dos botones: los estados son dos y uno de ellos es el normal.
   "Todos" no necesita su propio botón cuando apagar éste es exactamente eso. */
.docs-filtro{
	flex: 0 0 auto;
	padding: 13px 20px;
	font-family: inherit;
	font-size: .84rem;
	font-weight: 600;
	color: var(--tinta-2);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: 999px;
	cursor: pointer;
	white-space: nowrap;
	transition: color .25s var(--curva), background .25s var(--curva), border-color .25s var(--curva);
}

.docs-filtro:hover{ color: var(--tinta); border-color: var(--verde); }

.docs-filtro[aria-pressed="true"]{
	color: #fff;
	background: var(--verde);
	border-color: var(--verde);
}

[data-theme="dark"] .docs-filtro[aria-pressed="true"]{ color: var(--verde-noche); }

.docs-cuenta{
	flex: 0 0 auto;
	margin-left: auto;
	font-size: .86rem;
	color: var(--tinta-2);
	white-space: nowrap;
}

/* ---- La rejilla ---- */

.docs-rejilla{
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(min(270px, 100%), 1fr));
	gap: 14px;
	list-style: none;
}

.docs-vacio{
	padding: 28px 4px;
	font-size: .92rem;
	color: var(--tinta-2);
}

/* Cuando el filtro no deja nada en toda la página. Va en su propia tarjeta porque los
   bloques que lo rodean se escondieron: un renglón de texto suelto sobre el fondo, donde
   antes había tres tarjetas, se lee como que la página se rompió. */
.docs-nada{
	padding: 34px 26px;
	font-size: .95rem;
	color: var(--tinta-2);
	text-align: center;
	background: var(--tarjeta);
	border: 1px solid var(--linea);
	border-radius: var(--radio-2);
}

/* El cuadro. El borde izquierdo es el estado: verde cuando el documento está y el mismo
   hilo que el resto del contorno cuando falta. Es lo que deja ver de un vistazo cuánto hay
   publicado sin leer una sola ficha.

   La que no lo tiene no lleva un gris propio, que sobre blanco casi no se distingue del
   verde apagado ni del borde: lleva nada, y el acento es lo que se nota. */
.docs-ficha{
	display: flex;
	flex-direction: column;
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-left: 3px solid var(--linea);
	border-radius: var(--radio-3);
	overflow: hidden;
	transition: transform .3s var(--curva), box-shadow .3s var(--curva), border-color .3s var(--curva);
}

.docs-ficha.is-lista{ border-left-color: var(--verde); }

.docs-ficha.is-lista:hover{
	transform: translateY(-3px);
	box-shadow: var(--sombra-2);
}

/* El cuerpo de una ficha con documento es el botón que lo abre: presionar "el cuadro"
   tiene que ser presionar el cuadro entero, no cazar un enlace adentro. El enlace de
   siempre queda en el pie, para quien lo quiere en una pestaña aparte.

   Van separados y no anidados porque un botón dentro de otro no es HTML válido, y el
   navegador lo desarma justo donde peor conviene. */
.docs-ficha-cuerpo{
	display: flex;
	flex: 1;
	flex-direction: column;
	align-items: flex-start;
	gap: 9px;
	width: 100%;
	padding: 18px 19px 15px;
	font-family: inherit;
	text-align: left;
	background: transparent;
	border: 0;
}

button.docs-ficha-cuerpo{ cursor: pointer; }
button.docs-ficha-cuerpo:hover{ background: var(--verde-tenue); }

button.docs-ficha-cuerpo:focus-visible{
	outline: 2px solid var(--verde);
	outline-offset: -3px;
}

/* La píldora de estado, la misma forma que ya usaba la tabla. */
.docs-ficha-marca{
	display: inline-block;
	padding: 4px 12px;
	font-size: .72rem;
	font-weight: 700;
	letter-spacing: .03em;
	color: var(--verde);
	background: var(--verde-tenue);
	border-radius: 999px;
	white-space: nowrap;
}

.docs-ficha-marca.is-espera{
	font-weight: 600;
	color: var(--tinta-2);
	background: var(--gris-tenue);
}

.docs-ficha-nombre{
	font-size: .96rem;
	font-weight: 600;
	line-height: 1.4;
	letter-spacing: -.01em;
	color: var(--tinta);
	/* El número de una ordenanza no se parte a mitad de palabra; un nombre de informe largo
	   sí tiene que poder cortarse antes que estirar el cuadro y romper la rejilla. */
	overflow-wrap: anywhere;
}

.docs-ficha-dato{
	margin-top: auto;
	padding-top: 4px;
	font-size: .82rem;
	color: var(--tinta-2);
	font-variant-numeric: tabular-nums;
}

.docs-ficha-pie{
	display: flex;
	flex-wrap: wrap;
	gap: 6px 14px;
	padding: 0 19px 16px;
	border-top: 0;
}

/* Lo que el buscador encontró adentro de una ficha. */
.docs-ficha mark{
	padding: 0 2px;
	color: inherit;
	background: var(--verde-tenue);
	border-radius: 4px;
}

/* ---- El visor ----
   El PDF sin salir de la página. Un enlace que se lleva al lector a otra pestaña le cuesta
   volver, y en un cronograma de cuarenta documentos eso se paga cuarenta veces. */
.docs-visor{
	width: min(1080px, calc(100vw - 32px));
	max-width: none;
	max-height: none;
	height: min(90vh, 960px);
	/* El navegador ancla un diálogo modal por las cuatro esquinas; el margen automático es
	   lo que lo centra adentro de ese marco. Sin él se pega arriba a la izquierda en cuanto
	   deja de medir lo que mide la pantalla. */
	margin: auto;
	padding: 0;
	color: var(--tinta);
	background: var(--tarjeta);
	border: 1px solid var(--linea);
	border-radius: var(--radio-2);
	box-shadow: var(--sombra-3);
	overflow: hidden;
}

.docs-visor::backdrop{ background: rgba(4, 28, 21, .66); }

.docs-visor-caja{
	display: grid;
	grid-template-rows: auto 1fr auto;
	height: 100%;
	min-height: 0;
}

.docs-visor-cabeza{
	display: flex;
	align-items: flex-start;
	gap: 16px;
	padding: 20px 22px 16px;
	border-bottom: 1px solid var(--linea);
}

.docs-visor-titulos{ flex: 1; min-width: 0; }

.docs-visor-titulo{
	font-size: 1.1rem;
	font-weight: 600;
	line-height: 1.35;
	letter-spacing: -.02em;
	color: var(--tinta);
	overflow-wrap: anywhere;
}

.docs-visor-sub{
	margin-top: 4px;
	font-size: .86rem;
	color: var(--tinta-2);
	overflow-wrap: anywhere;
}

.docs-visor-cerrar{
	flex: 0 0 auto;
	width: 40px;
	height: 40px;
	font-family: inherit;
	font-size: 1.3rem;
	line-height: 1;
	color: var(--tinta-2);
	background: transparent;
	border: 1px solid var(--linea);
	border-radius: 50%;
	cursor: pointer;
	transition: color .2s, background .2s;
}

.docs-visor-cerrar:hover{ color: var(--tinta); background: var(--gris-tenue); }

.docs-visor-cuerpo{
	min-height: 0;
	background: var(--fondo);
}

.docs-visor-marco{
	display: block;
	width: 100%;
	height: 100%;
	border: 0;
}

/* En un teléfono, donde ningún navegador dibuja un PDF adentro de un marco: en vez de un
   rectángulo en blanco que parece un error, se dice qué pasa. */
.docs-visor-hueco{
	display: flex;
	align-items: center;
	justify-content: center;
	height: 100%;
	padding: 40px 28px;
	text-align: center;
}

.docs-visor-hueco p{
	max-width: 34ch;
	font-size: .92rem;
	color: var(--tinta-2);
}

.docs-visor-pie{
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: flex-end;
	gap: 14px;
	padding: 16px 22px;
	border-top: 1px solid var(--linea);
}

.docs-visor-peso{
	margin-right: auto;
	font-size: .82rem;
	color: var(--tinta-2);
	font-variant-numeric: tabular-nums;
}

/* El mismo corte que usa `documentos.js` para decidir si dibuja el PDF adentro. Por debajo
   no lo dibuja —ningún navegador de teléfono lo hace— así que el visor pasa a ser un
   título, una línea y un botón: estirarlo a nueve décimos de la pantalla para eso deja un
   hueco negro donde debería estar el documento. Acá mide lo que ocupa. */
@media (max-width: 859px){
	/* `fit-content` y no `auto`: el navegador posiciona un <dialog> abierto con showModal()
	   como fijo y con las cuatro esquinas ancladas, y ahí `height: auto` no quiere decir "lo
	   que mida el contenido" sino "todo el hueco que hay entre arriba y abajo". El diálogo
	   se estiraba a los 86vh del max-height con el contenido apretado contra el techo. */
	.docs-visor{
		width: min(420px, calc(100vw - 28px));
		height: fit-content;
		max-height: 86vh;
	}

	/* El `height: 100%` se va con la altura fija. Mientras estaba, el navegador lo resolvía
	   contra el `max-height` de arriba —698 px—, la caja se creía de ese alto y repartía el
	   sobrante entre sus tres filas: la cabecera terminaba midiendo doscientos píxeles para
	   sostener dos renglones de texto. */
	.docs-visor-caja{
		height: auto;
		grid-template-rows: auto auto auto;
	}

	.docs-visor-hueco{ height: auto; padding: 26px 22px 6px; }

	/* Los 44 px del pulgar: es el único modo de salir sin la tecla Esc, que en un teléfono
	   no existe. */
	.docs-visor-cerrar{ width: 44px; height: 44px; }

	/* Con el diálogo angosto, el peso y el botón en el mismo renglón dejan al botón en una
	   franja de cien píxeles. */
	.docs-visor-pie{ justify-content: center; }
	.docs-visor-peso{ margin-right: 0; }
	.docs-visor-pie .boton{ flex: 1 1 100%; justify-content: center; }
}

.convocatoria .bloque-titulo{ max-width: 60ch; }

/* Lo mismo en la franja verde de transparencia, donde el renglón pendiente no es un
   enlace y por lo tanto no se ilumina al pasar por encima. */
.franja-links .is-pendiente{
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	padding: 15px 18px;
	font-size: .98rem;
	font-weight: 500;
	color: rgba(255, 255, 255, .45);
	border-radius: var(--radio-3);
}

.franja-links .is-pendiente small{
	font-size: .7rem;
	font-weight: 700;
	letter-spacing: .06em;
	text-transform: uppercase;
	opacity: .8;
}

/* ---- Una publicación ----
   La foto arriba a todo el ancho de la columna, el texto abajo dentro del ancho de
   lectura. Es el orden en que se mira un boletín: primero qué pasó, después el detalle. */
.nota-caja{ max-width: 860px; }

.nota-foto{
	margin-bottom: clamp(28px, 4vw, 40px);
	overflow: hidden;
	border-radius: var(--radio);
	box-shadow: var(--sombra-2);
}

.nota-foto img{ display: block; width: 100%; height: auto; }

/* El tope de lectura es del texto, no de la caja: la fotografía y el pie siguen usando los
   860 px de ancho de .nota-caja, y sólo los renglones se recortan a la medida en que el
   ojo no pierde la línea. Sin esto el cuerpo de una nota corría los ciento cuatro
   caracteres. */
.nota-cuerpo{ font-size: 1rem; line-height: 1.72; max-width: 52ch; }
.nota-cuerpo p + p{ margin-top: 18px; }

.nota-entrada{
	font-size: 1.16rem;
	font-weight: 500;
	line-height: 1.6;
	letter-spacing: -.01em;
	padding-bottom: 22px;
	margin-bottom: 4px;
	border-bottom: 1px solid var(--linea);
}

/* De dónde salió lo que se está leyendo, cuando el boletín original quedó a medias. Va
   al final del cuerpo y con el mismo gris de las notas al pie. */
.nota-origen{
	max-width: 52ch;
	margin-top: 28px;
	padding: 16px 18px;
	font-size: .86rem;
	color: var(--tinta-2);
	background: var(--tarjeta);
	border-radius: var(--radio-3);
}

.seccion.is-tenue .nota-origen{ background: var(--fondo); }

.nota-pie{
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: 16px 32px;
	margin-top: clamp(32px, 4vw, 44px);
	padding-top: 24px;
	border-top: 1px solid var(--linea);
}

/* ---- Pasos ----
   Un trámite explicado en orden. El número grande en su círculo es lo que permite
   retomarlo sin releer desde arriba. */
.pasos{ display: grid; gap: 22px; list-style: none; }

.paso{ display: flex; align-items: flex-start; gap: 16px; }

.paso-num{
	display: grid;
	place-items: center;
	flex: none;
	width: 38px;
	height: 38px;
	font-size: 1rem;
	font-weight: 800;
	color: #fff;
	background: var(--verde);
	border-radius: 50%;
}

.paso-titulo{ font-size: 1rem; font-weight: 700; letter-spacing: -.02em; }

.paso-texto{
	margin-top: 6px;
	font-size: .94rem;
	line-height: 1.62;
	color: var(--tinta-2);
}

/* El ejemplo literal de lo que hay que escribir. Va en su propia línea y con fondo
   propio: es texto para copiar, no para leer al pasar. */
.paso-ejemplo{
	display: block;
	margin-top: 10px;
	padding: 10px 14px;
	font-size: .9rem;
	font-weight: 600;
	color: var(--tinta);
	background: var(--verde-tenue);
	border-radius: var(--radio-3);
}

/* ---- El mapa ----
   Mismo recuadro que la transmisión. Va de OpenStreetMap y no del servicio de siempre:
   un portal público no debería obligar a aceptar rastreo para saber dónde queda la sede. */
.mapa-marco{
	position: relative;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	border-radius: var(--radio-2);
	background: var(--gris-tenue);
}

.mapa-marco iframe{
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
}

/* ---- Los bloques del constructor ----
   Todo lo que `servidor/bloques-html.js` sabe dibujar y esta hoja todavía no sabía vestir.
   Faltaba media docena de piezas —la cita, la figura, la galería, el separador, el mapa
   incrustado, la rejilla de diputados— y el resultado no era feo: era nada. Un <iframe>
   sin alto declarado mide 150 px por defecto, y una rejilla que no existe apila trece
   retratos a pantalla completa.

   El criterio es el mismo del resto de la sección: la página se lee. Ninguna de estas
   piezas trae caja, sombra ni color propio; todas se apoyan en la línea fina, el verde de
   señalar y el ancho de lectura que ya usa el texto. */

/* La rejilla de fichas. Cuatro por fila en un monitor, y `auto-fill` en lugar de un número
   fijo: la mesa directiva son cuatro personas y los diputados trece, y la misma regla
   tiene que servir para las dos sin dejar una fila coja. */
.miembros-rejilla{
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
	gap: 24px;
}

.miembros-rejilla > *{ min-width: 0; }
.miembros-rejilla .miembro-retrato{ aspect-ratio: 1 / 1; }

/* El recuadro de lo que viene de afuera: un mapa, un video. Mismo marco que la transmisión
   y el mapa de la sede, porque es la misma cosa. */
.incrustado{
	position: relative;
	overflow: hidden;
	border: 1px solid var(--linea);
	border-radius: var(--radio-2);
	background: var(--gris-tenue);
}

.incrustado.is-medio{ aspect-ratio: 16 / 9; }
.incrustado.is-alto{ aspect-ratio: 4 / 3; }

.incrustado iframe{
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
}

/* La cita. Sin comillas dibujadas ni bastardilla: una línea verde al canto y el texto un
   punto más grande alcanzan para decir que lo que se lee es de otro. */
.cita{
	margin: 0;
	padding-left: clamp(18px, 2.4vw, 26px);
	border-left: 3px solid var(--verde);
	font-size: 1.08rem;
	line-height: 1.55;
	color: var(--tinta);
}

.cita cite{
	display: block;
	margin-top: 12px;
	font-size: .86rem;
	font-style: normal;
	font-weight: 600;
	letter-spacing: .02em;
	color: var(--tinta-2);
}

/* La figura y su pie. El pie va debajo y en gris: es la referencia de la imagen, no un
   renglón más del texto. */
.figura{ margin: 0; }

.figura img{
	width: 100%;
	border-radius: var(--radio-2);
	background: var(--gris-tenue);
}

.figura figcaption{
	margin-top: 10px;
	font-size: .84rem;
	line-height: 1.5;
	color: var(--tinta-2);
}

/* La galería: tantas columnas como entren, y las fotos recortadas a un cuadrado para que
   una vertical y una horizontal no desalineen la fila. */
.galeria{
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
	gap: 12px;
}

.galeria img{
	width: 100%;
	aspect-ratio: 1 / 1;
	object-fit: cover;
	border-radius: var(--radio-3);
	background: var(--gris-tenue);
}

/* El separador. Una línea corta y centrada, no una raya de lado a lado: lo que separa dos
   partes de un texto no necesita el ancho entero para decirlo. */
.separador{
	width: 64px;
	height: 1px;
	margin: clamp(30px, 4vw, 44px) auto;
	border: 0;
	background: var(--linea);
}

/* El botón suelto que cierra un bloque. El <p> que lo envuelve no aporta nada salvo el
   flujo, así que lo único que hace falta es que el botón no herede el ancho del párrafo. */
.bloque-boton{ display: flex; }

/* El pie de un bloque: la nota, la fuente y el enlace a la norma. Letra chica y gris, y
   una línea fina arriba que lo despega de lo que cierra. */
.bloque-pie-caja{
	padding-top: 16px;
	border-top: 1px solid var(--linea);
	font-size: .86rem;
	color: var(--tinta-2);
}

.bloque-pie-caja p + p{ margin-top: 6px; }
.bloque-pie-caja a{ color: var(--verde); }

.bloque-fuente{ font-size: .82rem; opacity: .85; }

/* Lo que se ve mientras una sección se llena, y lo que queda si no había nada que poner.
   Centrado y en gris: un hueco vacío sin una línea que lo explique se lee como una página
   rota. */
.vacio{
	padding: clamp(28px, 4vw, 40px) 20px;
	font-size: .92rem;
	color: var(--tinta-2);
	text-align: center;
	border: 1px dashed var(--linea);
	border-radius: var(--radio-2);
}

/* Las tablas de documentos que llena la pantalla —ordenanzas, convocatorias, informes—.
   Sólo el envase: las filas las dibuja `.tabla-doc`, más arriba en esta misma sección. */
.docs-tabla,
.agenda-lista{ display: grid; gap: 14px; }

/* ---- El formulario de PQRSD ----

   Es el único formulario del portal público, y eso le da un problema que no tiene ninguna
   otra pantalla de acá: lo llena una sola vez alguien que nunca lo vio, muchas veces desde
   el teléfono, y muchas veces para algo que importa. No hay segunda oportunidad de
   aprenderlo.

   De ahí las tres decisiones de este bloque:

     · El tipo de solicitud son cinco cuadros y no un desplegable. Elegir mal el tipo es el
       error clásico de un formulario de estos —queja y reclamo se confunden siempre—, y un
       <select> esconde cuatro de las cinco opciones y no tiene dónde poner la línea que
       explica cada una. Acá las cinco se ven a la vez, con su explicación puesta.

     · Los campos van grandes. 13 px de aire arriba y abajo, y 16 px de letra en el
       teléfono: por debajo de eso, Safari hace zoom al enfocar el campo y descoloca la
       página entera. No es una preferencia estética, es la diferencia entre poder escribir
       y tener que pelear con el navegador.

     · El resultado se pinta debajo y no reemplaza al formulario. El código de radicado es
       la única pantalla de este portal que alguien va a fotografiar, así que tiene que
       poder verse sin que nada más se mueva de lugar. */

.pqr-form{
	display: grid;
	gap: clamp(22px, 3vw, 30px);
	margin-top: 26px;
}

/* El <fieldset> trae borde, aire y un ancho mínimo propios del navegador. Acá no se quiere
   ninguno de los tres: el grupo se separa solo con el espacio de la rejilla. El `min-width`
   es el importante — sin él, un fieldset se niega a encogerse dentro de una rejilla y se
   lleva puesto el ancho de la página en el teléfono. */
.pqr-grupo{
	min-width: 0;
	margin: 0;
	padding: 0;
	border: 0;
}

.pqr-legend{
	padding: 0;
	margin-bottom: 14px;
	font-size: .92rem;
	font-weight: 600;
	color: var(--tinta);
}

/* ---- Los cinco tipos ---- */

.pqr-tipos{
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(215px, 1fr));
	gap: 12px;
}

.pqr-tipo{ display: block; cursor: pointer; }

/* El radio de verdad sigue ahí: se esconde a la vista pero no del teclado ni del lector de
   pantalla. Con `display: none` dejaría de ser enfocable y el grupo entero se volvería
   inalcanzable sin ratón, que es la forma más común de romper un formulario creyendo que
   se lo está decorando. */
/* Con `.pqr-form` delante: la regla general `.pqr-form input` (ancho completo, relleno)
   tiene la misma especificidad y va después, así que le ganaba y los radios escondidos
   medían todo el ancho y desbordaban la página de costado. */
.pqr-form .pqr-tipo input,
.pqr-tipo input{
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

.pqr-tipo-caja{
	display: grid;
	gap: 6px;
	height: 100%;
	padding: 16px 18px;
	background: var(--superficie);
	border: 2px solid var(--linea);
	border-radius: var(--radio-3);
	transition: border-color .25s ease, background-color .25s ease, transform .3s var(--curva);
}

.pqr-tipo:hover .pqr-tipo-caja{ border-color: var(--verde); }

.pqr-tipo input:checked + .pqr-tipo-caja{
	background: var(--verde-tenue);
	border-color: var(--verde);
}

/* El foco va sobre el cuadro y no sobre el radio, que no se ve: sin esto, recorrer las
   cinco opciones con el teclado no muestra en cuál se está parado. */
.pqr-tipo input:focus-visible + .pqr-tipo-caja{
	outline: 2px solid var(--verde);
	outline-offset: 3px;
}

.pqr-tipo-nombre{
	font-size: 1rem;
	font-weight: 700;
	color: var(--tinta);
}

.pqr-tipo-pista{
	font-size: .84rem;
	line-height: 1.5;
	color: var(--tinta-2);
}

/* ---- Los campos ---- */

.pqr-rejilla{
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 18px;
}

.pqr-campo{ display: grid; gap: 8px; min-width: 0; }
.pqr-campo.is-ancho{ grid-column: 1 / -1; }

.pqr-rotulo{
	font-size: .9rem;
	font-weight: 600;
	color: var(--tinta);
}

.pqr-rotulo small{
	font-weight: 400;
	color: var(--tinta-2);
}

/* El asterisco de obligatorio. Va en verde y no en rojo: todavía no hay ningún error, y
   pintar de rojo un formulario en blanco es avisar de algo que no pasó. */
.pqr-obliga{
	font-style: normal;
	color: var(--verde);
}

.pqr-form input,
.pqr-form textarea,
.pqr-consulta input{
	width: 100%;
	padding: 13px 16px;
	font-family: inherit;
	font-size: .96rem;
	color: var(--tinta);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: var(--radio-3);
	transition: border-color .25s ease, box-shadow .25s ease;
}

.pqr-form textarea{
	min-height: 150px;
	line-height: 1.6;
	resize: vertical;
}

.pqr-form input:focus,
.pqr-form textarea:focus,
.pqr-consulta input:focus{
	border-color: var(--verde);
	box-shadow: 0 0 0 3px var(--verde-tenue);
}

/* El campo que el navegador marcó como mal llenado, y sólo después de intentar enviar.
   `:user-invalid` y no `:invalid` a propósito: `:invalid` pinta de rojo un campo vacío que
   nadie tocó todavía, o sea el formulario entero apenas se abre. */
.pqr-form input:user-invalid,
.pqr-form textarea:user-invalid{
	border-color: var(--rojo);
}

.pqr-ayuda{
	font-size: .82rem;
	color: var(--tinta-2);
}

.pqr-cuenta.is-tope{ color: var(--rojo); font-weight: 600; }

/* ---- La autorización de datos ---- */

.pqr-acepta{
	display: grid;
	grid-template-columns: auto 1fr;
	gap: 12px;
	align-items: start;
	padding: 18px 20px;
	font-size: .88rem;
	line-height: 1.6;
	color: var(--tinta-2);
	background: var(--tarjeta);
	border-radius: var(--radio-3);
	cursor: pointer;
}

.pqr-acepta input{
	width: 20px;
	height: 20px;
	margin-top: 2px;
	accent-color: var(--verde);
	cursor: pointer;
}

/* ---- Enviar ---- */

.pqr-enviar{
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 18px;
}

.pqr-nota{
	flex: 1 1 260px;
	font-size: .82rem;
	line-height: 1.55;
	color: var(--tinta-2);
}

.boton.is-ocupado{ opacity: .7; cursor: progress; }
.boton:disabled{ cursor: not-allowed; }

/* ---- El resultado ----
   Vacío no ocupa nada: mientras no haya respuesta, no hay hueco que explicar. */
.pqr-salida:empty{ display: none; }

.pqr-panel{
	padding: 22px 24px;
	background: var(--tarjeta);
	border-left: 4px solid var(--linea);
	border-radius: var(--radio-3);
}

.pqr-panel.is-bien{ border-left-color: var(--verde); background: var(--verde-tenue); }
.pqr-panel.is-tramite{ border-left-color: var(--verde-vivo); }
.pqr-panel.is-mal{ border-left-color: var(--rojo); }
.pqr-panel.is-espera{ border-left-color: var(--tinta-2); }

.pqr-panel-titulo{
	font-size: 1.05rem;
	font-weight: 700;
	color: var(--tinta);
}

.pqr-panel-rotulo{
	margin-top: 16px;
	font-size: .76rem;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--verde);
}

.pqr-panel-texto{
	margin-top: 8px;
	font-size: .9rem;
	line-height: 1.6;
	color: var(--tinta-2);
	white-space: pre-line;
}

/* ---- El código de radicado ----
   Lo único que esta página existe para entregar. Va en monoespaciada porque se copia a
   mano y se dicta por teléfono: en una proporcional, un 0 y una O se parecen demasiado
   —por eso ninguno de los dos está en el alfabeto del código— y las mitades no se alinean
   al leerlas de a cuatro. */
.pqr-codigo-rotulo{
	margin-top: 18px;
	font-size: .76rem;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--verde);
}

.pqr-codigo{
	margin-top: 4px;
	font-family: ui-monospace, "SFMono-Regular", "Cascadia Mono", Menlo, Consolas, monospace;
	font-size: clamp(1.3rem, 4.4vw, 1.75rem);
	font-weight: 700;
	letter-spacing: .02em;
	color: var(--verde-hondo);
	word-break: break-all;
}

[data-theme="dark"] .pqr-codigo{ color: var(--verde); }

.pqr-panel-acciones{
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 18px;
}

/* Los botones del panel van más chicos que el de radicar: son la salida de emergencia y el
   accesorio, no la acción principal de la página. */
.pqr-panel-acciones .boton{ padding: 12px 24px; font-size: .9rem; }

/* ---- La ficha de una consulta ---- */

.pqr-ficha{
	display: grid;
	grid-template-columns: auto 1fr;
	gap: 8px 18px;
	margin-top: 16px;
	font-size: .9rem;
}

.pqr-ficha dt{
	font-weight: 600;
	color: var(--tinta-2);
	white-space: nowrap;
}

.pqr-ficha dd{
	margin: 0;
	color: var(--tinta);
	overflow-wrap: anywhere;
}

/* ---- Consultar ----
   El campo y el botón en una línea, y el botón sin encogerse: es corto y no tiene por qué
   ceder espacio al campo, que siempre quiere más. */
.pqr-consulta{
	display: flex;
	flex-wrap: wrap;
	align-items: end;
	gap: 14px;
	margin-top: 22px;
}

.pqr-consulta .pqr-campo{ flex: 1 1 260px; }

.pqr-consulta input{
	font-family: ui-monospace, "SFMono-Regular", "Cascadia Mono", Menlo, Consolas, monospace;
	letter-spacing: .04em;
	text-transform: uppercase;
}

.pqr-consulta input::placeholder{ text-transform: none; letter-spacing: 0; }
.pqr-consulta .boton{ flex: 0 0 auto; }

/* ============================================================
   15. Tamaños de pantalla
   ============================================================ */

/* El mapa, de mayor a menor. Cada corte está donde algo deja de entrar, medido, y no en
   un número redondo elegido de antemano:

     1240  el encabezado completo ya no entra en una fila → el menú pasa a ser un panel
     1180  cuatro accesos rápidos en fila quedan angostos → dos columnas
      980  tres noticias en fila quedan angostas → dos columnas
      860  la firma completa no cabe al lado del menú → sólo el emblema; una columna en
            sesiones y dos en el pie; y el cuerpo de texto sube a 16 px, que es la medida
            de leer de pie y con el brazo estirado
      620  el teléfono: todo a una columna, botones a lo ancho, controles más angostos
   520-620 la excepción del bloque anterior: en una tableta chica o un plegable vuelven las
            dos columnas, porque una tarjeta de 560 px de ancho no es una tarjeta
      400  lo más angosto que se fabrica —o cualquier pantalla con el zoom subido—: los
            controles del encabezado se quedan en 44 px y lo que cede es la firma

   Y dos cortes que no son de ancho: el teléfono acostado (poca altura), donde la portada
   se mide por su contenido y los flotantes se van a la derecha para no tapar los botones;
   y el del botón A+, que agranda el encabezado por encima de la columna en todo el
   escritorio —no sólo hasta 1400 px: la columna mide 1240 igual en un monitor de 1366 que
   en uno de 1920—. */

/* El menú completo y la marca necesitan 1240 px para convivir en una fila —el mismo ancho
   que el contenido, y está medido: a 1200 px la fila se sale por la derecha—. Por debajo,
   el menú pasa a ser un panel: apretar seis secciones en el espacio que sobra las vuelve
   inservibles mucho antes de que dejen de entrar. */
@media (max-width: 1240px){
	.nav-toggle{ display: flex; }

	.nav{
		position: fixed;
		top: 0;
		right: 0;
		bottom: 0;
		z-index: 1200;
		width: min(400px, 88vw);
		flex-direction: column;
		align-items: stretch;
		justify-content: flex-start;
		gap: 0;
		margin: 0;
		padding: calc(var(--tope-alto) + 24px) 24px 40px;
		overflow-y: auto;
		background: var(--superficie);
		box-shadow: -20px 0 60px rgba(6, 42, 32, .18);

		opacity: 0;
		visibility: hidden;
		transform: translateX(100%);
		pointer-events: none;
		transition: transform .45s var(--curva-2), opacity .35s ease, visibility .45s;
	}

	.nav.is-abierto{
		opacity: 1;
		visibility: visible;
		transform: none;
		pointer-events: auto;
	}

	/* Los renglones del panel entran uno tras otro. El retraso está acá, en el CSS, y no
	   en el JavaScript: es una lista de seis elementos que no cambia. */
	.nav > *{
		opacity: 0;
		transform: translateX(22px);
		transition: opacity .4s var(--curva-2), transform .45s var(--curva-2);
	}

	.nav.is-abierto > *{ opacity: 1; transform: none; }
	.nav.is-abierto > *:nth-child(1){ transition-delay: .08s; }
	.nav.is-abierto > *:nth-child(2){ transition-delay: .13s; }
	.nav.is-abierto > *:nth-child(3){ transition-delay: .18s; }
	.nav.is-abierto > *:nth-child(4){ transition-delay: .23s; }
	.nav.is-abierto > *:nth-child(5){ transition-delay: .28s; }
	.nav.is-abierto > *:nth-child(6){ transition-delay: .33s; }

	.nav-link,
	.nav-boton{
		justify-content: space-between;
		width: 100%;
		padding: 16px 0;
		font-size: 1.1rem;
		font-weight: 600;
		border-bottom: 1px solid var(--linea);
	}

	.nav-link::after{ display: none; }
	.nav-grupo{ width: 100%; }
	.nav-grupo::after{ display: none; }

	/* En el panel el desplegable no flota: se abre empujando lo de abajo, que es la única
	   forma de que se pueda leer entero sin tapar el resto del menú. */
	.nav-caja{
		position: static;
		display: none;
		min-width: 0;
		padding: 6px 0 12px;
		background: none;
		border: 0;
		box-shadow: none;
		opacity: 1;
		visibility: visible;
		transform: none;
		pointer-events: auto;
	}

	.nav-grupo.is-abierto .nav-caja{ display: block; }
	.nav-grupo:hover .nav-caja{ display: none; }
	.nav-grupo.is-abierto:hover .nav-caja{ display: block; }

	/* El velo que cubre la página detrás del panel. */
	.nav-velo{
		display: block;
		position: fixed;
		inset: 0;
		z-index: 1100;
		background: rgba(4, 28, 21, .42);
		backdrop-filter: blur(3px);
		-webkit-backdrop-filter: blur(3px);
		border: 0;
		opacity: 0;
		visibility: hidden;
		transition: opacity .35s ease, visibility .35s;
	}

	.nav-velo.is-visible{ opacity: 1; visibility: visible; }

	/* La clase la pone script.js al abrir el panel: la página de atrás se queda quieta
	   mientras está abierto. */
	body.is-trabado{ overflow: hidden; }

	/* La página 404 usa el mismo <nav> pero con dos enlaces y sin botón que lo abra. Si se
	   escondiera como el menú grande quedaría invisible y sin nada que lo muestre. Con dos
	   enlaces la fila entra, así que se queda como en el escritorio. */
	.nav.is-simple{
		position: static;
		width: auto;
		flex-direction: row;
		align-items: center;
		gap: 18px;
		padding: 0;
		overflow: visible;
		background: none;
		box-shadow: none;

		opacity: 1;
		visibility: visible;
		transform: none;
		pointer-events: auto;
	}

	.nav.is-simple > *{ opacity: 1; transform: none; transition: none; }

	.nav.is-simple .nav-link{
		width: auto;
		padding: 6px 0;
		font-size: .96rem;
		border: 0;
	}
}

@media (max-width: 1180px){
	/* Cuatro retratos en fila quedan angostos igual que cuatro accesos rápidos. */
	.mesa-rejilla.is-cuatro{ grid-template-columns: repeat(3, minmax(0, 1fr)); }
	.periodos-rejilla{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.atajos-rejilla.is-duo{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.atajos-rejilla{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.sesiones-rejilla,
	.sesiones-rejilla:has(.vivo){ grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.sesiones-rejilla .vivo{ grid-column: 1 / -1; }
	.pie-rejilla{ grid-template-columns: 1.6fr 1fr 1.4fr; }
	.pie-mapa{ grid-column: 2 / -1; }
}

@media (max-width: 980px){
	.mesa-rejilla.is-cuatro{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.bloques-duo{ grid-template-columns: 1fr; }
	.vivo.is-ancho{ grid-column: 1 / -1; }
	.noticias-rejilla{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.videos-rejilla{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.mesa-rejilla{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.franja-caja{ grid-template-columns: 1fr; }
	.cifras-caja{ grid-template-columns: 1fr 1fr; gap: 24px 8px; }
	.cifra:nth-child(odd)::before{ display: none; }
}

@media (max-width: 860px){
	:root{ --govco-alto: 28px; --tope-alto: 100px; --radio: 22px; }

	:root{ --aire: 20px; }

	.govco-marca{ transform: scale(.86); transform-origin: left center; }

	/* La firma completa —emblema de la corporación y escudo nacional— no cabe al lado del
	   nombre en un teléfono: queda sólo el emblema, que es el que identifica. */
	.marca-img.is-amplio{ display: none; }
	.marca-img.is-compacto{ display: block; height: 36px; }
	.marca-nombre{ font-size: .98rem; }
	.marca-bajada{ font-size: .62rem; }
	.marca{ gap: 10px; }

	.portada{ padding-top: calc(var(--tope-alto) + 28px); padding-bottom: 120px; }
	.portada-texto{ font-size: 1rem; }
	.portada-barra{ margin-top: 40px; }

	/* ---- El cuerpo de texto sube a 16 px ----
	   En el escritorio, un párrafo de 14,4 px se lee sentado y a cincuenta centímetros. En
	   un teléfono se lee de pie, en la calle, con el sol de frente y el brazo estirado: ahí
	   catorce píxeles son un obstáculo, y este es el portal donde alguien busca cómo
	   radicar una petición. Todo lo que es una frase pasa a 16 px; lo que es una etiqueta
	   —versalitas sueltas de dos palabras— se queda más chico, pero no baja de 12,8, que es
	   el punto donde una versalita espaciada deja de leerse de un vistazo. */
	.bajada,
	.atajo-texto,
	.noticia-texto,
	.miembro-texto,
	.pie-texto,
	.vivo-nota,
	.prosa p,
	.prosa li,
	.nota-cuerpo p,
	.nota-cuerpo li{ font-size: 1rem; }

	.bloque-pie,
	.agenda-texto,
	.cifra-pie,
	.nota-origen,
	.pie-legal-nav a,
	.pie-copy,
	.enlace.is-corto{ font-size: .94rem; }

	.etiqueta,
	.miembro-cargo,
	.noticia-marca,
	.vivo-estado,
	.marca-norma,
	.pendiente,
	.integrante-texto small,
	.tabla-doc thead th{ font-size: .8rem; }

	/* El piso para lo que va en <small> suelto: el mes de una fecha o un estado de tres
	   palabras. Diez píxeles en un teléfono, al sol, no se leen. La excepción es el signo de
	   porcentaje de las cifras, que se mide contra el número que acompaña y por eso lleva su
	   propio tamaño en em. */
	small,
	.agenda-fecha small,
	.franja-links .is-pendiente small{ font-size: .78rem; }

	/* La aurora se achica: a este ancho las manchas medidas en vw se comen la pantalla
	   entera y el verde queda plano. */
	.portada-aurora span:nth-child(1){ width: 95vw; height: 95vw; }
	.portada-aurora span:nth-child(2){ width: 85vw; height: 85vw; }
	.portada-aurora span:nth-child(3){ width: 75vw; height: 75vw; }

	.sesiones-rejilla,
	.sesiones-rejilla:has(.vivo){ grid-template-columns: minmax(0, 1fr); }
	.pie-rejilla{ grid-template-columns: 1fr 1fr; gap: 32px; }
	.pie-mapa{ grid-column: auto; }
}

@media (max-width: 620px){
	.mesa-rejilla.is-cuatro{ grid-template-columns: 1fr; }
	.periodos-rejilla{ grid-template-columns: 1fr; }
	.atajos-rejilla.is-duo{ grid-template-columns: 1fr; }

	/* La cabecera de sección interna: el título ocupa el ancho y las migas se parten en
	   dos renglones antes que salirse. */
	.portadilla{ padding-top: calc(var(--tope-alto) + 28px); }
	.portadilla-titulo{ max-width: none; }

	/* El piso del clamp del título lo fijaba el escritorio: 2rem son 32 px, y a 375 px de
	   ancho un nombre de tres palabras se comía dos renglones de 35 px. Acá el piso baja y
	   la medida la pone la pantalla —6.6vw son 24.7 px en el teléfono más común—, con el
	   techo en los mismos 2rem de antes para que a 620 px se vea igual que siempre. */
	.portadilla-titulo{ font-size: clamp(1.5rem, 6.6vw, 2rem); }

	.nota-pie{ flex-direction: column; gap: 12px; }
	.paso{ gap: 12px; }
	.tabla-doc{ min-width: 460px; }
	.atajos-rejilla{ grid-template-columns: 1fr; }
	.noticias-rejilla{ grid-template-columns: 1fr; }
	.videos-rejilla{ grid-template-columns: 1fr; }
	.mesa-rejilla{ grid-template-columns: 1fr; }
	.cifras{ margin-top: -60px; }
	.cifras-caja{ grid-template-columns: 1fr 1fr; padding: 26px 8px; }
	.cifra{ padding: 6px 12px; }

	.portada-titulo{ font-size: clamp(2rem, 9vw, 2.6rem); }
	.portada-botones{ width: 100%; }
	.portada-botones .boton{ width: 100%; }
	.portada-guia{ display: none; }

	/* Los controles del carrusel se angostan para que la fila entera —tres barritas y dos
	   flechas— siga entrando en el ancho de un teléfono. Lo que no se toca es el alto: el
	   botón mide 44 px aunque la raya visible tenga 3, porque es lo que decide si el pulgar
	   acierta. Lo que se recorta es el ancho, que sobra. */
	.portada-barra{ gap: 14px; }
	.portada-punto{ width: 44px; }
	.portada-flecha{ width: 44px; height: 44px; }
	.portada-flechas{ gap: 8px; }

	.pie-rejilla{ grid-template-columns: 1fr; gap: 28px; }
	.pie-legal{ justify-content: flex-start; }

	/* El recuadro de la transmisión. A este ancho, 16/9 da menos alto que el botón con su
	   nota debajo, y el overflow:hidden del marco los cortaba por la mitad. El mínimo sólo
	   manda mientras la proporción se queda corta: en cuanto hay ancho, vuelve a ser 16/9,
	   que es lo que necesita el reproductor. */
	.vivo-marco{ min-height: 200px; }
	.vivo-boton{ width: 52px; height: 52px; }
	.vivo-nota{ font-size: .78rem; }

	/* En 390 px de ancho no entran la firma, el botón de texto, "Ingresar" completo y el
	   menú: el botón de entrar se queda con su flecha y suelta la palabra, que igual está
	   en el pie y en el mapa del sitio. */
	.nav-entrar{ width: 46px; height: 46px; padding: 0; justify-content: center; border-radius: 50%; }
	.nav-entrar span{ display: none; }
	.nav-entrar svg{ width: 18px; height: 18px; }
	.tope-acciones{ gap: 8px; }

	/* Y el nombre pasa a dos renglones. En una sola línea mide más que la mitad de la
	   pantalla y empuja el botón del menú fuera del borde derecho: el menú deja de existir
	   justo en el tamaño donde es la única forma de navegar. */
	.marca{ gap: 8px; min-width: 0; }
	/* El ancho es el que fuerza el corte: un elemento flexible se estira hasta donde le
	   dé el texto, y "Asamblea Departamental" en una línea son ciento cuarenta píxeles. */
	.marca-texto{ max-width: 100px; }
	.marca-nombre{ white-space: normal; font-size: .82rem; line-height: 1.15; }
	.marca-bajada{ font-size: .58rem; letter-spacing: .14em; }
	.marca-img.is-compacto{ height: 32px; }

	/* Los flotantes se achican y se acercan al filo: en 390 px de ancho, un círculo de
	   cincuenta píxeles con veinticuatro de margen tapa contenido. El del dock lo hace en
	   su propia sección —la 16—, porque ahí van juntos el botón y su panel. */
	.arriba{ width: 46px; height: 46px; right: max(16px, env(safe-area-inset-right)); bottom: max(16px, env(safe-area-inset-bottom)); }
	.aviso{ right: max(16px, env(safe-area-inset-right)); bottom: calc(74px + env(safe-area-inset-bottom)); }

	/* ---- El formulario de PQRSD en el teléfono ----

	   Dos columnas de campos a 620 px dan campos de 130 px: no entra un correo. Todo pasa a
	   una sola columna.

	   Los 16 px de los campos NO son una elección de tamaño. Safari en iOS hace zoom al
	   enfocar un campo cuya letra mide menos que eso, y ese zoom no se deshace solo: el
	   resto del formulario queda desplazado a la derecha y hay que arrastrar la página para
	   cada campo siguiente. Con 16 px no hace zoom, y es la única forma de evitarlo sin
	   prohibirlo con `user-scalable=no`, que rompe el acercamiento a mano de quien lo
	   necesita. */
	.pqr-rejilla{ grid-template-columns: 1fr; }
	.pqr-tipos{ grid-template-columns: 1fr; }

	.pqr-form input,
	.pqr-form textarea,
	.pqr-consulta input{ font-size: 16px; }

	/* El botón ocupa el ancho: es la acción de la página, y en el teléfono un botón centrado
	   de doscientos píxeles se busca con el pulgar. */
	.pqr-enviar .boton{ width: 100%; }
	.pqr-consulta .boton{ width: 100%; }

	/* El cuadro del tipo baja de 16 a 14 px de aire lateral, pero no de alto: son cinco
	   objetivos táctiles seguidos y ninguno puede quedar por debajo de 44 px. */
	.pqr-tipo-caja{ padding: 14px 14px; }

	.pqr-panel{ padding: 18px; }
	.pqr-panel-acciones .boton{ width: 100%; }

	/* La ficha en dos columnas deja el valor en una tira de cien píxeles. Acá el rótulo va
	   arriba y el valor debajo, con el ancho entero. */
	.pqr-ficha{ grid-template-columns: 1fr; gap: 2px; }
	.pqr-ficha dt{ margin-top: 10px; }
	.pqr-ficha dd{ margin-bottom: 0; }
}


/* ---- Lo más angosto que se fabrica ----
   Un teléfono chico de 320 px de ancho —o cualquiera con el zoom del navegador subido, que
   es exactamente lo mismo desde acá—. Todo lo que se mide en píxeles fijos y convive en
   una fila tiene que encoger, o algo se sale por la derecha. */
@media (max-width: 400px){
	:root{ --aire: 16px; }

	/* La fila del encabezado: emblema, nombre en dos renglones y tres controles. Los tres
	   se quedan en 44 px —el mínimo de un objetivo táctil, y uno de ellos es el único
	   acceso al menú—, así que lo que cede es el nombre: se parte en dos renglones y el
	   emblema se achica. Medido a 320 px: 28 + 8 + 74 de firma, 144 de controles y 16 de
	   aire a cada lado entran en los 288 disponibles. */
	.redondo,
	.nav-entrar{ width: 44px; height: 44px; }
	.redondo svg{ width: 17px; height: 17px; }
	.tope-acciones{ gap: 4px; }
	.marca-texto{ max-width: 88px; }
	.marca-nombre{ font-size: .78rem; }
	.marca-img.is-compacto{ height: 28px; }
	.marca{ gap: 8px; }

	/* "del Cesar" se va, no se achica. Para que entrara al lado de tres controles de 44 px
	   había que bajarlo a 8,6 px, y un renglón de ocho píxeles no es información: es una
	   mancha gris que ocupa lugar. El escudo y "Asamblea Departamental" identifican igual,
	   y el nombre completo sigue en el pie de todas las páginas. */
	.marca-bajada{ display: none; }

	/* Las cifras pasan a una columna: en dos, el renglón del pie queda de tres palabras de
	   ancho y se parte en cinco líneas. */
	.cifras-caja{ grid-template-columns: 1fr; gap: 22px; padding: 24px 16px; }
	.cifra{ padding: 0; }
	.cifra + .cifra::before{ display: none; }

	.portada-punto{ width: 40px; }
	.atajo{ padding: 26px 22px 28px; }
	.bloque{ padding: 22px; }
	.noticia-cuerpo{ padding: 20px 20px 22px; }
	.franja-caja{ padding: 28px 20px; }
}

/* ============================================================
   15 bis. El teléfono, diseñado como teléfono
   ============================================================ */

/* Hasta acá, la versión angosta era la de escritorio apilada: las mismas piezas, el mismo
   aire, todo en una columna. Medido en un teléfono de 375 × 812, eso daba una portada de
   10.155 px —doce pantallas y media— con un pie de 1.440 px, que son casi dos pantallas
   de enlaces.

   Este bloque la rediseña con otro criterio: en una pantalla que se recorre con el pulgar,
   el espacio vertical es el recurso escaso. Cada pieza se pregunta si vale lo que ocupa y,
   si no, se compacta. Nada se pierde: lo que sale de un lado entra en otro donde estorba
   menos.

   Las cuatro decisiones de fondo:

     · La barra de arriba se queda con la firma y el botón del menú. Los tres controles que
       la llenaban —tamaño de texto, tema y "Ingresar"— se mudan adentro del panel, que es
       donde hay lugar de sobra y donde se los va a buscar. Los mueve script.js y no el
       HTML: son catorce páginas con la misma cabecera.
     · Lo que en el escritorio es una tarjeta con foto grande, acá es una fila: la imagen a
       la izquierda y el texto al lado. Una noticia pasa de 550 px de alto a 120.
     · Lo que se enumera de a cuatro —accesos, cifras— va en dos columnas. Cuatro tarjetas
       apiladas son cuatro pantallas de pulgar para decir cuatro palabras.
     · El aire entre secciones baja de 64 a 44 px. En una pantalla de 812, sesenta y cuatro
       píxeles arriba y abajo de cada sección son un octavo del recorrido en blanco. */

@media (max-width: 620px){

	/* ---- La barra de arriba ----
	   Dos cosas: quién es y cómo se navega. Con los controles afuera, la firma recupera su
	   tamaño y vuelve a leerse de un vistazo.

	   El nombre en un solo renglón entra a partir de 361 px; por debajo vuelve a partirse en
	   dos, que es preferible a recortarlo contra el botón del menú —medido: a 320 px, la
	   fila pedía 26 px más de los que hay—. */
	.marca-texto{ max-width: none; }
	.marca-nombre{ font-size: 1rem; white-space: nowrap; }
	.marca-bajada{ display: block; font-size: .6rem; }
	.marca-img.is-compacto{ height: 34px; }
	.marca{ gap: 10px; }
	.tope-acciones{ gap: 8px; }

	/* Mientras esté en la barra —en el 404, que no tiene panel al que mudarse, y en
	   cualquier página durante el instante anterior a que corra el script— el botón de
	   entrar se queda con su flecha y suelta la palabra. Con el nombre entero no entra al
	   lado de la firma en una pantalla de 320: se recortaba 19 px. Adentro del panel
	   recupera el nombre, que es donde hay lugar. */
	.tope-acciones .nav-entrar{
		width: 44px;
		height: 44px;
		padding: 0;
		justify-content: center;
		border-radius: 50%;
	}

	.tope-acciones .nav-entrar span{ display: none; }

	/* Y en el 404 se cae el "Inicio" suelto de su cabecera corta: con la firma y el boton
	   de entrar, la fila pedia 323 px donde hay 288. Es el unico prescindible de los tres
	   —el escudo ya lleva a la portada y la pagina tiene su propio boton para volver. */
	.nav.is-simple .nav-link{ display: none; }

	/* ---- "Ingresar", adentro del panel ----
	   Lo coloca script.js en pantalla angosta: en la barra de arriba sólo entran la firma y
	   el botón del menú, y adentro del panel éste va entero y con su nombre, que es donde
	   no compite con nada.

	   Antes lo acompañaban el botón del tema y el del tamaño de letra. Los dos se mudaron
	   al dock de la sección 16, que está a la vista en todas las pantallas: una preferencia
	   de lectura escondida detrás de un menú que hay que abrir no la encuentra quien la
	   necesita. */
	.nav-extra{
		margin-top: 26px;
		padding-top: 22px;
		border-top: 1px solid var(--linea);
	}

	.nav-extra .nav-entrar{
		display: flex;
		width: auto;
		height: auto;
		justify-content: center;
		padding: 15px 22px;
		font-size: 1rem;
		border-radius: 999px;
	}

	.nav-extra .nav-entrar span{ display: inline; }
	.nav-extra .nav-entrar svg{ width: 17px; height: 17px; }

	/* ---- La portada ----
	   Deja de ocupar la pantalla entera: con la barra fija arriba, 100svh obliga a
	   desplazar dos veces antes de enterarse de que abajo hay algo más. Y de los dos
	   botones sólo uno se comporta como botón; el otro pasa a ser un enlace, que es lo que
	   siempre fue en la jerarquía. */
	.portada{
		min-height: min(86svh, 660px);
		padding-top: calc(var(--tope-alto) + 24px);
		padding-bottom: 96px;
	}

	.portada-sello{ padding: 7px 14px; font-size: .72rem; }
	.portada-titulo{ margin-top: 18px; font-size: clamp(1.9rem, 8.4vw, 2.4rem); }
	.portada-texto{ margin-top: 14px; }
	.portada-botones{ gap: 10px; margin-top: 26px; }

	.portada-botones .boton.is-linea{
		width: auto;
		padding: 6px 0;
		background: none;
		border: 0;
		text-decoration: underline;
		text-underline-offset: 5px;
	}

	/* Las flechas se van: el gesto de esta pantalla es arrastrar, y las barritas ya dicen
	   cuántos destacados hay y en cuál se está. */
	.portada-flechas{ display: none; }
	.portada-barra{ margin-top: 28px; }

	/* ---- Las cifras ----
	   Dos por fila siempre. En una columna, cuatro números ocupaban una pantalla entera
	   para decir cuatro datos que se leen de un golpe. */
	.cifras{ margin-top: -40px; }
	.cifras-caja{ grid-template-columns: 1fr 1fr; gap: 20px 8px; padding: 24px 12px; }
	.cifra{ padding: 0 10px; }
	.cifra-num{ font-size: 1.9rem; }
	.cifra-pie{ margin-top: 4px; font-size: .84rem; line-height: 1.35; }

	/* ---- Los accesos rápidos ----
	   Cuatro fichas en dos filas. Se quedan el ícono y el nombre: la descripción y el
	   "Consultar" son para el escritorio, donde hay ancho que llenar; acá el nombre del
	   trámite ya dice a dónde lleva y el ícono lo señala antes de leerlo. */
	.atajos{ padding-top: 44px; }
	.atajos-rejilla{ grid-template-columns: 1fr 1fr; gap: 12px; }

	.atajo{
		gap: 10px;
		padding: 18px 14px 20px;
	}

	.atajo-icono{ width: 44px; height: 44px; margin-bottom: 0; border-radius: 14px; }
	.atajo-icono svg{ width: 21px; height: 21px; }
	.atajo-titulo{ font-size: 1.02rem; line-height: 1.25; }
	.atajo-texto,
	.atajo-mas{ display: none; }

	/* ---- Las secciones ----
	   Menos aire arriba y abajo, y la cabecera más pegada a lo que anuncia. */
	.seccion{ padding: 44px 0; }
	.cabeza{ margin-bottom: 24px; gap: 14px; }
	.titulo{ margin-top: 10px; }
	.bajada{ margin-top: 8px; }

	/* ---- La tira de categorías ----
	   Una sola fila que se arrastra, en lugar de dos renglones de píldoras.

	   Se sale hasta el borde de la pantalla a propósito: una tira que termina donde termina
	   el texto parece una fila completa a la que no le falta nada, y la mitad de la gente
	   no descubre que hay más. Cortada por el filo, se lee como lo que es. El margen
	   negativo tiene que ser exactamente el aire del contenedor —de ahí la variable—: con
	   veinte fijos contra un contenedor de dieciséis, la tira sobresalía cuatro píxeles y
	   arrastraba con ella a la sección entera.

	   El degradado de los extremos no es fijo: lo enciende y lo apaga script.js según haya
	   o no contenido escondido de ese lado. Un degradado permanente en el borde derecho
	   miente cuando ya se llegó al final, y no avisa nada cuando lo que quedó escondido
	   está del otro lado. */
	.filtros{
		flex-wrap: nowrap;
		overflow-x: auto;
		scrollbar-width: none;
		gap: 8px;
		margin-inline: calc(var(--aire) * -1);
		padding: 2px var(--aire);
		/* El arrastre horizontal no se contagia a la página ni al gesto de "atrás" del
		   navegador cuando la tira llega a su extremo. */
		overscroll-behavior-x: contain;
	}

	.filtros::-webkit-scrollbar{ display: none; }

	/* Las dos máscaras se combinan en una sola declaración; cada clase enciende la suya.
	   Sin ninguna, la tira se ve entera —que es lo correcto cuando entra sin desplazar. */
	.filtros.is-mas-izquierda{
		-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 28px);
		mask-image: linear-gradient(90deg, transparent 0, #000 28px);
	}

	.filtros.is-mas-derecha{
		-webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 28px), transparent 100%);
		mask-image: linear-gradient(90deg, #000 calc(100% - 28px), transparent 100%);
	}

	.filtros.is-mas-izquierda.is-mas-derecha{
		-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 28px, #000 calc(100% - 28px), transparent 100%);
		mask-image: linear-gradient(90deg, transparent 0, #000 28px, #000 calc(100% - 28px), transparent 100%);
	}

	.filtro{ flex: none; padding: 10px 18px; font-size: .88rem; }

	/* ---- Las noticias ----
	   La tarjeta se acuesta: la foto a la izquierda, la fecha y el titular al lado. Con la
	   foto arriba, cada noticia medía 550 px y tres ocupaban dos pantallas; así entran las
	   tres de un vistazo y se sigue viendo de qué se trata cada una.

	   El resumen se va. En el escritorio acompaña al titular; acá competía con él y era lo
	   primero que nadie leía. */
	.noticias-rejilla{ grid-template-columns: 1fr; gap: 12px; }

	.noticia-liga{
		display: grid;
		grid-template-columns: 116px 1fr;
		align-items: stretch;
		height: auto;
	}

	/* Acostada, la foto la mide su columna y no su proporción. Con aspect-ratio: 1/1 y
	   height: 100% las dos medidas quedaban definidas por la altura de la fila —que la
	   pone el titular— y el cuadrado resultante se salía de los 116 px de su columna:
	   138 px medidos, veintidós encima de la fecha y de la primera letra de cada renglón.
	   Por eso "16 de mayo" se leía "6 de mayo". Con el ancho tomado de la columna y sin
	   proporción que lo contradiga, la foto se recorta sola: es un fondo con cover. */
	.noticia-foto{ aspect-ratio: auto; width: 100%; height: 100%; min-width: 0; }
	.noticia-marca{ display: none; }

	/* Y el cuerpo no empuja la columna desde adentro: un titular sin espacios —una sigla
	   larga, una dirección— arrastraría el 1fr más allá de la tarjeta. */
	.noticia-cuerpo{ min-width: 0; }
	.noticia-titulo{ overflow-wrap: anywhere; }

	.noticia-cuerpo{
		gap: 6px;
		padding: 14px 16px;
		justify-content: center;
	}

	.noticia-fecha{ font-size: .8rem; }
	.noticia-titulo{ font-size: 1rem; line-height: 1.3; }
	.noticia-texto,
	.noticia-mas{ display: none; }

	/* ---- Las sesiones grabadas ----
	   Se acuestan por lo mismo que las noticias, con una diferencia: la miniatura de un
	   video no se puede recortar a un cuadrado sin que deje de reconocerse qué se ve, así
	   que la columna es más ancha y conserva su 16/9.

	   El triángulo se achica pero se queda. En la noticia lo que sobra es la estampilla
	   —el nombre de la sección, que el filtro ya dice—; acá lo que sobra es la duración y
	   el resumen, y lo que no puede faltar es la señal de que eso se reproduce. */
	.videos-rejilla{ grid-template-columns: 1fr; gap: 12px; }

	/* ---- La galería ----
	   Baja a dos columnas y no a una, al revés que las noticias y los videos. Un cuadrado
	   de ancho completo es una foto por pantallazo, y recorrer treinta así es imposible;
	   dos columnas de cuadrados chicos siguen siendo legibles y dejan ver seis de una vez.
	   Lo que se saca es el pie: el título de una foto no se lee de reojo en 160 px, y en el
	   visor está entero. */
	.galeria-rejilla{ grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
	.galeria-pie{ padding: 8px 10px 10px; }
	.galeria-fecha{ display: none; }
	.galeria-titulo{ font-size: .8rem; -webkit-line-clamp: 1; }

	.video-liga{
		display: grid;
		grid-template-columns: 152px 1fr;
		align-items: stretch;
		height: auto;
	}

	.video-foto{ aspect-ratio: 16 / 9; width: 100%; min-width: 0; align-self: center; }
	.video-marca,
	.video-duracion,
	.video-texto{ display: none; }

	.video-play{ width: 38px; height: 38px; }
	.video-play svg{ width: 16px; height: 16px; }

	.video-cuerpo{
		gap: 6px;
		min-width: 0;
		padding: 14px 16px;
		justify-content: center;
	}

	.video-titulo{ font-size: 1rem; line-height: 1.3; overflow-wrap: anywhere; }

	/* El reproductor ocupa el ancho del teléfono: con el margen de escritorio, un video de
	   16/9 quedaba en un recuadro de 240 px de alto. */
	.visor{ width: 96vw; }
	.visor-pie{ padding: 14px 16px 16px; }
	.visor-cerrar{ top: 8px; right: 8px; }

	/* La foto entera y las flechas más chicas y más pegadas al borde. En un teléfono el
	   pulgar llega a los lados y no al centro, así que quedarse ahí es lo correcto; lo que
	   sobra es el tamaño. */
	.visor.is-foto{ max-width: 96vw; }
	.visor-foto img{ max-height: 66vh; }
	.visor-flecha{ width: 36px; height: 36px; font-size: 1.3rem; }
	.visor-flecha.is-antes{ left: 6px; }
	.visor-flecha.is-despues{ right: 6px; }

	/* ---- Lo que no tiene dónde partirse ----
	   Un correo o una dirección larga son una sola palabra para el navegador, y su ancho
	   mínimo arrastra a la caja que los contiene: en /pqrsd/ a 320 px,
	   "secreasambleacesar@gmail.com" estiraba la lista de pasos a 296 px dentro de una
	   columna de 247 y terminaba desplazando la página entera de costado —13 px—. Se les
	   permite cortar en cualquier punto: un correo partido en dos renglones se copia igual,
	   una página que se va de lado no se lee. */
	.paso-texto,
	.paso-texto a,
	.prosa a,
	.nota-cuerpo a,
	.bloque-pie a,
	.franja-links a{ overflow-wrap: anywhere; }

	/* ---- Sesiones ----
	   Las tarjetas ceden relleno; el reproductor se queda como está, que es lo único que
	   justifica su alto. */
	.bloque{ padding: 20px; }
	.bloque-cabeza{ margin-bottom: 14px; }
	.agenda-item{ padding: 10px; gap: 12px; }
	.agenda-fecha{ width: 46px; height: 46px; }
	.participa-link{ padding: 12px 14px; }

	/* ---- Mesa directiva ----
	   La mesa son tres o cuatro personas, y en dos columnas queda una huérfana ocupando
	   media fila. Se acuestan, igual que las noticias: el retrato a la izquierda y el cargo
	   con el nombre al lado. Así da lo mismo cuántos sean —tres, cuatro o cinco—, todas las
	   fichas miden lo mismo y la sección pasa de 969 px a poco más de 400.

	   La excepción es /diputados/, que son doce y donde la cara es el dato: ahí se quedan en
	   dos columnas con el retrato grande, que además con doce no deja a nadie suelto. */
	.mesa-rejilla{ grid-template-columns: 1fr; gap: 12px; }

	.mesa-rejilla:not(.is-cuatro) .miembro{
		display: grid;
		grid-template-columns: 104px 1fr;
		align-items: stretch;
	}

	.mesa-rejilla:not(.is-cuatro) .miembro-retrato{ aspect-ratio: 1 / 1; height: 100%; }

	.mesa-rejilla:not(.is-cuatro) .miembro-cuerpo{
		display: flex;
		flex-direction: column;
		justify-content: center;
		padding: 14px 16px;
	}

	.mesa-rejilla.is-cuatro{ grid-template-columns: 1fr 1fr; }
	.mesa-rejilla.is-cuatro .miembro-retrato{ aspect-ratio: 1 / 1; }

	.miembro-cuerpo{ padding: 14px 14px 16px; }
	.miembro-nombre{ font-size: 1rem; }
	/* El cargo deja de ser una pildora. "PRIMER VICEPRESIDENTE" en versalitas espaciadas
	   mide 176 px y no tiene donde partirse adentro de una capsula: en una ficha de 140 px
	   se salia por el costado —medido: 33 px en /diputados/ a 375—. Como texto suelto parte
	   en el espacio y ocupa dos renglones, que es lo que hace cualquier rotulo largo. */
	/* Con dos columnas en una pantalla de 320, "VICEPRESIDENTE" es una sola palabra mas
	   ancha que la ficha. Se le permite al navegador partirla con guion —las paginas
	   declaran lang="es", asi que corta por silabas y no a la mitad de cualquier modo—, y
	   si no puede, que rompa: preferible una palabra partida a una ficha desbordada. */
	.miembro-cargo,
	.miembro-nombre{ hyphens: auto; overflow-wrap: break-word; }

	.miembro-cargo{
		display: block;
		margin-bottom: 4px;
		padding: 0;
		background: none;
		font-size: .7rem;
		letter-spacing: .06em;
	}
	.miembro-texto{ display: none; }

	/* ---- Transparencia ---- */
	.franja-caja{ padding: 28px 20px; }
	.franja-links a{ padding: 13px 14px; }

	/* ---- El pie ----
	   Era un pie de escritorio de cuatro columnas puesto en fila india: 1.440 px, casi dos
	   pantallas de enlaces para cerrar la página.

	   Acá se arma como una retícula de dos: la firma arriba a todo el ancho, los dos
	   bloques de datos —sede y contacto— uno al lado del otro, y el mapa del sitio abajo,
	   también en dos columnas porque son enlaces de dos palabras. Nada se esconde; lo que
	   cambia es que deja de leerse en fila india. */
	.pie{ padding-top: 40px; }

	.pie-rejilla{
		grid-template-columns: 1fr 1fr;
		gap: 24px 20px;
		padding-bottom: 28px;
	}

	/* La firma y el mapa a todo el ancho; los datos comparten fila. */
	.pie-columna:first-child,
	.pie-mapa{ grid-column: 1 / -1; }

	.pie-titulo{ margin-bottom: 10px; font-size: .98rem; }
	.pie-texto + .pie-titulo{ margin-top: 18px; }
	.pie-texto{ max-width: none; }
	.pie .marca{ margin-bottom: 12px; }
	.social{ margin-top: 14px; }

	/* Un correo largo no tiene dónde partirse, y en media columna de un teléfono se sale
	   por el borde. Se le permite cortar en cualquier punto: preferible una dirección
	   partida en dos renglones que un pie desplazándose de costado. */
	.pie-texto a{ overflow-wrap: anywhere; }

	.pie-nav{
		display: grid;
		grid-template-columns: 1fr 1fr;
		gap: 2px 14px;
	}

	/* Los cuatro enlaces legales, en una columna compacta. Probé ponerlos en dos y salió
	   peor: "Seguridad de la información" no entra en media columna de un teléfono y se
	   parte en dos renglones, así que cuatro enlaces ocupaban cuatro filas igual, pero con
	   la mitad del ancho y el doble de cortes. */
	.pie-legal{ padding-top: 18px; gap: 10px; }

	.pie-legal-nav{
		display: grid;
		gap: 2px;
	}

	.pie-legal-nav a{ padding: 12px 0; font-size: .88rem; }
	.pie-copy{ font-size: .88rem; }

	/* La firma del pie tiene el ancho entero: no compite con nada y no tiene por qué
	   quedarse con los nueve píxeles y medio que necesita arriba, donde sí compite con el
	   botón del menú. Debajo de doce, una versalita espaciada deja de leerse de un vistazo
	   —el mismo piso que se aplica en el resto de la página—. */
	.pie .marca-bajada{ font-size: .78rem; }

	/* ---- El tamaño del dedo ----
	   Lo que se lee con el ojo se acierta con el pulgar, y son dos medidas distintas. Estos
	   cuatro son los blancos que quedaban por debajo de 44 px: las migas, los enlaces de
	   texto con raya, los enlaces del pie y las marcas de las redes. Ninguno cambia de
	   tamaño ni de color; lo que crece es el área que responde al toque, y donde eso movía
	   el dibujo se compensa con un margen negativo del mismo tamaño. */
	.migas{ margin-block: -9px; }

	.migas a{
		display: inline-flex;
		align-items: center;
		min-height: 44px;
		padding: 0 8px;
	}

	/* La raya del enlace la dibuja un ::after anclado al borde de abajo, así que al crecer
	   el relleno hay que subirla otro tanto o se despega del texto. */
	.enlace{ padding-top: 8px; padding-bottom: 12px; }
	.enlace::after{ bottom: 8px; }

	.pie-nav a{ display: inline-flex; align-items: center; min-height: 44px; }
	.social a{ width: 44px; height: 44px; }

	/* La firma de la cabecera: el ancho lo da el nombre, el alto lo daba el renglón. */
	a.marca{ min-height: 44px; }

	/* El segundo botón de la portada es un enlace subrayado, no una cápsula, y por eso se
	   había quedado con el relleno de un renglón de texto. */
	.portada-botones .boton.is-linea{ padding: 11px 0; }

	/* ---- Lo más angosto ----
	   Un teléfono chico, o cualquiera con el zoom del navegador subido. */
	@media (max-width: 360px){
		.marca-nombre{ white-space: normal; font-size: .92rem; }
		.marca-texto{ max-width: 150px; }

		/* "Convocatorias" y "Transparencia" son una sola palabra y no tienen dónde
		   partirse: en una ficha de 110 px de ancho útil se salían por el costado. */
		.atajo-titulo{ font-size: .92rem; }
		.atajo{ padding: 16px 12px 18px; }
	}

	/* Por debajo de 345 px, media columna son 130 px: no alcanza para una dirección ni para
	   un horario, así que los datos vuelven a apilarse. El mapa del sitio se queda en dos,
	   que para enlaces de una o dos palabras sí da. El corte va en 345 y no en 380 porque
	   360 y 375 son los anchos de teléfono más comunes que hay, y en 157 px la dirección
	   entra en dos renglones sin drama. */
	@media (max-width: 345px){
		.pie-rejilla{ grid-template-columns: 1fr; }
		.pie-columna{ grid-column: 1 / -1; }
	}

}

/* ---- El teléfono acostado ----
   Poca altura y mucho ancho: la portada a pantalla completa deja de tener sentido —el
   titular y los botones no entran en 360 px de alto— así que se mide por su contenido, y
   lo que sólo adorna se va. */
@media (max-height: 620px) and (orientation: landscape){
	.portada{
		min-height: 0;
		padding-top: calc(var(--tope-alto) + 24px);
		padding-bottom: 110px;
	}

	.portada-titulo{ font-size: clamp(1.7rem, 4.4vw, 2.4rem); }
	.portada-texto{ margin-top: 14px; }
	.portada-botones{ margin-top: 22px; }
	.portada-barra{ margin-top: 26px; }
	.portada-guia{ display: none; }

	/* El panel del menú se lee entero con la pantalla de lado: en 360 px de alto, seis
	   secciones de sesenta píxeles no entran y hay que poder desplazarlo. */
	.nav{ padding-top: calc(var(--tope-alto) + 12px); padding-bottom: 24px; }
	.nav-link, .nav-boton{ padding: 12px 0; }

	/* Los flotantes se achican. Acostado, la pantalla mide 360 px de alto y cada círculo se
	   come una porción visible de ella; el dock, además, aprieta su panel en la sección 16. */
	.arriba{ width: 42px; height: 42px; }
}

/* ---- Con el texto grande puesto ----
   Sin techo de ancho: la columna del contenido mide 1240 px en un monitor de 1366 y en uno
   de 1920, así que el encabezado agrandado se sale igual en los dos. Una compensación que
   terminara en 1400 dejaría rota justo la mitad de los monitores de escritorio.
   El dock agranda la raíz hasta un 37,5 %, y el encabezado crece con ella: la fila que
   entraba justo a 1240 px pasa a necesitar 1400 en el primer escalón y bastante más en el
   tercero. En esa franja el menú recupera su tamaño normal —sigue siendo legible, y es un
   puñado de palabras— en lugar de salirse de la pantalla o esconderse detrás de un botón
   que a este ancho nadie espera.

   `[data-texto]` a secas, sin valor: los tres escalones necesitan la compensación, y el
   segundo y el tercero más que el primero. */
@media (min-width: 1241px){
	html[data-texto] .nav{ gap: 12px; }
	html[data-texto] .nav-link{ font-size: .8rem; }
	html[data-texto] .nav-entrar{ padding: 10px 15px; font-size: .8rem; }
	html[data-texto] .marca-nombre{ font-size: .9rem; }
	html[data-texto] .marca-img{ height: 36px; }

	/* Pasado el primer escalón ya no alcanza con lo de arriba: en el tercero la raíz mide
	   22 px y los nueve enlaces del menú vuelven a pedir más ancho del que hay. */
	html[data-texto="3"] .nav{ gap: 8px; }
	html[data-texto="3"] .nav-link{ font-size: .74rem; }
	html[data-texto="3"] .marca-nombre{ font-size: .8rem; }
}

/* ---- Pantallas grandes ----
   El contenido no se estira más allá de su ancho, pero la portada sí: es la única pieza a
   sangre, y en un monitor ancho el titular se queda chico contra tanta fotografía. */
@media (min-width: 1600px){
	.portada-titulo{ font-size: 4.6rem; }
	.portada-texto{ font-size: 1.18rem; }
	.portada{ min-height: min(100svh, 900px); }
}

/* ============================================================
   15. La bitácora de un diputado
   ============================================================ */

/* Las páginas del mini blog: la de un diputado y la de una entrada suya. Son las dos
   únicas del portal que el servidor arma —el resto son archivos—, y su contenido sale de
   la base. El cuerpo de una entrada lo dibuja /compartido/noticia.css, igual que el de una
   noticia; acá está sólo lo que las rodea.

   Lo que las distingue de un boletín es que llevan firma: una noticia la publica la
   corporación, una entrada la publica una persona. De ahí que el retrato aparezca dos
   veces —sobre el banner de su perfil y arriba del cuerpo de cada entrada— y que las dos
   cosas lleven al mismo lugar. */

/* ---- El perfil: el banner y la ficha ----
   La cabecera de la página de un diputado. Es la única del portal que no abre con la
   franja verde de `.portadilla`, y la diferencia no es un capricho: las demás páginas
   nombran una sección —"Ordenanzas", "Sesiones"— y ésta nombra a una persona. Abre con
   una fotografía del recinto y el retrato recortado sobre su borde, y todo lo demás —el
   nombre, la bancada, el periodo, las comisiones— cae debajo, sobre el fondo claro de la
   página, que es donde mejor se lee texto.

   Lo que reemplaza: una franja verde con el retrato y el nombre, y una tarjeta blanca
   montada sobre su borde con tres datos en celdas separadas por líneas verticales. Eran
   dos piezas, un fondo, una sombra, un borde y tres divisores para decir seis palabras.
   Acá no hay ninguna caja: lo que separa los datos es espacio, y hay una sola línea en
   toda la cabecera. */

/* Sin `.portadilla` arriba, las dos reglas que gobiernan las páginas internas dejarían de
   alcanzar a ésta: el ancho de lectura de las secciones y el aire entre franjas del mismo
   color. Se enganchan también acá, en lugar de repetirlas. */
.perfil ~ .seccion > .contenedor{ max-width: 980px; }
.perfil ~ .seccion + .seccion:not(.is-tenue){ padding-top: 0; }
.perfil ~ .seccion.is-tenue + .seccion:not(.is-tenue){ padding-top: clamp(64px, 8vw, 100px); }

/* ---- El banner ----
   La fotografía va acá y no en el HTML porque es decoración: no dice nada que la página
   no diga ya con palabras. Quien llegue con las imágenes apagadas —o antes de que cargue—
   se queda con el verde de siempre, que es el color de fondo del bloque.

   Encima lleva un velo verde en degradado, más denso del lado en el que van las migas.
   No es oscurecer por oscurecer: son texto blanco sobre una fotografía, y sin el velo su
   contraste dependería de qué hubiera en ese pedazo de la foto.

   El alto incluye el del encabezado, que flota por encima: descontarlo dejaría el banner
   empezando debajo de una barra translúcida a través de la cual se ve la página. */
.perfil-banner{
	display: flex;
	align-items: flex-start;
	/* El alto no es un gusto: es lo que tiene que entrar. Debajo del encabezado van las
	   migas y, contra el borde de abajo, la mitad de arriba del retrato. Más corto que la
	   suma de las dos cosas y la cara le tapa las migas —que fue exactamente lo que pasó
	   cuando iban abajo—, así que el mínimo deja el alto de las migas más la mitad del
	   retrato más aire entre medio. */
	min-height: calc(var(--tope-alto) + clamp(120px, 13vw, 164px));
	padding-top: calc(var(--tope-alto) + clamp(12px, 1.6vw, 18px));
	background-color: var(--verde-hondo);
	background-image:
		linear-gradient(115deg, rgba(4, 28, 21, .96) 0%, rgba(4, 28, 21, .89) 52%, rgba(4, 28, 21, .8) 100%),
		url("img/portada-corporacion.jpg");
	background-size: cover;
	background-position: center 34%;
}

/* Las migas montan sobre la foto, así que van en el mismo eje que el contenido de abajo y
   no en el del contenedor ancho: desalineadas por sesenta píxeles se leerían como parte
   de otra cosa. */
.perfil-banner > .contenedor,
.perfil-caja{ max-width: calc(980px + var(--aire) * 2); }

.perfil-caja{ padding-bottom: clamp(32px, 4.5vw, 48px); }

/* ---- El retrato ----
   Monta sobre el banner: sube la mitad de su alto, así que la línea donde termina la
   fotografía le pasa por el medio.

   El aro que lo rodea es del color del fondo de la página y no blanco, y de ahí sale el
   recorte: contra la foto se lee como un agujero por el que asoma la cara, que es
   exactamente lo que es. Blanco sería una pieza pegada encima. */
.perfil-retrato{
	--perfil-retrato: clamp(104px, 12vw, 136px);

	position: relative;
	z-index: 2;
	display: block;
	width: var(--perfil-retrato);
	height: var(--perfil-retrato);
	margin-top: calc(var(--perfil-retrato) / -2);
	overflow: hidden;
	border-radius: 50%;
	background: var(--tarjeta);
	box-shadow:
		0 0 0 5px var(--fondo),
		0 14px 34px rgba(6, 42, 32, .22);
}

.perfil-retrato img{
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: top center;
}

/* ---- El nombre ----
   Lo único que hay entre el retrato y la línea: el cargo y el nombre, sin nada al lado.
   Es el renglón por el que alguien llegó a esta página, y lo que lo hace verse grande no
   es el cuerpo de la letra —que es el mismo de cualquier titular— sino que esté solo. */
.perfil-cabeza{ margin-top: clamp(18px, 2.4vw, 24px); }

/* El cargo, sin el punto verde de `.etiqueta`. El punto está para señalar el comienzo de
   una sección en una página que tiene varias; acá arriba hay un solo rótulo y una sola
   persona, y el punto es un adorno de más justo donde hace falta menos. */
.perfil-cargo{
	font-size: .74rem;
	font-weight: 700;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: var(--verde);
}

.perfil-nombre{
	max-width: 24ch;
	margin-top: 8px;
	font-size: clamp(1.75rem, 3.4vw, 2.7rem);
	font-weight: 800;
	letter-spacing: -.04em;
	line-height: 1.08;
	color: var(--tinta);
	text-wrap: balance;
}

/* ---- La franja de abajo ----
   Los datos a la izquierda y el contacto a la derecha, con la única línea de toda la
   cabecera separándolos del nombre. Van juntos porque se consultan juntos: quien baja
   hasta acá ya sabe de quién es la página y viene a lo otro —de qué bancada es, hasta
   cuándo, cómo escribirle—. En dos franjas con su propia línea cada una eso eran tres
   cortes para media pantalla de contenido.

   Alineados por abajo: los datos son dos renglones y el contacto uno, y alineados por
   arriba el correo quedaría flotando a la altura de los rótulos. */
.perfil-fila{
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	justify-content: space-between;
	gap: 18px clamp(24px, 4vw, 48px);
	margin-top: clamp(22px, 3vw, 30px);
	padding-top: clamp(20px, 2.6vw, 26px);
	border-top: 1px solid var(--linea);
}

/* Las redes y el correo, uno al lado del otro. Son dos cosas distintas —una lleva afuera,
   la otra abre el programa de correo— pero se buscan en el mismo momento, así que se
   ofrecen juntas. Los dos altos son el mismo, que es lo que las hace ver como una fila y
   no como dos cosas que quedaron cerca. */
.perfil-contacto{
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px 14px;
}

.perfil-contacto .social{ margin-top: 0; gap: 10px; }

.perfil-contacto .social a{
	width: 38px;
	height: 38px;
	box-shadow: none;
}

.perfil-contacto .social svg{ width: 15px; height: 15px; }

/* El correo, como algo que se aprieta y no como algo que se lee. El sobre lo dibuja el
   mismo trazo fino que el resto de los íconos del portal. */
.perfil-correo{
	display: inline-flex;
	align-items: center;
	gap: 9px;
	height: 38px;
	padding: 0 18px;
	font-size: .88rem;
	font-weight: 600;
	color: var(--verde);
	text-decoration: none;
	/* Fondo de superficie y no `--verde-tenue`, que es lo que usa el resto del portal para
	   esto. El verde tenue está calculado contra el blanco de una tarjeta; acá abajo no hay
	   tarjeta, y sobre el gris verdoso del fondo de la página los dos tonos se parecen
	   tanto que la píldora desaparece y queda un texto verde suelto. */
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: 999px;
	overflow-wrap: anywhere;
	transition: background-color .25s ease, border-color .25s ease, color .25s ease;
}

.perfil-correo:hover{ color: #fff; background: var(--verde); border-color: var(--verde); }

.perfil-correo svg{
	flex: 0 0 auto;
	width: 17px;
	height: 17px;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.7;
	stroke-linecap: round;
	stroke-linejoin: round;
}

/* ---- Los datos ----
   Bancada, periodo y profesión. Cuántos hay lo decide quién tenga cargado qué, así que la
   lista se acomoda sola: van uno al lado del otro y bajan de renglón cuando no caben.
   Entre uno y el siguiente no hay línea ni divisor: alcanza con el espacio. */
.perfil-datos{
	display: flex;
	flex-wrap: wrap;
	gap: 16px clamp(28px, 5vw, 64px);
}

.perfil-dato{ min-width: 0; }

.perfil-dato dt,
.perfil-rotulo{
	font-size: .7rem;
	font-weight: 700;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--tinta-2);
}

.perfil-dato dd{
	margin-top: 5px;
	font-size: 1.02rem;
	font-weight: 600;
	line-height: 1.35;
	color: var(--tinta);
}

/* ---- Las comisiones ----
   Nombres de seis o siete palabras, así que no entran en la fila de datos: van en su
   propio renglón, a lo ancho y como fichitas. */
.perfil-comisiones{
	--chip-aire: 14px;

	margin-top: clamp(24px, 3vw, 32px);
}

/* El margen negativo es el relleno de una fichita. Sin él, la primera empieza catorce
   píxeles a la derecha de su propio rótulo —el relleno la corre— y toda la cabecera, que
   está alineada por una sola columna, tiene un renglón que arranca torcido. */
.perfil-chips{
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin-top: 10px;
	margin-left: calc(var(--chip-aire) * -1);
	padding: 0;
	list-style: none;
}

.perfil-chip{
	padding: 7px var(--chip-aire);
	font-size: .85rem;
	font-weight: 500;
	line-height: 1.35;
	color: var(--verde);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: 999px;
}

/* Con el contraste alto, el velo del banner se cierra. Las migas son el texto con menos
   contraste de la cabecera y es justo el que no puede quedar librado a qué haya debajo. */
html[data-contraste="alto"] .perfil-banner{
	background-image:
		linear-gradient(100deg, rgba(3, 20, 15, .96) 0%, rgba(3, 20, 15, .86) 48%, rgba(3, 20, 15, .76) 100%),
		url("img/portada-corporacion.jpg");
}
html[data-contraste="alto"] .portadilla{
	background-image:
		linear-gradient(100deg, rgba(3, 20, 15, .96) 0%, rgba(3, 20, 15, .86) 48%, rgba(3, 20, 15, .76) 100%),
		var(--portadilla-foto);
}

/* ---- La bitácora sin nada adentro ----
   Una caja con la explicación y una salida, en vez de un renglón suelto en medio del
   espacio: un hueco vacío se lee como una página que se rompió al cargar. */
.bitacora-vacio{
	padding: clamp(32px, 5vw, 48px) clamp(24px, 4vw, 40px);
	text-align: center;
	background: var(--tarjeta);
	border: 1px dashed var(--linea);
	border-radius: var(--radio);
}

.bitacora-vacio-texto{
	font-size: 1.05rem;
	font-weight: 500;
	color: var(--tinta);
}

.bitacora-vacio-pie{
	max-width: 44ch;
	margin: 8px auto 0;
	font-size: .9rem;
	line-height: 1.6;
	color: var(--tinta-2);
}

/* ---- La firma, arriba del cuerpo de una entrada ---- */

/* Es un enlace entero y no sólo el nombre: el retrato y el cargo llevan al mismo sitio, y
   un objetivo de sesenta píxeles se acierta con el pulgar. */
.bitacora-firma{
	display: inline-flex;
	align-items: center;
	gap: 14px;
	margin-bottom: clamp(24px, 3vw, 32px);
	padding: 10px 18px 10px 10px;
	color: inherit;
	text-decoration: none;
	background: var(--tarjeta);
	border-radius: 999px;
	transition: background .2s ease, transform .2s var(--curva);
}

.bitacora-firma:hover{ background: var(--verde-tenue); transform: translateY(-2px); }

.bitacora-firma-retrato{
	display: block;
	flex: none;
	width: 52px;
	height: 52px;
	overflow: hidden;
	border-radius: 50%;
	background: var(--gris-tenue);
}

.bitacora-firma-retrato img{
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: top center;
}

.bitacora-firma-texto{ display: grid; gap: 2px; line-height: 1.3; }
.bitacora-firma-texto strong{ font-size: 1rem; font-weight: 600; }

.bitacora-firma-texto span{
	font-size: .82rem;
	color: var(--tinta-2);
}

/* ---- La tarjeta de un diputado, enlazada ----
   Las tarjetas están escritas a mano en tres páginas y sin enlace; se lo pone `diputados.js`
   con lo que le contesta el servidor. Estas reglas sólo tocan a las que ya lo tienen: sin
   JavaScript, la tarjeta se ve igual que siempre y no pretende ser un botón.

   El <a> envuelve nada más que el nombre —que es lo que el enlace dice— y se estira por
   encima de toda la tarjeta con este pseudo-elemento, para que se pueda apretar en
   cualquier parte. Envolver la tarjeta entera daría un enlace cuyo texto es el retrato, el
   cargo, el nombre, el partido y las redes de corrido; y las redes son enlaces, que no
   pueden vivir adentro de otro enlace. Por eso mismo el ::after va debajo de ellas: si
   quedara encima, taparía el enlace a Facebook. */
.miembro.is-enlazada{ position: relative; }
.miembro.is-enlazada .social{ position: relative; z-index: 2; }

.miembro-liga{
	color: inherit;
	text-decoration: none;
}

.miembro-liga::after{
	content: '';
	position: absolute;
	inset: 0;
	z-index: 1;
	border-radius: inherit;
}

.miembro.is-enlazada:hover .miembro-nombre{ color: var(--verde); }
.miembro-liga:focus-visible{ outline: none; }

/* El foco se dibuja sobre la tarjeta entera y no sobre el renglón del nombre: el área que
   responde es la tarjeta, y un recuadro alrededor de dos palabras señalaría mal dónde se
   va a apretar. */
.miembro.is-enlazada:focus-within{
	outline: 2px solid var(--verde);
	outline-offset: 3px;
}

/* Cuántas publicaciones tiene, cuando tiene. Es la diferencia entre una página con su
   perfil y una que además tiene bitácora. */
.miembro-cuantas{
	display: block;
	margin-top: 8px;
	font-size: .8rem;
	font-weight: 600;
	color: var(--verde);
}

/* En una pantalla angosta el contacto baja del renglón de los datos, y no es sólo que no
   quepa: alineados por abajo, los datos y el contacto se leen como una sola fila; cuando
   se parte, el `space-between` deja al contacto contra el borde derecho de la pantalla,
   descolgado de la columna a la que pertenece. Ocupando el ancho entero vuelve a
   empezar donde empieza todo lo demás. */
@media (max-width: 720px){
	.perfil-fila{ align-items: flex-start; }
	.perfil-contacto{ width: 100%; }
}

@media (max-width: 600px){
	/* El banner se achica y el retrato con él. Entre el banner, las migas, el retrato, el
	   cargo y el nombre, la cabecera se llevaba la mitad de una pantalla de 812 px —y casi
	   dos tercios de una de 667— para decir de quién es la página. A 92 px se sigue
	   reconociendo la cara, que es para lo único que está el retrato. */
	.perfil-banner{ min-height: calc(var(--tope-alto) + 100px); }
	.perfil-retrato{ --perfil-retrato: 92px; }

	/* Los datos, de a dos por renglón y en columnas parejas. Sueltos en una fila que se
	   parte, cada uno ocupaba lo largo de su valor: "Bancada" y "Periodo" arriba y
	   "Profesión" sola abajo, corrida a la izquierda contra el borde de la de arriba. */
	.perfil-datos{
		display: grid;
		grid-template-columns: repeat(2, 1fr);
		gap: 16px 20px;
	}
}

@media (prefers-reduced-motion: reduce){
	.bitacora-firma{ transition: none; }
	.bitacora-firma:hover{ transform: none; }
}

/* ============================================================
   16. Accesibilidad: el dock y las preferencias
   ============================================================ */

/* Un portal público del Estado tiene que poder leerse con el equipo y la vista que cada
   quien tenga. Antes eso estaba repartido: el tamaño de letra era un botón del encabezado
   —que en el teléfono se mudaba adentro del menú—, el tema era un círculo suelto abajo a
   la izquierda, y no había ni contraste ni quietud ni enlaces subrayados. Tres lugares
   distintos para una misma cosa, y dos de ellos escondidos.

   Ahora hay uno: el dock de abajo a la izquierda, que es donde la convención lo puso hace
   años y donde se lo busca. Dos círculos —accesibilidad y tema— y, detrás del primero, un
   panel con las cinco preferencias.

   ---- Cómo funciona ----

   Cada preferencia es un atributo en <html> y nada más:

     data-theme="dark"              el tema oscuro
     data-texto="1|2|3"             la escala de letra (sección 1)
     data-contraste="alto"          más contraste
     data-enlaces="subrayados"      cada enlace con su raya
     data-movimiento="reducido"     la página quieta

   La hoja define qué significa cada uno y script.js se limita a ponerlos y a guardarlos.
   Esa división es lo que deja que el <head> de cada página pinte las preferencias antes
   del primer cuadro sin cargar nada: son cuatro líneas que leen localStorage y escriben
   atributos. */

/* ---- El dock ---- */
.acc{
	position: fixed;
	bottom: max(24px, env(safe-area-inset-bottom));
	left: max(24px, env(safe-area-inset-left));
	z-index: 1500;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 12px;
}

.acc-botones{ display: flex; gap: 10px; }

/* Con el panel del menú abierto el dock se va. En el teléfono ese panel ocupa la pantalla
   entera menos una franja, y dos círculos flotando sobre el velo de atrás se leen como
   parte del menú sin serlo: el dedo que va al de accesibilidad termina cerrando el menú. */
body.is-trabado .acc,
body.is-trabado .arriba{ display: none; }

/* Abierto, el botón se queda en verde: es lo que dice cuál de los dos abrió el panel. */
.acc-btn[aria-expanded="true"]{
	color: #fff;
	background: var(--verde);
	border-color: var(--verde);
}

/* ---- El panel ----
   Crece hacia arriba desde su esquina. El alto tiene techo y el contenido se desplaza
   adentro: con la letra en 137,5 % y un teléfono acostado, las cinco preferencias miden
   más que la pantalla, y un panel que se sale por arriba no se puede ni leer ni cerrar. */
.acc-panel{
	width: min(320px, calc(100vw - 2 * max(24px, env(safe-area-inset-left))));
	max-height: min(72svh, 560px);
	overflow-y: auto;
	overscroll-behavior: contain;
	padding: 20px;
	color: var(--tinta-2);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: var(--radio-2);
	box-shadow: var(--sombra-3);
	animation: accAbrir .28s var(--curva-2);
}

@keyframes accAbrir{
	from{ opacity: 0; transform: translateY(12px) scale(.98); }
	to{ opacity: 1; transform: none; }
}

/* El foco del panel lo pone el código al abrirlo, nunca el teclado: dibujarle el contorno
   sería señalar lo que ya está a la vista y rodeado de sombra. Los controles de adentro sí
   lo llevan, como todo el portal. */
.acc-panel:focus{ outline: none; }

.acc-cabeza{
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	margin-bottom: 18px;
}

.acc-titulo{
	font-size: 1rem;
	font-weight: 700;
	letter-spacing: -.02em;
}

.acc-cerrar{
	display: grid;
	place-items: center;
	width: 32px;
	height: 32px;
	flex: none;
	color: var(--tinta-2);
	background: none;
	border: 0;
	border-radius: 50%;
	cursor: pointer;
	transition: color .25s ease, background-color .25s ease;
}

.acc-cerrar:hover{ color: var(--tinta); background: var(--gris-tenue); }

.acc-cerrar svg{
	width: 16px;
	height: 16px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
}

.acc-grupo + .acc-grupo{
	margin-top: 18px;
	padding-top: 18px;
	border-top: 1px solid var(--linea);
}

.acc-rotulo{
	margin-bottom: 10px;
	font-size: .72rem;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--tinta-2);
}

/* ---- Las tres opciones del tema ----
   Una fila de píldoras dentro de un riel. Tres y no un interruptor de dos: "Sistema" no es
   ni claro ni oscuro, es no elegir —y es el que trae el portal de fábrica—. Sin esa
   tercera opción, quien toca una vez el botón queda atado a su elección para siempre y no
   tiene cómo devolverle el mando al equipo. */
.acc-opciones{
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 4px;
	padding: 4px;
	background: var(--gris-tenue);
	border-radius: 999px;
}

.acc-opcion{
	padding: 9px 6px;
	font-family: inherit;
	font-size: .82rem;
	font-weight: 600;
	color: var(--tinta-2);
	background: none;
	border: 0;
	border-radius: 999px;
	cursor: pointer;
	transition: color .25s ease, background-color .25s ease;
}

.acc-opcion:hover{ color: var(--tinta); }

.acc-opcion[aria-pressed="true"]{
	color: #fff;
	background: var(--verde);
}

/* ---- Los escalones del tamaño ---- */
.acc-pasos{
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
}

.acc-paso{
	display: grid;
	place-items: center;
	width: 44px;
	height: 44px;
	flex: none;
	font-family: inherit;
	font-size: .95rem;
	font-weight: 700;
	color: var(--tinta);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: 50%;
	cursor: pointer;
	transition: color .25s ease, background-color .25s ease, border-color .25s ease;
}

.acc-paso:hover:not(:disabled){ color: var(--verde); border-color: var(--verde); }

/* En el tope de la escala el botón se apaga en lugar de desaparecer: un control que se va
   deja al otro saltando de lugar, y a la tercera vez ya no se sabe cuál se está apretando. */
.acc-paso:disabled{ opacity: .35; cursor: default; }

.acc-medida{
	font-size: .88rem;
	font-weight: 600;
	color: var(--tinta);
	font-variant-numeric: tabular-nums;
}

/* ---- Los interruptores ----
   Etiqueta a la izquierda, llave a la derecha. Es un <button> con aria-pressed y no una
   casilla porque no hay formulario que enviar: lo que cambia es la página que ya está
   abierta. */
.acc-llaves{ display: grid; gap: 4px; }

.acc-interruptor{
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	width: 100%;
	padding: 9px 10px;
	font-family: inherit;
	font-size: .88rem;
	font-weight: 500;
	text-align: left;
	color: var(--tinta);
	background: none;
	border: 0;
	border-radius: var(--radio-3);
	cursor: pointer;
	transition: background-color .25s ease;
}

.acc-interruptor:hover{ background: var(--gris-tenue); }

.acc-llave{
	position: relative;
	width: 38px;
	height: 22px;
	flex: none;
	background: var(--gris-tenue);
	border: 1px solid var(--linea);
	border-radius: 999px;
	transition: background-color .25s ease, border-color .25s ease;
}

.acc-llave::after{
	content: "";
	position: absolute;
	top: 2px;
	left: 2px;
	width: 16px;
	height: 16px;
	background: var(--superficie);
	border-radius: 50%;
	box-shadow: var(--sombra-1);
	transition: transform .25s var(--curva);
}

.acc-interruptor[aria-pressed="true"] .acc-llave{
	background: var(--verde);
	border-color: var(--verde);
}

.acc-interruptor[aria-pressed="true"] .acc-llave::after{ transform: translateX(16px); }

/* ---- Volver a cero ----
   Una preferencia mal puesta es peor que ninguna, y con cinco encima la página puede
   quedar irreconocible. Esto la devuelve entera de un toque. */
.acc-reiniciar{
	width: 100%;
	margin-top: 18px;
	padding: 11px;
	font-family: inherit;
	font-size: .84rem;
	font-weight: 600;
	color: var(--tinta-2);
	background: none;
	border: 1px solid var(--linea);
	border-radius: 999px;
	cursor: pointer;
	transition: color .25s ease, border-color .25s ease;
}

.acc-reiniciar:hover{ color: var(--verde); border-color: var(--verde); }

/* ---- Más contraste ----
   No es "el tema oscuro pero más": es la misma paleta con los grises apretados contra los
   extremos. El gris de los párrafos —#5f706a sobre #e9eeeb, 4,6:1— pasa a un valor que
   cumple 7:1, las líneas de un 9 % de opacidad suben a un 38 % donde se ven de verdad, y
   las sombras se van: una sombra larga y difusa es exactamente el tipo de borde que no se
   distingue cuando la vista no separa bien dos claros parecidos.

   El fondo pasa a blanco puro a propósito. El gris verdoso de siempre es lo que le da al
   portal su temperatura, pero también es medio punto de contraste que acá hace falta. */
html[data-contraste="alto"]{
	--fondo: #fff;
	--tarjeta: #fff;
	--superficie: #fff;
	--tope-fondo: rgba(255, 255, 255, .94);

	--tinta: #04110d;
	--tinta-2: #2b3a35;

	--verde: #054e37;
	--verde-hondo: #032018;
	--verde-tenue: #dcebe5;
	--gris-tenue: #e6ebe8;

	--linea: rgba(3, 32, 24, .38);

	--sombra-1: none;
	--sombra-2: none;
	--sombra-3: none;
	--sombra-verde: none;
}

html[data-contraste="alto"][data-theme="dark"]{
	--fondo: #050a08;
	--tarjeta: #0c1310;
	--superficie: #0c1310;
	--tope-fondo: rgba(5, 10, 8, .94);

	--tinta: #fff;
	--tinta-2: #d3ded9;

	--verde: #5cf0b6;
	--verde-vivo: #5cf0b6;
	--verde-hondo: #05100c;
	--verde-tenue: rgba(92, 240, 182, .18);
	--gris-tenue: rgba(255, 255, 255, .14);

	--linea: rgba(255, 255, 255, .5);
}

/* Y lo que no sale de una variable: las superficies que llevaban su borde sólo insinuado
   pasan a llevarlo dibujado. */
html[data-contraste="alto"] .tarjeta,
html[data-contraste="alto"] .flotante,
html[data-contraste="alto"] .acc-panel{ border-width: 2px; }

html[data-contraste="alto"] .tope{ border-bottom: 2px solid var(--linea); }

/* ---- Subrayar los enlaces ----
   Distinguir un enlace sólo por el color deja afuera a quien no separa ese verde del negro
   que lo rodea. Con esto vuelve la raya de toda la vida.

   Quedan fuera los que no son texto: un botón, la firma del encabezado, una tarjeta entera
   que es un enlace. Ahí la raya no agrega nada —la forma ya dice que se aprieta— y en
   cambio ensucia. */
html[data-enlaces="subrayados"] a{
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: .22em;
}

html[data-enlaces="subrayados"] .boton,
html[data-enlaces="subrayados"] .nav-entrar,
html[data-enlaces="subrayados"] .marca,
html[data-enlaces="subrayados"] .saltar,
html[data-enlaces="subrayados"] .atajo,
html[data-enlaces="subrayados"] .social a,
html[data-enlaces="subrayados"] .is-enlazada a,
html[data-enlaces="subrayados"] .filtro{ text-decoration: none; }

/* ---- Menos movimiento ----
   El mismo apagón que hace `@media (prefers-reduced-motion: reduce)` en la sección 3, pero
   pedido a mano. Existen los dos porque no son la misma pregunta: aquélla la contesta el
   sistema operativo de una vez para todo, y ésta la contesta quien está mirando esta
   página y no puede —o no quiere— tocar la configuración del equipo.

   Las duraciones no se ponen en cero sino en una centésima: un `transitionend` que nunca
   llega deja colgado al código que lo espera, y acá hay al menos uno —el panel del menú—
   que cuenta con él para terminar de cerrarse. */
html[data-movimiento="reducido"]{ scroll-behavior: auto; }

html[data-movimiento="reducido"] *,
html[data-movimiento="reducido"] *::before,
html[data-movimiento="reducido"] *::after{
	animation-duration: .01s !important;
	animation-delay: 0s !important;
	animation-iteration-count: 1 !important;
	transition-duration: .01s !important;
	transition-delay: 0s !important;
}

/* Y nada salta al pasar por encima, igual que con la preferencia del sistema. */
html[data-movimiento="reducido"] .boton:hover,
html[data-movimiento="reducido"] .tarjeta.is-viva:hover,
html[data-movimiento="reducido"] .atajo:hover,
html[data-movimiento="reducido"] .social a:hover,
html[data-movimiento="reducido"] .redondo:hover,
html[data-movimiento="reducido"] .flotante:hover{ transform: none; }

/* ---- El dock en pantallas chicas ----
   El dock no se esconde en el teléfono. Es la excepción a la regla de la sección 15 bis
   —donde lo que sólo adorna se va—, porque esto no adorna: es la única puerta al tamaño de
   letra, y quien la necesita la necesita más en una pantalla de 375 px que en un monitor.

   Lo que sí cede es el tamaño. Dos círculos de 46 px pegados al filo ocupan poco más de
   cien píxeles de la esquina, y el de volver arriba se queda en la otra. */
@media (max-width: 620px){
	.acc{
		bottom: max(16px, env(safe-area-inset-bottom));
		left: max(16px, env(safe-area-inset-left));
		gap: 10px;
	}

	.acc .flotante{ width: 46px; height: 46px; }
	.acc-botones{ gap: 8px; }

	/* El panel pasa a medir lo que la pantalla menos el aire de los dos costados: en 375 px
	   los 320 de escritorio dejaban un margen de dos píxeles de un lado y treinta del otro. */
	.acc-panel{
		width: calc(100vw - max(16px, env(safe-area-inset-left)) - max(16px, env(safe-area-inset-right)));
		max-width: 360px;
		max-height: min(68svh, 520px);
	}
}

/* Acostado sobran píxeles de ancho y faltan de alto: el panel usa el alto que haya y se
   aprieta por dentro. */
@media (max-height: 620px) and (orientation: landscape){
	.acc .flotante{ width: 42px; height: 42px; }
	.acc-panel{ max-height: calc(100svh - 110px); padding: 16px; }
	.acc-grupo + .acc-grupo{ margin-top: 14px; padding-top: 14px; }
}

/* ============================================================
   Atención al ciudadano en la portada
   ============================================================
   La PQRSD a un clic: los cinco tipos llevan al formulario con el tipo ya elegido, y la
   consulta del radicado se hace ahí mismo. Va sobre verde oscuro para que se distinga de
   las tarjetas blancas de alrededor: es la única sección de la portada que pide algo. */
.pqr-rapida{ padding-top: clamp(40px, 5vw, 64px); padding-bottom: 0; }

.pqr-rapida-caja{
	position: relative;
	padding: clamp(28px, 4vw, 52px);
	overflow: hidden;
	color: rgba(255, 255, 255, .86);
	background:
		radial-gradient(circle at 100% 0%, rgba(18, 160, 111, .35), transparent 55%),
		var(--verde-noche);
	border-radius: var(--radio);
	box-shadow: var(--sombra-3);
}

.pqr-rapida-cabeza{
	display: flex;
	flex-wrap: wrap;
	gap: 24px;
	align-items: flex-end;
	justify-content: space-between;
}
.pqr-rapida-cabeza .titulo{ color: #fff; }
.pqr-rapida-cabeza .titulo em{ color: var(--verde-menta); }
.pqr-rapida-cabeza .bajada{ color: rgba(255, 255, 255, .78); max-width: 60ch; }

.pqr-rapida-tipos{
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: clamp(24px, 3vw, 36px);
}

.pqr-rapida-tipo{
	flex: 1 1 180px;
	display: grid;
	align-content: start;
	gap: 6px;
	padding: 18px;
	color: rgba(255, 255, 255, .78);
	text-decoration: none;
	background: rgba(255, 255, 255, .06);
	border: 1px solid rgba(255, 255, 255, .12);
	border-radius: var(--radio-3);
	transition: transform .35s var(--curva), background-color .25s ease, border-color .25s ease;
}
.pqr-rapida-tipo:hover,
.pqr-rapida-tipo:focus-visible{
	transform: translateY(-4px);
	background: rgba(255, 255, 255, .12);
	border-color: var(--verde-menta);
}
.pqr-rapida-tipo:focus-visible{ outline: 2px solid var(--verde-menta); outline-offset: 2px; }

.pqr-rapida-icono{
	display: grid;
	place-items: center;
	width: 40px;
	height: 40px;
	margin-bottom: 6px;
	color: var(--verde-noche);
	background: var(--verde-menta);
	border-radius: 12px;
}
.pqr-rapida-icono svg{
	width: 20px;
	height: 20px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
}
.pqr-rapida-nombre{ font-size: 1.05rem; font-weight: 700; color: #fff; }
.pqr-rapida-texto{ font-size: .86rem; line-height: 1.45; }

.pqr-rapida-consulta{
	display: flex;
	flex-wrap: wrap;
	gap: 12px 20px;
	align-items: center;
	justify-content: space-between;
	margin-top: clamp(20px, 3vw, 32px);
	padding-top: clamp(20px, 3vw, 28px);
	border-top: 1px solid rgba(255, 255, 255, .12);
}
.pqr-rapida-rotulo{ font-weight: 600; color: #fff; }
.pqr-rapida-campo{ display: flex; flex-wrap: wrap; gap: 10px; flex: 1 1 380px; max-width: 520px; }
.pqr-rapida-campo input{
	flex: 1 1 220px;
	min-width: 0;
	padding: 14px 18px;
	font: inherit;
	letter-spacing: .04em;
	color: #fff;
	background: rgba(255, 255, 255, .08);
	border: 1px solid rgba(255, 255, 255, .22);
	border-radius: 999px;
}
.pqr-rapida-campo input::placeholder{ color: rgba(255, 255, 255, .5); }
.pqr-rapida-campo input:focus{ outline: 2px solid var(--verde-menta); outline-offset: 1px; }
.pqr-rapida-campo .boton{ padding: 13px 26px; }

@media (max-width: 420px){
	.pqr-rapida-tipo{ flex-basis: 100%; }
	.pqr-rapida-tipo{ grid-template-columns: auto minmax(0, 1fr); column-gap: 14px; }
	.pqr-rapida-icono{ grid-row: span 2; margin: 0; }
	.pqr-rapida-cabeza .boton{ width: 100%; }
}

/* El acceso flotante, abajo a la derecha, encima del botón de volver arriba. */
.pqr-flotante{
	position: fixed;
	right: max(24px, env(safe-area-inset-right));
	bottom: calc(max(24px, env(safe-area-inset-bottom)) + 62px);
	z-index: 1490;
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 12px 18px 12px 14px;
	font-size: .9rem;
	font-weight: 700;
	letter-spacing: .02em;
	color: var(--verde-noche);
	text-decoration: none;
	background: var(--verde-menta);
	border-radius: 999px;
	box-shadow: var(--sombra-3);
	transition: transform .35s var(--curva), box-shadow .3s ease;
}
.pqr-flotante:hover{ transform: translateY(-3px); box-shadow: var(--sombra-verde); }
.pqr-flotante:focus-visible{ outline: 3px solid var(--verde); outline-offset: 3px; }
.pqr-flotante svg{
	width: 20px;
	height: 20px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
}
@media (max-width: 620px){
	.pqr-flotante{
		right: max(16px, env(safe-area-inset-right));
		bottom: calc(max(16px, env(safe-area-inset-bottom)) + 58px);
		padding: 11px 14px 11px 12px;
		font-size: .82rem;
	}
}
@media print{ .pqr-flotante, .cookies{ display: none !important; } }

/* ============================================================
   Cookies
   ============================================================ */
.cookies{
	position: fixed;
	left: 50%;
	bottom: max(16px, env(safe-area-inset-bottom));
	z-index: 1600;
	display: flex;
	flex-wrap: wrap;
	gap: 16px 24px;
	align-items: center;
	width: min(980px, calc(100% - 32px));
	padding: 20px 24px;
	color: var(--tinta);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: var(--radio-2);
	box-shadow: var(--sombra-3);
	transform: translateX(-50%);
	animation: cookiesEntrar .5s var(--curva-2);
}
@keyframes cookiesEntrar{ from{ opacity: 0; transform: translate(-50%, 20px); } }
[data-movimiento="reducido"] .cookies{ animation: none; }

.cookies-texto{ flex: 1 1 420px; font-size: .9rem; line-height: 1.55; color: var(--tinta-2); }
.cookies-texto a{ color: var(--verde); font-weight: 600; }
.cookies-titulo{ margin-bottom: 4px; font-size: 1rem; font-weight: 700; color: var(--tinta); }

.cookies-botones{ display: flex; flex-wrap: wrap; gap: 10px; align-items: center; justify-content: flex-end; }
.cookies-botones .boton{ padding: 11px 22px; font-size: .9rem; }
.cookies-botones .boton:hover{ transform: none; }

.cookies-enlace{
	padding: 8px 4px;
	font: inherit;
	font-size: .9rem;
	font-weight: 600;
	color: var(--verde);
	text-decoration: underline;
	text-underline-offset: 3px;
	background: none;
	border: 0;
	cursor: pointer;
}

@media (max-width: 620px){
	.cookies{ padding: 18px; }
	.cookies-botones{ width: 100%; }
	.cookies-botones .boton{ flex: 1 1 140px; }
	.cookies-botones .cookies-enlace{ order: 3; flex-basis: 100%; text-align: center; }
}

.cookies-dialogo{
	width: min(560px, calc(100% - 32px));
	max-height: calc(100dvh - 32px);
	margin: auto;
	padding: 26px;
	color: var(--tinta);
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: var(--radio-2);
	box-shadow: var(--sombra-3);
}
.cookies-dialogo::backdrop{ background: rgba(4, 28, 21, .55); }
.cookies-dialogo-cabeza{ display: flex; gap: 16px; align-items: center; justify-content: space-between; }
.cookies-dialogo h2{ font-size: 1.3rem; font-weight: 800; letter-spacing: -.02em; }
.cookies-dialogo > p{ margin: 10px 0 18px; font-size: .92rem; color: var(--tinta-2); }
.cookies-cerrar{
	display: grid;
	place-items: center;
	width: 36px;
	height: 36px;
	font: inherit;
	color: var(--tinta-2);
	background: none;
	border: 1px solid var(--linea);
	border-radius: 50%;
	cursor: pointer;
}
.cookies-cerrar:hover{ color: var(--tinta); border-color: var(--tinta-2); }

.cookies-opcion{
	display: flex;
	gap: 16px;
	align-items: center;
	justify-content: space-between;
	padding: 16px 0;
	border-top: 1px solid var(--linea);
	cursor: pointer;
}
.cookies-opcion-texto{ display: grid; gap: 4px; font-size: .88rem; color: var(--tinta-2); }
.cookies-opcion-texto strong{ font-size: .98rem; color: var(--tinta); }
.cookies-dialogo .cookies-botones{ padding-top: 16px; border-top: 1px solid var(--linea); justify-content: space-between; }

/* El interruptor: una casilla de verdad, dibujada como palanca. */
.cookies-switch{
	flex: none;
	position: relative;
	width: 46px;
	height: 26px;
	margin: 0;
	background: var(--gris-tenue);
	border: 1px solid var(--linea);
	border-radius: 999px;
	appearance: none;
	cursor: pointer;
	transition: background-color .2s ease;
}
.cookies-switch::after{
	content: "";
	position: absolute;
	top: 3px;
	left: 3px;
	width: 18px;
	height: 18px;
	background: #fff;
	border-radius: 50%;
	box-shadow: 0 1px 3px rgba(0, 0, 0, .25);
	transition: transform .2s ease;
}
.cookies-switch:checked{ background: var(--verde); border-color: var(--verde); }
.cookies-switch:checked::after{ transform: translateX(20px); }
.cookies-switch:disabled{ opacity: .6; cursor: default; }
.cookies-switch:focus-visible{ outline: 2px solid var(--verde); outline-offset: 2px; }

/* El cartel que ocupa el lugar de un video de YouTube mientras no haya permiso. */
.terceros-aviso{
	position: relative;
	z-index: 1;
	display: grid;
	justify-items: center;
	gap: 14px;
	max-width: 44ch;
	padding: 20px;
	font-size: .92rem;
	text-align: center;
	color: rgba(255, 255, 255, .86);
}
.terceros-aviso a:not(.boton){ color: var(--verde-menta); font-weight: 600; }
.terceros-aviso .boton{ padding: 12px 22px; font-size: .9rem; }
.visor-marco .terceros-aviso{ position: absolute; inset: 0; max-width: none; align-content: center; }

/* "Preferencias de cookies" en el pie: un botón que se lee como los enlaces de al lado. */
.pie-legal-boton{
	padding: 0;
	font: inherit;
	font-size: .84rem;
	color: var(--tinta-2);
	background: none;
	border: 0;
	cursor: pointer;
	transition: color .25s ease;
}
.pie-legal-boton:hover{ color: var(--verde); }

/* El enlace a la política, debajo del texto de la autorización. */
.pqr-acepta > a{ grid-column: 2; margin-top: -6px; font-weight: 600; color: var(--verde); }

/* ============================================================
   La columna lateral
   ============================================================
   La arma script.js en las páginas internas: las otras páginas de la sección y los
   accesos rápidos. Aparece sólo desde 1280 px, que es donde el contenedor de 1240 entra
   entero: la columna de lectura y la lateral suman ese ancho, así que el borde derecho de
   la tarjeta queda alineado con el del encabezado y el de la portadilla.

   El texto no pierde medida: sin columna tenía 932 px útiles y con ella tiene 920. */

.lateral{ display: none; }

@media (min-width: 1280px){
	.con-lateral{ --lateral-ancho: 248px; --lateral-hueco: 36px; }

	.con-lateral main{ position: relative; }

	.con-lateral .lleva-lateral > .contenedor{
		max-width: var(--ancho);
		padding-right: calc(var(--aire) + var(--lateral-ancho) + var(--lateral-hueco));
	}

	/* Lo que la sección crece cuando la columna es más alta que ella: lo calcula script.js y
	   va adentro de la sección, con su mismo fondo. */
	.con-lateral .lleva-lateral{ padding-bottom: calc(100px + var(--lateral-extra, 0px)); }

	/* El mismo aire de arriba y de abajo que una sección, para que la primera tarjeta
	   arranque a la altura del primer titular. */
	.lateral{
		display: block;
		position: absolute;
		top: var(--lateral-arriba, 0);
		right: calc((100% - var(--ancho)) / 2 + var(--aire));
		width: var(--lateral-ancho);
		height: var(--lateral-alto, auto);
		padding: 100px 0;
	}
}

.lateral-pila{
	position: sticky;
	top: calc(var(--tope-alto) + 24px);
	display: grid;
	gap: 18px;
}

.lateral-tarjeta{
	padding: 22px 20px;
	background: var(--superficie);
	border: 1px solid var(--linea);
	border-radius: var(--radio-2);
	box-shadow: var(--sombra-1);
}

.lateral-tarjeta .etiqueta{ margin-bottom: 12px; }

.lateral-lista{ display: grid; gap: 2px; list-style: none; }

.lateral-lista a{
	display: block;
	padding: 8px 12px;
	font-size: .9rem;
	font-weight: 500;
	line-height: 1.35;
	color: var(--tinta-2);
	text-decoration: none;
	border-radius: var(--radio-3);
	transition: color .25s ease, background-color .25s ease;
}

.lateral-lista a:hover{ color: var(--verde); background: var(--verde-tenue); }

.lateral-lista a[aria-current]{
	font-weight: 700;
	color: var(--verde);
	background: var(--verde-tenue);
	box-shadow: inset 3px 0 0 var(--verde);
}

.lateral-accesos{ display: grid; gap: 6px; list-style: none; }

.lateral-acceso{
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 8px;
	color: var(--tinta);
	text-decoration: none;
	border-radius: var(--radio-3);
	transition: background-color .25s ease;
}

.lateral-acceso:hover{ background: var(--verde-tenue); }

.lateral-icono{
	display: grid;
	flex: none;
	place-items: center;
	width: 38px;
	height: 38px;
	color: var(--verde);
	background: var(--verde-tenue);
	border-radius: 12px;
}

.lateral-icono svg{
	width: 19px;
	height: 19px;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.8;
	stroke-linecap: round;
	stroke-linejoin: round;
}

.lateral-rotulo{ display: grid; gap: 2px; min-width: 0; }
.lateral-rotulo strong{ font-size: .9rem; font-weight: 600; line-height: 1.25; }
.lateral-rotulo small{ font-size: .78rem; line-height: 1.3; color: var(--tinta-2); }

.lateral-noticias{ display: grid; gap: 4px; list-style: none; }

.lateral-noticia{
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding: 8px;
	color: var(--tinta);
	text-decoration: none;
	border-radius: var(--radio-3);
	transition: background-color .25s ease;
}

.lateral-noticia:hover{ background: var(--verde-tenue); }
.lateral-noticia:hover strong{ color: var(--verde); }

.lateral-noticia-foto{
	flex: none;
	width: 56px;
	height: 56px;
	background: var(--verde-tenue) center / cover no-repeat;
	border-radius: 12px;
}

/* El título de una nota puede ser largo: tres renglones y se corta. */
.lateral-noticia strong{
	display: -webkit-box;
	overflow: hidden;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	transition: color .25s ease;
}

.lateral-todas{
	display: inline-block;
	margin: 10px 0 0 8px;
	font-size: .84rem;
	font-weight: 700;
	color: var(--verde);
	text-decoration: none;
}

.lateral-todas:hover{ text-decoration: underline; }

.lateral a:focus-visible{ outline: 2px solid var(--verde); outline-offset: 2px; }

@media print{
	.lateral{ display: none !important; }
	.con-lateral .lleva-lateral > .contenedor{ padding-right: var(--aire); }
	.con-lateral .portadilla ~ .lleva-lateral > .contenedor{ max-width: 980px; }
	.con-lateral .lleva-lateral{ padding-bottom: 100px; }
}

/* ============================================================
   Sin efectos de brillo
   ============================================================
   El portal es institucional: nada de resplandores de color, halos que se mueven ni
   botones que saltan o brillan al pasar el puntero. Los botones y tarjetas cambian de
   color al pasar por encima, y nada más. Va al final para ganarle a las reglas de arriba. */

:root,
[data-tema="oscuro"]{ --sombra-verde: var(--sombra-2); }

.portada-aurora,
.vivo-marco::before{ display: none; }

.pqr-rapida-caja{ background: var(--verde-noche); }

.boton:hover,
.tarjeta.is-viva:hover,
.redondo:hover,
.nav-entrar:hover,
.portada-flecha:hover,
.atajo:hover,
.atajo:hover .atajo-icono,
.filtro:hover,
.visor-cerrar:hover,
.galeria-cuadro:hover,
.aliado:hover,
.social a:hover,
.flotante:hover,
.arriba:hover,
.periodo-ficha:hover,
.docs-ficha.is-lista:hover,
.bitacora-firma:hover,
.pqr-rapida-tipo:hover,
.pqr-rapida-tipo:focus-visible,
.pqr-flotante:hover{
	transform: none;
	filter: none;
}

.boton:hover,
.nav-entrar:hover,
.arriba:hover,
.pqr-flotante:hover{ box-shadow: none; }

.tarjeta.is-viva:hover,
.atajo:hover,
.periodo-ficha:hover{ box-shadow: var(--sombra-2); }

/* Tarjetas de diputados que arma el servidor: sin retrato van las iniciales, y una lista
   vacía lo dice en vez de dejar un hueco. */
.miembro-iniciales{
	display: grid;
	place-items: center;
	width: 100%;
	height: 100%;
	font-size: 2.6rem;
	font-weight: 700;
	color: var(--verde);
}

.miembro-vacio{ grid-column: 1 / -1; margin: 0; color: var(--texto-2, #5b6b66); }
