/* ──────────────────────────────────────────────────────────────────────────────
   SCRUM-2551 — Barra superior, diseño V5.

   Los estilos vienen del mockup aprobado (softopv5.netlify.app), el mismo del que
   salió el ingreso al sistema; por eso la paleta se toma tal cual de css/login-v5.css.

   ── Por qué todo va prefijado con .topbar-v5 ──────────────────────────────────
   El tema Dore no se enlaza en head.php: lo inyecta JavaScript en tiempo de
   ejecución (web/js/scripts.js:79 → loadStyle("css/" + theme)). loadStyle lo coloca
   justo antes del primer <link> cuyo href termine en "main.css", que resulta ser
   `js/fullcalendar-scheduler/main.css` (head.php:31). Es decir: el tema acaba por
   ENCIMA de css/main.css y de esta hoja, y a igualdad de especificidad pierde.

   Aun así, aquí se gana por ESPECIFICIDAD y no por ese orden, por dos razones:

   1. El orden depende de un accidente. El selector [href$="main.css"] no encaja con
      `css/main.css?v=1` —compara el atributo literal, que termina en "?v=1"— sino
      con la hoja de fullcalendar. Basta con que alguien la quite o la renombre para
      que loadStyle caiga en su rama else (head.appendChild) y el tema pase a ser la
      última hoja del documento, invirtiendo la cascada de toda la aplicación sin que
      nada lo avise.
   2. Contra `.navbar #iconMenuDropdown` y `.navbar .header-icon#notificationButton`
      no hay orden que valga si la regla local tiene menos ids: un id derrota a
      cualquier cantidad de clases.

   Por eso el <nav> lleva la clase topbar-v5 además de navbar y cada regla se escribe
   como `.navbar.topbar-v5 …` (0,2,0) frente al `.navbar …` (0,1,0) del tema; donde el
   tema usa un id, la regla local repite ese id para quedar por delante.

   Por lo mismo NO se usa !important salvo donde es inevitable, en línea con el
   resto de hojas del proyecto (entre 1 y 4 en cada una).
   ────────────────────────────────────────────────────────────────────────────── */

.topbar-v5 {
    /* Paleta de marca V5, la misma de css/login-v5.css */
    --tb-blue: #009cd8;
    --tb-blue-ink: #0078b4;
    --tb-blue-deep: #00609c;
    --tb-cyan: #00bee6;
    --tb-ink-700: #2b3a4a;
    --tb-ink-500: #5b6b7c;
    --tb-line: #e5ebf1;
    --tb-line-soft: #eef2f6;
    --tb-red: #e0524d;

    /* Propias de la barra */
    --tb-on-blue: #ffffff;
    --tb-on-blue-soft: rgba(255, 255, 255, .72);
    --tb-chip: rgba(255, 255, 255, .14);
    --tb-chip-hover: rgba(255, 255, 255, .24);
    --tb-divider: rgba(255, 255, 255, .22);
}

/* ── 1. La barra ──────────────────────────────────────────────────────────────
   La ALTURA no se toca. En el tema está acoplada a `main { margin-top }` y a
   `.menu { padding-top / height: calc(100% - Npx) }` en cuatro breakpoints
   (dore.light.blue.css:1455-1463, :1496-1502, :1666-1674, :2036-2064); cambiarla
   obligaría a reescribir el layout de todas las pantallas. Sólo cambia el fondo. */
.navbar.topbar-v5 {
    /* El degradado termina en --tb-blue-ink y no en --tb-blue: sobre #009cd8 el texto
       blanco de 0.68rem (el ID de la óptica y el rol) se queda en ~2.9:1 de contraste,
       mientras que sobre #0078b4 llega a ~4.6:1, que es el mínimo legible. */
    background: linear-gradient(90deg, var(--tb-blue-deep) 0%, var(--tb-blue-ink) 100%);
    box-shadow: 0 1px 12px rgba(0, 39, 71, .18);
    /* El marcado deja de usar `position: fixed` en los dos contenedores internos
       (era lo que sacaba ambos lados del flujo y anulaba las @media del tema),
       así que la barra vuelve a ser un flex normal de tres zonas. */
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
    padding: 0 1.5rem;
    gap: 1rem;
}

