/* ============================================================
   Sistema 5S — Europastry Sarral
   Hoja de estilos única, propia, sin dependencias externas
   (sin Bootstrap, sin CDN). Cubre tipografía, tokens de color,
   modo claro/oscuro y todos los componentes de la aplicación.
   ============================================================ */

/* ---------- Tipografía autoalojada ---------- */
@font-face{
  font-family: 'Manrope';
  src: url('../fonts/manrope-400.woff2') format('woff2');
  font-weight: 400; font-style: normal; font-display: swap;
}
@font-face{
  font-family: 'Manrope';
  src: url('../fonts/manrope-500.woff2') format('woff2');
  font-weight: 500; font-style: normal; font-display: swap;
}
@font-face{
  font-family: 'Manrope';
  src: url('../fonts/manrope-600.woff2') format('woff2');
  font-weight: 600; font-style: normal; font-display: swap;
}
@font-face{
  font-family: 'Manrope';
  src: url('../fonts/manrope-700.woff2') format('woff2');
  font-weight: 700; font-style: normal; font-display: swap;
}
@font-face{
  font-family: 'Manrope';
  src: url('../fonts/manrope-800.woff2') format('woff2');
  font-weight: 800; font-style: normal; font-display: swap;
}

/* ---------- Tokens — modo claro ----------
   Paleta "harina y horno": neutros cálidos de panadería con un único
   acento (bronce tostado) en vez del marrón/dorado saturado anterior.
   La barra de navegación pasa a un antracita neutro — el marrón vivo
   era lo que se leía como "poco profesional". */
:root{
  --font-base: 'Manrope', -apple-system, 'Segoe UI', Roboto, sans-serif;

  --5s-ink:        #262220;
  --5s-ink-soft:   #5c5347;
  --5s-muted:      #847a6a;
  --5s-paper:      #f4f2ec;
  --5s-surface:    #ffffff;
  --5s-surface-2:  #eae6da;
  --5s-line:       #ddd6c6;

  --5s-accent:       #9c7a3d;
  --5s-accent-dark:  #74591f;
  --5s-accent-soft:  #efe6d0;
  --5s-accent-ink:   #241c0c;

  --5s-brand:        #3f6b52;
  --5s-brand-dark:   #2c4f3c;
  --5s-brand-soft:   #e2ebe3;

  --5s-good:      #2f7d52;
  --5s-good-soft: #e2f0e6;
  --5s-warn:      #b5650f;
  --5s-warn-soft: #fbeada;
  --5s-crit:      #b3261e;
  --5s-crit-soft: #fbe9e7;
  --5s-info:      #2e5266;
  --5s-info-soft: #dfe9ee;

  --radius-sm: .5rem;
  --radius:    .7rem;
  --radius-lg: 1rem;
  --shadow-sm: 0 1px 2px rgba(35,32,27,.06), 0 1px 1px rgba(35,32,27,.04);
  --shadow-lg: 0 20px 45px -20px rgba(35,32,27,.28);
}

/* ---------- Tokens — modo oscuro ----------
   [data-theme="dark"] se aplica en <html> desde el botón de tema
   (ver footer.php). Sin ese atributo, se sigue el tema del sistema
   solo si el usuario nunca ha elegido uno explícitamente (ver JS). */
[data-theme="dark"]{
  --5s-ink:        #efe9db;
  --5s-ink-soft:   #d2c6b1;
  --5s-muted:      #a89c83;
  --5s-paper:      #18140f;
  --5s-surface:    #221e19;
  --5s-surface-2:  #2b261e;
  --5s-line:       #3e372a;

  --5s-accent:       #c39552;
  --5s-accent-dark:  #d9b271;
  --5s-accent-soft:  #332918;
  --5s-accent-ink:   #1c1408;

  --5s-brand:        #6ca382;
  --5s-brand-dark:   #8fbba3;
  --5s-brand-soft:   #1e2b23;

  --5s-good:      #74c092;
  --5s-good-soft: #1c2e22;
  --5s-warn:      #e08a3f;
  --5s-warn-soft: #332411;
  --5s-crit:      #ff8a80;
  --5s-crit-soft: #3a2220;
  --5s-info:      #8fb8cf;
  --5s-info-soft: #1f2f38;

  --shadow-lg: 0 20px 45px -18px rgba(0,0,0,.55);
}

/* ---------- Reset base ---------- */
*, *::before, *::after{ box-sizing: border-box; }
/* Sin esto, el ancho disponible cambia según si la página necesita o no
   barra de scroll vertical (~15px que a veces "come" el contenido y a
   veces no) — eso es lo que se notaba como un pequeño salto lateral al
   cambiar de una sección corta a una larga o viceversa. Reservando
   siempre ese hueco, haya o no scroll, el ancho es constante en todas
   las páginas. overflow-y:scroll es el resguardo para el puñado de
   navegadores que aún no soportan scrollbar-gutter. */
html{
  -webkit-text-size-adjust: 100%;
  scrollbar-gutter: stable;
  overflow-y: scroll;
}
body{
  margin: 0;
  font-family: var(--font-base);
  background: var(--5s-paper);
  color: var(--5s-ink);
  font-size: 15px;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}
h1,h2,h3,h4,h5,h6{
  font-family: var(--font-base);
  font-weight: 700;
  letter-spacing: -.01em;
  color: var(--5s-ink);
  margin: 0 0 .5rem;
}
p{ margin: 0 0 1rem; }
a{ color: var(--5s-accent-dark); text-decoration: none; }
a:hover{ color: var(--5s-ink); }
img{ max-width: 100%; }
hr{ border: none; border-top: 1px solid var(--5s-line); margin: 1rem 0; }
::selection{ background: var(--5s-accent-soft); }

/* ---------- Iconos SVG en línea ---------- */
.icon{
  width: 1.1em; height: 1.1em;
  display: inline-block;
  vertical-align: -0.18em;
  flex-shrink: 0;
}

/* ---------- Rejilla y layout ---------- */
/* Rejilla de 12 columnas (equivalente ligero al grid de Bootstrap) */
.row{display:flex;flex-wrap:wrap;margin-left:-12px;margin-right:-12px;}
.row > [class*="col"]{padding-left:12px;padding-right:12px;box-sizing:border-box;}
/* El ancho va aparte y con menor especificidad (un solo selector de atributo,
   sin ".row >") a propósito: así las clases de punto de corte de abajo
   (.col-md-3, .col-lg-2, etc.), que también tienen especificidad de una sola
   clase, ganan por orden de aparición en vez de perder siempre frente a esta
   regla base. Antes ".row > [class*="col"]" tenía especificidad doble y
   anulaba TODOS los "col-md-N" y "col-lg-N" del sitio, dejando los
   formularios y la barra lateral de mensajes en una sola columna incluso
   en escritorio. */
[class^="col-"], [class*=" col-"]{width:100%;}
.row.g-3{row-gap:1rem;}
.container, .container-fluid{width:100%;padding-left:12px;padding-right:12px;margin-left:auto;margin-right:auto;box-sizing:border-box;}
.container{max-width:1140px;}
.col-1{width:8.3333%;}
.col-2{width:16.6667%;}
.col-3{width:25.0%;}
.col-4{width:33.3333%;}
.col-5{width:41.6667%;}
.col-6{width:50.0%;}
.col-7{width:58.3333%;}
.col-8{width:66.6667%;}
.col-9{width:75.0%;}
.col-10{width:83.3333%;}
.col-11{width:91.6667%;}
.col-12{width:100.0%;}
@media (min-width: 768px){
  .col-md-1{width:8.3333%;}
  .col-md-2{width:16.6667%;}
  .col-md-3{width:25.0%;}
  .col-md-4{width:33.3333%;}
  .col-md-5{width:41.6667%;}
  .col-md-6{width:50.0%;}
  .col-md-7{width:58.3333%;}
  .col-md-8{width:66.6667%;}
  .col-md-9{width:75.0%;}
  .col-md-10{width:83.3333%;}
  .col-md-11{width:91.6667%;}
  .col-md-12{width:100.0%;}
}
@media (min-width: 992px){
  .col-lg-1{width:8.3333%;}
  .col-lg-2{width:16.6667%;}
  .col-lg-3{width:25.0%;}
  .col-lg-4{width:33.3333%;}
  .col-lg-5{width:41.6667%;}
  .col-lg-6{width:50.0%;}
  .col-lg-7{width:58.3333%;}
  .col-lg-8{width:66.6667%;}
  .col-lg-9{width:75.0%;}
  .col-lg-10{width:83.3333%;}
  .col-lg-11{width:91.6667%;}
  .col-lg-12{width:100.0%;}
}

/* ---------- Utilidades ---------- */
.d-flex{ display: flex; }
.d-grid{ display: grid; }
/* !important es necesario: sin él, ".form-text{ display:block }" (más
   abajo en la hoja) empataba en especificidad y ganaba por orden de
   aparición, así que cosas como el aviso "Las contraseñas no coinciden"
   (que lleva ambas clases) se veían siempre, aunque tuvieran d-none. */
.d-none{ display: none !important; }
.d-inline-block{ display: inline-block; }
.flex-column{ flex-direction: column; }
.flex-wrap{ flex-wrap: wrap; }
.justify-content-between{ justify-content: space-between; }
.justify-content-center{ justify-content: center; }
.justify-content-end{ justify-content: flex-end; }
.align-items-center{ align-items: center; }
.align-items-start{ align-items: flex-start; }
.align-items-end{ align-items: flex-end; }
.align-middle{ vertical-align: middle; }
.gap-2{ gap: .5rem; }
.gap-3{ gap: 1rem; }

.w-100{ width: 100%; }
.h-100{ height: 100%; }
.mx-auto{ margin-left: auto; margin-right: auto; }

