/*
 * Lo que el diseño de referencia no trae.
 *
 * Su CSS se descargó tal cual y no se toca: cuando el sitio de referencia
 * cambie, se vuelve a bajar y se reemplaza entero. Lo que se agrega acá es solo
 * lo que este sitio necesita y aquél no tiene, por dos motivos:
 *
 * - Cosas que allá hace Vue y acá se resuelven con una clase: el menú de
 *   teléfono abierto, un desplegable desplegado, la foto en grande.
 * - Páginas que este sitio tiene y aquél no —el concejo, la documentación, el
 *   COSOC— y que usan moldes de otras secciones.
 */

/* ------------------------------------------------------------------
   Menú de teléfono
   ------------------------------------------------------------------ */
@media (max-width: 992px) {
    /* En teléfono manda el cajón: la barra de secciones de escritorio no se
       muestra, igual que en el diseño original. */
    .header__nav {
        display: none;
    }

    .has-dropdown .dropdown {
        display: none;
    }

    .has-dropdown--abierto .dropdown {
        display: block;
    }
}

/* ------------------------------------------------------------------
   Cajón de menú en teléfono

   Portado del sitio original (sus reglas, sin los atributos de ámbito de Vue
   que allá generaba el compilador). Es un cajón que entra desde la derecha
   sobre un velo oscuro, con las secciones apiladas y sus desplegables dentro.
   Antes esto lo resolvía Vue con un «v-if»; acá se muestra con una clase.
   ------------------------------------------------------------------ */