/* Zona izquierda (hamburguesa + logo) y derecha (buscador + iconos + usuario).
   min-width:0 es lo que permite que los hijos se encojan por debajo de su tamaño
   de contenido; sin él un flex item nunca baja de su `min-content` y es de donde
   sale el desbordamiento horizontal. */
.navbar.topbar-v5 .tb-left,
.navbar.topbar-v5 .tb-right {
    display: flex;
    align-items: center;
    min-width: 0;
}

.navbar.topbar-v5 .tb-left {
    gap: .5rem;
    flex: 0 1 auto;
}

/* La zona derecha es la que absorbe el espacio sobrante y la que se comprime. */
.navbar.topbar-v5 .tb-right {
    gap: .5rem;
    flex: 1 1 auto;
    justify-content: flex-end;
}

/* El tema pinta el flex-basis de estas dos clases (40% y, en main.css, 70%).
   El marcado nuevo ya no las usa, pero .navbar-left sigue presente por el
   contrato de dore.script.js, así que se neutraliza su reparto. */
.navbar.topbar-v5 .navbar-left {
    flex-basis: auto;
}

/* Hamburguesa: el tema le da un ancho fijo de 120px (dore:1291) pensado para
   alinear con el sidebar. Sobre la barra nueva ese hueco descuadra el logo. */
.navbar.topbar-v5 .menu-button,
.navbar.topbar-v5 .menu-button-mobile {
    width: auto;
    margin-left: 0;
    padding: 0 .35rem;
    color: var(--tb-on-blue);
    flex: none;
}

.navbar.topbar-v5 .menu-button svg,
.navbar.topbar-v5 .menu-button-mobile svg {
    height: 12px;
}

/* El tema colorea los <rect> del SVG en varias reglas: #3a3a3a en
   `.navbar .menu-button .main/.sub` (dore:1296-1301) y #8f8f8f en las cuatro que van
   bajo #app-container según el estado del menú (dore:1481-1489). Estas últimas llevan
   id, así que ganan a cualquier combinación de clases. Es el único punto de la barra
   donde hace falta forzar. */
.navbar.topbar-v5 .menu-button svg rect,
.navbar.topbar-v5 .menu-button-mobile svg rect {
    fill: var(--tb-on-blue) !important;
}

/* ── 2. Logo Softop ───────────────────────────────────────────────────────────
   El tema pinta el logo como background-image de un <span> vacío y lo dimensiona
   a 110x35 (dore:1465-1480). El marcado nuevo usa un <img> real, que se comporta
   mejor al encogerse y evita tener que repetir la ruta del asset por tema.
   max-width es el tope que le faltaba: sin él, en pantallas angostas el logo
   empujaba al resto de la barra fuera del viewport. */
.navbar.topbar-v5 .tb-logo {
    display: flex;
    align-items: center;
    flex: 0 1 auto;
    min-width: 0;
}

.navbar.topbar-v5 .tb-logo img {
    height: 34px;
    width: auto;
    max-width: 190px;
    object-fit: contain;
    object-position: left center;
    display: block;
}

/* Cuentas laboratorio. El logo de Softop LAB es un PNG pensado para el fondo claro
   de antes: su luminancia media es de 118 sobre 255, contra los ~74 del azul de la
   barra, así que sobre el degradado se pierde. Hasta que exista una versión en
   blanco, se apoya en una pastilla clara, que es lo que hace legible el asset que
   hay sin tener que rehacerlo. */
.navbar.topbar-v5 .tb-logo img.tb-logo-lab {
    max-width: 120px;
    padding: 3px 8px;
    border-radius: 8px;
    background: rgba(255, 255, 255, .94);
}

/* Badge "Cuenta Laboratorio". Se mantiene el fondo claro del original —sobre el azul
   es lo que lo hace destacar— pero el naranja de marca se oscurece: #f58220 sobre
   blanco da 2.59:1, por debajo del mínimo para un texto de 10.5px, mientras que
   #b35410 llega a 5.01:1. El color de marca sigue reconociéndose. */
.navbar.topbar-v5 .lab-tag {
    background: rgba(255, 255, 255, .94);
    color: #b35410;
    margin-left: .75rem;
    flex: none;
}

/* ── 3. Identidad de la óptica ───────────────────────────────────────────────
   Chip con el logo de la óptica, su nombre y el ID, más el plan contratado y los
   complementos activos. */