.mb-0{ margin-bottom: 0; } .mb-1{ margin-bottom: .25rem; } .mb-2{ margin-bottom: .5rem; }
.mb-3{ margin-bottom: 1rem; } .mb-4{ margin-bottom: 1.5rem; } .mb-5{ margin-bottom: 3rem; }
.mt-1{ margin-top: .25rem; } .mt-2{ margin-top: .5rem; } .mt-3{ margin-top: 1rem; } .mt-4{ margin-top: 1.5rem; }
.my-3{ margin-top: 1rem; margin-bottom: 1rem; }
.me-1{ margin-right: .25rem; } .me-2{ margin-right: .5rem; } .me-3{ margin-right: 1rem; }
.ms-1{ margin-left: .25rem; } .ms-2{ margin-left: .5rem; } .ms-3{ margin-left: 1rem; }
.p-3{ padding: 1rem; } .p-4{ padding: 1.5rem; }
.py-2{ padding-top: .5rem; padding-bottom: .5rem; } .py-5{ padding-top: 3rem; padding-bottom: 3rem; }
.pb-4{ padding-bottom: 1.5rem; }
@media (min-width: 992px){ .mb-lg-0{ margin-bottom: 0; } .mt-lg-0{ margin-top: 0; } }
@media (min-width: 768px){ .mb-md-0{ margin-bottom: 0; } }