@media(max-width:767px) {
    .mobile-menu { transition:top .3s ease }
    .mobile-menu--scrolled { top:0!important }
}
.mobile-menu__overlay { background:#00000080;inset:0;position:fixed;z-index:9998 }
.mobile-menu {
    display: none;
    background:#f8f9fa;bottom:0;box-shadow:-5px 0 30px #0003;max-width:400px;overflow:hidden;position:fixed;right:0;top:0;width:85%;z-index:9999 }
.mobile-menu__content { display:flex;flex-direction:column;height:100%;padding:1rem }
.mobile-menu__nav { display:flex;flex:1;flex-direction:column;gap:.35rem;overflow-y:auto;padding-bottom:1rem }
.mobile-menu__nav a { background:#fff;border-radius:10px;box-shadow:0 1px 3px #0000000d;color:#1a1a1a;font-size:.95rem;font-weight:600;padding:.85rem 1rem;text-decoration:none;transition:all .2s }
.mobile-menu__nav a:active,.mobile-menu__nav a:hover { background:#0a4952;color:#fff }
.mobile-menu__dropdown { display:flex;flex-direction:column }
.mobile-menu__dropdown-toggle { align-items:center;background:#fff;border:none;border-radius:10px;box-shadow:0 1px 3px #0000000d;color:#1a1a1a;cursor:pointer;display:flex;font-size:.95rem;font-weight:600;justify-content:space-between;padding:.85rem 1rem;text-align:left;transition:all .2s;width:100% }
.mobile-menu__dropdown-toggle svg { color:#666;transition:transform .3s ease }
.mobile-menu__dropdown-toggle--open svg { transform:rotate(180deg) }
.mobile-menu__dropdown-toggle--open,.mobile-menu__dropdown-toggle:hover { background:#0a4952;color:#fff }
.mobile-menu__dropdown-toggle--open svg,.mobile-menu__dropdown-toggle:hover svg { color:#fff }
.mobile-menu__dropdown-content { background:#0a49520d;border-radius:10px;display:flex;flex-direction:column;gap:.25rem;margin-top:.25rem;overflow:hidden;padding:.5rem 0 .5rem 1rem }
.mobile-menu__dropdown-content a { background:transparent;border-radius:8px;box-shadow:none;font-size:.85rem;font-weight:500;padding:.65rem 1rem }
.mobile-menu__dropdown-content a:hover { background:#0a4952;color:#fff }
.mobile-menu__item--disabled { align-items:center;background:#00000008;border-radius:8px;color:#999;cursor:not-allowed;display:flex;font-size:.85rem;font-weight:500;justify-content:space-between;padding:.65rem 1rem }
.mobile-menu__soon { background:#f59e0b;border-radius:3px;color:#000;font-size:.55rem;font-weight:800;letter-spacing:.3px;padding:2px 6px;text-transform:uppercase }
.mobile-menu__subdropdown { display:flex;flex-direction:column }
.mobile-menu__subdropdown-toggle { align-items:center;background:#0a495214;border:none;border-radius:8px;color:#333;cursor:pointer;display:flex;font-size:.8rem;font-weight:600;justify-content:space-between;margin-left:.5rem;padding:.65rem 1rem;text-align:left;transition:all .2s;width:calc(100% - .5rem) }
.mobile-menu__subdropdown-toggle svg { color:#666;transition:transform .3s ease }
.mobile-menu__subdropdown-toggle--open svg { transform:rotate(180deg) }
.mobile-menu__subdropdown-toggle--open,.mobile-menu__subdropdown-toggle:hover { background:#0a495226;color:#0a4952 }
.mobile-menu__subdropdown-toggle--open svg,.mobile-menu__subdropdown-toggle:hover svg { color:#0a4952 }
.mobile-menu__subdropdown-content { border-left:2px solid rgba(10,73,82,.15);display:flex;flex-direction:column;gap:.2rem;margin-left:.5rem;margin-top:.25rem;padding:.4rem 0 .4rem 1.5rem }
.mobile-menu__subdropdown-content a { background:transparent;border-radius:6px;box-shadow:none;font-size:.8rem;font-weight:500;padding:.55rem .85rem }
.mobile-menu__subdropdown-content a:hover { background:#0a49521a;color:#0a4952 }
.mobile-menu__subdropdown-content .mobile-menu__item--disabled { font-size:.8rem;padding:.55rem .85rem }
.mobile-menu__subsubdropdown { display:flex;flex-direction:column }
.mobile-menu__subsubdropdown-toggle { align-items:center;background:#0a49520f;border:none;border-radius:6px;color:#555;cursor:pointer;display:flex;font-size:.75rem;font-weight:600;justify-content:space-between;margin-left:.5rem;padding:.55rem .85rem;text-align:left;transition:all .2s;width:calc(100% - .5rem) }
.mobile-menu__subsubdropdown-toggle svg { color:#999;transition:transform .3s ease }
.mobile-menu__subsubdropdown-toggle--open svg { transform:rotate(180deg) }
.mobile-menu__subsubdropdown-toggle--open,.mobile-menu__subsubdropdown-toggle:hover { background:#0a49521f;color:#0a4952 }
.mobile-menu__subsubdropdown-toggle--open svg,.mobile-menu__subsubdropdown-toggle:hover svg { color:#0a4952 }
.mobile-menu__subsubdropdown-content { border-left:2px solid rgba(10,73,82,.1);display:flex;flex-direction:column;gap:.15rem;margin-left:.5rem;margin-top:.2rem;padding:.3rem 0 .3rem 2rem }
.mobile-menu__subsubdropdown-content a { background:transparent;border-radius:5px;box-shadow:none;font-size:.75rem;font-weight:500;padding:.5rem .75rem }
.mobile-menu__subsubdropdown-content a:hover { background:#0a495214;color:#0a4952 }
.mobile-menu__subsubdropdown-content .mobile-menu__item--disabled { font-size:.75rem;padding:.5rem .75rem }
.mobile-menu__buttons { border-top:1px solid rgba(0,0,0,.08);display:flex;flex-direction:column;gap:.5rem;padding-top:1rem }
.mobile-menu__btn { align-items:center;border-radius:12px;display:flex;font-size:.9rem;font-weight:700;gap:.6rem;justify-content:center;padding:.9rem 1rem;text-decoration:none;transition:all .2s }
.mobile-menu__btn--radio { background:linear-gradient(135deg,#6366f1,#4f46e5);color:#fff }
.mobile-menu__btn--radio:hover { background:linear-gradient(135deg,#4f46e5,#4338ca) }
.mobile-menu__btn--disabled { cursor:not-allowed;opacity:.7;overflow:hidden;position:relative }
.mobile-menu__btn--disabled:hover { transform:none }
.mobile-menu__btn-soon { background:#f59e0b;box-shadow:0 2px 8px #0000004d;color:#000;font-size:.6rem;font-weight:800;left:50%;letter-spacing:.5px;padding:4px 30px;position:absolute;text-transform:uppercase;top:50%;transform:translate(-50%,-50%) rotate(-20deg);white-space:nowrap;z-index:1 }
.mobile-menu__btn--concejo { background:linear-gradient(135deg,#0a4952,#083d44);color:#fff }
.mobile-menu__btn--concejo:hover { background:linear-gradient(135deg,#083d44,#062f35) }
.mobile-menu__btn--active { background:linear-gradient(135deg,#dc2626,#b91c1c)!important }
.mobile-menu__btn-live { background:#fff;border-radius:4px;color:#dc2626;font-size:.65rem;font-weight:800;letter-spacing:.5px;padding:2px 8px;text-transform:uppercase }
.mobile-menu__btn-icon { height:20px;-o-object-fit:contain;object-fit:contain;width:20px }
.mobile-menu__btn-badge { background:#fff;border-radius:4px;color:#dc2626;font-size:.6rem;font-weight:800;letter-spacing:.05em;margin-left:auto;padding:2px 6px }
.mobile-menu-enter-active,.mobile-menu-leave-active { transition:transform .3s cubic-bezier(.4,0,.2,1) }
.mobile-menu-enter-from,.mobile-menu-leave-to { transform:translate(100%) }
@media(min-width:768px)and (max-width:1024px) {
    .mobile-menu { top:0!important }
}
@media(max-width:768px) {
    .mobile-menu { top:0 }
    .mobile-menu__content { padding:.75rem }
    .mobile-menu__dropdown-toggle,.mobile-menu__nav a { font-size:.9rem;padding:.75rem .9rem }
    .mobile-menu__dropdown-content a { font-size:.8rem;padding:.6rem .9rem }
}
@media(max-width:480px) {
    .mobile-menu { top:0 }
    .mobile-menu__content { padding:.6rem }
    .mobile-menu__nav { gap:.3rem }
    .mobile-menu__dropdown-toggle,.mobile-menu__nav a { border-radius:8px;font-size:.85rem;padding:.7rem .85rem }
    .mobile-menu__dropdown-content { border-radius:8px;padding:.4rem 0 .4rem .75rem }
    .mobile-menu__dropdown-content a { border-radius:6px;font-size:.8rem;padding:.55rem .85rem }
    .mobile-menu__buttons { gap:.4rem;padding-top:.75rem }
    .mobile-menu__btn { border-radius:10px;font-size:.85rem;padding:.75rem .9rem }
}

/* Los desplegables nacen cerrados. Va con el atributo en el selector a
   propósito: el «hidden» del navegador es un display:none de baja prioridad y
   cualquier display de autor —acá, el flex de arriba— lo pisa sin avisar. Se
   veía como un cajón con TODAS las secciones desplegadas de entrada. */
.mobile-menu__dropdown-content[hidden],
.mobile-menu__subdropdown-content[hidden],
.mobile-menu__subsubdropdown-content[hidden] {
    display: none;
}

/* El cajón recibe el foco al abrirse (para que el teclado entre ahí), pero es
   un contenedor, no algo que se pulse: el anillo de foco alrededor se veía como
   un borde dorado que el diseño original no tiene. Los enlaces de dentro
   conservan el suyo, que es el que hace falta. */
.mobile-menu:focus {
    outline: none;
}

/* Lo que allá hacía Vue y acá hace una clase. */
/* Se muestra como BLOQUE, no como flex: el original no le pone display al
   cajón, y convertirlo en contenedor flex hacía que su contenido se encogiera
   al ancho del texto —las tarjetas quedaban a 189 px dentro de un cajón de
   332—. El interior ya es flex por su propia regla. */
.mobile-menu--abierto {
    display: block;
}

.mobile-menu__overlay {
    display: none;
}

.mobile-menu__overlay--visible {
    display: block;
}

/* De escritorio hacia arriba el cajón no existe: ahí está la barra de siempre. */
@media (min-width: 993px) {
    .mobile-menu,
    .mobile-menu--abierto,
    .mobile-menu__overlay {
        display: none !important;
    }
}


/* ------------------------------------------------------------------
   La foto de la galería, en grande
   ------------------------------------------------------------------ */
.galeria__visor {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 9999;
    background: rgba(0, 0, 0, .88);
    align-items: center;
    justify-content: center;
    padding: 2rem;
}

.galeria__visor--abierto {
    display: flex;
}

.galeria__visor img {
    max-width: 92vw;
    max-height: 88vh;
    object-fit: contain;
    border-radius: .5rem;
}

.galeria__visor button {
    position: absolute;
    background: rgba(255, 255, 255, .16);
    color: #fff;
    border: none;
    border-radius: 50%;
    cursor: pointer;
    /* Cuarenta y ocho píxeles: menos que eso y un dedo no acierta. */
    width: 48px;
    height: 48px;
    font-size: 1.8rem;
    line-height: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: background .18s;
}

.galeria__visor button:hover,
.galeria__visor button:focus-visible {
    background: rgba(255, 255, 255, .32);
}

.galeria__visor-cerrar {
    top: 1.2rem;
    right: 1.2rem;
}

.galeria__visor-prev {
    left: 1.2rem;
}

.galeria__visor-next {
    right: 1.2rem;
}

.galeria__item img {
    cursor: zoom-in;
}

/* ------------------------------------------------------------------
   Páginas que este sitio tiene y el de referencia no
   ------------------------------------------------------------------ */

/* La lista de concejales usa las tarjetas de departamentos. */
.dept-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 1.5rem;
    padding: 2rem 0;
}

/* ------------------------------------------------------------------
   Imágenes servidas en varios formatos
   ------------------------------------------------------------------ */

/* Las imágenes salen envueltas en «picture» para ofrecer AVIF y WebP. Ese
   envoltorio es un elemento en línea, y por serlo reserva el hueco de un
   renglón debajo de cada foto y se interpone entre el contenedor y la imagen:
   una regla como «.dept-card__image img» deja de aplicar. Con «display:
   contents» no genera caja propia y la imagen queda donde estaría sin él. */
picture {
    display: contents;
}

/* Y sus «source», que no se ven, dejan de contar como elementos: si no, en un
   contenedor con separación cada uno suma su hueco. */
picture > source {
    display: none;
}

/* En el diseño de referencia la tarjeta de departamento no lleva fotografía:
   su hueco de imagen muestra un icono, y por eso no hay regla para «img». Acá
   sí hay foto —del concejal, del encargado— y sin ajustarla al hueco se sale y
   tapa el nombre y el cargo. */
.dept-card__image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    /* Encuadre en el tercio superior: son retratos de cuerpo entero y en un
       hueco apaisado el centro cae a la altura del pecho, dejando la cara
       fuera. */
    object-position: center 22%;
    display: block;
}

/* El diseño de referencia estiliza el título de la tarjeta por su etiqueta
   —«.dept-card__body h3»— y acá esos títulos son «h2», porque colgar del título
   de la página los pone en ese nivel y así quien navega con lector de pantalla
   no se encuentra un salto. Se repite la regla para el nivel correcto: el
   aspecto queda idéntico y el orden de los encabezados también. */
.dept-card__body h2 {
    color: #1a1a1a;
    font-size: 1.15rem;
    font-weight: 700;
    line-height: 1.3;
    margin: 0 0 .75rem;
}

.dept-card__nombre {
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--color-primario, #0D5963);
    margin: 0 0 .2rem;
    line-height: 1.3;
}

.dept-card__encargado {
    font-size: .82rem;
    font-weight: 600;
    color: #5f6b73;
    text-transform: uppercase;
    letter-spacing: .04em;
    margin: 0;
}

.dept-card__desc {
    font-size: .86rem;
    color: #4a5560;
    line-height: 1.55;
    margin: .6rem 0 0;
}

.dept-card__tel,
.dept-card__mail {
    display: block;
    font-size: .85rem;
    color: var(--color-primario, #0D5963);
    margin-top: .35rem;
    text-decoration: none;
}

.dept-card__tel:hover,
.dept-card__mail:hover {
    text-decoration: underline;
}

.dept-card__partido {
    display: inline-block;
    font-size: .72rem;
    font-weight: 700;
    padding: .2rem .7rem;
    border-radius: 2rem;
    margin-top: .4rem;
}

/* Los grupos de la página de documentación. */
.obras__grupo-titulo {
    font-size: 1.1rem;
    font-weight: 700;
    margin: 2rem 0 1rem;
    color: var(--color-primario, #0D5963);
}

/* Cuando una sección todavía no tiene nada publicado. Se dice con palabras y
   no con un hueco en blanco, que se lee como que algo falló. */
.sin-contenido {
    grid-column: 1 / -1;
    text-align: center;
    color: #5f6b73;
    font-style: italic;
    padding: 3rem 1rem;
}

/* ------------------------------------------------------------------
   El visor de la cuenta pública
   ------------------------------------------------------------------ */
.guia-servicios__anios {
    display: flex;
    flex-wrap: wrap;
    gap: .6rem;
    justify-content: center;
    margin-bottom: 1.5rem;
}

.guia-servicios__anio {
    padding: .45rem 1.1rem;
    border-radius: 2rem;
    border: 2px solid var(--color-primario, #0D5963);
    color: var(--color-primario, #0D5963);
    font-weight: 600;
    font-size: .9rem;
    text-decoration: none;
}

.guia-servicios__anio--activo {
    background: var(--color-primario, #0D5963);
    color: #fff;
}

.guia-servicios__pdf {
    width: 100%;
    /* Se reserva sobre el ancho y no en «vh»: en teléfono una medida fija deja
       un hueco blanco debajo del documento. */
    min-height: calc(100% * 1.294);
    aspect-ratio: 1 / 1.294;
    border: none;
    border-radius: .5rem;
    background: #fff;
}

.guia-servicios__descargar {
    display: inline-block;
    margin-top: 1.2rem;
    padding: .7rem 1.6rem;
    border-radius: 2rem;
    background: var(--color-primario, #0D5963);
    color: #fff;
    font-weight: 600;
    text-decoration: none;
}

/* ------------------------------------------------------------------
   Los iconos de los valores institucionales
   ------------------------------------------------------------------ */

/* El diseño de referencia dibuja cada icono como un SVG escrito dentro del
   HTML, así que no carga ninguna tipografía de iconos. Los valores
   institucionales sí la necesitan: sus iconos los elige quien edita el
   controlador, por nombre.
   
   Traer la hoja entera de la librería serían ochenta y cuatro kilos de reglas
   —dos mil iconos— para dibujar seis. Se copian solo las seis que se usan; la
   tipografía la declara «iconos-partidos.css», que ya viene partida.
   
   Si mañana se cambia un valor en el controlador, hay que traer su regla acá.
   El test «los iconos de los valores existen» avisa si alguien se olvida: fue
   el que descubrió que «bi-balance-scale» no existía y que Equidad llevaba
   años saliendo sin icono. */
.mision-vision__card--valor .bi::before {
    font-family: "bootstrap-icons";
    font-style: normal;
    font-weight: normal;
    display: inline-block;
    line-height: 1;
}

.bi-eye-fill::before { content: "\f33e"; }
.bi-people-fill::before { content: "\f4cf"; }
.bi-lightning-fill::before { content: "\f46e"; }
.bi-shield-fill-check::before { content: "\f531"; }
.bi-lightbulb-fill::before { content: "\f468"; }
.bi-heart-fill::before { content: "\f415"; }

/* Estas tarjetas solo llevan un icono y un nombre, y heredaban el alto de las
   de misión y visión, que llevan un párrafo largo cada una: quedaban seis cajas
   enormes con dos palabras perdidas en el medio. Se ajustan a su contenido y se
   ponen de a tres, que es como caben sin que sobre espacio. */
.mision-vision__card--valor {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    gap: .75rem;
    padding: 1.75rem 1rem;
    min-height: 0;
}

.mision-vision__card--valor .mision-vision__card-icon {
    font-size: 1.75rem;
    color: var(--color-primario, #0D5963);
    /* El hueco del icono es el mismo que usan las tarjetas de arriba, para que
       las dos filas se lean como parte de la misma página. */
    width: 3.25rem;
    height: 3.25rem;
    border-radius: 50%;
    background: rgba(13, 89, 99, .09);
    display: flex;
    align-items: center;
    justify-content: center;
    margin: 0;
}

.mision-vision__card--valor .mision-vision__card-title {
    font-size: 1.05rem;
    margin: 0;
}

/* Tres por fila y no «los que quepan»: son seis, y dejándolo al ancho salían
   cinco arriba y uno solo abajo. Dos filas de tres quedan parejas. */
.mision-vision__cards:has(.mision-vision__card--valor) {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1.25rem;
}

@media (max-width: 900px) {
    .mision-vision__cards:has(.mision-vision__card--valor) {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 520px) {
    .mision-vision__cards:has(.mision-vision__card--valor) {
        grid-template-columns: 1fr;
    }
}

/* ------------------------------------------------------------------
   El buscador en la barra
   ------------------------------------------------------------------ */

/* Un icono y no una caja de texto: en la barra no cabe, y una caja que se
   encoge en teléfono termina midiendo tres centímetros y no sirve. El icono
   lleva a la página de búsqueda, donde el campo es del ancho que necesita. */
.header__buscar {
    display: flex;
    align-items: center;
    justify-content: center;
    /* Cuarenta y cuatro píxeles: menos que eso y un dedo no acierta. */
    width: 44px;
    height: 44px;
    border-radius: 50%;
    color: inherit;
    text-decoration: none;
    transition: background .18s;
}

.header__buscar:hover,
.header__buscar:focus-visible {
    background: rgba(255, 255, 255, .15);
}

/* ------------------------------------------------------------------
   Los títulos del pie
   ------------------------------------------------------------------ */

/* Ya no hace falta repetir nada: los títulos de columna del pie y el nombre del
   alcalde son «h4» y «h3», que es lo que usa el diseño de referencia, así que
   sus propias reglas los alcanzan. Antes eran «h2» y había que reescribirles el
   tamaño acá, con un valor que además no coincidía con el del sitio en vivo. */

/* ------------------------------------------------------------------
   El panel de accesibilidad
   ------------------------------------------------------------------ */

/* El botón flotante, su menú y los modos que enciende. Vienen de la hoja del
   diseño anterior, que es donde se escribieron: el diseño de referencia no trae
   nada de esto porque su sitio no tiene panel de accesibilidad.

   Se copian las reglas ENTERAS, con su selector completo. La primera vez se
   copiaron por trozos que empezaran en «.acc-», y eso convirtió
   «body.alto-contraste .acc-panel» en «.acc-panel»: el menú salía negro
   siempre, no solo en el modo de alto contraste, con el texto gris y los
   iconos apagados. Se veía roto sin estar roto. */

.acc-fab {position: fixed;
    right: 1.25rem;
    bottom: 1.5rem;
    z-index: 9990;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 0.6rem;}
.acc-fab-btn {width: 54px;
    height: 54px;
    border-radius: 50%;
    background: var(--color-primario);
    color: #fff;
    border: none;
    cursor: pointer;
    font-size: 1.5rem;
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: 0 4px 18px rgba(13,89,99,0.45);
    transition: transform 0.18s ease, background 0.18s ease, box-shadow 0.18s ease;
    flex-shrink: 0;}
.acc-fab-btn:hover {background: var(--color-primario-dark); transform: scale(1.08);}
.acc-fab-btn:focus-visible {outline: 3px solid #fff; outline-offset: 3px;}
.acc-panel {background: #fff;
    border: 1px solid #e2e8ed;
    border-radius: 14px;
    box-shadow: 0 10px 40px rgba(0,0,0,0.18);
    width: 252px;
    overflow: hidden;
    display: none;
    animation: accPanelIn 0.18s ease;}
.acc-panel.is-open {display: block;}
.acc-panel-header {display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0.8rem 1rem 0.65rem;
    border-bottom: 1px solid #f0f4f8;
    background: #f8fafc;}
.acc-panel-header-title {font-size: 0.7rem;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: var(--color-primario);}
.acc-panel-close {background: none;
    border: none;
    cursor: pointer;
    color: #aab;
    font-size: 1rem;
    padding: 0 0.15rem;
    line-height: 1;
    transition: color 0.14s;
    font-family: var(--fuente);}
.acc-panel-close:hover {color: #555;}
.acc-panel-list {list-style: none;
    margin: 0;
    padding: 0.35rem 0 0.5rem;}
.acc-panel-item {display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.6rem 1rem;
    cursor: pointer;
    font-size: 0.88rem;
    font-weight: 500;
    color: #2d2d2d;
    user-select: none;
    transition: background 0.12s;
    position: relative;}
.acc-panel-item:hover {background: #f4f7f9;}
.acc-panel-item.is-active {color: var(--color-primario);
    font-weight: 700;
    background: #edf6f7;}
.acc-item-icon {width: 30px;
    height: 30px;
    border-radius: 7px;
    background: #eef2f5;
    color: #666;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1rem;
    flex-shrink: 0;
    transition: background 0.14s, color 0.14s;}
.acc-panel-item:hover .acc-item-icon {background: #d8eef1; color: var(--color-primario);}
.acc-panel-item.is-active .acc-item-icon {background: var(--color-primario); color: #fff;}
.acc-item-badge {margin-left: auto;
    font-size: 0.68rem;
    font-weight: 800;
    color: var(--color-primario);
    background: #daeef1;
    border-radius: 2rem;
    padding: 0.1rem 0.5rem;
    white-space: nowrap;
    display: none;}
.acc-panel-item.is-active .acc-item-badge {display: inline-block;}
.acc-panel-item--sep {border-top: 1px solid #f0f4f8;
    margin-top: 0.3rem;
    padding-top: 0.75rem;
    color: #6b6b6b;}
.acc-panel-item--sep .acc-item-icon {background: #fce8ea; color: #c0392b;}
.acc-panel-item--sep:hover {background: #fff5f5;}
.acc-panel-item--sep:hover .acc-item-icon {background: #f9c0c5; color: #c0392b;}
.acc-panel-item--sep {color: #c0392b;}
.acc-popup-overlay {position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.62);
    z-index: 10000;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1rem;
    opacity: 0;
    transition: opacity 0.28s ease;}
.acc-popup-overlay.is-visible {opacity: 1;}
.acc-popup {background: #fff;
    border-radius: 18px;
    padding: 2rem 2rem 1.75rem;
    max-width: 480px;
    width: 100%;
    box-shadow: 0 16px 48px rgba(0,0,0,0.28);
    text-align: center;}
.acc-popup-icon {font-size: 3rem;
    color: var(--color-primario);
    margin-bottom: 0.75rem;}
.acc-popup-title {font-size: 1.25rem;
    font-weight: 800;
    color: var(--color-texto);
    margin-bottom: 0.5rem;
    line-height: 1.3;}
.acc-popup-desc {font-size: 0.9rem;
    color: var(--color-texto-suave);
    margin-bottom: 1.5rem;
    line-height: 1.6;}
.acc-popup-actions {display: flex; gap: 0.75rem; justify-content: center; flex-wrap: wrap;}
.acc-popup-btn-si {background: var(--color-primario);
    color: #fff;
    border: none;
    border-radius: 10px;
    padding: 0.75rem 1.75rem;
    font-size: 1rem;
    font-weight: 700;
    cursor: pointer;
    transition: background 0.18s;}
.acc-popup-btn-si:hover {background: var(--color-primario-dark);}
.acc-popup-btn-no {background: #f0f0f0;
    color: var(--color-texto);
    border: 1px solid var(--color-borde);
    border-radius: 10px;
    padding: 0.75rem 1.5rem;
    font-size: 0.9rem;
    font-weight: 600;
    cursor: pointer;
    transition: background 0.18s;}
.acc-popup-btn-no:hover {background: #e0e0e0;}
#acc-banner-modo {background: #e6f4f7;
    border-bottom: 2px solid var(--color-primario);
    padding: 0.55rem 1.25rem;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 1rem;
    font-size: 0.82rem;
    color: var(--color-primario-dark);
    flex-wrap: wrap;
    text-align: center;}
#acc-banner-modo strong {font-weight: 800;}
#acc-banner-modo button {background: var(--color-primario);
    color: #fff;
    border: none;
    border-radius: 6px;
    padding: 0.32rem 0.9rem;
    font-size: 0.78rem;
    font-weight: 700;
    cursor: pointer;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    transition: background 0.15s;
    font-family: var(--fuente);}
#acc-banner-modo button:hover {background: var(--color-primario-dark);}

/* Y los modos que enciende el propio panel, con la condición que los activa.
   Sin ella se aplican siempre, que es exactamente lo que pasó. */

body.alto-contraste #modal-svc-caja, body.alto-contraste .acc-popup {background: #1e1e1e !important; color: #eee !important;}
body.alto-contraste #modal-svc-titulo, body.alto-contraste .acc-popup h2 {color: #fff !important;}
body.alto-contraste .acc-panel-title {color: #4dd0e1 !important; border-bottom-color: #333 !important;}
body.alto-contraste .acc-panel-item:hover {background: #2a2a2a !important;}
body.alto-contraste .acc-item-icon {background: #2a2a2a !important; color: #ccc !important;}

/* ------------------------------------------------------------------
   El buscador de la barra
   ------------------------------------------------------------------ */

/* Cerrado ocupa lo que un icono, y al tocarlo se abre en su sitio. Antes era un
   enlace que llevaba a otra página solo para escribir dos palabras: dos pasos
   para lo que debería ser uno, y el icono suelto además desentonaba entre dos
   botones con relleno. */
.buscador-barra {
    display: flex;
    align-items: center;
    background: rgba(255, 255, 255, .14);
    border-radius: 2rem;
    /* La transición es del ancho del campo, no del contenedor: animar el
       contenedor empuja los botones vecinos en cada apertura. */
    padding: 0 .25rem 0 0;
    /* Sin esto, el texto de ayuda del campo se sale de su caja de ancho cero y
       queda escrito encima de la barra, en negro y partido en dos líneas. */
    overflow: hidden;
}

.buscador-barra__campo {
    width: 0;
    /* «min-width: 0» además del ancho: un campo de formulario trae un ancho
       mínimo propio del navegador que ignora el «width: 0». */
    min-width: 0;
    padding: 0;
    border: none;
    background: transparent;
    /* En blanco a la fuerza: la barra es verde oscuro y el color que hereda el
       campo es el negro del cuerpo, que ahí no se lee. */
    color: #fff !important;
    font-size: .92rem;
    outline: none;
    transition: width .25s ease, padding .25s ease;
}

.buscador-barra__campo::placeholder {
    color: rgba(255, 255, 255, .7);
}

/* Se abre al enfocarlo y al pasar el ratón por encima. El «:focus-within» del
   contenedor es lo que lo mantiene abierto mientras se escribe. */
.buscador-barra:hover .buscador-barra__campo,
.buscador-barra:focus-within .buscador-barra__campo {
    width: 190px;
    padding: .55rem .25rem .55rem 1rem;
}

.buscador-barra__boton {
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    /* Cuarenta y cuatro píxeles: menos que eso y un dedo no acierta. */
    width: 44px;
    height: 44px;
    border: none;
    border-radius: 50%;
    background: transparent;
    cursor: pointer;
    flex: 0 0 auto;
}

.buscador-barra__boton:hover,
.buscador-barra__boton:focus-visible {
    background: rgba(255, 255, 255, .2);
}

/* En teléfono el campo va siempre abierto y del ancho que quede: el gesto de
   «pasar el ratón» no existe, y un campo que solo se abre al enfocarlo obliga a
   un toque a ciegas sobre algo que mide cero. */
@media (max-width: 992px) {
    .buscador-barra {
        width: 100%;
        margin: .5rem 0;
    }

    .buscador-barra__campo {
        width: 100%;
        padding: .6rem .25rem .6rem 1rem;
    }
}

/* ------------------------------------------------------------------
   Texto solo para lectores de pantalla
   ------------------------------------------------------------------ */

/* Se usa en las etiquetas de los campos de búsqueda y en el enlace para saltar
   al contenido: cosas que quien ve la página no necesita leer, y quien navega
   con lector de pantalla sí.

   Ninguno de los dos diseños la traía, así que ese texto salía escrito encima
   de la barra, en negro sobre verde. Es un defecto silencioso de los peores:
   la clase existe en el HTML, nadie la define, y el resultado no da error —solo
   se ve mal, y solo si alguien mira.

   No se usa «display: none» ni «visibility: hidden»: eso lo esconde también del
   lector de pantalla, que es justo lo contrario de lo que se busca. */
.visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

/* Salvo cuando se le da el foco con el teclado: el enlace para saltar al
   contenido tiene que verse justo en ese momento. */
.visually-hidden-focusable:not(:focus):not(:focus-within) {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

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

/* Estuvo dentro de la barra de navegación y ahí no cabía: esa barra ya lleva
   diez enlaces, el teléfono y WhatsApp, y un campo que se abre la deformaba
   cada vez. Acá no estorba, se alcanza desde cualquier página sin subir, y
   queda simétrico con el de accesibilidad, que está en la esquina de enfrente. */
.buscador-flotante {
    position: fixed;
    right: 1.25rem;
    bottom: 1.25rem;
    z-index: 900;
    display: flex;
    align-items: center;
    gap: .5rem;
    flex-direction: row-reverse;
}

.buscador-flotante__abrir {
    /* Del mismo tamaño y forma que el de accesibilidad: son los dos botones
       que flotan sobre la página, y que se parezcan los explica sin palabras. */
    width: 54px;
    height: 54px;
    border-radius: 50%;
    border: none;
    background: var(--color-primario, #0D5963);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    box-shadow: 0 4px 16px rgba(0, 0, 0, .28);
    transition: transform .18s, background .18s;
}

.buscador-flotante__abrir:hover,
.buscador-flotante__abrir:focus-visible {
    transform: scale(1.08);
}

.buscador-flotante__abrir:focus-visible {
    outline: 3px solid #fff;
    outline-offset: 3px;
}

.buscador-flotante__caja {
    display: flex;
    align-items: center;
    gap: .4rem;
    background: #fff;
    border-radius: 2rem;
    padding: .35rem .35rem .35rem 1rem;
    box-shadow: 0 4px 20px rgba(0, 0, 0, .22);
}

.buscador-flotante__caja[hidden] {
    display: none;
}

.buscador-flotante__campo {
    width: 230px;
    max-width: 55vw;
    border: none;
    outline: none;
    font-size: .95rem;
    color: #1a1a1a;
    background: transparent;
}

.buscador-flotante__enviar {
    border: none;
    border-radius: 2rem;
    background: var(--color-primario, #0D5963);
    color: #fff;
    font-weight: 600;
    font-size: .88rem;
    /* Cuarenta y cuatro de alto: menos que eso y un dedo no acierta. */
    padding: 0 1.1rem;
    height: 44px;
    cursor: pointer;
}

/* En teléfono la caja se despliega encima del botón, no al lado: al lado no
   cabe y empujaría el botón fuera de la pantalla. */
@media (max-width: 600px) {
    .buscador-flotante {
        flex-direction: column;
        align-items: flex-end;
    }

    .buscador-flotante__campo {
        width: 62vw;
    }
}

/* ------------------------------------------------------------------
   Las tarjetas de «Ver más servicios»
   ------------------------------------------------------------------ */

/* En producción esta retícula es de cuadrados, porque las imágenes que subieron
   allá son cuadradas de origen (1080×1080) y la tarjeta se adapta a lo que le
   pongan dentro.

   Eso hace que la portada cambie de forma según lo que suba quien publica: con
   una imagen apaisada las tarjetas quedan de la mitad de alto y la sección se
   ve distinta a la de producción, que es lo que pasaba acá.

   Se fija el cuadrado en la tarjeta, no en la imagen: así la retícula es
   siempre la misma suba lo que suba, y la imagen se acomoda dentro sin
   recortarse. Lo que mejor se ve sigue siendo una imagen cuadrada. */
.boton-card {
    aspect-ratio: 1 / 1;
}

/* La imagen llena TODA la tarjeta (cover), así todos los banners —y los que se
   suban después, con cualquier proporción— quedan del mismo tamaño y estilo, sin
   franjas ni recuadros vacíos. Se estira también el <a> y el <picture> que
   envuelven la imagen, o se quedan al alto natural de la imagen. El overflow del
   recuadro (con su radio) recorta las esquinas → bordes redondeados parejos. */
.boton-card > a,
.boton-card picture {
    display: block;
    width: 100%;
    height: 100%;
}

.boton-card__img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}


/* ------------------------------------------------------------------
   Los colores que necesitan las reglas traídas del otro diseño
   ------------------------------------------------------------------ */

/* Las reglas del panel de accesibilidad vienen de la hoja del diseño anterior y
   están escritas contra sus variables. El diseño de referencia no define
   ninguna, así que sin esto el botón sale con fondo transparente: no da error,
   simplemente no se ve, que es lo peor que le puede pasar justo a ese botón.

   Los valores son los del diseño anterior, copiados y no inventados. */
:root {
    --color-borde: #dde3e0;
    --color-primario: #0D5963;
    --color-primario-dark: #094550;
    --color-texto: #1a1a1a;
    --color-texto-suave: #63696f;
    --fuente: 'Montserrat', sans-serif;
}

/* El icono del botón de accesibilidad, que es de la tipografía de iconos: sin
   su regla el botón sale vacío, y un botón redondo sin nada dentro no dice
   qué hace. */
.acc-fab-btn .bi::before {
    font-family: "bootstrap-icons";
    font-style: normal;
    font-weight: normal;
    line-height: 1;
}

.bi-universal-access::before { content: "\f826"; }

/* ------------------------------------------------------------------
   Las flechas de los desplegables del menú
   ------------------------------------------------------------------ */

/* La hoja del diseño de referencia trae dos reglas que dimensionan estos SVG:
   «.header__nav svg» los deja en 14 píxeles y «a > svg:only-child» en 24. Las
   dos tienen la misma especificidad, así que decide cuál va después.

   Y no decide el orden sino la especificidad: «a > svg:only-child» pesa más que
   «.header__nav svg», así que gana la de 24 aunque venga antes. Por eso los
   cuatro menús con desplegable medían diez píxeles más cada uno —cuarenta en
   total, que es exactamente lo que separaba este menú del de producción— y por
   eso repetir la regla tal cual no arreglaba nada.

   Se escribe con un selector más específico que el que hay que ganar. */
.header__nav .has-dropdown > a > svg,
.header__nav li > a > svg {
    width: 14px;
    height: 14px;
}


/* Los iconos del panel de accesibilidad.

   Se copian solo estos siete, sacados del propio guion del panel para no
   adivinar ninguno. La hoja completa de la librería son dos mil iconos en
   ochenta y cuatro kilos de reglas, y acá hacen falta siete.

   Sin ellos el panel se abre con siete cuadrados grises vacíos: se ve roto sin
   estarlo, que es como estaba. */
.acc-panel .bi::before,
.acc-item-icon .bi::before {
    font-family: "bootstrap-icons";
    font-style: normal;
    font-weight: normal;
    line-height: 1;
}

.bi-arrow-counterclockwise::before { content: "\f117"; }
.bi-circle-half::before { content: "\f288"; }
.bi-person-hearts::before { content: "\f77b"; }
.bi-universal-access::before { content: "\f826"; }
.bi-volume-up::before { content: "\f611"; }
.bi-zoom-in::before { content: "\f62c"; }
.bi-zoom-out::before { content: "\f62d"; }

/* ------------------------------------------------------------------
   Dónde va cada botón flotante
   ------------------------------------------------------------------ */

/* El de accesibilidad a la izquierda, como en producción; el buscador a la
   derecha. Las reglas que vienen de la hoja del otro diseño lo ponen a la
   derecha, y ahí los dos quedaban uno encima del otro.

   Esta regla ya se había escrito y se perdió al rehacer el bloque de
   accesibilidad completo: se pone al final, fuera de ese bloque, para que
   volver a traer aquellas reglas no se la lleve otra vez. */
.acc-fab {
    right: auto;
    left: 1.25rem;
}

/* ------------------------------------------------------------------
   La imagen del aviso emergente
   ------------------------------------------------------------------ */

/* El aviso de la portada salía de 1080 × 760 donde producción lo tiene de 760 ×
   760, y por eso su botón de cerrar caía 160 píxeles a la derecha del borde.

   La causa no está en el aviso sino en las imágenes del sitio: este proyecto
   les añade los atributos «width» y «height» para que el navegador reserve su
   hueco antes de bajarlas y la página no dé un salto al cargar. Producción no
   lo hace. Con esos atributos, cuando «max-height» recorta el alto, el ancho se
   queda en el que dice el atributo y la caja deja de ser cuadrada.

   Basta con dejar el ancho en automático: el alto manda, el ancho lo sigue, y
   los atributos siguen sirviendo para reservar el hueco. */
.popup-content img {
    width: auto;
    height: auto;
}


/* ==================================================================
   ALTO CONTRASTE — copiado del sitio de referencia (municipalidadgraneros.cl).
   NO invierte a oscuro: realza el contraste del diseño CLARO con un filtro
   sobre <html>. Así el header fijo sigue visible al hacer scroll (no se funde
   con un fondo negro) y se ve moderno. El enfoque oscuro anterior dejaba todo
   negro y el navbar invisible; se reemplaza por completo.
   ================================================================== */
html:has(body.alto-contraste) { filter: contrast(1.15); }

/* ------------------------------------------------------------------
   La versión simplificada
   ------------------------------------------------------------------ */

/* Lo que se enciende desde el panel de accesibilidad o desde el aviso de la
   portada: letras más grandes, más separación y menos cosas en pantalla. Está
   pensado para quien tiene dificultad visual o no se maneja con una página
   llena de columnas.

   El servidor lo lee de una cookie y le pone la clase «modo-mayor» al cuerpo;
   todo lo demás cuelga de esa clase. Las reglas vienen de la hoja del diseño
   anterior, copiadas enteras con su selector: el diseño de referencia no tiene
   nada parecido. */

#acc-banner-modo {background: #e6f4f7;
    border-bottom: 2px solid var(--color-primario);
    padding: 0.55rem 1.25rem;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 1rem;
    font-size: 0.82rem;
    color: var(--color-primario-dark);
    flex-wrap: wrap;
    text-align: center;}
#acc-banner-modo strong {font-weight: 800;}
#acc-banner-modo button {background: var(--color-primario);
    color: #fff;
    border: none;
    border-radius: 6px;
    padding: 0.32rem 0.9rem;
    font-size: 0.78rem;
    font-weight: 700;
    cursor: pointer;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    transition: background 0.15s;
    font-family: var(--fuente);}
#acc-banner-modo button:hover {background: var(--color-primario-dark);}

/* ------------------------------------------------------------------
   Hacia dónde abre el panel de accesibilidad
   ------------------------------------------------------------------ */

/* El panel viene sin posicionar: se apila dentro del mismo contenedor que el
   botón, así que al abrirse el contenedor se ensancha a los 252 píxeles del
   panel y el botón salta de la esquina al otro extremo. Parece que el botón se
   mueve solo, y es lo primero que se nota al usarlo.

   En el diseño anterior no se veía porque el botón iba a la derecha: el
   contenedor crecía hacia la izquierda y el botón se quedaba en su sitio. Al
   moverlo a la izquierda —que es donde está en producción— el defecto aparece.

   Se ancla el contenedor al tamaño del botón y el panel se saca del flujo:
   entonces el botón no se mueve nunca y el panel se despliega hacia arriba y
   hacia la derecha, que es el lado donde hay sitio. */
.acc-fab {
    width: 54px;
    height: 54px;
}

.acc-fab .acc-panel {
    position: absolute;
    bottom: calc(100% + .75rem);
    left: 0;
    right: auto;
}

/* En teléfono se despliega desde el borde izquierdo y ocupa lo que quepa: un
   panel de 252 píxeles anclado al botón se sale por la derecha en pantallas
   angostas. */
@media (max-width: 380px) {
    .acc-fab .acc-panel {
        width: calc(100vw - 2.5rem);
        max-width: 252px;
    }
}


/* ------------------------------------------------------------------
   Alto contraste
   ------------------------------------------------------------------ */

/* Lo que enciende esa opción del panel: fondo oscuro, texto claro y bordes
   marcados en todo el sitio, no solo en el propio panel.

   La primera vez se copiaron quince de las setenta y nueve reglas que tiene la
   hoja base, porque la expresión que las buscaba no entraba dentro de los
   bloques «@media», que es justo donde estaban casi todas. El resultado era un
   modo que cambiaba los colores de su propio recuadro y dejaba la página igual:
   se encendía y no servía de nada. */

/* (tema oscuro de alto contraste eliminado: reemplazado por el filtro de arriba) */

/* ------------------------------------------------------------------
   La versión simplificada
   ------------------------------------------------------------------ */

/* Lo que hace no es agrandar la letra ni apilar todo en una columna —eso fue lo
   primero que probé y lo único que consigue es desordenar la portada—. Lo que
   hace es QUITAR OPCIONES: la barra superior pasa de cuatro enlaces a tres y el
   menú de diez a cuatro. La página se ve igual; lo que baja es la cantidad de
   decisiones que hay que tomar para encontrar algo.

   El banner de arriba es del diseño anterior, copiado tal cual. */

#acc-banner-modo {background: #e6f4f7;
    border-bottom: 2px solid var(--color-primario);
    padding: 0.55rem 1.25rem;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 1rem;
    font-size: 0.82rem;
    color: var(--color-primario-dark);
    flex-wrap: wrap;
    text-align: center;}
#acc-banner-modo strong {font-weight: 800;}
#acc-banner-modo button {background: var(--color-primario);
    color: #fff;
    border: none;
    border-radius: 6px;
    padding: 0.32rem 0.9rem;
    font-size: 0.78rem;
    font-weight: 700;
    cursor: pointer;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    transition: background 0.15s;
    font-family: var(--fuente);}
#acc-banner-modo button:hover {background: var(--color-primario-dark);}

/* El banner de la versión simplificada, encima de todo.

   La cabecera del diseño nuevo es fija y arranca en el borde superior, así que
   el banner quedaba debajo de ella: existía, medía sus 45 píxeles, y no se veía
   ni uno. En el diseño anterior no pasaba porque allá la cabecera no es fija.

   Se fija el banner también y se baja la cabecera lo que él mide, para que
   ninguno tape al otro. Solo en versión simplificada: en la normal el banner no
   existe y la cabecera tiene que seguir arriba del todo. */
body.modo-mayor #acc-banner-modo {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    /* Por encima de la cabecera, que es lo que hay que ganar. */
    z-index: 1100;
}

body.modo-mayor header {
    top: var(--acc-banner-h, 68px);
}

body.modo-mayor main {
    padding-top: var(--acc-banner-h, 68px);
}


/* Los iconos del banner de la versión simplificada. */
#acc-banner-modo .bi::before,
#acc-desactivar-modo .bi::before {
    font-family: "bootstrap-icons";
    font-style: normal;
    font-weight: normal;
    line-height: 1;
}

.bi-arrow-left-circle::before { content: "\f12a"; }

/* ------------------------------------------------------------------
   DIDECO: los filtros y las oficinas son enlaces, no botones

   En el sitio anterior eran <button> que movía Vue; acá son enlaces de verdad
   para que cada oficina tenga su dirección y funcione sin JavaScript. Lo único
   que hay que devolverles es el aspecto: un enlace trae subrayado y color
   propios que el botón no tenía.
   ------------------------------------------------------------------ */
.dideco__filter,
.dideco__item {
    text-decoration: none;
}

/* Solo lo que el enlace trae de más: el subrayado. El color y la altura de
   línea los pone la hoja del diseño, y forzarlos acá con «inherit» dejaba el
   filtro activo con el texto negro sobre fondo verde —cuando en el sitio en
   vivo va blanco— y cinco píxeles más alto que su botón equivalente. */
.dideco__item {
    color: inherit;
}

.dideco__filter,
.daf__filter {
    line-height: normal;
}

.dideco__item {
    display: block;
}

/* Los números del paginador son enlaces (para que cada página tenga dirección
   propia), pero deben verse como los botones del diseño original. */
.pagination__btn {
    text-decoration: none;
}

/* ------------------------------------------------------------------
   Tarjetas que son enlaces

   En el sitio anterior la tarjeta de una noticia o un video se hacía clicable
   con JavaScript; acá es un enlace de verdad, para que funcione sin scripts y
   para que un buscador la recorra. Lo único que hay que devolverle es el
   aspecto: un enlace subraya y recolorea todo lo que lleva dentro.
   ------------------------------------------------------------------ */
.noticia-card,
.video-card,
.noticia-card:hover,
.video-card:hover {
    text-decoration: none;
    color: inherit;
}

.noticia-card *,
.video-card * {
    text-decoration: none;
}

/* ------------------------------------------------------------------
   Hitos y personajes: la lista lateral son enlaces

   Cada hito tiene dirección propia, así que la lista dejó de ser botones que
   movía un script y pasó a ser enlaces. Un enlace es en línea: sin esto el
   ítem activo se veía como una barra oscura sin texto, porque el bloque se
   colapsaba y el nombre quedaba fuera.
   ------------------------------------------------------------------ */
.hitos-page__item {
    display: block;
    text-decoration: none;
    color: inherit;
}

.hitos-page__item-name,
.hitos-page__item-cargo {
    display: block;
    text-decoration: none;
}

/* Guía turística. El diseño viene del sitio anterior, donde el visor era un
   componente de JavaScript: el índice de páginas era una ventana que abría un
   clic y los botones de avanzar eran botones. Acá son enlaces con dirección
   propia —para que se puedan compartir e indexar—, así que hay que devolverles
   el aspecto que tenían y hacer que la ventana se abra sola con el ancla. */
.book-viewer2 { display: flex; flex-direction: column; }
.book-viewer2__nav {
    align-items: center;
    color: #16213e;
    display: flex;
    flex: none;
    justify-content: center;
    line-height: 1;
    text-decoration: none;
}
.book-viewer2__nav[aria-disabled="true"] { cursor: default; opacity: .4; }
.book-viewer2__grid-btn { text-decoration: none; }
.book-viewer2__descarga {
    background: #ffffff26;
    border-radius: 8px;
    color: #fff;
    font-size: .8rem;
    font-weight: 700;
    letter-spacing: .04em;
    margin-left: .5rem;
    padding: .45rem .7rem;
    text-decoration: none;
    transition: background .2s;
}
.book-viewer2__descarga:hover { background: #ffffff40; }
.book-viewer2__thumb { text-decoration: none; }

/* El índice sólo aparece cuando la dirección lo apunta. Sin esto se vería
   siempre encima de la hoja, porque es una capa fija a pantalla completa. */
.book-viewer2__modal { display: none; }
.book-viewer2__modal:target { display: flex; }
.book-viewer2__modal-header a {
    align-items: center;
    background: #f0f0f0;
    border-radius: 6px;
    color: #666;
    display: flex;
    height: 32px;
    justify-content: center;
    text-decoration: none;
    width: 32px;
}
.book-viewer2__modal-header a:hover { background: #e0e0e0; }

/* Guía de servicios. Mismo caso que la guía turística: el visor era un
   componente de JavaScript con botones, y acá son enlaces con dirección propia.
   Hay que devolverles el aspecto y abrir el índice con el ancla. */
.book-viewer__nav {
    align-items: center;
    display: flex;
    justify-content: center;
    text-decoration: none;
}
.book-viewer__nav[aria-disabled="true"] { cursor: default; opacity: .35; }
.book-viewer__grid-btn { text-decoration: none; }
.book-viewer__descarga {
    background: #ffffff26;
    border-radius: 8px;
    color: #fff;
    font-size: .8rem;
    font-weight: 700;
    letter-spacing: .04em;
    margin-left: .5rem;
    padding: .45rem .7rem;
    text-decoration: none;
    transition: background .2s;
}
.book-viewer__descarga:hover { background: #ffffff40; }
.book-viewer__thumb { text-decoration: none; }
.book-viewer__modal { display: none; }
.book-viewer__modal:target { display: flex; }
.book-viewer__modal-header a {
    align-items: center;
    background: #f0f0f0;
    border-radius: 6px;
    color: #666;
    display: flex;
    height: 32px;
    justify-content: center;
    text-decoration: none;
    width: 32px;
}
.book-viewer__modal-header a:hover { background: #e0e0e0; }

/* Página del alcalde. En el sitio anterior todo esto iba en atributos «style»
   dentro de la plantilla, así que no había forma de ajustarlo sin tocar el
   marcado —ni de que respetara el modo de alto contraste—. Son las mismas
   medidas y los mismos colores, movidos a clases. */
.autoridad {
    align-items: flex-start;
    display: flex;
    flex-wrap: wrap;
    gap: 2.5rem;
    padding: 1.5rem 0;
}
.autoridad__ficha { flex: 0 1 320px; text-align: center; }
.autoridad__texto { flex: 1 1 420px; }
.autoridad__texto h2 { font-size: 1.4rem; margin-bottom: 1rem; }
.autoridad__texto p { line-height: 1.8; }
.autoridad__foto {
    border-radius: 1rem;
    box-shadow: 0 6px 32px rgba(0, 0, 0, .14);
    display: block;
    margin: 0 auto 1.25rem;
    max-width: 320px;
    width: 100%;
}
.autoridad__nombre { font-size: 1.4rem; margin-bottom: .2rem; }
.autoridad__cargo { margin-bottom: .1rem; opacity: .75; }
.autoridad__periodo { margin-bottom: 1.2rem; opacity: .75; }
.autoridad__redes {
    display: flex;
    gap: .5rem;
    justify-content: center;
    margin-bottom: 1.5rem;
}
.autoridad__red {
    align-items: center;
    background: #0a4952;
    border-radius: 50%;
    color: #fff;
    display: inline-flex;
    height: 38px;
    justify-content: center;
    width: 38px;
}
/* El foco tiene que verse: son enlaces que salen del sitio. */
.autoridad__red:focus-visible { outline: 3px solid #fdbb2d; outline-offset: 2px; }
.autoridad__contacto {
    background: rgba(10, 73, 82, .06);
    border-radius: .75rem;
    padding: 1.1rem 1.3rem;
    text-align: left;
}
.autoridad__contacto h3 { font-size: 1rem; margin-bottom: .7rem; }
.autoridad__contacto p { font-size: .88rem; margin-bottom: .4rem; }
.autoridad__contacto p:last-child { margin-bottom: 0; }

/* El mapa de la Dirección de Obras, antes de cargarse. Ocupa el mismo espacio
   que el marco para que la página no salte cuando aparece. */
.mapa-diferido {
    align-items: center;
    aspect-ratio: 600 / 320;
    /* El ancho lo manda el contenedor. Sin declararlo, con la proporción puesta
       el navegador calcula el ancho desde la altura y el bloque se sale de la
       pantalla: en el teléfono la página del Concejo medía 1149 píxeles de
       ancho y se podía arrastrar de lado. */
    box-sizing: border-box;
    max-width: 100%;
    width: 100%;
    background: #f0f0f0;
    border-radius: .75rem;
    display: flex;
    flex-direction: column;
    gap: .75rem;
    justify-content: center;
    padding: 1.5rem;
    text-align: center;
}
.mapa-diferido__aviso { color: #444; font-size: .9rem; margin: 0; max-width: 34ch; }
.mapa-diferido__boton {
    background: #0a4952;
    border: none;
    border-radius: .5rem;
    color: #fff;
    cursor: pointer;
    font-size: .9rem;
    min-height: 44px;
    padding: .6rem 1.2rem;
}
.mapa-diferido__boton:hover { background: #0d5a65; }
.mapa-diferido__enlace { color: #0a4952; font-size: .85rem; }

/* La ficha de una noticia. En el sitio anterior la noticia se abría en una
   ventana encima del listado: no tenía dirección propia, no se podía enlazar ni
   compartir, y para un buscador el sitio no tenía ni una sola noticia. Acá se
   usa ese mismo diseño como página, así que hay que quitarle lo que solo tenía
   sentido flotando: la altura máxima, la sombra de ventana y el desenfoque. */
.modal--ficha {
    animation: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    background: #fff;
    box-shadow: 0 6px 28px rgba(0, 0, 0, .10);
    margin: 0 auto 2.5rem;
    max-height: none;
}
.modal--ficha .modal__content { overflow-y: visible; }
.modal--ficha .modal__texto { white-space: normal; }
.modal--ficha .modal__texto p { margin-bottom: 1.1rem; }

.noticias-page__titulo-relacionadas {
    color: #0d5963;
    font-size: 1.5rem;
    font-weight: 800;
    margin: 0 0 1.25rem;
}

.aviso-vista-previa {
    background: #fff3cd;
    border-left: 4px solid #e9b02d;
    border-radius: .5rem;
    color: #6b5200;
    margin-bottom: 1.5rem;
    padding: .9rem 1.2rem;
}

/* La ficha de un departamento. El diseño viene del sitio anterior, donde era una
   ventana que abría un clic; acá es una página con su propia dirección, así que
   hay que quitarle lo que solo tenía sentido flotando. */
.departamentos .modal--ficha {
    animation: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    background: #fff;
    box-shadow: 0 6px 28px rgba(0, 0, 0, .10);
    margin: 0 auto 2.5rem;
    max-height: none;
    max-width: 900px;
}
.departamentos .modal--ficha .modal__body { overflow-y: visible; }
.departamentos__otros-titulo {
    color: #0d5963;
    font-size: 1.4rem;
    font-weight: 800;
    margin: 0 0 1.25rem;
}
.dept-card__nombre a { color: inherit; text-decoration: none; }
.dept-card__nombre a:hover,
.dept-card__nombre a:focus-visible { text-decoration: underline; }
.modal__contacto-item span {
    color: #888;
    display: block;
    font-size: .8rem;
    letter-spacing: .06em;
    text-transform: uppercase;
}

/* La ficha de un video. Igual que la de una noticia: el diseño viene de la
   ventana del sitio anterior y acá es una página con dirección propia, así que
   pierde la altura máxima y la sombra de ventana. */
.videos-page .modal--ficha {
    animation: none;
    background: #fff;
    box-shadow: 0 6px 28px rgba(0, 0, 0, .10);
    margin: 0 auto 2.5rem;
    max-height: none;
    overflow: hidden;
}
.videos-page .modal--ficha .modal__left,
.videos-page .modal--ficha .modal__right,
.videos-page .modal--ficha .modal__layout { max-height: none; }
.videos-page .modal--ficha .modal__right { overflow-y: visible; }
.videos-page .modal--ficha .modal__video { aspect-ratio: 16 / 9; height: auto; }
.videos-page__titulo-relacionados {
    color: #0d5963;
    font-size: 1.4rem;
    font-weight: 800;
    margin: 0 0 1.25rem;
}
.mapa-diferido__portada {
    border-radius: .5rem;
    max-height: 220px;
    object-fit: cover;
    width: 100%;
}

/* Las tarjetas de documento son un enlace entero: sin esto el título sale
   subrayado y en el sitio en vivo no lo está. */
.obras__card, .obras__card:hover { text-decoration: none; }
.obras__card-fecha { align-items: center; display: flex; gap: .4rem; justify-content: center; }
.obras__card-fecha svg { height: 14px; width: 14px; }

/* Las páginas que este sitio agrega y el diseño de referencia no traía: la
   ficha de una actividad del calendario y la lista de sesiones del Concejo. */
.calendario__event-card--ficha { cursor: default; max-width: 900px; margin: 0 auto 2rem; }
.calendario__event-card--ficha h1 { font-size: 1.6rem; margin: .5rem 0 1rem; }

.concejo-page__playlist-item {
    align-items: center;
    border-radius: .75rem;
    color: inherit;
    display: flex;
    gap: 1rem;
    padding: .75rem;
    text-decoration: none;
    transition: background .2s;
}
.concejo-page__playlist-item:hover { background: rgba(10, 73, 82, .06); }

.page-template__imagen {
    border-radius: .75rem;
    display: block;
    margin: 0 auto 1.5rem;
    max-width: 100%;
}
.page-template__texto { line-height: 1.8; }
.page-template__texto p { margin-bottom: 1.1rem; }
.page-template__texto h2, .page-template__texto h3 { margin: 1.5rem 0 .75rem; }

/* El video de la portada tiene la misma altura que el bloque de eventos que va
   a su lado. En el sitio en vivo eso lo fija un guion al cargar; acá la
   proporción del video es el punto de partida —para que la página no salte
   antes de que corra nada— y el guion la iguala después. */
.eventos-botones__video {
    aspect-ratio: 16 / 7;
    /* El ancho lo manda la rejilla. Sin declararlo, al fijar la altura el
       navegador calcula el ancho desde la proporción y el bloque queda once
       píxeles más angosto que el de al lado. */
    width: 100%;
}
.eventos-botones__video video,
.eventos-botones__video iframe,
.eventos-botones__video img { height: 100%; object-fit: cover; width: 100%; }

/* Dentro del visor del Concejo el hueco ocupa toda la celda, que ya trae seiscientos
   píxeles de alto mínimo. Con la proporción puesta, el navegador calculaba el ancho
   desde esa altura —mil ciento veinticinco píxeles— y estiraba la columna: en el
   teléfono la página se podía arrastrar de lado. */
.concejo-page__stream-wrapper { min-width: 0; }
.concejo-page__stream-wrapper > * { min-width: 0; }
.concejo-page__stream-wrapper .mapa-diferido {
    aspect-ratio: auto;
    height: 100%;
    min-height: 240px;
}

/* Las pestañas de elecciones. En el sitio en vivo hay dos y caben; acá hay tres
   —el municipio publicó una categoría más— y empujaban la página entera, que en
   el teléfono se podía arrastrar de lado. Ahora se desplaza la barra y no la
   página, que es lo que corresponde a una fila de pestañas. */
.elecciones__tabs {
    /* Sin esto la barra crece con su contenido y se lleva la página consigo:
       el desplazamiento interior solo entra cuando la barra tiene un límite. */
    box-sizing: border-box;
    max-width: 100%;
    overflow-x: auto;
    scrollbar-width: thin;
    /* Un tirón deja la pestaña alineada, no a medio camino. */
    scroll-snap-type: x proximity;
}
.elecciones__tabs > * {
    flex-shrink: 0;
    scroll-snap-align: start;
}
/* El foco no se corta contra el borde de la barra al llegar con el teclado. */
.elecciones__tabs { padding-bottom: .35rem; scroll-padding-inline: 1rem; }

/* Las cabeceras de página van ocultas —el sitio ya tiene su barra arriba y esta
   franja quedaría repetida—, y así viene del diseño de referencia. Pero se
   ocultaban con «display:none», y eso se lleva por delante el «h1» que llevan
   dentro: veinte páginas quedaban sin título para un buscador. El título es lo
   primero que se lee para saber de qué trata una página.
   
   Se ocultan igual, pero recortadas en vez de quitadas: no se ven, no ocupan
   sitio, y el título sigue ahí para quien lee la página con un lector de
   pantalla o la indexa. */
.calendario__header,
.concejo-page__header,
.departamentos__header,
.elecciones__header,
.galeria__header,
.guia-servicios__header,
.mision-vision__page-header,
.museo__header,
.noticias-page__header,
.obras__header,
.page-template__header,
.prc__header,
.servicios-page__header,
.tramites__header {
    display: block !important;
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    margin: -1px !important;
    padding: 0 !important;
    overflow: hidden !important;
    clip-path: inset(50%) !important;
    white-space: nowrap !important;
}

/* Las pastillas de filtro son enlaces y no botones: el filtro va en la
   dirección para que se pueda compartir y lo encuentre un buscador. Un enlace
   hereda la altura de línea del cuerpo y un botón no, así que salían cinco
   píxeles más altas y en el teléfono la barra pasaba de dos filas a tres. */
.noticias-page__filter-btn,
.calendario__filter-btn,
.videos-page__filter-btn,
.elecciones__tab,
.pagination__btn,
.prc__documento,
.tramites__card {
    line-height: normal;
}

/* El museo tiene el fondo casi negro en el sitio en vivo. Solo se ve al rebotar
   el scroll en el teléfono, pero ahí se nota: el resto del sitio rebota en
   blanco y esta página en negro. */
body.pagina-museo { background-color: #0e0e0e; }

/* La ficha de una actividad. El diseño viene de la ventana del calendario del
   sitio anterior; acá es una página con su dirección, así que pierde la altura
   máxima y la sombra de ventana, y la imagen ocupa su celda. */
.calendario .modal--ficha {
    animation: none;
    background: #fff;
    box-shadow: 0 6px 28px rgba(0, 0, 0, .10);
    margin: 0 auto 2.5rem;
    max-height: none;
    max-width: 1000px;
    overflow: hidden;
}
.calendario .modal--ficha .modal__left,
.calendario .modal--ficha .modal__right,
.calendario .modal--ficha .modal__layout { max-height: none; }
.calendario .modal--ficha .modal__body { overflow-y: visible; }
.calendario .modal--ficha .modal__header h1 { font-size: 1.5rem; margin: 0; }
.modal__imagen { display: block; height: 100%; object-fit: cover; width: 100%; }
.calendario .modal--ficha .modal__left { background: #f5f5f5; min-height: 220px; }

/* La ficha de una actividad no tiene la columna del calendario al lado, así que
   ocupa el ancho entero: la rejilla del calendario reserva trescientos píxeles
   para un mes que aquí no se dibuja, y la ficha quedaba encajada en lo que
   sobraba. */
.calendario__content--ficha { grid-template-columns: 1fr; }

/* La rejilla de la ficha con medidas explícitas. En la ventana original el
   ancho lo daba la fotografía ya cargada; en una página, la columna «auto» y la
   imagen «al 100%» se esperan la una a la otra y la celda resuelve cero: la
   ficha quedaba en cuatrocientos veinte píxeles con la foto invisible. */
.calendario .modal--ficha .modal__layout {
    grid-template-columns: minmax(0, 1fr) minmax(340px, 420px);
}

/* Una actividad sin fotografía: la ficha ocupa el ancho entero en vez de dejar
   media caja vacía. */
.calendario .modal--ficha .modal__layout--sin-imagen { grid-template-columns: 1fr; }
.calendario .modal--ficha .modal__layout--sin-imagen .modal__right { max-width: none; }

/* En el teléfono, una debajo de la otra. */
@media (max-width: 900px) {
    .calendario .modal--ficha .modal__layout { grid-template-columns: 1fr; }
    .calendario .modal--ficha .modal__right { max-width: none; min-width: 0; }
    .calendario .modal--ficha .modal__left { max-height: 260px; }
}

/* El visor de la cuenta pública. El documento va en un marco con medidas desde
   el primer render, para que la página no salte cuando termina de cargar. */
.guia-servicios__visor { width: 100%; }
.guia-servicios__pdf {
    aspect-ratio: 10 / 8;
    border: 0;
    border-radius: .75rem;
    display: block;
    min-height: 420px;
    width: 100%;
}
.guia-servicios__alternativa { font-size: .9rem; margin-top: .75rem; text-align: center; }

/* La tarjeta de una actividad es un enlace a su ficha —en el sitio en vivo abre
   una ventana— y un enlace trae subrayado propio: sin esto el título, la hora,
   el lugar y el resumen salen todos subrayados. */
.calendario__event-card,
.calendario__event-card:hover { color: inherit; text-decoration: none; }
.calendario__event-card h3,
.calendario__event-card h4 { color: #1a1a1a; }

/* Las tarjetas de trámite son enlaces —en el sitio en vivo son botones que
   mueve un guion— y un enlace trae subrayado propio. */
.tramites__card,
.tramites__card:hover { text-decoration: none; }
.tramites__card-nombre { text-decoration: none; }

/* La lista de oficinas del DAF y de DIDECO son enlaces —cada ficha tiene su
   dirección— donde el diseño de referencia usa botones. Solo hay que quitarles
   el subrayado y devolverles el color del texto. */
.daf__item,
.daf__item:hover { color: inherit; text-decoration: none; }
.daf__item--disabled { opacity: .55; }

/* La tarjeta de una convocatoria es un enlace a su ficha —en el sitio en vivo
   abre una ventana— y un enlace trae subrayado y color propios. */
.oferta-card,
.oferta-card:hover { color: inherit; text-decoration: none; }
.ofertas-page__titulo-otras {
    color: #0d5963;
    font-size: 1.4rem;
    font-weight: 800;
    margin: 2.5rem 0 1.25rem;
}
/* La ficha usa el diseño de la ventana, sin lo que solo tenía sentido flotando. */
.ofertas-page .modal--ficha {
    animation: none;
    background: #fff;
    box-shadow: 0 6px 28px rgba(0, 0, 0, .10);
    margin: 0 auto 2rem;
    max-height: none;
    max-width: 900px;
}
.ofertas-page .modal--ficha .modal__content { overflow-y: visible; }

/* El hueco de una imagen que no llegó: liso, del color del marco, en vez del
   icono de imagen rota con el texto alternativo encima. */
.sin-imagen {
    background: #e5e7eb;
    display: block;
    min-height: 120px;
}

/* El visor de fotografías, para que funcione en cualquier página.
   La hoja de la galería define «.lightbox__content» y las de noticias y ofertas
   definen «.lightbox__image»: el mismo visor compartido se veía en la galería y
   en las otras dos abría un recuadro vacío —la fotografía cargaba, pero sin una
   sola regla que le diera tamaño quedaba en cero por cero—. Se define acá, que
   es la hoja que va en todas las páginas, y así no depende de cuál se cargó. */
.lightbox__content {
    align-items: center;
    display: flex;
    flex-direction: column;
    max-height: 85vh;
    max-width: 90vw;
}

.lightbox__content img {
    border-radius: 8px;
    max-height: 85vh;
    max-width: 90vw;
    object-fit: contain;
}

/* El visor de documentos, copiado del sitio en vivo.

   Allá un documento se abre en una ventana sobre el listado, con el nombre
   arriba y el archivo dentro; acá se abría en otra pestaña y quien revisaba
   cinco resoluciones terminaba con cinco pestañas. */
.visor {
    align-items: center;
    background: rgba(0, 0, 0, .85);
    display: flex;
    justify-content: center;
    inset: 0;
    padding: 1rem;
    position: fixed;
    z-index: 9999;
}

.visor__container {
    background: #fff;
    border-radius: 16px;
    box-shadow: 0 25px 50px rgba(0, 0, 0, .5);
    display: flex;
    flex-direction: column;
    height: 90vh;
    max-width: 1200px;
    overflow: hidden;
    width: 100%;
}

.visor__header {
    align-items: center;
    background: #0a4952;
    color: #fff;
    display: flex;
    gap: 1rem;
    justify-content: space-between;
    padding: 1rem 1.5rem;
}

.visor__info h3 {
    color: #fff;
    font-size: 1.1rem;
    font-weight: 700;
    line-height: 1.3;
    margin: 0 0 .25rem;
}

.visor__info span {
    font-size: .85rem;
    opacity: .8;
}

.visor__actions {
    display: flex;
    flex-shrink: 0;
    gap: .5rem;
}

.visor__btn {
    align-items: center;
    background: rgba(255, 255, 255, .15);
    border: none;
    border-radius: 10px;
    color: #fff;
    cursor: pointer;
    display: flex;
    height: 40px;
    justify-content: center;
    transition: .2s;
    width: 40px;
}

.visor__btn:hover {
    background: rgba(255, 255, 255, .25);
    transform: scale(1.05);
}

.visor__btn--close:hover {
    background: #dc2626;
}

.visor__btn svg {
    height: 20px;
    width: 20px;
}

.visor__content {
    align-items: center;
    background: #333;
    display: flex;
    flex: 1;
    justify-content: center;
    overflow: auto;
}

.visor__content iframe {
    border: none;
    height: 100%;
    width: 100%;
}

.visor__content img {
    max-height: 100%;
    max-width: 100%;
    object-fit: contain;
}

/* Quien navega con teclado tiene que ver dónde está: el fondo del encabezado es
   oscuro y el contorno del navegador se pierde encima. */
.visor__btn:focus-visible {
    outline: 3px solid #fff;
    outline-offset: 2px;
}

/* Con el movimiento reducido, la ventana no crece al aparecer. */
@media (prefers-reduced-motion: reduce) {
    .visor__btn {
        transition: none;
    }

    .visor__btn:hover {
        transform: none;
    }
}

/* La tarjeta de documento del plan regulador es un botón en el sitio en vivo y
   acá es un enlace, así que heredaba la tipografía de los enlaces del sitio:
   la línea «Documento PDF» salía en negrita donde allá va normal. */
.prc__documento {
    font-size: 13.3333px;
    font-weight: 400;
}

/* La ventana de un banner de servicios, copiada del sitio en vivo. */
.modal-overlay {
    align-items: center;
    backdrop-filter: blur(8px);
    background: rgba(0, 0, 0, .75);
    display: flex;
    inset: 0;
    justify-content: center;
    padding: 1rem;
    position: fixed;
    z-index: 1000;
}

.modal-content {
    background: linear-gradient(135deg, #fff, #f8f9fa);
    border-radius: 24px;
    box-shadow: 0 20px 60px rgba(0, 0, 0, .3), 0 0 0 1px rgba(255, 255, 255, .1);
    max-width: 440px;
    padding: 2.5rem;
    position: relative;
    width: 100%;
}

.modal-content h3 {
    color: #0d5963;
    font-size: 1.75rem;
    font-weight: 700;
    letter-spacing: -.5px;
    line-height: 1.3;
    margin: 0 0 2rem;
    text-align: center;
}

.modal-close {
    align-items: center;
    background: none;
    border: none;
    color: #666;
    cursor: pointer;
    display: flex;
    height: 40px;
    justify-content: center;
    position: absolute;
    right: 1rem;
    top: 1rem;
    width: 40px;
}

.modal-buttons {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.modal-btn {
    border: none;
    border-radius: 14px;
    cursor: pointer;
    display: block;
    font-size: 1.05rem;
    font-weight: 600;
    letter-spacing: .3px;
    padding: 1rem 2rem;
    text-align: center;
    text-decoration: none;
    transition: .3s cubic-bezier(.34, 1.56, .64, 1);
}

.modal-btn-bases {
    background: linear-gradient(135deg, #0d5963, #0a4650);
    box-shadow: 0 4px 15px rgba(13, 89, 99, .3);
    color: #fff;
}

.modal-btn-bases:hover {
    box-shadow: 0 8px 25px rgba(13, 89, 99, .4);
    transform: translateY(-3px);
}

.modal-btn-inscripcion {
    background: #fff;
    border: 2px solid #0d5963;
    box-shadow: 0 4px 15px rgba(13, 89, 99, .15);
    color: #0d5963;
}

.modal-btn-inscripcion:hover {
    background: #0d5963;
    color: #fff;
    box-shadow: 0 8px 25px rgba(13, 89, 99, .4);
    transform: translateY(-3px);
}

/* El disparador es un botón para que se pueda usar con el teclado, pero se ve
   como la tarjeta: sin fondo, sin borde y con la imagen ocupándolo entero. */
.servicio-card__disparador {
    background: none;
    border: none;
    cursor: pointer;
    display: block;
    padding: 0;
    width: 100%;
}

.servicio-card__disparador img {
    display: block;
    width: 100%;
}

@media (prefers-reduced-motion: reduce) {
    .modal-btn {
        transition: none;
    }

    .modal-btn:hover {
        transform: none;
    }
}

/* El aviso previo a cargar la transmisión, dentro del marco del reproductor.

   El contenedor del video reserva su alto con «padding-bottom: 56.25%» —el
   truco de siempre para mantener la proporción— y cualquier cosa que se ponga
   dentro en flujo normal se suma a ese alto: el bloque quedaba en 772 píxeles
   donde el sitio en vivo tiene 600, y arrastraba el chat y toda la página. Va
   posicionado encima, que es donde estaría el reproductor. */
.concejo-page__video-container .mapa-diferido {
    align-items: center;
    background: #f4f6f7;
    display: flex;
    flex-direction: column;
    gap: .75rem;
    inset: 0;
    justify-content: center;
    padding: 1.5rem;
    position: absolute;
    text-align: center;
}

.concejo-page__video-container .mapa-diferido__aviso {
    max-width: 42ch;
}

/* La tarjeta de noticia entera abre la noticia.

   El diseño le pone «cursor: pointer» a la tarjeta completa, así que el puntero
   promete que se puede pinchar en cualquier parte —el título, la fotografía—;
   pero el único enlace era el «Ver más» de la esquina. Quien pinchaba la
   fotografía no pasaba nada, y no hay forma de saber por qué.

   Se estira el enlace que ya estaba sobre toda la tarjeta en vez de envolverla
   en otro: un enlace dentro de otro enlace es HTML inválido —el navegador
   cierra el de fuera antes de tiempo y la maquetación se descuadra— y además
   quien navega con teclado tendría que pasar dos veces por la misma noticia. */
.noticia-card {
    position: relative;
}

.noticia-card__link::after {
    content: "";
    inset: 0;
    position: absolute;
}

/* El foco se ve sobre la tarjeta entera, no sobre las dos palabras del enlace:
   es el área que de verdad se activa. */
.noticia-card:has(.noticia-card__link:focus-visible) {
    outline: 3px solid #0d5963;
    outline-offset: 3px;
}

.noticia-card__link:focus-visible {
    outline: none;
}

/* La tarjeta de departamento entera abre su ficha, igual que la de noticia.

   El diseño le pone el puntero de mano a toda la tarjeta, pero el único enlace
   era el nombre: quien pinchaba la fotografía o la descripción no conseguía
   nada. Se estira el enlace del nombre —no se envuelve la tarjeta, que dentro
   hay un teléfono y un correo y un enlace no puede contener a otro—. */
.dept-card {
    position: relative;
}

.dept-card__nombre a::after {
    content: "";
    inset: 0;
    position: absolute;
}

/* El teléfono y el correo quedan por encima del enlace estirado: son destinos
   distintos y llamar a un departamento no puede llevarte a su ficha. */
.dept-card__tel,
.dept-card__mail {
    position: relative;
    z-index: 1;
}

.dept-card:has(.dept-card__nombre a:focus-visible) {
    outline: 3px solid #0d5963;
    outline-offset: 3px;
}

.dept-card__nombre a:focus-visible {
    outline: none;
}

/* ==================================================================
   Herramientas de accesibilidad — modos visuales (portadas del sitio de
   referencia): cursor grande, resaltar enlaces, línea y máscara de lectura.
   Los filtros de color (contraste/invertir/grises) los aplica el JS sobre
   <html> como `filter` combinado.
   ================================================================== */
body.acc-cursor-grande, body.acc-cursor-grande * {
    cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='42' height='42' viewBox='0 0 24 24'%3E%3Cpath fill='%23111' stroke='%23fff' stroke-width='1.5' d='M4 2l15 11-6.2 1.1L16 22l-3 1.1-3.2-7.9L4 20z'/%3E%3C/svg%3E") 4 2, auto !important;
}

body.acc-resaltar a,
body.acc-resaltar button,
body.acc-resaltar [role="button"] {
    outline: 3px solid #ffbf00 !important;
    outline-offset: 2px !important;
    background-color: rgba(255, 191, 0, 0.18) !important;
}

.acc-linea-lectura {
    position: fixed;
    left: 0;
    width: 100%;
    height: 3px;
    background: #0d5963;
    box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.7);
    pointer-events: none;
    z-index: 2147483000;
    display: none;
}

.acc-mascara {
    position: fixed;
    left: 0;
    width: 100%;
    background: rgba(0, 0, 0, 0.72);
    pointer-events: none;
    z-index: 2147482000;
    display: none;
}
.acc-mascara--top { top: 0; height: 0; }
.acc-mascara--bot { bottom: 0; top: 100%; }

/* ==================================================================
   VERSIÓN SIMPLIFICADA (modo-mayor) — pensada para adultos mayores.
   Antes solo escondía unos enlaces del menú. Ahora: letra grande, sin
   movimiento (los carruseles marean), objetivos táctiles grandes, tarjetas
   grandes y legibles, más contraste y un layout más tranquilo.
   ================================================================== */

/* -- Letra más grande en todo el sitio -- */
body.modo-mayor { font-size: 20px; line-height: 1.7; }
body.modo-mayor h1 { font-size: 2.4rem; line-height: 1.25; }
body.modo-mayor h2 { font-size: 1.9rem; line-height: 1.3; }
body.modo-mayor h3 { font-size: 1.5rem; line-height: 1.35; }

/* -- Sin movimiento: carruseles y animaciones marean -- */
body.modo-mayor *,
body.modo-mayor *::before,
body.modo-mayor *::after {
    animation: none !important;
    transition: none !important;
}
body.modo-mayor { scroll-behavior: auto !important; }

/* -- Navegación grande y clara -- */
body.modo-mayor .header__nav > ul > li > a {
    font-size: 1.2rem;
    padding: 0.9rem 1.1rem;
}
body.modo-mayor .dropdown a { font-size: 1.15rem; padding: 0.8rem 1rem; }

/* -- Noticias: de carrusel a lista de tarjetas grandes, sin deslizar -- */
body.modo-mayor .noticias-section__controls { display: none; }
body.modo-mayor .noticias-carousel {
    display: grid !important;
    grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
    gap: 1.75rem;
    overflow: visible !important;
    transform: none !important;
    scroll-snap-type: none !important;
}
body.modo-mayor .noticia-card { width: auto !important; min-width: 0 !important; }
body.modo-mayor .noticia-card__image { height: 220px; }
body.modo-mayor .noticia-card__titulo { font-size: 1.4rem; line-height: 1.35; }
body.modo-mayor .noticia-card__extracto { font-size: 1.15rem; line-height: 1.6; }
body.modo-mayor .noticia-card__link { font-size: 1.2rem; padding: 0.6rem 0; font-weight: 700; }

/* -- Quita el video de la portada (distrae y pesa) y el carrusel a ancho completo -- */
body.modo-mayor .eventos-botones__video { display: none; }
body.modo-mayor .eventos-botones__row { display: block; }
/* Sin el video, el banner ocupa el ancho pero SIN pasar de su resolución real
   (la imagen mide ~900px): estirarlo a 1600 lo dejaba pixelado. Se centra a su
   tamaño nítido. */
body.modo-mayor .eventos-botones__eventos {
    width: 100%;
    max-width: 900px;
    margin-left: auto;
    margin-right: auto;
}

/* -- Banners de servicio: nítidos, sin estirar la celda más que la imagen -- */
body.modo-mayor .botones-grid__container {
    grid-template-columns: repeat(auto-fill, 260px) !important;
    justify-content: center;
}

/* -- Objetivos táctiles grandes -- */
body.modo-mayor a,
body.modo-mayor button,
body.modo-mayor [role="button"] { min-height: 48px; }

/* -- Más contraste en el texto de tarjetas -- */
body.modo-mayor .noticia-card__extracto { color: #1a1a1a; }
body.modo-mayor .ver-mas-link,
body.modo-mayor .noticias-section__title { font-size: 1.6rem; }

/* ------------------------------------------------------------------
   Panel de accesibilidad en dos columnas (como el sitio de referencia)
   ------------------------------------------------------------------
   Cada herramienta es una celda con el icono arriba y la etiqueta debajo,
   centrada. Entra más en menos alto y se lee de un vistazo. El botón de
   reiniciar cruza las dos columnas abajo. */
.acc-panel { width: 340px; }

.acc-panel-list {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.4rem;
    padding: 0.6rem;
}

.acc-panel-item {
    flex-direction: column;
    justify-content: flex-start;
    text-align: center;
    gap: 0.45rem;
    padding: 0.7rem 0.4rem;
    border: 1px solid #eef2f5;
    border-radius: 10px;
    min-height: 84px;
}

.acc-item-label {
    line-height: 1.2;
    font-size: 0.8rem;
}

/* El indicador de nivel de letra: a la esquina, que en columna no hay «auto». */
.acc-item-badge {
    position: absolute;
    top: 0.35rem;
    right: 0.4rem;
    margin-left: 0;
}

/* Reiniciar: una fila entera abajo, en horizontal. */
.acc-panel-item--sep {
    grid-column: 1 / -1;
    flex-direction: row;
    justify-content: center;
    min-height: 0;
    border: 1px solid #f6dfe1;
    margin-top: 0.15rem;
    padding-top: 0.7rem;
}

@media (max-width: 380px) {
    .acc-fab .acc-panel { max-width: 340px; }
}