.navbar.topbar-v5 .tb-optica {
    display: flex;
    align-items: center;
    gap: .55rem;
    padding: .3rem .8rem .3rem .35rem;
    border-radius: 999px;
    background: var(--tb-chip);
    color: var(--tb-on-blue);
    min-width: 0;
    flex: 0 1 auto;
}

/* El logo que sube cada óptica es de proporción libre (los hay apaisados y
   cuadrados), así que se encaja entero con `contain`: recortarlo con `cover`
   dejaba fuera parte de la marca del cliente.

   El isotipo de Softop ocupa exactamente el mismo hueco y va debajo en el marcado.
   Cuando hay logo, la imagen se superpone y lo tapa; cuando no lo hay —PHP no lo
   emite, o el onerror lo retira— queda a la vista el isotipo. Es también lo que
   evita que el chip cambie de ancho según haya logo o no.

   Ojo con los assets: img/logo-mobile.svg y img/logo-white.svg NO son de Softop,
   son los de la plantilla Dore (su wordmark dice "DORE"). El isotipo de Softop es
   img/logo-mobile.png. */
.navbar.topbar-v5 .tb-optica-marca {
    position: relative;
    width: 32px;
    height: 32px;
    flex: none;
}

.navbar.topbar-v5 .tb-optica-logo,
.navbar.topbar-v5 .tb-optica-defecto {
    position: absolute;
    top: 0;
    left: 0;
    width: 32px;
    height: 32px;
    padding: 3px;
    border-radius: 8px;
    background: #ffffff;
    object-fit: contain;
}

/* El logo de la óptica tapa al isotipo cuando existe. */
.navbar.topbar-v5 .tb-optica-logo {
    z-index: 1;
}

.navbar.topbar-v5 .tb-optica-datos {
    display: flex;
    flex-direction: column;
    line-height: 1.15;
    min-width: 0;
}

/* El nombre comercial de la óptica es libre y puede ser largo; se trunca en vez
   de empujar los iconos fuera de la pantalla. */
.navbar.topbar-v5 .tb-optica-nombre {
    font-size: .82rem;
    font-weight: 700;
    max-width: 170px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.navbar.topbar-v5 .tb-optica-id {
    font-size: .68rem;
    color: var(--tb-on-blue-soft);
    white-space: nowrap;
}

/* Plan + complementos. Se apilan porque en el mockup ocupan el alto de la barra. */
.navbar.topbar-v5 .tb-plan {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: .2rem;
    flex: none;
}

.navbar.topbar-v5 .tb-plan-chip {
    display: inline-block;
    padding: .15rem .6rem;
    border-radius: 999px;
    background: rgba(255, 255, 255, .92);
    color: var(--tb-blue-deep);
    font-size: .68rem;
    font-weight: 800;
    letter-spacing: .02em;
    white-space: nowrap;
}

.navbar.topbar-v5 .tb-complementos {
    display: flex;
    gap: .65rem;
    list-style: none;
    margin: 0;
    padding: 0;
}

.navbar.topbar-v5 .tb-complementos li {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    font-size: .65rem;
    font-weight: 700;
    color: var(--tb-on-blue);
    white-space: nowrap;
}

/* Punto de estado: verde cuando el complemento está activo, apagado cuando no.
   currentColor deja que el estado lo fije el modificador y no una regla aparte. */
.navbar.topbar-v5 .tb-complementos li::before {
    content: "";
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: currentColor;
    flex: none;
}

.navbar.topbar-v5 .tb-complementos li.tb-on {
    color: #6ee7a8;
}

.navbar.topbar-v5 .tb-complementos li.tb-off {
    color: var(--tb-on-blue-soft);
}

/* Separador vertical entre bloques de la zona derecha. */
.navbar.topbar-v5 .tb-sep {
    width: 1px;
    height: 34px;
    background: var(--tb-divider);
    flex: none;
}

/* ── 4. Iconos de acción ──────────────────────────────────────────────────────
   Chips claros con el glifo en azul de marca, como pide el diseño. El tema los
   pinta como texto gris sin fondo (dore:1402-1410).

   El marcado de estos botones ya no lleva la clase .btn-empty: el tema la define
   como `background: transparent !important` (dore:510-511), y contra un !important
   no hay especificidad que valga. Como no la usa ningún JavaScript —sólo pinta— se
   quita del marcado en lugar de responder con otro !important. */
.navbar.topbar-v5 .header-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    padding: 0;
    border-radius: 50%;
    background: rgba(255, 255, 255, .95);
    color: var(--tb-blue-ink);
    font-size: 17px;
    line-height: 1;
    border: none;
    flex: none;
    transition: background .14s, color .14s;
}