.fw-bold{ font-weight: 700; } .fw-semibold{ font-weight: 600; } .fw-normal{ font-weight: 400; }
.fs-5{ font-size: 1.15rem; } .fs-6{ font-size: 1rem; }
.small{ font-size: .84rem; }
.lead{ font-size: 1.1rem; color: var(--5s-ink-soft); }
.text-center{ text-align: center; }
.text-uppercase{ text-transform: uppercase; letter-spacing: .03em; }
.text-muted{ color: var(--5s-muted) !important; }
.text-danger{ color: var(--5s-crit) !important; }
.text-warning{ color: var(--5s-warn) !important; }
.text-primary{ color: var(--5s-accent-dark) !important; }
.text-secondary{ color: var(--5s-ink-soft) !important; }
.text-dark, .text-5s-dark{ color: var(--5s-ink) !important; }
.text-white{ color: #fff !important; }

.border{ border: 1px solid var(--5s-line) !important; }
.border-0{ border: 0 !important; }
.border-end{ border-right: 1px solid var(--5s-line) !important; }
.border-danger{ border-color: var(--5s-crit) !important; }
.rounded{ border-radius: var(--radius) !important; }
.shadow-sm{ box-shadow: var(--shadow-sm) !important; }
.shadow-lg{ box-shadow: var(--shadow-lg) !important; }
.bg-light{ background: var(--5s-surface-2) !important; }
.bg-primary{ background: var(--5s-accent) !important; color: var(--5s-accent-ink) !important; }
.bg-secondary{ background: var(--5s-ink-soft) !important; color: #fff !important; }
.bg-success{ background: var(--5s-good) !important; color: #fff !important; }
.bg-danger{ background: var(--5s-crit) !important; color: #fff !important; }
.bg-warning{ background: var(--5s-warn) !important; color: #fff !important; }
.bg-warning-subtle{ background: var(--5s-warn-soft) !important; color: var(--5s-warn) !important; }
.bg-transparent{ background: transparent !important; }
/* bg-info y bg-dark: quedaron sin definir (herencia de cuando la app usaba
   Bootstrap) y varias vistas ya las usaban dando por hecho que existían —
   el resultado era una insignia o una barra de progreso sin ningún color,
   casi invisible sobre el fondo de la tarjeta. */
.bg-info{ background: var(--5s-info) !important; color: #fff !important; }
.bg-dark{ background: var(--5s-ink) !important; color: #fff !important; }

.img-fluid{ max-width: 100%; height: auto; display: block; }
.list-unstyled{ list-style: none; margin: 0; padding: 0; }

/* Contenedor máximo de página (sustituye a los style inline max-width).
   Antes vivía siempre dentro de ".container" (main.php), que ya limitaba
   a 1140px — por mucho que este declarara 1440px, un hijo nunca puede ser
   más ancho que su padre ya limitado, así que nunca se llegaba a usar.
   Ahora main.php ya no envuelve en ".container", así que el padding
   lateral (antes heredado del padre) se pone aquí directamente, para que
   ".page-shell" sea autosuficiente pase lo que pase por fuera. */
.page-shell{
  max-width: 1600px;
  width: 100%;
  margin: 0 auto;
  padding-left: 12px;
  padding-right: 12px;
  box-sizing: border-box;
}
.main-content{
  padding-top: 28px;
  padding-bottom: 32px;
}
html, body{ background: var(--5s-paper); }

/* ---------- Barra de navegación ----------
   Antes era un marrón casi negro fijo (#211d18) que NO cambiaba en modo
   claro: por eso la barra siempre se veía "en modo oscuro" aunque el
   resto de la página estuviera en modo claro. Ahora sigue el tema igual
   que cualquier otra superficie (var(--5s-surface): blanco en claro,
   antracita cálido en oscuro) y el dorado se reserva para la marca, el
   enlace activo y los botones principales — ya no tiñe todo el texto. */
/* Aviso fijo mientras Admin Master ve la app "como" una empresa concreta
   (impersonación desde el panel interno de la plataforma) — para que
   nunca se confunda con su sesión normal de "ve todas las empresas".
   Va ANTES de .navbar-5s en el DOM; como esta última es sticky (no
   fixed), no hace falta ningún ajuste de padding para que encajen. */
.impersonando-bar{
  background: var(--5s-warn);
  color: #fff;
  font-size: .85rem;
  font-weight: 600;
  padding: .5rem 1rem;
  display: flex; align-items: center; justify-content: center; gap: .6rem;
  text-align: center;
}
.impersonando-bar a{
  color: #fff; text-decoration: underline; font-weight: 700;
}
.impersonando-bar a:hover{ color: #fff; opacity: .85; }

.navbar-5s{
  position: sticky; top: 0; z-index: 1030;
  background: var(--5s-surface);
  border-bottom: 1px solid var(--5s-line);
  padding: .65rem 0;
}
.navbar-5s .container, .navbar-5s .container-fluid{
  display: flex; align-items: center; justify-content: space-between; gap: .5rem;
  /* Antes esto tenía flex-wrap:wrap con un max-width ajustado a ojo
     (1650px, luego 1900px) para que la marca + los 8 enlaces + tema +
     usuario + cerrar sesión cupieran en un renglón. El problema de fondo
     no era el ancho del tope sino depender de wrap en absoluto: en
     cuanto la fuente real del navegador del usuario medía unos pocos px
     más ancha que en las pruebas (fuente de sistema distinta según
     SO/navegador), el contenido dejaba de caber y el wrap partía la
     barra en dos líneas — "5S Europastry" arriba, el menú entero debajo,
     sin alinear. Subir el tope una y otra vez solo desplazaba el punto
     de rotura. flex-wrap: nowrap aquí lo elimina de raíz: la marca y el
     menú SIEMPRE quedan en la misma fila; si algún día no cupiera del
     todo, .navbar-collapse hace scroll horizontal por su cuenta (ver
     abajo) en vez de romper la fila. */
  flex-wrap: nowrap;
  /* Mismo tope que .page-shell (1600px) — antes eran anchos distintos
     (este llegaba a 1900px) y en monitores muy anchos el logo/menú de
     arriba quedaba desalineado respecto al contenido de la página,
     centrado más estrecho justo debajo. */
  max-width: 1600px;
  padding-left: 12px;
  padding-right: 12px;
  box-sizing: border-box;
}
.navbar-5s .navbar-brand{
  color: var(--5s-ink);
  font-weight: 800;
  font-size: 1.25rem;
  display: flex; align-items: center; gap: 10px;
  flex-shrink: 0; /* el logo nunca se comprime ni se envuelve; si algo cede espacio, es el menú */
}
.navbar-5s .brand-mark{
  width: 30px; height: 30px;
  border-radius: 8px;
  background: var(--5s-accent);
  color: var(--5s-accent-ink);
  display: flex; align-items: center; justify-content: center;
  font-size: .92rem; font-weight: 800;
  flex-shrink: 0;
}
.navbar-toggler{
  display: none;
  background: transparent;
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-sm);
  color: var(--5s-ink-soft);
  padding: .4rem .6rem;
  cursor: pointer;
  flex-shrink: 0;
}
.navbar-toggler .icon{ width: 1.3em; height: 1.3em; }
/* flex-wrap:nowrap + min-width:0 (el mínimo automático de un hijo flex
   es su tamaño de contenido, que aquí puede superar el hueco disponible)
   + overflow-x:auto: si algún día la marca + los enlaces + las acciones
   de la derecha no caben del todo, ESTA franja se desliza horizontalmente
   en vez de que el navegador reparta la marca y el menú en dos líneas —
   la barra siempre se ve como una sola fila alineada. */
.navbar-collapse{
  display: flex; align-items: center; flex-wrap: nowrap; gap: .35rem .6rem;
  flex: 1 1 auto;
  min-width: 0;
  overflow-x: auto;
  scrollbar-width: thin;
}
.navbar-nav{
  display: flex; flex-wrap: nowrap; flex-shrink: 0; align-items: center; gap: .1rem;
  list-style: none; margin: 0; padding: 0;
}
.nav-item{ display: flex; flex-shrink: 0; }
.nav-link{
  display: inline-flex; align-items: center; gap: 6px;
  color: var(--5s-ink-soft);
  font-weight: 600; font-size: .89rem;
  border-radius: var(--radius-sm);
  padding: .5rem .65rem;
  transition: background .15s, color .15s;
  white-space: nowrap;
}
.nav-link:hover{ color: var(--5s-ink); background: var(--5s-surface-2); }
.nav-link.active{ color: var(--5s-accent-ink); background: var(--5s-accent); }
.navbar-text{ color: var(--5s-ink-soft); }
.user-chip{
  color: var(--5s-ink);
  font-size: .84rem; line-height: 1.2;
  display: flex; flex-direction: column;
  text-decoration: none;
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-sm);
  padding: .3rem .6rem;
  transition: background-color .15s, border-color .15s;
}
/* Antes solo cambiaba el fondo un poco al pasar el ratón: sin borde
   visible en reposo, parecía texto suelto en vez de un control con el
   que se puede interactuar (a diferencia de "Cerrar sesión", que sí es
   un botón con borde). Con un borde tenue siempre visible que se marca
   en dorado al pasar el ratón, se lee igual de "clicable" que el resto
   de botones de la barra. */
.user-chip:hover{ background: var(--5s-surface-2); border-color: var(--5s-accent); color: var(--5s-ink); }
.user-chip small{ color: var(--5s-muted); }

/* ---------- Mi perfil ---------- */
.profile-avatar, .profile-avatar-placeholder{
  width: 140px; height: 140px; border-radius: 50%;
  margin-left: auto; margin-right: auto;
  object-fit: cover;
}
.profile-avatar{ border: 3px solid var(--5s-line); background: var(--5s-surface-2); }
.profile-avatar-placeholder{
  display: flex; align-items: center; justify-content: center;
  background: var(--5s-accent-soft); color: var(--5s-accent-ink);
  border: 3px solid var(--5s-line);
}
.profile-avatar-placeholder .icon{ width: 64px; height: 64px; }
.btn-outline-5s{
  border: 1px solid var(--5s-line);
  color: var(--5s-ink);
  background: transparent;
  border-radius: var(--radius-sm);
  padding: .45rem .85rem;
  font-size: .88rem; font-weight: 600;
  display: inline-flex; align-items: center; gap: 6px;
  cursor: pointer;
}
.btn-outline-5s:hover{ border-color: var(--5s-accent); color: var(--5s-accent); background: var(--5s-surface-2); }

/* ---------- Menú desplegable del navbar (Operativa / Gestión) ----------
   Ligero y sin depender de Bootstrap JS (igual que el resto del navbar):
   .dropdown-toggle abre/cierra .dropdown-menu añadiendo/quitando "show"
   en el <li> padre, gestionado desde footer.php. */
.dropdown{ position: relative; }
.dropdown-toggle{ cursor: pointer; }
.icon-chevron{ width: .75em; height: .75em; transition: transform .15s; }
.dropdown.show .icon-chevron{ transform: rotate(180deg); }
/* position:fixed a propósito, NO absolute: .navbar-collapse necesita
   overflow-x:auto para el scroll horizontal de emergencia (ver más abajo),
   y por cómo funciona overflow en CSS, en cuanto un eje deja de ser
   "visible" el otro pasa a comportarse como "auto" también — eso recortaba
   este menú (que necesita salirse hacia abajo) dentro de la franja de la
   barra, aunque nunca se viera un scrollbar ahí. position:fixed no forma
   parte de esa caja recortada (su "contenedor" es la ventana, no
   .navbar-collapse), así que escapa del recorte. Como contrapartida, top/
   left ya no se pueden fijar por CSS (dependen de dónde esté el botón que
   lo abre) — los calcula el JS de footer.php al abrirlo. */
.dropdown-menu{
  display: none;
  position: fixed;
  margin-top: 6px;
  min-width: 210px;
  background: var(--5s-surface);
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-sm);
  box-shadow: 0 10px 28px rgba(20,16,8,.16);
  padding: .4rem;
  z-index: 1050;
  list-style: none;
}
.dropdown.show .dropdown-menu{ display: block; }
.dropdown-item{
  display: flex; align-items: center;
  padding: .55rem .65rem;
  border-radius: var(--radius-sm);
  color: var(--5s-ink-soft);
  font-weight: 600; font-size: .89rem;
  white-space: nowrap;
  text-decoration: none;
}
.dropdown-item:hover{ background: var(--5s-surface-2); color: var(--5s-ink); }
.dropdown-item.active{ color: var(--5s-accent-ink); background: var(--5s-accent); }

/* ---------- Campanita de notificaciones ---------- */
.notif-bell .btn{ position: relative; }
.notif-badge{
  position: absolute;
  top: -6px; right: -6px;
  min-width: 18px; height: 18px;
  padding: 0 4px;
  border-radius: 999px;
  font-size: .66rem; font-weight: 800;
  display: flex; align-items: center; justify-content: center;
  line-height: 1;
  border: 2px solid var(--5s-surface);
}
.notif-dropdown{ width: 340px; max-width: calc(100vw - 20px); padding: 0; overflow: hidden; }
.notif-header{
  display: flex; align-items: center; justify-content: space-between;
  padding: .7rem .9rem;
  border-bottom: 1px solid var(--5s-line);
  font-size: .85rem;
}
.notif-marcar-todas{ color: var(--5s-accent); font-weight: 600; font-size: .78rem; text-decoration: none; white-space: nowrap; }
.notif-marcar-todas:hover{ text-decoration: underline; }
.notif-vacio{
  padding: 1.5rem 1rem;
  text-align: center;
  color: var(--5s-muted);
  font-size: .85rem;
  white-space: normal;
}
.notif-item{
  display: grid;
  grid-template-columns: auto 1fr;
  column-gap: .6rem;
  row-gap: .1rem;
  padding: .65rem .9rem;
  border-radius: 0;
  white-space: normal;
  border-bottom: 1px solid var(--5s-line);
}
.notif-item:last-child{ border-bottom: none; }
.notif-item-icon{
  grid-row: 1 / 3;
  display: flex; align-items: center; justify-content: center;
  width: 32px; height: 32px;
  border-radius: 50%;
  background: var(--5s-surface-2);
  color: var(--5s-accent);
  flex-shrink: 0;
}
.notif-item-icon .icon{ width: 16px; height: 16px; }
.notif-item-texto{ font-size: .83rem; font-weight: 600; color: var(--5s-ink-soft); line-height: 1.3; }
.notif-item-fecha{ font-size: .72rem; color: var(--5s-muted); }
/* Sin leer: texto en el color normal de la app (más "presente" que el gris
   apagado de .dropdown-item) y un punto de color a la izquierda del todo,
   mismo lenguaje visual que .badge-estado.pendiente. */
.notif-item--no-leida .notif-item-texto{ color: var(--5s-ink); }
.notif-item--no-leida{ position: relative; }
.notif-item--no-leida::before{
  content: "";
  position: absolute; left: 4px; top: 50%;
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--5s-crit);
  transform: translateY(-50%);
}

/* El menú necesita bastante ancho para caber en una sola fila (marca +
   8 enlaces + tema + usuario + cerrar sesión: ronda los 1550px de ancho
   real, y varía algo según la fuente de cada sistema/navegador). Por
   debajo de este punto de corte se cambia al desplegable móvil, donde
   cada cosa se apila a ancho completo; por encima, .navbar-collapse va
   en línea junto a la marca (ver reglas base arriba) y, si por lo que
   sea no cupiera del todo, desliza en horizontal en vez de romper la
   fila — ya no depende de ajustar este punto de corte al milímetro. */
@media (max-width: 1699.98px){
  /* Bug real (no solo "se ve feo"): en escritorio .container-fluid es
     flex-wrap:nowrap a propósito (ver comentario arriba) para que la
     marca y el menú NUNCA se partan en dos líneas torpemente. Pero aquí
     abajo, con el menú colapsado, ese mismo nowrap obligaba a
     .navbar-collapse (marca+toggler+colapsable en una sola fila flex) a
     colocarse a la DERECHA del logo en vez de debajo: al ser mucho más
     alto que el logo, y con align-items:center heredado, el logo y el
     botón quedaban centrados verticalmente a mitad del menú desplegado
     — el típico "menú movil descolocado", con el logo flotando en medio
     de las opciones en vez de arriba del todo. Con flex-wrap:wrap aquí,
     .navbar-collapse (que sigue midiendo width:100%) ya no cabe en la
     primera línea junto a marca+toggler y salta a su propia línea
     completa debajo, que es el patrón estándar de menú hamburguesa. */
  .navbar-5s .container-fluid{ flex-wrap: wrap; }
  .navbar-toggler{ display: inline-flex; align-items: center; justify-content: center; }
  .navbar-collapse{
    display: none;
    width: 100%;
    flex-direction: column;
    align-items: stretch;
    overflow-x: visible; /* el scroll horizontal es solo para el modo fila única de escritorio */
    background: var(--5s-surface);
    border-top: 1px solid var(--5s-line);
    margin-top: .65rem;
    padding-top: .5rem;
  }
  .navbar-collapse.show{ display: flex; }
  .navbar-nav{ flex-direction: column; flex-wrap: wrap; align-items: stretch; gap: 2px; }
  .nav-link{ padding: .7rem .5rem; }

  /* En el menú móvil apilado, el desplegable se despliega en línea (empuja
     el resto del menú hacia abajo) en vez de flotar encima como en
     escritorio — encaja mejor con el resto de opciones apiladas.
     Para que "en línea" signifique DEBAJO del enlace "Operativa"/"Gestión"
     y no AL LADO, .nav-item (el <li>, que sigue siendo flex-direction:row
     de base) también tiene que pasar a columna aquí: si no, el <li>
     colocaba el <a> y el <ul class="dropdown-menu"> como dos elementos en
     la misma fila (el <ul> se quedaba con su min-width:210px flotando a
     la derecha del texto en vez de ocupar el ancho completo debajo). */
  .nav-item{ flex-direction: column; align-items: stretch; }
  .dropdown-menu{
    position: static;
    width: 100%;
    box-shadow: none;
    border: none;
    background: var(--5s-surface-2);
    margin: 2px 0 4px;
  }

  /* Panel de la derecha (tema / usuario / cerrar sesión): en escritorio
     va en línea junto a los enlaces, pero en el desplegable móvil se
     quedaba en una fila estrecha y apretada (flex-wrap sin más), muy
     distinta del resto de opciones del menú, que sí ocupan todo el
     ancho. Se apila igual que .navbar-nav, con la misma separación
     visual (línea superior) y cada elemento a ancho completo. */
  .navbar-actions{
    flex-direction: column;
    align-items: stretch;
    width: 100%;
    gap: 4px;
    margin-top: .5rem !important;
    padding-top: .6rem;
    border-top: 1px solid var(--5s-line);
  }
  .navbar-actions .btn-outline-5s{
    width: 100%;
    justify-content: center;
    padding: .7rem .5rem;
  }
  .user-chip{
    flex-direction: row;
    align-items: center;
    justify-content: center;
    gap: 8px;
    width: 100%;
    padding: .7rem .5rem;
  }
  .user-chip .d-flex.flex-column{ line-height: 1.2 !important; }
}

/* ---------- Botones ---------- */
.btn{
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  font-family: var(--font-base);
  font-weight: 600; font-size: .9rem;
  padding: .55rem 1.1rem;
  border-radius: var(--radius-sm);
  border: 1px solid transparent;
  cursor: pointer;
  transition: background .15s, border-color .15s, color .15s, box-shadow .15s;
  line-height: 1.3;
  text-decoration: none;
}
.btn:hover{ text-decoration: none; }
.btn:focus-visible{ outline: 2px solid var(--5s-accent); outline-offset: 2px; }
.btn-sm{ padding: .35rem .75rem; font-size: .82rem; }
.btn-group{ display: inline-flex; }
.btn-group > .btn{ border-radius: 0; margin-left: -1px; }
.btn-group > .btn:first-child{ border-top-left-radius: var(--radius-sm); border-bottom-left-radius: var(--radius-sm); margin-left: 0; }
.btn-group > .btn:last-child{ border-top-right-radius: var(--radius-sm); border-bottom-right-radius: var(--radius-sm); }

.btn-primary{ background: var(--5s-accent); border-color: var(--5s-accent); color: var(--5s-accent-ink); }
.btn-primary:hover{ background: var(--5s-accent-dark); border-color: var(--5s-accent-dark); color: var(--5s-accent-ink); }

.btn-success{ background: var(--5s-good); border-color: var(--5s-good); color: #fff; }
.btn-success:hover{ background: var(--5s-brand-dark); border-color: var(--5s-brand-dark); color: #fff; }

.btn-danger{ background: var(--5s-crit); border-color: var(--5s-crit); color: #fff; }
.btn-danger:hover{ background: #8f1e18; border-color: #8f1e18; color: #fff; }

.btn-warning{ background: var(--5s-warn); border-color: var(--5s-warn); color: #fff; }
.btn-warning:hover{ background: #9c5108; border-color: #9c5108; color: #fff; }

.btn-info{ background: var(--5s-info); border-color: var(--5s-info); color: #fff; }
.btn-info:hover{ background: #223e4c; border-color: #223e4c; color: #fff; }

.btn-secondary{ background: var(--5s-ink-soft); border-color: var(--5s-ink-soft); color: #fff; }
.btn-secondary:hover{ background: var(--5s-ink); border-color: var(--5s-ink); color: #fff; }

.btn-outline-primary{ background: transparent; border-color: var(--5s-accent); color: var(--5s-accent-dark); }
.btn-outline-primary:hover{ background: var(--5s-accent); border-color: var(--5s-accent); color: var(--5s-accent-ink); }
.btn-outline-success{ background: transparent; border-color: var(--5s-good); color: var(--5s-good); }
.btn-outline-success:hover{ background: var(--5s-good); border-color: var(--5s-good); color: #fff; }
.btn-outline-danger{ background: transparent; border-color: var(--5s-crit); color: var(--5s-crit); }
.btn-outline-danger:hover{ background: var(--5s-crit); border-color: var(--5s-crit); color: #fff; }
.btn-outline-warning{ background: transparent; border-color: var(--5s-warn); color: var(--5s-warn); }
.btn-outline-warning:hover{ background: var(--5s-warn); border-color: var(--5s-warn); color: #fff; }
.btn-outline-info{ background: transparent; border-color: var(--5s-info); color: var(--5s-info); }
.btn-outline-info:hover{ background: var(--5s-info); border-color: var(--5s-info); color: #fff; }
.btn-outline-secondary{ background: transparent; border-color: var(--5s-line); color: var(--5s-ink-soft); }
.btn-outline-secondary:hover{ background: var(--5s-ink-soft); border-color: var(--5s-ink-soft); color: #fff; }

.btn:disabled, .btn.disabled{ opacity: .55; cursor: not-allowed; }

/* ---------- Botones de acción por fila (bandeja de mensajes) ----------
   Antes usaban .btn-outline-* normales: una caja con borde grueso por
   cada icono, que en una fila de tabla se ve pesada y desalineada
   (cada botón sale con un ancho distinto según su borde/relleno).
   Este estilo, más parecido a Gmail/Outlook, hace que los tres pesen
   y midan exactamente lo mismo: un círculo sin borde que solo se
   colorea al pasar el ratón o cuando el estado está "activo" (favorito
   marcado), en vez de tres cajas con contorno permanente. */
.btn-row-action{
  display: inline-flex; align-items: center; justify-content: center;
  width: 2.6rem; height: 2.6rem;
  border: none; border-radius: 50%;
  background: transparent;
  color: var(--5s-muted);
  cursor: pointer;
  transition: background-color .15s ease, color .15s ease;
}
.btn-row-action .icon{ width: 1.3rem; height: 1.3rem; }
.btn-row-action:hover{ background: var(--5s-surface-2); color: var(--5s-ink-soft); }
.btn-row-action:focus-visible{ outline: 2px solid var(--5s-accent); outline-offset: 1px; }

.btn-row-action--star:hover{ background: var(--5s-accent-soft); color: var(--5s-accent-dark); }
.btn-row-action--star.is-on{ color: var(--5s-accent); }
.btn-row-action--star.is-on:hover{ background: var(--5s-accent-soft); color: var(--5s-accent-dark); }

.btn-row-action--open:hover{ background: var(--5s-brand-soft); color: var(--5s-brand-dark); }

.btn-row-action--delete:hover{ background: var(--5s-crit-soft); color: var(--5s-crit); }

.btn-row-action--restore:hover{ background: var(--5s-brand-soft); color: var(--5s-good); }

.btn-row-action--edit:hover{ background: var(--5s-accent-soft); color: var(--5s-accent-dark); }
.btn-row-action--pdf:hover{ background: var(--5s-info-soft); color: var(--5s-info); }

/* Envoltorio de la columna "Acciones" en tablas (Acciones 5S, etc.): antes
   cada botón era un .btn.btn-sm con su propio ancho/margen, así que en una
   celda estrecha se partían en dos líneas (editar+ver en una fila, borrar
   suelto debajo). Con .btn-row-action (círculos de tamaño fijo) más este
   contenedor en fila sin salto, los tres caben siempre en una sola línea. */
.row-actions{
  display: inline-flex; align-items: center; justify-content: center;
  gap: 2px; flex-wrap: nowrap; white-space: nowrap;
}

/* ---------- Navegación lateral de Mensajes ----------
   Antes "Enviados"/"Eliminados" usaban .btn-outline-secondary: borde
   --5s-line (muy pálido) sobre fondo blanco, así que casi no se veían
   junto a "Nuevo mensaje"/"Bandeja de entrada" (botones sólidos). Con
   fondo relleno en vez de solo borde, las 4 opciones pesan igual. */
/* Antes iba alineado a la izquierda con su propio padding (.6rem .9rem),
   distinto del de "Nuevo mensaje" (.btn: centrado, .55rem 1.1rem) — con
   4 opciones seguidas en la misma columna, ese único enlace alineado a la
   izquierda quedaba raro junto a los otros tres centrados: texto no
   alineado entre sí, y como su padding vertical era mayor, ligeramente
   más alto/grueso que los botones .btn. Centrado y con el mismo padding
   que .btn, las 4 opciones pesan y se leen exactamente igual. */
/* NO usar display:flex aquí (a diferencia de .btn): la columna de
   Mensajes es estrecha (col-lg-2) y "Nuevo mensaje"/"Bandeja de entrada"
   parten a dos líneas casi siempre. Con flex, el icono y el texto son dos
   "items" en fila — el icono queda pegado arriba-izquierda del bloque de
   texto de 2 líneas en vez de centrado con él, así que el conjunto se ve
   descolocado (esto es justo lo que se veía en el pantallazo). Con
   display:block + texto e icono como contenido en línea normal (el icono
   es inline-block con vertical-align, ver regla ".icon"), el icono viaja
   pegado a la primera palabra y cada línea se centra sola con
   text-align:center — se ve bien tanto en una línea como partido en dos. */
.msg-nav-link{
  display: block;
  width: 100%;
  padding: .55rem 1.1rem;
  border-radius: var(--radius-sm);
  border: none;
  background: var(--5s-surface-2);
  color: var(--5s-ink-soft);
  font-family: var(--font-base);
  font-weight: 600; font-size: .9rem;
  text-align: center;
  cursor: pointer;
  transition: background-color .15s ease, color .15s ease;
}
.msg-nav-link .icon{ margin-right: .45em; }
.msg-nav-link:hover{ background: var(--5s-accent-soft); color: var(--5s-accent-dark); text-decoration: none; }
.msg-nav-link.is-active{ background: var(--5s-ink-soft); color: #fff; }
.msg-nav-link.is-active:hover{ background: var(--5s-ink); color: #fff; }

/* "Nuevo mensaje" es un .btn normal (display:inline-flex) colocado en esta
   misma columna estrecha, así que sufre el mismo problema que arriba en
   cuanto el texto parte a dos líneas. Aquí, solo dentro de este menú
   (.d-grid es exclusivo de Mensajes), se anula ese flex y se centra igual
   que .msg-nav-link — así las 4 opciones se comportan igual de bien
   estrechas o partidas en dos líneas. */
.d-grid .btn{
  display: block;
  text-align: center;
}
.d-grid .btn .icon{ margin-right: .45em; }

/* En pantallas muy estrechas (o con el tamaño de letra del sistema
   ampliado), "Bandeja de entrada" / "Nuevo mensaje" con icono podían no
   caber en una línea y partirse en dos de forma poco cuidada. Se reduce
   un poco el texto solo aquí (.d-grid es exclusivo de este menú de
   Mensajes) para que quepan en una sola línea en la inmensa mayoría de
   móviles; si aun así se parte, ahora se sigue viendo centrado (ver
   reglas de arriba), así que ya no hace falta nada más que ajustar tamaño. */
@media (max-width: 420px){
  .d-grid .msg-nav-link, .d-grid > .btn{
    font-size: .82rem;
    padding: .6rem .7rem;
  }
}

.btn-close{
  width: 1.6rem; height: 1.6rem;
  border-radius: 50%;
  border: none;
  background: rgba(0,0,0,.08);
  color: inherit;
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer;
  font-size: 1rem; line-height: 1;
  padding: 0;
}
.btn-close::before{ content: "\2715"; }
.btn-close:hover{ background: rgba(0,0,0,.16); }
.btn-close-white{ background: rgba(255,255,255,.18); color: #fff; }
.btn-close-white:hover{ background: rgba(255,255,255,.3); }

/* ---------- Tarjetas ---------- */
.card{
  background: var(--5s-surface);
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-lg);
  overflow: hidden;
}
.card-body{ padding: 1.5rem; }
/* .card-footer se usa en reunion_ver.php (botones Editar/Cancelar) — sin
   esta regla se quedaba sin padding ni separación del contenido de arriba,
   pegado al borde de la tarjeta. */
.card-footer{ padding: 1rem 1.5rem; border-top: 1px solid var(--5s-line); }
.card-img-top{ width: 100%; display: block; }

/* Rejilla de "qué se pide al crear un usuario, por rol" (administracion.php):
   ancho fijo por tarjeta en vez de columnas Bootstrap en %, para que una
   última fila incompleta (p.ej. 5 roles → 4+1) deje el hueco sobrante
   fuera de las tarjetas en vez de una tarjeta estirada con medio cuerpo
   vacío dentro. */
.roles-ambito-grid{ display: flex; flex-wrap: wrap; gap: 1rem; }
.roles-ambito-item{ flex: 1 1 220px; max-width: 260px; }

/* ---------- Tablas ---------- */
.table-box{
  background: var(--5s-surface);
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-lg);
  overflow: hidden;
}
.table-responsive{ overflow-x: auto; }
.table{
  width: 100%;
  border-collapse: collapse;
  color: var(--5s-ink);
  font-size: .89rem;
}
.table th, .table td{
  padding: .75rem .9rem;
  border-bottom: 1px solid var(--5s-line);
  text-align: left;
  vertical-align: middle;
}
.table-header, thead.table-header, .table-primary{
  background: var(--5s-surface-2);
}
.table-header th, .table-primary th{
  font-size: .74rem;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--5s-muted);
  font-weight: 700;
  border-bottom-width: 2px;
  /* Sin esto, cabeceras de dos palabras ("Admin Master") partían línea
     justo por el espacio mientras las de una sola palabra
     ("Administrador") no tenían dónde partir y se quedaban en una línea —
     la fila de cabecera salía más alta solo en esa columna. La tabla ya
     vive dentro de .table-responsive (scroll horizontal), así que forzar
     una sola línea aquí no puede desbordar la página. */
  white-space: nowrap;
}
.table-striped tbody tr:nth-of-type(odd){ background: var(--5s-surface-2); }
.table-hover tbody tr:hover{ background: var(--5s-accent-soft); }

/* ---------- Formularios ---------- */
.form-label{ display: block; margin-bottom: .4rem; font-size: .88rem; }
.form-text{ display: block; margin-top: .3rem; font-size: .8rem; color: var(--5s-muted); }
.form-control, .form-select{
  display: block;
  width: 100%;
  font-family: var(--font-base);
  font-size: .92rem;
  padding: .6rem .8rem;
  color: var(--5s-ink);
  background: var(--5s-surface);
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-sm);
  transition: border-color .15s, box-shadow .15s;
}
.form-control:focus, .form-select:focus{
  outline: none;
  border-color: var(--5s-accent);
  box-shadow: 0 0 0 3px var(--5s-accent-soft);
}
textarea.form-control{ resize: vertical; min-height: 5rem; }
.form-select{
  appearance: none;
  background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23837a6a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right .75rem center;
  background-size: 1rem;
  padding-right: 2.4rem;
}
/* Se usaba "form-control-sm"/"form-select-sm" en varias vistas (junto a
   botones .btn-sm, en formularios inline) dando por hecho que existía como
   en Bootstrap, pero no estaba definida — el campo salía a tamaño normal,
   más alto que el botón de al lado, y quedaban desalineados verticalmente. */
.form-control-sm, .form-select-sm{
  padding: .35rem .6rem;
  font-size: .82rem;
  line-height: 1.3;
}
.form-select-sm{ padding-right: 2.2rem; }
.form-check{ display: flex; align-items: flex-start; gap: .5rem; margin-bottom: .5rem; }
.form-check-input{
  width: 1.05rem; height: 1.05rem; margin-top: .2rem;
  accent-color: var(--5s-accent);
  flex-shrink: 0;
}
.form-check-label{ font-size: .92rem; }
/* Caja con scroll para listas largas de checkboxes (p.ej. "Convocar a" en
   reunion_form.php) — antes era un <select multiple>, nada evidente sin
   saber que hay que usar Ctrl/Cmd+clic para elegir varios. */
.checklist-box{
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-sm);
  padding: .7rem .9rem;
  max-height: 260px;
  overflow-y: auto;
  background: var(--5s-surface);
}
.checklist-box .form-check{ margin-bottom: .4rem; }
.checklist-box .form-check:last-child{ margin-bottom: 0; }
.input-group{ display: flex; }
/* Antes se asumía siempre el orden "icono + input" y se redondeaba un lado
   fijo, pero el buscador de mensajes usa el orden contrario (input + botón),
   así que con una regla fija uno de los dos quedaba con el icono/botón
   como una píldora suelta, separada del campo. Ahora cada pieza redondea
   su lado exterior según si es la primera o la última del grupo, sea cual
   sea el orden en el HTML. */
.input-group > .form-control{ border-radius: var(--radius-sm); }
.input-group > .form-control:not(:first-child){ border-top-left-radius: 0; border-bottom-left-radius: 0; }
.input-group > .form-control:not(:last-child){ border-top-right-radius: 0; border-bottom-right-radius: 0; }
.input-group-text{
  display: flex; align-items: center;
  padding: .5rem .8rem;
  background: var(--5s-surface-2);
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-sm);
  color: var(--5s-muted);
}
.input-group-text:not(:first-child){ border-top-left-radius: 0; border-bottom-left-radius: 0; border-left: none; }
.input-group-text:not(:last-child){ border-top-right-radius: 0; border-bottom-right-radius: 0; border-right: none; }
.filter-box, .form-box, .section-box{
  background: var(--5s-surface);
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-lg);
  padding: 1.25rem 1.5rem;
}

/* ---------- Alertas ---------- */
.alert{
  padding: .9rem 1.1rem;
  border-radius: var(--radius);
  border: 1px solid transparent;
  font-size: .9rem;
  display: flex; align-items: flex-start; gap: 10px;
}
.alert-info{ background: var(--5s-info-soft); color: var(--5s-info); border-color: var(--5s-info-soft); }
.alert-warning{ background: var(--5s-warn-soft); color: var(--5s-warn); border-color: var(--5s-warn-soft); }
.alert-danger{ background: var(--5s-crit-soft); color: var(--5s-crit); border-color: var(--5s-crit-soft); }
/* .alert-success: como bg-info/bg-dark, se usaba en varias vistas
   (administracion.php y ahora Mi perfil / recuperar contraseña) dando
   por hecho que existía, y no estaba definida — el aviso de éxito salía
   sin caja de color, casi invisible. */
.alert-success{ background: var(--5s-good-soft); color: var(--5s-good); border-color: var(--5s-good-soft); }

/* ---------- Insignias / estados ---------- */
.badge{
  display: inline-flex; align-items: center; gap: 4px;
  font-size: .74rem; font-weight: 700;
  padding: .3em .6em;
  border-radius: 20px;
  background: var(--5s-surface-2); color: var(--5s-ink-soft);
}
.badge-estado{
  font-size: .74rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: .03em;
  padding: .35em .75em;
  border-radius: 20px;
  display: inline-block;
}
.badge-estado.pendiente{ background: var(--5s-crit-soft); color: var(--5s-crit); }
.badge-estado.en-curso{ background: var(--5s-warn-soft); color: var(--5s-warn); }
.badge-estado.cerrada{ background: var(--5s-good-soft); color: var(--5s-good); }

/* ---------- Paginación ---------- */
.pagination{ display: flex; list-style: none; margin: 0; padding: 0; gap: 4px; }
.page-item .page-link{
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 2.2rem; height: 2.2rem;
  padding: 0 .5rem;
  border-radius: var(--radius-sm);
  border: 1px solid var(--5s-line);
  color: var(--5s-ink-soft);
  font-size: .88rem; font-weight: 600;
}
.page-item .page-link:hover{ background: var(--5s-surface-2); color: var(--5s-ink); }
.page-item.active .page-link{ background: var(--5s-accent); border-color: var(--5s-accent); color: var(--5s-accent-ink); }

/* ---------- Progreso ---------- */
.progress{ height: .6rem; background: var(--5s-surface-2); border-radius: 20px; overflow: hidden; }
.progress-bar{ height: 100%; background: var(--5s-accent); }

/* ---------- Ventanas modales (reemplazo ligero, sin librería) ---------- */
.modal{
  position: fixed; inset: 0; z-index: 1050;
  display: none; align-items: center; justify-content: center;
  padding: 1rem;
  background: rgba(20,17,12,.55);
}
.modal.show{ display: flex; }
.modal-dialog{ width: 100%; max-width: 480px; }
.modal-content{
  background: var(--5s-surface);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  overflow: hidden;
}
.modal-header{
  display: flex; align-items: center; justify-content: space-between;
  padding: 1rem 1.25rem;
  border-bottom: 1px solid var(--5s-line);
}
.modal-title{ margin: 0; font-size: 1.05rem; }
.modal-body{ padding: 1.25rem; }
.modal-footer{
  display: flex; justify-content: flex-end; gap: .5rem;
  padding: 1rem 1.25rem;
  border-top: 1px solid var(--5s-line);
}
body.modal-open{ overflow: hidden; }

/* ---------- Login ---------- */
.login-shell{
  min-height: 100vh;
  display: flex; align-items: center; justify-content: center;
  background:
    radial-gradient(circle at 15% 15%, rgba(156,122,61,.10), transparent 40%),
    radial-gradient(circle at 85% 85%, rgba(63,107,82,.10), transparent 40%),
    var(--5s-paper);
  padding: 24px;
}
.login-card{
  width: 100%; max-width: 420px;
  background: var(--5s-surface);
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-lg);
  padding: 40px 36px;
  box-shadow: var(--shadow-lg);
}
.login-brand{
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 10px; margin-bottom: 28px;
}
.login-brand .brand-mark{
  width: 52px; height: 52px;
  border-radius: 14px;
  background: var(--5s-accent);
  color: var(--5s-accent-ink);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.4rem; font-weight: 800;
}
.login-brand h1{ font-size: 1.3rem; margin: 0; }
.login-brand p{ margin: 0; color: var(--5s-muted); font-size: .88rem; }
.password-field{ position: relative; }
.password-field input{ padding-right: 44px; }
.password-toggle{
  position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
  background: none; border: none; color: var(--5s-muted);
  padding: 6px; line-height: 1; cursor: pointer; border-radius: var(--radius-sm);
}
.password-toggle:hover{ color: var(--5s-ink); background: var(--5s-surface-2); }

/* ---------- Cabecera de dashboard ---------- */
.dashboard-header{
  display: flex; justify-content: space-between; align-items: flex-end; flex-wrap: wrap;
  gap: 12px; padding-bottom: 18px; margin-bottom: 1.5rem;
  border-bottom: 1px solid var(--5s-line);
}
.dashboard-title{ font-size: 1.6rem; margin: 0 0 4px; display: flex; align-items: center; gap: 10px; }
.dashboard-subtitle{ margin: 0; color: var(--5s-muted); font-size: .92rem; }

/* Breve texto explicativo bajo el título de una sección (Ideas de mejora,
   Tarjetas rojas...), para quien no sepa de un vistazo qué es cada apartado. */
.page-lead{ margin: .25rem 0 0; color: var(--5s-ink-soft); font-size: .92rem; max-width: 62ch; }
.icon.dashboard-icon{ width: 2.4rem; height: 2.4rem; color: var(--5s-accent); flex-shrink: 0; }

/* ---------- KPI ----------
   Antes cada tarjeta era una caja blanca lisa con solo una franja de
   color de 4px a la izquierda — de lejos todas parecían iguales y el
   número (el dato importante) no destacaba. Ahora cada una lleva un
   icono en un círculo de color a juego con su franja superior, y el
   número crece para que sea lo primero que se lee. */
.kpi-card{
  background: var(--5s-surface);
  border: 1px solid var(--5s-line);
  border-top: 3px solid var(--5s-line);
  border-radius: var(--radius-lg);
  padding: 1.1rem 1.25rem;
  display: flex; align-items: center; gap: 14px;
  text-align: left;
  box-shadow: var(--shadow-sm);
  transition: transform .15s ease, box-shadow .15s ease;
  /* Las columnas de Bootstrap en la misma fila ya se estiran a la misma
     altura (.row es flex por defecto), pero sin esto la TARJETA de
     dentro solo ocupaba su propio contenido — una con franja+subtítulo
     (2 líneas más que otra sin ellos) se veía más alta que sus vecinas
     de la misma fila. Con height:100% la tarjeta rellena la columna
     estirada y el contenido corto queda centrado, en vez de "colgar"
     arriba con hueco vacío debajo. */
  height: 100%;
}
.kpi-card:hover{ transform: translateY(-2px); box-shadow: var(--shadow-lg); }
/* Las tarjetas de "Tus Acciones 5S" son <a> (enlazan al listado filtrado
   con ese número exacto), pero deben verse y comportarse igual que las
   que siguen siendo <div> — sin esto heredarían el azul/subrayado de
   enlace por defecto del navegador. */
a.kpi-card{ text-decoration: none; color: inherit; cursor: pointer; }
.kpi-icon{
  display: flex; align-items: center; justify-content: center;
  width: 2.75rem; height: 2.75rem; flex-shrink: 0;
  border-radius: 50%;
  background: var(--5s-surface-2); color: var(--5s-ink-soft);
}
.kpi-icon .icon{ width: 1.3rem; height: 1.3rem; }
.kpi-number{ margin: 0; font-size: 1.7rem; font-weight: 800; line-height: 1; font-variant-numeric: tabular-nums; }
.kpi-label{ margin: .25rem 0 0; color: var(--5s-ink-soft); font-size: .82rem; font-weight: 600; }

/* Antes el círculo del icono llevaba el tono "-soft" (muy pálido, casi
   blanco) con el icono en el tono oscuro — a tamaño pequeño se veía como
   un círculo gris con un icono negro, sin nada de color. Con el círculo
   ya relleno del color fuerte y el icono en blanco, el color se ve de
   verdad de un vistazo, no solo al fijarse. */
.kpi-open, .kpi-expired{ border-top-color: var(--5s-crit); }
.kpi-open .kpi-icon, .kpi-expired .kpi-icon{ background: var(--5s-crit); color: #fff; }

.kpi-next{ border-top-color: var(--5s-warn); }
.kpi-next .kpi-icon{ background: var(--5s-warn); color: #fff; }

.kpi-closed, .kpi-eficaz{ border-top-color: var(--5s-good); }
.kpi-closed .kpi-icon, .kpi-eficaz .kpi-icon{ background: var(--5s-good); color: #fff; }

.kpi-nc, .kpi-noneficaz{ border-top-color: var(--5s-accent); }
.kpi-nc .kpi-icon, .kpi-noneficaz .kpi-icon{ background: var(--5s-accent); color: var(--5s-accent-ink); }

.kpi-operario{ border-top-color: var(--5s-info); }
.kpi-operario .kpi-icon{ background: var(--5s-info); color: #fff; }

/* Mismo lenguaje visual que las KPI, para los 4 datos de "Mi Actividad" */
.kpi-created{ border-top-color: var(--5s-info); }
.kpi-created .kpi-icon{ background: var(--5s-info); color: #fff; }
.kpi-assigned{ border-top-color: var(--5s-accent); }
.kpi-assigned .kpi-icon{ background: var(--5s-accent); color: var(--5s-accent-ink); }
.kpi-pending{ border-top-color: var(--5s-warn); }
.kpi-pending .kpi-icon{ background: var(--5s-warn); color: #fff; }
.kpi-done{ border-top-color: var(--5s-good); }
.kpi-done .kpi-icon{ background: var(--5s-good); color: #fff; }

/* Cabecera de cada bloque de KPIs ("Tu actividad" / "Toda la planta"):
   antes las 12 tarjetas iban seguidas sin decir de quién eran los
   números — "Cerradas" salía dos veces (una tuya, una de la planta) sin
   ninguna pista de cuál era cuál. */
.kpi-group-head{ display: flex; align-items: center; gap: .6rem; margin-bottom: .85rem; }
.kpi-group-head:not(:first-child){ margin-top: 1.75rem; }
.kpi-group-ico{
  display: flex; align-items: center; justify-content: center;
  width: 1.9rem; height: 1.9rem; flex-shrink: 0; border-radius: 8px;
}
.kpi-group-ico .icon{ width: 1.05rem; height: 1.05rem; }
.kpi-group-ico.you{ background: var(--5s-info-soft); color: var(--5s-info); }
.kpi-group-ico.plant{ background: var(--5s-brand-soft); color: var(--5s-brand-dark); }
.kpi-group-name{ font-weight: 700; font-size: .95rem; }
.kpi-group-sub{ margin-left: auto; color: var(--5s-muted); font-size: .78rem; }

/* Segunda línea de contexto bajo la etiqueta ("de las 4 asignadas",
   "origen = Operario"...) — para no obligar a adivinar qué mide cada
   número solo por su nombre corto. */
.kpi-sub{ margin: .1rem 0 0; color: var(--5s-muted); font-size: .72rem; }

/* Franja de peso visual bajo el número: refuerza el color del borde con
   una proporción real (p.ej. pendientes sobre el total asignado), no
   solo decorativa. */
.kpi-bar{ height: 4px; border-radius: 99px; background: var(--5s-surface-2); margin-top: .55rem; overflow: hidden; }
.kpi-bar > i{ display: block; height: 100%; border-radius: 99px; background: var(--kpi-bar-color, var(--5s-accent)); }

/* ---------- "Mi línea": cabecera, estadísticas y mini-tendencia ---------- */
.linea-head{ display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px; }
.delta-pill{ display: inline-flex; align-items: center; gap: 5px; font-size: .78rem; font-weight: 700; padding: 5px 12px; border-radius: 99px; white-space: nowrap; }
.delta-pill.good{ background: var(--5s-good-soft); color: var(--5s-good); }
.delta-pill.warn{ background: var(--5s-warn-soft); color: var(--5s-warn); }
.delta-pill.crit{ background: var(--5s-crit-soft); color: var(--5s-crit); }

.stat-row{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
@media (max-width: 720px){ .stat-row{ grid-template-columns: 1fr; } }
/* min-width:0 en los dos niveles (celda de rejilla Y contenedor flex por
   dentro) es lo que de verdad evita que una fecha completa o un nombre
   largo empujen la columna y se corten contra el borde de la tarjeta en
   vez de partir de línea. align-items:center (no flex-start) empareja
   el icono con el texto igual tenga 1 o 2 líneas. */
.stat{
  min-width: 0; display: flex; align-items: center; gap: 11px;
  border: 1px solid var(--5s-line); border-radius: var(--radius-lg); padding: .8rem .9rem;
}
.stat-ico{
  width: 2.2rem; height: 2.2rem; flex-shrink: 0; border-radius: 8px;
  display: flex; align-items: center; justify-content: center;
}
.stat-ico .icon{ width: 1.1rem; height: 1.1rem; }
.stat-ico.brand{ background: var(--5s-brand); color: #fff; }
.stat-ico.warn{ background: var(--5s-warn); color: #fff; }
.stat-ico.crit{ background: var(--5s-crit); color: #fff; }
.stat-body{ min-width: 0; flex: 1; }
.stat-label{ font-size: .7rem; text-transform: uppercase; letter-spacing: .04em; color: var(--5s-muted); font-weight: 700; }
.stat-value{ font-size: 1.15rem; font-weight: 800; line-height: 1.25; font-variant-numeric: tabular-nums; overflow-wrap: break-word; }
.stat-note{ font-size: .78rem; color: var(--5s-muted); line-height: 1.4; overflow-wrap: break-word; }
.stat-note.crit{ color: var(--5s-crit); font-weight: 600; }

/* Rejilla de tarjetas-enlace del hub de "Administración de estructura"
   (admin_estructura.php) — mismo grid auto-ajustable que .stat-row, pero
   cada tarjeta es un <a> completo (cursor + hover), cosa que .stat no
   necesita porque no es clicable. */
.hub-grid{ display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; }
.hub-tile{
  display: flex; align-items: center; gap: 14px; padding: 1.1rem 1.25rem;
  text-decoration: none; color: inherit;
  transition: border-color .15s, transform .15s;
}
.hub-tile:hover{ border-color: var(--5s-brand); transform: translateY(-2px); }
.hub-tile-body{ display: flex; flex-direction: column; min-width: 0; }
.hub-tile-count{ font-size: 1.6rem; font-weight: 800; line-height: 1; font-variant-numeric: tabular-nums; }
.hub-tile-label{ font-size: .85rem; color: var(--5s-muted); margin-top: .15rem; }

.history-box{
  border: 1px dashed var(--5s-line); border-radius: var(--radius-lg);
  padding: .85rem 1rem; display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
}
.history-chart{ flex-shrink: 0; }
.history-text{ font-size: .82rem; color: var(--5s-ink-soft); line-height: 1.5; }

/* ---------- Ranking combinado (Dashboard) ---------- */
.metric-bar{ display: flex; align-items: center; gap: 8px; justify-content: flex-end; font-weight: 700; font-variant-numeric: tabular-nums; }
.metric-bar-track{ width: 64px; height: 6px; border-radius: 99px; background: var(--5s-surface-2); overflow: hidden; }
.metric-bar-track > i{ display: block; height: 100%; border-radius: 99px; }
.tabla-ranking td, .tabla-ranking th{ white-space: nowrap; }

/* ---------- Actividad / listas resumen ---------- */
.actividad-box{
  background: var(--5s-surface); border: 1px solid var(--5s-line);
  border-radius: var(--radius-lg); padding: 1.25rem 1.5rem;
}
.actividad-title{ font-weight: 700; margin-bottom: .9rem; font-size: 1.1rem; }

.actividad-list{ display: flex; flex-direction: column; gap: .35rem; }
.actividad-fila{
  display: flex; align-items: center; gap: .85rem;
  padding: .65rem .75rem; border-radius: var(--radius-sm);
}
.actividad-fila:nth-child(odd){ background: var(--5s-paper); }
.actividad-fila-id{ color: var(--5s-accent-dark); font-weight: 700; flex-shrink: 0; }
.actividad-fila-desc{ flex: 1; color: var(--5s-ink); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.actividad-fila-progress{ display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.actividad-fila-progress .progress{ width: 70px; }
.actividad-fila-meta{ color: var(--5s-ink-soft); font-size: .82rem; white-space: nowrap; min-width: 2.4em; }

/* ---------- Timeline ---------- */
.timeline{ position: relative; padding-left: 1.75rem; }
.timeline::before{
  content: ""; position: absolute; left: 6px; top: 4px; bottom: 4px;
  width: 2px; background: var(--5s-line);
}
.timeline-item{ position: relative; padding-bottom: 1.25rem; }
.timeline-point{
  position: absolute; left: -1.75rem; top: 2px;
  width: 14px; height: 14px; border-radius: 50%;
  background: var(--5s-accent); border: 2px solid var(--5s-surface);
}
.timeline-content{ font-size: .9rem; }

/* ---------- Tarjeta de bienvenida ---------- */
.welcome-card{
  background: linear-gradient(135deg, var(--5s-accent-soft) 0%, var(--5s-surface) 60%);
  border: 1px solid var(--5s-line);
  border-radius: var(--radius-lg); overflow: hidden;
}
.icon.welcome-img{ width: 3rem; height: 3rem; color: var(--5s-brand); flex-shrink: 0; }

/* ---------- Cabeceras de los bloques de gráficos del dashboard ----------
   Antes eran solo texto (un <h3> a secas): la sección entera se leía
   plana, sin ningún color que ayude a distinguir un bloque de otro de
   un vistazo. Un icono en círculo de color por bloque, a juego con el
   propio gráfico, arregla eso sin tocar los gráficos en sí. */
.section-box h3{
  display: flex; align-items: center; gap: 10px;
  font-size: 1.05rem; margin: 0 0 1.1rem;
  padding-bottom: .75rem;
  border-bottom: 1px solid var(--5s-line);
}
.section-icon{
  display: inline-flex; align-items: center; justify-content: center;
  width: 2.1rem; height: 2.1rem; flex-shrink: 0;
  border-radius: 50%;
}
.section-icon .icon{ width: 1.05rem; height: 1.05rem; }
.section-icon.i-accent{ background: var(--5s-accent); color: var(--5s-accent-ink); }
.section-icon.i-brand{ background: var(--5s-brand); color: #fff; }
.section-icon.i-info{ background: var(--5s-info); color: #fff; }
.section-icon.i-good{ background: var(--5s-good); color: #fff; }
.section-icon.i-warn{ background: var(--5s-warn); color: #fff; }
.section-icon.i-crit{ background: var(--5s-crit); color: #fff; }

/* ---------- Avatar / chip ---------- */
.avatar{
  width: 44px; height: 44px; border-radius: 50%;
  background: var(--5s-accent-soft); color: var(--5s-accent-dark);
  display: flex; align-items: center; justify-content: center;
  font-weight: 800; font-size: .92rem; flex-shrink: 0;
}

/* ---------- Valoración por estrellas ---------- */
.icon.star-filled{ color: var(--5s-accent); }
.icon.star-empty{ color: var(--5s-line); }

/* ---------- Fila de mensaje clicable ---------- */
.fila-mensaje{ cursor: pointer; }

/* ---------- Páginas de error ---------- */
.error-container{
  min-height: 100vh; display: flex; flex-direction: column;
  align-items: center; justify-content: center; text-align: center;
  padding: 24px;
}
.icon.error-icon{ width: 3.5rem; height: 3.5rem; color: var(--5s-crit); margin-bottom: 1rem; }

/* ---------- Ficha de línea (destino de los QR pegados en planta) ---------- */
.ficha-linea{ max-width: 640px; margin: 0 auto; }

.ficha-linea-cabecera{
  display: flex; align-items: center; gap: 1rem;
  margin-bottom: .5rem;
}
.ficha-linea-icono{
  flex-shrink: 0; width: 3.2rem; height: 3.2rem; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: var(--5s-accent-soft); color: var(--5s-accent-dark);
}
.ficha-linea-icono .icon{ width: 1.6rem; height: 1.6rem; }
.ficha-linea-eyebrow{
  text-transform: uppercase; letter-spacing: .06em; font-size: .74rem;
  font-weight: 700; color: var(--5s-muted); margin-bottom: 2px;
}
.ficha-linea-intro{ margin-bottom: 1.5rem; }

.ficha-linea-grid{
  display: grid; grid-template-columns: 1fr; gap: .85rem;
}
@media (min-width: 560px){
  .ficha-linea-grid{ grid-template-columns: 1fr 1fr; }
}

.ficha-linea-boton{
  display: flex; align-items: center; gap: 1rem;
  background: var(--5s-surface); border: 1px solid var(--5s-line);
  border-left: 5px solid var(--5s-line);
  border-radius: var(--radius-lg);
  padding: 1.1rem 1.2rem;
  min-height: 5.5rem;
  text-decoration: none; color: var(--5s-ink);
  transition: transform .1s, box-shadow .15s, border-color .15s;
}
.ficha-linea-boton:hover, .ficha-linea-boton:focus-visible{
  transform: translateY(-1px);
  box-shadow: var(--shadow-sm);
  text-decoration: none; color: var(--5s-ink);
}
.ficha-linea-boton-icono{
  flex-shrink: 0; width: 2.75rem; height: 2.75rem; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: var(--5s-surface-2);
}
.ficha-linea-boton-icono .icon{ width: 1.5rem; height: 1.5rem; }
.ficha-linea-boton-texto{ display: flex; flex-direction: column; gap: 2px; }
.ficha-linea-boton-texto strong{ font-size: 1.02rem; }
.ficha-linea-boton-texto small{ color: var(--5s-muted); line-height: 1.3; }

.ficha-linea-boton--critico{ border-left-color: var(--5s-crit); }
.ficha-linea-boton--critico .ficha-linea-boton-icono{ background: var(--5s-crit-soft); color: var(--5s-crit); }
.ficha-linea-boton--primario{ border-left-color: var(--5s-accent); }
.ficha-linea-boton--primario .ficha-linea-boton-icono{ background: var(--5s-accent-soft); color: var(--5s-accent-dark); }
.ficha-linea-boton--exito{ border-left-color: var(--5s-brand); }
.ficha-linea-boton--exito .ficha-linea-boton-icono{ background: var(--5s-brand-soft); color: var(--5s-brand); }
.ficha-linea-boton--info{ border-left-color: var(--5s-info); }
.ficha-linea-boton--info .ficha-linea-boton-icono{ background: var(--5s-info-soft); color: var(--5s-info); }

.ficha-linea-pie{ margin-top: 1.75rem; text-align: center; }

/* ---------- QR de línea (modal en Administrar líneas) ---------- */
.qr-linea-caja{
  display: flex; flex-direction: column; align-items: center; gap: 1rem;
  text-align: center;
}
.qr-linea-lienzo{
  background: #fff; padding: 16px; border-radius: var(--radius);
  border: 1px solid var(--5s-line);
  display: flex; align-items: center; justify-content: center;
  width: 232px; height: 232px;
}
.qr-linea-lienzo svg{ width: 100%; height: 100%; }
.qr-linea-url{
  font-size: .78rem; color: var(--5s-muted); word-break: break-all;
  max-width: 320px;
}

/* ---------- Auditorías 5S v2: checklist flexible, resultados, borradores, calendario ---------- */

/* Punto del checklist al pasar una auditoría (auditoria_crear.php) */
.auditoria-item{
  padding: .75rem .9rem; border: 1px solid var(--5s-line); border-radius: var(--radius-sm);
  background: var(--5s-surface, transparent);
}
.auditoria-item + .auditoria-item{ margin-top: .5rem; }
.auditoria-item-texto{ font-weight: 600; margin-bottom: .5rem; }
.auditoria-item-estado{ flex-wrap: wrap; }
.auditoria-item-detalle{ border-top: 1px dashed var(--5s-line); margin-top: .65rem; padding-top: .1rem; }
.auditoria-item--no-ok{ border-color: var(--5s-crit); background: var(--5s-crit-soft); }
.auditoria-item--na{ opacity: .72; }

/* Resultados de una auditoría ya realizada (auditoria_ver.php) */
.auditoria-resultados-lista .auditoria-resultado-item{ padding: .6rem 0; }
.auditoria-resultados-lista .auditoria-resultado-item + .auditoria-resultado-item{ border-top: 1px solid var(--5s-line); }
.auditoria-resultado-foto img{
  width: 84px; height: 84px; object-fit: cover; border-radius: var(--radius-sm);
  border: 1px solid var(--5s-line);
}

/* Batch "Completar acciones de la auditoría" */
.auditoria-borrador--descartado{ opacity: .55; }

/* Checklist admin: una fila-formulario por punto */
/* Pestañas de tipo de auditoría en auditoria_checklist.php: cada tipo
   tiene su propio checklist, así que cambiar de pestaña es una navegación
   normal (recarga con ?tipo_auditoria_id=X), no hace falta JS. */
.checklist-tabs{ display: flex; flex-wrap: wrap; gap: .5rem; }
.checklist-tab{
  display: inline-flex; align-items: center; gap: .35rem;
  padding: .5rem 1.1rem;
  border-radius: 20px;
  border: 1px solid var(--5s-line);
  background: var(--5s-surface);
  color: var(--5s-ink-soft);
  font-weight: 600;
  text-decoration: none;
}
.checklist-tab:hover{ border-color: var(--5s-accent); color: var(--5s-ink); }
.checklist-tab--activa{
  background: var(--5s-accent); border-color: var(--5s-accent); color: var(--5s-accent-ink);
}
.checklist-tab--inactiva{ opacity: .65; }

.checklist-item-fila{
  display: flex; align-items: center; gap: .6rem; flex-wrap: wrap;
  padding: .5rem 0;
}
.checklist-item-fila + .checklist-item-fila{ border-top: 1px solid var(--5s-line); }
.checklist-item-fila--inactivo{ opacity: .55; }
.checklist-item-orden{ width: 64px; flex: 0 0 auto; }
/* form-control fija width:100%, que como flex-basis empuja este campo a
   ocupar toda la fila él solo y manda el nº de orden a su propia línea;
   se le da un ancho explícito para que comparta fila con el resto. */
.checklist-item-texto{ width: auto; flex: 1 1 220px; min-width: 160px; }
.checklist-item-acciones{ display: flex; gap: .35rem; flex: 0 0 auto; }

/* "Tus auditorías pendientes" (auditorias_listar.php) */
.auditoria-pendientes-card{ border-left: 4px solid var(--5s-accent); }
.auditoria-pendiente-item{
  display: flex; flex-direction: column; gap: 2px;
  padding: .65rem .85rem; border-radius: var(--radius-sm);
  border: 1px solid var(--5s-line); text-decoration: none; color: inherit;
  height: 100%; transition: border-color .15s ease, background .15s ease;
}
.auditoria-pendiente-item:hover, .auditoria-pendiente-item:focus-visible{
  border-color: var(--5s-accent); background: var(--5s-accent-soft);
}
.auditoria-pendiente-item .small{ color: var(--5s-muted); }
.auditoria-pendiente-item--vencida{ border-color: var(--5s-crit); }
.auditoria-pendiente-item--vencida .small{ color: var(--5s-crit); }

/* ---------- Calendario de reuniones (tarea #44) ----------
   Rejilla mensual estilo Google Calendar: 7 columnas fijas, con líneas
   finas (el propio gap con fondo --5s-line hace de separador) y celdas
   que crecen si un día tiene muchas reuniones (scroll interno en vez de
   desbordar la rejilla). .calendario-scroll evita que la rejilla rompa
   el ancho de la página en pantallas estrechas, en vez de intentar
   comprimir 7 columnas hasta hacerlas ilegibles. */
.calendario-scroll{ overflow-x: auto; }
.calendario-grid{
  display: grid;
  grid-template-columns: repeat(7, minmax(120px, 1fr));
  gap: 1px;
  background: var(--5s-line);
  border: 1px solid var(--5s-line);
  border-radius: 10px;
  overflow: hidden;
}
.calendario-diasemana{
  background: var(--5s-surface-2);
  color: var(--5s-ink-soft);
  font-weight: 700; font-size: .78rem; text-transform: uppercase; letter-spacing: .04em;
  text-align: center;
  padding: .5rem .25rem;
}
.calendario-dia{
  background: var(--5s-surface);
  min-height: 108px;
  padding: .35rem;
  display: flex; flex-direction: column; gap: .3rem;
}
.calendario-dia--fuera-mes{ background: var(--5s-paper); }
.calendario-dia--hoy{ box-shadow: inset 0 0 0 2px var(--5s-accent); }
.calendario-dia-num{ font-weight: 700; font-size: .82rem; color: var(--5s-ink-soft); }
.calendario-dia--hoy .calendario-dia-num{ color: var(--5s-accent-dark); }
.calendario-eventos-lista{
  display: flex; flex-direction: column; gap: .2rem;
  max-height: 92px; overflow-y: auto;
}
.calendario-evento{
  display: block;
  font-size: .72rem; font-weight: 600;
  padding: .15rem .4rem;
  border-radius: 5px;
  background: var(--5s-brand-soft); color: var(--5s-brand-dark);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.calendario-evento:hover{ filter: brightness(0.96); color: var(--5s-brand-dark); }
.calendario-evento--realizada{ background: var(--5s-good-soft); color: var(--5s-good); }
.calendario-evento--cancelada{ background: var(--5s-crit-soft); color: var(--5s-crit); text-decoration: line-through; }

/* ---------- Ajustes responsive ---------- */
@media (max-width: 575.98px){
  .login-card{ padding: 32px 24px; }
  .card-body{ padding: 1.1rem; }
  .dashboard-title{ font-size: 1.35rem; }
  .table{ font-size: .82rem; }
  .table th, .table td{ padding: .6rem .55rem; }
  .calendario-dia{ min-height: 80px; }
}
@media (prefers-reduced-motion: reduce){
  *{ transition: none !important; animation: none !important; }
}