.navbar.topbar-v5 .header-icon:hover,
.navbar.topbar-v5 .header-icon:focus {
    background: #ffffff;
    color: var(--tb-blue-deep);
}

.navbar.topbar-v5 .header-icon i {
    line-height: 1;
}

/* Cada chip vive en un contenedor relativo para anclar su dropdown y el punto de
   notificaciones. */
.navbar.topbar-v5 .tb-accion {
    position: relative;
    display: inline-flex;
    flex: none;
}

/* Indicador rojo de novedades. El tema lo pinta como una píldora con el número en
   azul sobre blanco (dore:1415-1427); el diseño pide un punto rojo. Se conserva el
   elemento y su id porque global.js:81-82 le escribe el contador.

   El selector incluye .header-icon a propósito: el del tema es
   `.navbar .header-icon#notificationButton .count`, que ya vale (1,3,0). Sin esa
   clase de más las dos reglas empatarían y quién gana dependería del orden de las
   hojas, que es justo de lo que esta hoja no quiere depender.
   `width` se declara porque el tema fija 18px; con sólo min-width mandaría él. */
.navbar.topbar-v5 .header-icon#notificationButton .count {
    position: absolute;
    top: 1px;
    right: 1px;
    width: auto;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    border-radius: 999px;
    background: var(--tb-red);
    border: 2px solid var(--tb-blue-ink);
    color: #ffffff;
    font-size: 9px;
    font-weight: 700;
    line-height: 12px;
    text-align: center;
}

/* Sin novedades no se pinta el indicador: en cero el punto rojo diría lo contrario
   de lo que hay. La clase la escribe PHP en el primer render y global.js la conmuta
   al marcar una notificación como leída. */
.navbar.topbar-v5 .header-icon#notificationButton .count.tb-sin-novedades {
    display: none;
}

/* ── 5. Usuario ───────────────────────────────────────────────────────────────
   Avatar con iniciales + nombre y rol. */
.navbar.topbar-v5 .user {
    margin-right: 0;
    align-self: center;
    flex: none;
}

.navbar.topbar-v5 .user > .btn {
    display: flex;
    align-items: center;
    gap: .55rem;
    padding: 0;
}

.navbar.topbar-v5 .tb-avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: rgba(255, 255, 255, .95);
    color: var(--tb-blue-ink);
    font-size: .8rem;
    font-weight: 800;
    letter-spacing: .02em;
    flex: none;
}

.navbar.topbar-v5 .tb-usuario-datos {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    line-height: 1.15;
    min-width: 0;
}

.navbar.topbar-v5 .tb-usuario-nombre {
    font-size: .82rem;
    font-weight: 700;
    color: var(--tb-on-blue);
    max-width: 150px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.navbar.topbar-v5 .tb-usuario-rol {
    font-size: .68rem;
    color: var(--tb-on-blue-soft);
    max-width: 150px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ── 6. Desplegables ──────────────────────────────────────────────────────────
   Los tres menús siguen siendo dropdowns nativos de Bootstrap 4 (data-toggle),
   que es lo que ya cierra el panel al hacer clic fuera y al elegir una opción.
   Aquí sólo se ajusta la presentación. */
.navbar.topbar-v5 .dropdown-menu {
    border: none;
    border-radius: 12px;
    box-shadow: 0 12px 32px rgba(0, 39, 71, .18);
    color: var(--tb-ink-700);
    margin-top: .5rem;
}

.navbar.topbar-v5 .dropdown-item {
    padding: .5rem 1.25rem;
    color: var(--tb-ink-700);
    font-size: .82rem;
}

.navbar.topbar-v5 .dropdown-item:hover,
.navbar.topbar-v5 .dropdown-item:focus {
    background: #f2f8fc;
    color: var(--tb-blue-deep);
}

/* Cabecera del menú (i): el código de la óptica es un dato, no una acción, y no
   debe parecer pulsable. */
.navbar.topbar-v5 .tb-menu-dato {
    padding: .5rem 1.25rem .65rem;
    margin-bottom: .25rem;
    border-bottom: 1px solid var(--tb-line);
    color: var(--tb-ink-500);
    font-size: .78rem;
}

.navbar.topbar-v5 .tb-menu-dato b {
    color: var(--tb-ink-700);
}

/* Menú de configuración. El tema le fija `height: 290px` (.navbar #iconMenuDropdown,
   dore:1261), que no da para las doce opciones. main.css:203 ya lo corrige con
   `height:auto`, así que hoy la lista no sale recortada; aquí se repite junto al
   resto del acabado para que la barra no dependa de una regla suelta de main.css.
   El id se repite en el selector porque contra el del tema las clases no bastan. */
.navbar.topbar-v5 #iconMenuDropdown {
    width: 240px;
    height: auto;
    max-height: calc(100vh - 120px);
    overflow-y: auto;
    padding: .75rem 0;
}

.navbar.topbar-v5 #iconMenuDropdown .conf-menu-item {
    display: flex;
    align-items: center;
    gap: .7rem;
    width: 100%;
    margin-bottom: 0;
    padding: .5rem 1.25rem;
    color: var(--tb-ink-700);
    font-size: .82rem;
    text-align: left;
}

.navbar.topbar-v5 #iconMenuDropdown .conf-menu-item:hover {
    background: #f2f8fc;
    color: var(--tb-blue-deep);
}

.navbar.topbar-v5 #iconMenuDropdown .conf-menu-item i {
    width: 18px;
    font-size: 16px;
    line-height: 1;
    color: var(--tb-ink-500);
    text-align: center;
    flex: none;
}

.navbar.topbar-v5 #iconMenuDropdown .conf-menu-item:hover i {
    color: var(--tb-blue);
}

/* "Actualizar sistema" va destacado arriba y con separador, como en la referencia. */
.navbar.topbar-v5 #iconMenuDropdown .tb-actualizar {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    padding: .35rem 1.25rem .8rem;
    margin-bottom: .5rem;
    border-bottom: 1px solid var(--tb-line);
    color: var(--tb-blue);
    font-weight: 700;
    font-size: .86rem;
}

.navbar.topbar-v5 #iconMenuDropdown .tb-actualizar i {
    font-size: 18px;
    line-height: 1;
}

/* Opción sin permiso: se ve, pero no invita a pulsarla. El marcado ya la
   distingue con el candado; aquí sólo se atenúa. */
.navbar.topbar-v5 #iconMenuDropdown .conf-menu-item.tb-bloqueado {
    color: #a8b4c0;
    cursor: default;
}

.navbar.topbar-v5 #iconMenuDropdown .conf-menu-item.tb-bloqueado:hover {
    background: transparent;
    color: #a8b4c0;
}

/* ── 7. Panel de notificaciones ──────────────────────────────────────────────
   Deja de ser un desplegable y pasa a ser un panel lateral, como pide el diseño.
   Conserva el id #notificationDropdown por el contrato con global.js, así que hay
   que deshacer lo que el tema le aplica por ese id: 260x280 y padding (dore:1256).

   Va en `position: fixed` respecto al viewport aunque el marcado lo deje dentro del
   <nav>: la barra no crea contexto de apilamiento (no tiene transform ni filter),
   de modo que el panel puede ocupar el alto completo de la pantalla sin sacarlo de
   su sitio en el HTML, que es lo que mantiene vivo el contrato con global.js. */
.navbar.topbar-v5 #notificationDropdown.tb-panel {
    display: flex;
    flex-direction: column;
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: auto;
    width: 400px;
    max-width: 100%;
    height: 100%;
    padding: 0;
    margin: 0;
    border: none;
    border-radius: 0;
    background: #ffffff;
    box-shadow: -8px 0 32px rgba(0, 39, 71, .18);
    color: var(--tb-ink-700);
    /* Por encima del propio navbar (1030), que es el elemento que lo contiene. */
    z-index: 1045;
    /* Cerrado: fuera de la pantalla. Se anima con transform, que no fuerza al
       navegador a recalcular el diseño en cada fotograma. */
    transform: translateX(100%);
    visibility: hidden;
    transition: transform .22s ease, visibility 0s linear .22s;
}

.navbar.topbar-v5 #notificationDropdown.tb-panel.tb-panel-abierto {
    transform: translateX(0);
    visibility: visible;
    transition: transform .22s ease, visibility 0s;
}

/* Quien no quiera animaciones tampoco tiene por qué sufrir ésta. */
@media (prefers-reduced-motion: reduce) {
    .navbar.topbar-v5 #notificationDropdown.tb-panel {
        transition: none;
    }
}

/* Velo sobre la página. Sirve de zona de clic para cerrar y de separación visual;
   queda justo por debajo del panel. */
.navbar.topbar-v5 .tb-panel-fondo {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background: rgba(20, 40, 60, .32);
    z-index: 1040;
}

.navbar.topbar-v5 .tb-panel-cab {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    padding: 1.15rem 1.25rem .75rem;
    flex: none;
}

.navbar.topbar-v5 .tb-panel-cab h2 {
    margin: 0;
    font-size: 1.15rem;
    font-weight: 800;
    color: var(--tb-ink-700);
}

.navbar.topbar-v5 .tb-panel-sub {
    margin: .15rem 0 0;
    font-size: .78rem;
    color: var(--tb-ink-500);
}

.navbar.topbar-v5 .tb-panel-cerrar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0;
    border: none;
    border-radius: 8px;
    background: transparent;
    color: var(--tb-ink-500);
    font-size: 16px;
    flex: none;
}

.navbar.topbar-v5 .tb-panel-cerrar:hover {
    background: var(--tb-line-soft);
    color: var(--tb-ink-700);
}

.navbar.topbar-v5 .tb-panel-filtros {
    display: flex;
    gap: .5rem;
    padding: 0 1.25rem 1rem;
    border-bottom: 1px solid var(--tb-line);
    flex: none;
}

.navbar.topbar-v5 .tb-filtro {
    padding: .3rem .9rem;
    border: 1px solid var(--tb-line);
    border-radius: 999px;
    background: #ffffff;
    color: var(--tb-ink-500);
    font-size: .78rem;
    font-weight: 600;
}

.navbar.topbar-v5 .tb-filtro:hover {
    border-color: var(--tb-blue);
    color: var(--tb-blue-ink);
}

.navbar.topbar-v5 .tb-filtro.tb-filtro-activo {
    background: var(--tb-blue-ink);
    border-color: var(--tb-blue-ink);
    color: #ffffff;
}

/* La lista es lo único que se desplaza: la cabecera, los filtros y el pie quedan
   fijos, que es lo que hace usable un panel largo. */
.navbar.topbar-v5 .tb-panel-lista {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 1rem 1.25rem 0;
}

/* Tarjeta de notificación. El estado de lectura se distingue con el fondo y un punto
   azul, en vez de con el gris y la negrita de antes. */
.navbar.topbar-v5 .tb-notif {
    position: relative;
    margin-bottom: .5rem;
    border: 1px solid var(--tb-line);
    border-radius: 10px;
    background: #ffffff;
}

.navbar.topbar-v5 .tb-notif.tb-notif-sin-leer {
    background: #f2f8fc;
    border-color: #d9ecf7;
}

/* El punto de "sin leer" va en la esquina, fuera del texto, para no competir con el
   menú de acciones de la tarjeta. */
.navbar.topbar-v5 .tb-notif.tb-notif-sin-leer::after {
    content: "";
    position: absolute;
    top: 12px;
    right: 10px;
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--tb-blue);
}

.navbar.topbar-v5 .tb-notif .contenedornotify {
    padding: .7rem .5rem;
}

.navbar.topbar-v5 .tb-notif .textoCard {
    font-size: .82rem;
    line-height: 1.35;
    color: var(--tb-ink-700);
}

.navbar.topbar-v5 .tb-notif.tb-notif-sin-leer .textoCard {
    font-weight: 700;
}

.navbar.topbar-v5 .tb-notif .textoCard.text-small {
    font-size: .72rem;
    font-weight: 400;
    color: var(--tb-ink-500);
}

/* Menú de acciones de la tarjeta: los tres puntos ocupaban 30px y dominaban la
   tarjeta entera. */
.navbar.topbar-v5 .tb-notif .desplegarMenu,
.navbar.topbar-v5 .tb-notif .botonAtras {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    border-radius: 6px;
    color: var(--tb-ink-500);
    font-size: 15px;
    cursor: pointer;
}

.navbar.topbar-v5 .tb-notif .desplegarMenu:hover,
.navbar.topbar-v5 .tb-notif .botonAtras:hover {
    background: var(--tb-line-soft);
    color: var(--tb-ink-700);
}

.navbar.topbar-v5 .tb-notif .desplegarMenu i,
.navbar.topbar-v5 .tb-notif .botonAtras i {
    font-size: 15px;
}

.navbar.topbar-v5 .tb-notif-accion {
    height: auto;
    margin-bottom: .35rem;
    padding: .35rem .6rem;
    border: 1px solid var(--tb-line);
    border-radius: 8px;
    background: #ffffff;
    color: var(--tb-ink-700);
    font-size: .78rem;
    text-align: center;
}

.navbar.topbar-v5 .tb-notif-accion:hover {
    border-color: var(--tb-blue);
    background: #f2f8fc;
    color: var(--tb-blue-deep);
}

/* Tarjeta sin resultados tras filtrar. */
.navbar.topbar-v5 .tb-panel-vacio {
    padding: 2rem 0;
    color: var(--tb-ink-500);
    font-size: .84rem;
    text-align: center;
}

.navbar.topbar-v5 .tb-panel-pie {
    padding: .9rem 1.25rem;
    border-top: 1px solid var(--tb-line);
    text-align: center;
    flex: none;
}

.navbar.topbar-v5 .tb-panel-vertodas {
    color: var(--tb-blue-ink);
    font-size: .84rem;
    font-weight: 700;
}

.navbar.topbar-v5 .tb-panel-vertodas:hover {
    color: var(--tb-blue-deep);
    text-decoration: none;
}

/* En pantallas estrechas el panel ocupa todo el ancho. Se ancla por los dos lados en
   vez de darle `width: 100vw`: la unidad vw incluye la barra de desplazamiento, así que
   en un escritorio angosto el panel acababa siendo 15px más ancho que el área visible y
   se salía por la izquierda. */
@media (max-width: 480px) {
    .navbar.topbar-v5 #notificationDropdown.tb-panel {
        width: auto;
        left: 0;
    }
}

/* ── 8. Responsividad ─────────────────────────────────────────────────────────
   Criterio: la barra no puede generar scroll horizontal a ningún ancho
   (320/360/375/390/430/768/1024/1280/1440px).

   Lo que lo provocaba no eran dos @media en conflicto, sino los estilos inline
   del marcado anterior: los dos contenedores iban en `position: fixed` —el de la
   derecha además con `margin-right: 40px` fijo y sin clase ni id a los que
   engancharse— y el logo llevaba 51x55px escritos en el atributo style. Nada de
   eso podía corregirse desde una hoja: un estilo inline gana a cualquier @media.
   El marcado nuevo los retira; a partir de ahí basta con dejar que el flex se
   comprima en orden.

   Se usan los breakpoints del tema (1199/991/767/575) para no añadir una escala
   más a las que ya conviven en el proyecto. El ticket menciona 560px: cae dentro
   del tramo de 575px, que es donde el tema ya compacta la barra. */

/* El plan y los complementos son lo primero que sobra: son informativos y se
   consultan desde el menú (i). */
@media (max-width: 1199px) {
    .navbar.topbar-v5 {
        padding: 0 1rem;
        gap: .75rem;
    }

    .navbar.topbar-v5 .tb-plan {
        display: none;
    }

    /* Al salir el buscador de la barra quedaron libres unos 200px, así que los
       nombres se recortan bastante menos que antes en este tramo. */
    .navbar.topbar-v5 .tb-optica-nombre,
    .navbar.topbar-v5 .tb-usuario-nombre,
    .navbar.topbar-v5 .tb-usuario-rol {
        max-width: 160px;
    }
}

@media (max-width: 991px) {
    .navbar.topbar-v5 .tb-logo img {
        max-width: 150px;
    }
}

/* En tableta y móvil el nombre y el rol del usuario ceden el sitio al avatar, que
   ya identifica la sesión, y el logo pasa a su versión compacta. */
@media (max-width: 767px) {
    .navbar.topbar-v5 {
        padding: 0 .75rem;
        gap: .5rem;
    }

    .navbar.topbar-v5 .tb-usuario-datos {
        display: none;
    }

    .navbar.topbar-v5 .tb-optica-nombre {
        max-width: 100px;
    }

    .navbar.topbar-v5 .tb-logo img {
        max-width: 120px;
    }

    .navbar.topbar-v5 .header-icon,
    .navbar.topbar-v5 .tb-avatar {
        width: 34px;
        height: 34px;
        font-size: 15px;
    }
}

/* Celulares angostos: se oculta el chip de la óptica y se reducen los iconos,
   dejando notificaciones, información, configuración, ayuda y usuario, que es el
   orden de prioridad del criterio de aceptación. */
@media (max-width: 575px) {
    .navbar.topbar-v5 {
        padding: 0 .5rem;
        gap: .25rem;
    }

    .navbar.topbar-v5 .tb-optica,
    .navbar.topbar-v5 .tb-sep {
        display: none;
    }

    .navbar.topbar-v5 .tb-logo img {
        max-width: 104px;
        height: 28px;
    }

    .navbar.topbar-v5 .header-icon,
    .navbar.topbar-v5 .tb-avatar {
        width: 30px;
        height: 30px;
        font-size: 14px;
    }

    .navbar.topbar-v5 .tb-avatar {
        font-size: .7rem;
    }

    /* Los desplegables no pueden ser más anchos que la ventana. Sólo se limita el ancho:
       la posición la escribe Popper.js en el atributo style al abrirlos, y declararla
       aquí entraría en conflicto con él. */
    .navbar.topbar-v5 .dropdown-menu {
        max-width: calc(100vw - 1rem);
    }
}

/* El caso más estrecho del criterio (320px). El logo compacto y los cinco chips
   son lo único que tiene que caber. */
@media (max-width: 359px) {
    .navbar.topbar-v5 .tb-logo img {
        max-width: 86px;
    }

    .navbar.topbar-v5 .header-icon,
    .navbar.topbar-v5 .tb-avatar {
        width: 28px;
        height: 28px;
        font-size: 13px;
    }
}


/* ── 9. Piezas que vivían en el <style> de view/partials/header.php ──────────
   Estaban ahí para poder ganarle al tema por orden de aparición, a base de
   !important. Bajo .navbar.topbar-v5 la especificidad ya alcanza, así que se
   escriben sin forzar nada. */

/* Alto del listado de notificaciones dentro del desplegable. */
.navbar.topbar-v5 scroll-container {
    display: block;
    width: 100%;
    height: 320px;
    overflow-y: auto;
    scroll-behavior: smooth;
}

/* Panel de acciones de una notificación. Venía del <style> inline con
   `position: absolute; top: 40%; left: 48%; transform: translate(-50%, -50%)`,
   pensado para flotar en el centro del desplegable de 200px de antes. En el panel
   lateral ese "centro" era el del panel entero (100vh), y las acciones aparecían
   flotando arriba, lejos de su tarjeta. Ahora va en flujo, dentro de la tarjeta y
   ocupando su ancho: la tarjeta es un flex de Bootstrap (`d-flex flex-row`, con
   !important) y el submenú lleva `col-10`, así que hay que pisar ese 83% con un
   100% para que no quede un hueco a la derecha. */
.navbar.topbar-v5 .tb-notif #contendorSubMenu {
    position: static;
    transform: none;
    flex: 0 0 100%;
    max-width: 100%;
    padding: .6rem .75rem .5rem;
    /* Transparente para que la tarjeta conserve el fondo que dice si está leída. */
    background-color: transparent;
}

/* Dentro del submenú: el botón de volver arriba a la derecha —con hueco para no
   pisar el punto de "sin leer"— y las acciones apiladas a lo ancho. */
.navbar.topbar-v5 .tb-notif #contendorSubMenu > .d-flex {
    padding: 0 1.1rem 0 0;
    justify-content: flex-end;
    margin-bottom: .35rem;
}

.navbar.topbar-v5 .tb-notif #contendorSubMenu .tb-notif-accion {
    display: block;
    width: 100%;
}

/* El tema maqueta .icon-menu-item como una rejilla de 90px de ancho con el texto
   centrado debajo del icono; el menú de configuración es una lista. */
.navbar.topbar-v5 .conf-menu-item-icon::before {
    margin-left: 0;
}
