/*!////////////////////////////////////////////////////////////////////////
 * BS3-BS5-BRIDGE.CSS
 * Capa de compatibilidad visual: permite que pantallas construidas con
 * marcado de Bootstrap 3 se vean igual corriendo sobre Bootstrap 5,
 * sin modificar el HTML de cada pantalla.
 *
 * ORDEN DE CARGA OBLIGATORIO (en el layout base, una sola vez):
 *   1) bootstrap.min.css              (Bootstrap 5)
 *   2) bs3-bs5-bridge.css             (este archivo)
 *   3) custom.css                     (tus customizaciones actuales)
 *
 * Cargar el bridge ANTES de custom.css permite que cualquier override
 * que ya tengas en custom.css (colores, tamaños, etc.) siga ganando por
 * cascada, igual que ganaba sobre bootstrap.css en BS3.
 *
 * Ver GUIA-INTEGRACION.md para el detalle de qué cubre y qué no cubre
 * esta capa (hay una parte funcional/JS que se resuelve en
 * bs3-bs5-bridge.js, y algunas cosas -como el font de Glyphicons- que
 * conviene resolver reutilizando el archivo original de BS3).
 ////////////////////////////////////////////////////////////////////////*/

/* ==========================================================================
   0. Gutter del grid: BS3 usaba 15px de padding a cada lado (30px totales).
      BS5 usa 0.75rem (12px) por lado via variable. Igualamos la variable
      para que TODO el grid (tanto el recreado abajo como cualquier
      col-md-*/col-lg-* nativo de BS5 que uses a futuro) respete el
      espaciado visual que ya tenés hoy.
   ========================================================================== */
:root {
  --bs-gutter-x: 1.875rem; /* 30px, paridad con BS3 */
}

/* ==========================================================================
   1. GRID: BS5 eliminó el infijo "xs" (col-xs-*). Sin esto, esas clases
      no existen y el layout se cae a bloques apilados sin más.
      Recreamos el sistema completo (col-xs-N, offset, push, pull) usando
      el mismo motor flex que ya trae `.row` de Bootstrap 5.
   ========================================================================== */
[class*="col-xs-"] {
  position: relative;
  padding-right: calc(var(--bs-gutter-x) * .5);
  padding-left: calc(var(--bs-gutter-x) * .5);
}

.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6,
.col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
  float: left;
}

/* El ancho de col-xs-N se limita a mobile (<768px, ver más abajo) a
   propósito: NO alcanza con ponerlo acá sin media query (como estaba
   antes), porque un elemento típico "col-xs-12 col-md-8" (ancho completo
   en mobile, 8/12 en desktop) rompe en desktop. En BS3 real esto
   funcionaba por ORDEN DE FUENTE: col-xs (sin media, "base") se define
   PRIMERO en el mismo bootstrap.css, y col-sm/md/lg (con media query) se
   definen DESPUÉS en ese mismo archivo -misma especificidad, pero por
   estar más abajo, col-md-8 le ganaba a col-xs-12 en desktop-. Acá el
   ancho de col-md-8/col-sm-8/col-lg-8 NO lo define este bridge -ya viene
   nativo de Bootstrap 5 (bootstrap.min.css, con su propio @media)-, y ese
   archivo se carga ANTES que este bridge. Si esta regla de col-xs-12
   siguiera sin media query, por estar en un archivo que carga DESPUÉS de
   bootstrap.min.css le ganaría a ".col-md-8" en CUALQUIER ancho de
   pantalla (misma especificidad, gana el que carga último), sin importar
   que el viewport sea de escritorio. Caso real: el widget "Calendario de
   detecciones" (Análisis > Gráficos) usa
   class="col-xs-12 col-md-offset-2 col-md-8": en desktop el offset-2
   corría el calendario 16.66% a la derecha pero el ancho quedaba en
   100% (por el .col-xs-12 sin media ganándole a .col-md-8) en vez de
   66.66%, y el conjunto (offset + 100% de ancho) desbordaba el
   contenedor por exactamente ese 16.66% -de ahí la tabla del calendario y
   la barra "Mes/Semana/Agenda" cortadas, con scroll horizontal y hasta
   perdiendo la columna de "dom." (domingo) fuera de la vista-. Con el
   ancho de col-xs-N acotado a mobile, en desktop no queda ninguna regla
   de este bridge compitiendo por "width" en ese elemento, así que gana
   directamente el ".col-md-8" nativo de Bootstrap 5 (66.66%), igual que
   pasaba en BS3. Verificado en vivo en i1-qa-bonita mutando el CSSOM
   (removiendo "width" de estas reglas) antes de aplicar el fix: el
   calendario pasó de desbordar 291px a encajar exacto en su contenedor
   (66.6667% de ancho), sin scroll horizontal y con las 7 columnas de día
   visibles. Pantalla de Análisis > Gráficos (2026-07-14). Mismo criterio
   aplicado a TODOS los col-xs-N (no solo 12), por si aparece el mismo
   patrón "col-xs-N col-sm/md/lg-M" en otra pantalla. */
@media (max-width: 767.98px) {
  .col-xs-12 { width: 100%; }
  .col-xs-11 { width: 91.66666667%; }
  .col-xs-10 { width: 83.33333333%; }
  .col-xs-9  { width: 75%; }
  .col-xs-8  { width: 66.66666667%; }
  .col-xs-7  { width: 58.33333333%; }
  .col-xs-6  { width: 50%; }
  .col-xs-5  { width: 41.66666667%; }
  .col-xs-4  { width: 33.33333333%; }
  .col-xs-3  { width: 25%; }
  .col-xs-2  { width: 16.66666667%; }
  .col-xs-1  { width: 8.33333333%; }
}
/* A propósito NO se agrega ningún "width" para [class*="col-xs-"] fuera
   del media de arriba: cualquier regla -aunque sea "width:auto"- puesta
   en este archivo volvería a ganarle a ".col-md-8" nativo de Bootstrap 5
   en desktop (misma especificidad, y este archivo carga después), por lo
   que el ancho de col-md-8 quedaría pisado igual que antes del fix. Sin
   ninguna regla de este bridge compitiendo, en desktop gana directo el
   ancho que corresponda de Bootstrap 5 (col-sm/md/lg-N) o, si el elemento
   no tiene ninguna otra clase de ancho, el default del navegador para un
   bloque (auto = 100% del contenedor) -mismo resultado visual que
   "width:100%" explícito, sin regresión para el caso más común de
   "col-xs-12" usado solo-. */

.col-xs-pull-12 { right: 100%; }
.col-xs-pull-11 { right: 91.66666667%; }
.col-xs-pull-10 { right: 83.33333333%; }
.col-xs-pull-9  { right: 75%; }
.col-xs-pull-8  { right: 66.66666667%; }
.col-xs-pull-7  { right: 58.33333333%; }
.col-xs-pull-6  { right: 50%; }
.col-xs-pull-5  { right: 41.66666667%; }
.col-xs-pull-4  { right: 33.33333333%; }
.col-xs-pull-3  { right: 25%; }
.col-xs-pull-2  { right: 16.66666667%; }
.col-xs-pull-1  { right: 8.33333333%; }
.col-xs-pull-0  { right: auto; }

.col-xs-push-12 { left: 100%; }
.col-xs-push-11 { left: 91.66666667%; }
.col-xs-push-10 { left: 83.33333333%; }
.col-xs-push-9  { left: 75%; }
.col-xs-push-8  { left: 66.66666667%; }
.col-xs-push-7  { left: 58.33333333%; }
.col-xs-push-6  { left: 50%; }
.col-xs-push-5  { left: 41.66666667%; }
.col-xs-push-4  { left: 33.33333333%; }
.col-xs-push-3  { left: 25%; }
.col-xs-push-2  { left: 16.66666667%; }
.col-xs-push-1  { left: 8.33333333%; }
.col-xs-push-0  { left: auto; }

.col-xs-offset-12 { margin-left: 100%; }
.col-xs-offset-11 { margin-left: 91.66666667%; }
.col-xs-offset-10 { margin-left: 83.33333333%; }
.col-xs-offset-9  { margin-left: 75%; }
.col-xs-offset-8  { margin-left: 66.66666667%; }
.col-xs-offset-7  { margin-left: 58.33333333%; }
.col-xs-offset-6  { margin-left: 50%; }
.col-xs-offset-5  { margin-left: 41.66666667%; }
.col-xs-offset-4  { margin-left: 33.33333333%; }
.col-xs-offset-3  { margin-left: 25%; }
.col-xs-offset-2  { margin-left: 16.66666667%; }
.col-xs-offset-1  { margin-left: 8.33333333%; }
.col-xs-offset-0  { margin-left: 0; }

/* Contenedores: alinear los anchos fijos de BS3 (BS5 usa otros breakpoints/anchos) */
@media (min-width: 768px)  { .container { max-width: 750px; } }
@media (min-width: 992px)  { .container { max-width: 970px; } }
@media (min-width: 1200px) { .container { max-width: 1170px; } }

/* ==========================================================================
   1b. GRID: mismo problema que el punto 1, pero para col-sm-*, col-md-*
       y col-lg-* (BS5 les sacó el float igual que a col-xs-*, y sólo deja
       flex). No se nota en un .row real -ahí el flex alcanza-, pero se
       cae en marcado viejo tipo "form-horizontal" (label + input lado a
       lado usando .form-group como fila, en vez de .row): sin el float,
       label y input quedan apilados uno debajo del otro.
       Ej.: admin.php > Agregar Administrador. Referencia de cómo se veía
       antes (sin bridge, BS3 puro): devesa.iwebjbs.com.ar/admin.php.
       El float no rompe nada en un grid moderno: dentro de un .row
       flex, `float` se computa a `none` en los flex items (spec CSS),
       así que esta regla es un no-op ahí.
   ========================================================================== */
/* El padding horizontal (15px c/lado en BS3) tampoco se hereda acá: en BS5
   ese padding lo pone ".row > *" (child combinator), y como este marcado
   no usa .row como fila sino .form-group, nunca matchea -quedaba en 0.
   Ojo: NO se puede resolver con calc(var(--bs-gutter-x)*.5) reusando la
   variable de la sección 0, porque ".row" de BS5 vuelve a declarar
   --bs-gutter-x:1.5rem de forma local; cualquier .col-sm-* que caiga
   dentro de un .row real (aunque no sea hijo directo) hereda ESE valor
   -no el de :root-, dando un gutter de 24px en vez de los 30px de BS3.
   Se hardcodea 15px para que sea idéntico a BS3 sin importar el anidado. */
[class*="col-sm-"], [class*="col-md-"], [class*="col-lg-"] {
  position: relative;
  padding-right: 15px;
  padding-left: 15px;
}
@media (min-width: 768px) {
  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6,
  .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
    float: left;
  }
}
@media (min-width: 992px) {
  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6,
  .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
    float: left;
  }
}
@media (min-width: 1200px) {
  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6,
  .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
    float: left;
  }
}

/* .form-horizontal .form-group hace de ".row" en BS3 (clearfix + márgenes
   negativos que compensan el padding de los .col-*-N hijos). BS5 no tiene
   ese selector -su equivalente moderno es .row directamente-, así que si
   el marcado viejo sigue usando .form-group como fila hay que recrearlo
   a mano; si no, el contenedor no "contiene" la altura de los hijos
   flotados y los renglones del formulario se pisan entre sí. */
.form-horizontal .form-group {
  margin-right: -15px;
  margin-left: -15px;
}
.form-horizontal .form-group::before,
.form-horizontal .form-group::after {
  display: table;
  content: " ";
}
.form-horizontal .form-group::after {
  clear: both;
}

/* .container / .container-fluid: en BS3 estos dos también traían el mismo
   mixin de clearfix (":before/:after{display:table;content:' '}" +
   ":after{clear:both}") de la lista larga de selectors del bootstrap.css
   original (clearfix, container, container-fluid, row, form-group, navbar,
   nav, panel-body, modal-header/footer, etc). BS5 los sigue dejando
   display:block (a diferencia de .row/.nav/.navbar, que en BS5 son flex y
   por eso NO se les agrega este clearfix acá -ya tienen su propio
   tratamiento flex en las secciones de navbar/grid-), pero sin el clearfix
   ya no "contienen" la altura de hijos flotados (ej: un `.pull-right` con
   botones sueltos directo adentro de un `.container-fluid`). Caso real: la
   franja blanca de "Listado de Usuarios" en Administración de Usuarios
   quedaba más baja que los botones "Agregar Usuario"/"Importar" (floteados,
   pull-right), y esos botones terminaban visualmente afuera del recuadro
   blanco, pisando el fondo gris de la página. Verificado en vivo en
   i1-qa-bonita (2026-07-06). Si aparece el mismo síntoma (fondo/borde de un
   contenedor que no llega a cubrir un hijo flotado) en .panel-body,
   .modal-header, .modal-footer, .btn-toolbar, .pager o .dl-horizontal dd,
   son candidatos a la misma receta (siguen siendo block en BS5). */
.container::before, .container::after,
.container-fluid::before, .container-fluid::after {
  display: table;
  content: " ";
}
.container::after, .container-fluid::after {
  clear: both;
}

/* ==========================================================================
   2. UTILIDADES BS3 renombradas o eliminadas en BS5
   ========================================================================== */
.pull-left  { float: left !important; }
.pull-right { float: right !important; }
/* pull-* como hijo directo de .row (típico footer "© a la izquierda,
   links a la derecha"): el .row de BS5 es flex, así que los floats se
   ignoran y ".row > *" fuerza width:100% -> quedaban apilados. Se emula
   el comportamiento BS3 (float shrink-wrap + derecha) con flex. */
.row > .pull-left, .row > .pull-right {
  width: auto;
  max-width: 100%;
  flex: 0 1 auto;
  padding-right: 0;
  padding-left: 0;
}
.row > .pull-right { margin-left: auto; }
.row > .pull-right ~ .pull-right { margin-left: 0; }
.text-left   { text-align: left !important; }
.text-right  { text-align: right !important; }
.text-center { text-align: center !important; }
.text-justify{ text-align: justify !important; }

.center-block {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

/* Visibilidad responsive estilo BS3 (BS5 no trae "hidden-" ni "visible-") */
@media (max-width: 767.98px) {
  .hidden-xs { display: none !important; }
}
@media (min-width: 768px) and (max-width: 991.98px) {
  .hidden-sm { display: none !important; }
}
@media (min-width: 992px) and (max-width: 1199.98px) {
  .hidden-md { display: none !important; }
}
@media (min-width: 1200px) {
  .hidden-lg { display: none !important; }
}

.visible-xs, .visible-sm, .visible-md, .visible-lg,
.visible-xs-block, .visible-xs-inline, .visible-xs-inline-block,
.visible-sm-block, .visible-sm-inline, .visible-sm-inline-block,
.visible-md-block, .visible-md-inline, .visible-md-inline-block,
.visible-lg-block, .visible-lg-inline, .visible-lg-inline-block {
  display: none !important;
}
@media (max-width: 767.98px) {
  .visible-xs { display: block !important; }
  table.visible-xs { display: table !important; }
  tr.visible-xs { display: table-row !important; }
  th.visible-xs, td.visible-xs { display: table-cell !important; }
  .visible-xs-block { display: block !important; }
  .visible-xs-inline { display: inline !important; }
  .visible-xs-inline-block { display: inline-block !important; }
}
@media (min-width: 768px) and (max-width: 991.98px) {
  .visible-sm { display: block !important; }
  table.visible-sm { display: table !important; }
  tr.visible-sm { display: table-row !important; }
  th.visible-sm, td.visible-sm { display: table-cell !important; }
  .visible-sm-block { display: block !important; }
  .visible-sm-inline { display: inline !important; }
  .visible-sm-inline-block { display: inline-block !important; }
}
@media (min-width: 992px) and (max-width: 1199.98px) {
  .visible-md { display: block !important; }
  table.visible-md { display: table !important; }
  tr.visible-md { display: table-row !important; }
  th.visible-md, td.visible-md { display: table-cell !important; }
  .visible-md-block { display: block !important; }
  .visible-md-inline { display: inline !important; }
  .visible-md-inline-block { display: inline-block !important; }
}
@media (min-width: 1200px) {
  .visible-lg { display: block !important; }
  table.visible-lg { display: table !important; }
  tr.visible-lg { display: table-row !important; }
  th.visible-lg, td.visible-lg { display: table-cell !important; }
  .visible-lg-block { display: block !important; }
  .visible-lg-inline { display: inline !important; }
  .visible-lg-inline-block { display: inline-block !important; }
}

/* ==========================================================================
   3. PANELES / WELLS / THUMBNAILS (eliminados de Bootstrap desde la v4)
   ========================================================================== */
.panel {
  margin-bottom: 20px;
  background-color: #fff;
  border: 1px solid transparent;
  border-radius: 4px;
  box-shadow: 0 1px 1px rgba(0,0,0,.05);
}
.panel-body { padding: 15px; }
.panel-heading {
  padding: 10px 15px;
  border-bottom: 1px solid transparent;
  border-top-left-radius: 3px;
  border-top-right-radius: 3px;
}
.panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; }
.panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a {
  color: inherit;
}
.panel-footer {
  padding: 10px 15px;
  background-color: #f5f5f5;
  border-top: 1px solid #ddd;
  border-bottom-right-radius: 3px;
  border-bottom-left-radius: 3px;
}
.panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; }
.panel-group { margin-bottom: 20px; }
.panel-group .panel { margin-bottom: 0; border-radius: 4px; overflow: hidden; }
.panel-group .panel + .panel { margin-top: 5px; }
.panel-default { border-color: #ddd; }
.panel-default > .panel-heading {
  color: #333;
  background-color: #f5f5f5;
  border-color: #ddd;
}
.panel-primary { border-color: #337ab7; }
.panel-primary > .panel-heading { color: #fff; background-color: #337ab7; border-color: #337ab7; }
.panel-success { border-color: #d6e9c6; }
.panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; }
.panel-info { border-color: #bce8f1; }
.panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; }
.panel-warning { border-color: #faebcc; }
.panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; }
.panel-danger { border-color: #ebccd1; }
.panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; }

.well {
  min-height: 20px;
  padding: 19px;
  margin-bottom: 20px;
  background-color: #f5f5f5;
  border: 1px solid #e3e3e3;
  border-radius: 4px;
  box-shadow: inset 0 1px 1px rgba(0,0,0,.05);
}
.well-lg { padding: 24px; border-radius: 6px; }
.well-sm { padding: 9px; border-radius: 3px; }

.thumbnail {
  display: block;
  padding: 4px;
  margin-bottom: 20px;
  line-height: 1.42857143;
  background-color: #fff;
  border: 1px solid #ddd;
  border-radius: 4px;
  transition: border .2s ease-in-out;
}
.thumbnail > img, .thumbnail a > img { margin-left: auto; margin-right: auto; }
.thumbnail .caption { padding: 9px; color: #333; }

/* ==========================================================================
   4. FORMULARIOS estilo BS3 (form-group, control-label, checkbox/radio,
      input-group-addon, help-block, has-error/has-success/has-warning)
   ========================================================================== */
.form-group { margin-bottom: 15px; }

.control-label {
  display: inline-block;
  max-width: 100%;
  margin-bottom: 5px;
  font-weight: 700;
}
.form-horizontal .control-label {
  padding-top: 7px;
  margin-bottom: 0;
  text-align: right;
}

.help-block {
  display: block;
  margin-top: 5px;
  margin-bottom: 10px;
  color: #737373;
}

.checkbox, .radio {
  position: relative;
  display: block;
  margin-top: 10px;
  margin-bottom: 10px;
}
.checkbox label, .radio label {
  min-height: 20px;
  padding-left: 20px;
  margin-bottom: 0;
  font-weight: 400;
  cursor: pointer;
}
.checkbox input[type="checkbox"], .radio input[type="radio"] {
  position: absolute;
  margin-top: 4px;
  margin-left: -20px;
}
.checkbox-inline, .radio-inline {
  display: inline-block;
  padding-left: 20px;
  margin-bottom: 0;
  font-weight: 400;
  vertical-align: middle;
  cursor: pointer;
}
.checkbox-inline + .checkbox-inline,
.radio-inline + .radio-inline { margin-top: 0; margin-left: 10px; }

.has-error .control-label, .has-error .help-block { color: #a94442; }
.has-error .form-control { border-color: #a94442; box-shadow: inset 0 1px 1px rgba(0,0,0,.075); }
.has-success .control-label, .has-success .help-block { color: #3c763d; }
.has-success .form-control { border-color: #3c763d; }
.has-warning .control-label, .has-warning .help-block { color: #8a6d3b; }
.has-warning .form-control { border-color: #8a6d3b; }

.form-control-static {
  padding-top: 7px;
  padding-bottom: 7px;
  margin-bottom: 0;
  min-height: 34px;
}

/* <select class="form-control">: BS5 le pone "appearance:none" a TODO
   .form-control (pensado sobre todo para normalizar <input type="date">,
   spinners de number, etc. entre navegadores), pero como consecuencia
   también apaga la flechita nativa de los <select> con esa clase. BS5
   espera que los selects usen ".form-select" en vez de ".form-control"
   (esa sí trae una flecha propia via background-image), pero el markup
   viejo de iWeb pone ".form-control" en TODOS los campos, selects
   incluidos, igual que en BS3 (que nunca tocaba "appearance", por eso ahí
   se veía la flecha nativa del navegador sin hacer nada especial). Se
   restaura ese comportamiento en vez de migrar cada <select> a
   .form-select (implicaría tocar el HTML de cada pantalla). No se toca
   "background-image" (BS5 ya la deja en "none" para .form-control; si en
   algún punto se le pone una a mano, sacarla acá también para no duplicar
   flecha). Verificado en vivo en i1-qa-bonita, campo "Bifurcacion"
   (2026-07-06). */
select.form-control {
  appearance: auto;
  -webkit-appearance: menulist;
  -moz-appearance: menulist;
}

/* input-group-addon: eliminado (ahora es .input-group-text). Recreado
   para funcionar dentro del .input-group flex de BS5. */
.input-group-addon {
  display: flex;
  align-items: center;
  padding: 6px 12px;
  font-size: 14px;
  font-weight: 400;
  line-height: 1;
  color: #555;
  text-align: center;
  background-color: #eee;
  border: 1px solid #ccc;
  border-radius: 4px;
  white-space: nowrap;
}
.input-group > .input-group-addon:not(:last-child) {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
}
.input-group > .input-group-addon:not(:first-child) {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  margin-left: -1px;
}
.input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; }
.input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; }

/* .iconos-login: clase propia del proyecto (definida en custom.css, no en
   Bootstrap) que resuelve el ícono dentro del input igual que un
   .input-group-addon, pero con el truco de tabla de BS3 hardcodeado:
   "display:table-cell; width:1%". Adentro del .input-group flex de BS5 eso
   se "blockifica" (un flex item no puede ser table-cell) y "width:1%" pasa
   a leerse como flex-basis casi 0 en vez de "achicate al mínimo posible
   dentro de una tabla"; como el <i class="glyphicon"> de adentro no tiene
   ancho de layout propio, la celda queda angosta y el ícono termina pegado/
   superpuesto contra el borde del input en vez del recuadro con aire de
   antes. Mismo tratamiento que a .input-group-addon: display:flex +
   ancho por contenido en vez de por el width:1% de la tabla. Verificado en
   vivo en i1-qa-bonita, pantalla de login (2026-07-06). */
.input-group > .iconos-login {
  display: flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  width: auto;
}

/* Tamaños BS3 de inputs, no existen como .input-sm/.input-lg en BS5 (son form-control-sm/lg) */
.input-sm, select.input-sm { height: 30px; padding: 5px 10px; font-size: 12px; border-radius: 3px; }
.input-lg, select.input-lg { height: 46px; padding: 10px 16px; font-size: 18px; border-radius: 6px; }

/* ==========================================================================
   5. BOTONES: variantes/tamaños de BS3 que BS5 no trae
   ========================================================================== */
.btn-default {
  color: #333;
  background-color: #fff;
  border-color: #ccc;
}
.btn-default:hover, .btn-default:focus {
  color: #333;
  background-color: #e6e6e6;
  border-color: #adadad;
}
.btn-default:active, .btn-default.active {
  color: #333;
  background-color: #d4d4d4;
  border-color: #8c8c8c;
}
.btn-xs {
  padding: 1px 5px;
  font-size: 12px;
  line-height: 1.5;
  border-radius: 3px;
}

/* Caret de dropdown: en BS3 la flecha era un elemento explícito
   <span class="caret"> — solo aparecía donde el markup lo ponía. BS5 en
   cambio dibuja SIEMPRE una flecha ::after en todo .dropdown-toggle, lo
   que agrega flechas donde nunca existieron (ej. íconos de menú del
   navbar). Se apaga el ::after de BS5 y se restaura el .caret de BS3. */
.dropdown-toggle::after,
.dropup .dropdown-toggle::after,
.dropend .dropdown-toggle::after,
.dropstart .dropdown-toggle::before { display: none; }
.caret {
  display: inline-block;
  width: 0;
  height: 0;
  margin-left: 2px;
  vertical-align: middle;
  border-top: 4px dashed;
  border-right: 4px solid transparent;
  border-left: 4px solid transparent;
}
.dropup .caret { border-top: 0; border-bottom: 4px dashed; }

/* ==========================================================================
   6. LABELS (BS3) vs BADGES (BS5 renombró/rediseñó ambos conceptos).
      Recreamos ".label" tal cual era en BS3. La forma de ".badge" también
      se restaura porque tu custom.css ya define los colores de
      .badge-danger/.badge-warning/.badge-success/etc. y solo necesita
      que la forma base (padding, radio, line-height) sea la de BS3.
   ========================================================================== */
.label {
  display: inline;
  padding: .2em .6em .3em;
  font-size: 75%;
  font-weight: 700;
  line-height: 1;
  color: #fff;
  text-align: center;
  white-space: nowrap;
  vertical-align: baseline;
  border-radius: .25em;
}
.label-default { background-color: #777; }
.label-primary  { background-color: #337ab7; }
.label-success  { background-color: #5cb85c; }
.label-info     { background-color: #5bc0de; }
.label-warning  { background-color: #f0ad4e; }
.label-danger   { background-color: #d9534f; }

.badge {
  display: inline-block;
  min-width: 10px;
  padding: 3px 7px;
  font-size: 12px;
  font-weight: 700;
  line-height: 1;
  color: #fff;
  text-align: center;
  white-space: nowrap;
  vertical-align: middle;
  background-color: #777;
  border-radius: 10px;
}
.badge:empty { display: none; }

/* ==========================================================================
   7. NAVBAR: bloque completo copiado del bootstrap.css 3.4.6 del proyecto
      (carpeta v3_example), en el mismo orden de fuente, más los
      neutralizadores del navbar de BS5 (que es flex: los floats de BS3
      no aplican dentro de un contenedor flex).
   ========================================================================== */

/* Neutralizadores BS5 (en BS3 eran los defaults, no hacía falta decirlos) */
.navbar > .container, .navbar > .container-fluid { display: block; }
.navbar-brand { margin-right: 0; }
.navbar-text { padding-top: 0; padding-bottom: 0; }

/* --- Desde acá: Bootstrap 3.4.6 tal cual (con display/padding explícitos
       donde BS5 define otra cosa) --- */
@media print {
  .navbar { display: none; }
}
.navbar-fixed-bottom .dropdown .caret { content: ""; border-top: 0; border-bottom: 4px dashed; }
.navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; }

.navbar {
  display: block;    /* BS5: flex */
  padding: 0;        /* BS5: padding propio */
  position: relative;
  min-height: 50px;
  margin-bottom: 20px;
  border: 1px solid transparent;
}
@media (min-width: 768px) {
  .navbar { border-radius: 4px; }
  .navbar-header { float: left; }
  .navbar-right .dropdown-menu { right: 0; left: auto; }
  .navbar-right .dropdown-menu-left { right: auto; left: 0; }
}

.navbar-collapse {
  padding-right: 15px;
  padding-left: 15px;
  overflow-x: visible;
  border-top: 1px solid transparent;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
  -webkit-overflow-scrolling: touch;
}
.navbar-collapse.in { overflow-y: auto; }
@media (min-width: 768px) {
  .navbar-collapse { width: auto; border-top: 0; box-shadow: none; }
  .navbar-collapse.collapse {
    display: block !important;
    height: auto !important;
    padding-bottom: 0;
    overflow: visible !important;
  }
  .navbar-collapse.in { overflow-y: visible; }
  .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse,
  .navbar-fixed-bottom .navbar-collapse { padding-right: 0; padding-left: 0; }
}
.navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; }
.navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; }
@media (max-device-width: 480px) and (orientation: landscape) {
  .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; }
}
@media (min-width: 768px) {
  .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; }
}
.navbar-fixed-top { top: 0; border-width: 0 0 1px; }
.navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; }

.container > .navbar-header, .container-fluid > .navbar-header,
.container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; }
@media (min-width: 768px) {
  .container > .navbar-header, .container-fluid > .navbar-header,
  .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; }
}
.navbar-static-top { z-index: 1000; border-width: 0 0 1px; }
@media (min-width: 768px) {
  .navbar-static-top { border-radius: 0; }
}

.navbar-brand { float: left; height: 50px; padding: 15px 15px; font-size: 18px; line-height: 20px; }
.navbar-brand:hover, .navbar-brand:focus { text-decoration: none; }
.navbar-brand > img { display: block; }
@media (min-width: 768px) {
  .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; }
}

.navbar-toggle {
  position: relative;
  float: right;
  padding: 9px 10px;
  margin-top: 8px;
  margin-right: 15px;
  margin-bottom: 8px;
  background-color: transparent;
  background-image: none;
  border: 1px solid transparent;
  border-radius: 4px;
}
.navbar-toggle:focus { outline: 0; }
.navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; }
.navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; }
@media (min-width: 768px) {
  .navbar-toggle { display: none; }
}

.navbar-nav {
  display: block;    /* BS5: flex en columna (apilaba los items) */
  margin: 7.5px -15px;
}
/* el ".nav > li > a" genérico del bridge excluye navbar-nav por el fix de
   especificidad (ver HANDOFF), así que el padding va explícito acá */
.navbar-nav > li > a { position: relative; display: block; padding: 10px 15px; line-height: 20px; }
@media (max-width: 767px) {
  .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; }
  .navbar-nav .open .dropdown-menu > li > a,
  .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; }
  .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; }
  .navbar-nav .open .dropdown-menu > li > a:hover,
  .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; }
}
@media (min-width: 768px) {
  .navbar-nav { float: left; margin: 0; }
  .navbar-nav > li { float: left; }
  .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; }
}

.navbar-form {
  padding: 10px 15px;
  margin-right: -15px;
  margin-left: -15px;
  border-top: 1px solid transparent;
  border-bottom: 1px solid transparent;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
  margin-top: 8px;
  margin-bottom: 8px;
}
@media (min-width: 768px) {
  .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; }
  .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; }
  .navbar-form .form-control-static { display: inline-block; }
  /* BS3 usaba inline-table; inline-flex por el .input-group flex de BS5
     (misma adaptación que en form-inline, ver sección 17) */
  .navbar-form .input-group { display: inline-flex; width: auto; flex-wrap: nowrap; vertical-align: middle; }
  .navbar-form .input-group .input-group-addon,
  .navbar-form .input-group .input-group-btn,
  .navbar-form .input-group .form-control { width: auto; }
  .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; }
  .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; }
  .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; }
  .navbar-form .radio input[type="radio"],
  .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; }
  .navbar-form .has-feedback .form-control-feedback { top: 0; }
}
@media (max-width: 767px) {
  .navbar-form .form-group { margin-bottom: 5px; }
  .navbar-form .form-group:last-child { margin-bottom: 0; }
}
@media (min-width: 768px) {
  .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; box-shadow: none; }
}

/* BS5 pone ".navbar-nav .dropdown-menu { position: static }" (pensado para
   su navbar colapsado): el menú entra en el flujo y estira toda la barra
   hacia abajo al abrir. En BS3 era absolute en desktop; la regla static
   solo aplicaba en mobile (ver media max-767 más arriba, que sigue
   ganando ahí por especificidad). */
.navbar-nav .dropdown-menu { position: absolute; }
.navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; }
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
  margin-bottom: 0;
  border-top-left-radius: 4px; border-top-right-radius: 4px;
  border-bottom-right-radius: 0; border-bottom-left-radius: 0;
}
.navbar-btn { margin-top: 8px; margin-bottom: 8px; }
.navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px; }
.navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; }
.navbar-text { margin-top: 15px; margin-bottom: 15px; }
@media (min-width: 768px) {
  .navbar-text { float: left; margin-right: 15px; margin-left: 15px; }
  .navbar-left { float: left !important; }
  .navbar-right { float: right !important; margin-right: -15px; }
  .navbar-right ~ .navbar-right { margin-right: 0; }
}

.navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; }
.navbar-default .navbar-brand { color: #777; }
.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; }
.navbar-default .navbar-text { color: #777; }
.navbar-default .navbar-nav > li > a { color: #777; }
.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333; background-color: transparent; }
.navbar-default .navbar-nav > .active > a,
.navbar-default .navbar-nav > .active > a:hover,
.navbar-default .navbar-nav > .active > a:focus { color: #555; background-color: #e7e7e7; }
.navbar-default .navbar-nav > .disabled > a,
.navbar-default .navbar-nav > .disabled > a:hover,
.navbar-default .navbar-nav > .disabled > a:focus { color: #ccc; background-color: transparent; }
.navbar-default .navbar-nav > .open > a,
.navbar-default .navbar-nav > .open > a:hover,
.navbar-default .navbar-nav > .open > a:focus { color: #555; background-color: #e7e7e7; }
@media (max-width: 767px) {
  .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777; }
  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333; background-color: transparent; }
  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555; background-color: #e7e7e7; }
  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #ccc; background-color: transparent; }
}
.navbar-default .navbar-toggle { border-color: #ddd; }
.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #ddd; }
.navbar-default .navbar-toggle .icon-bar { background-color: #888; }
.navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; }
.navbar-default .navbar-link { color: #777; }
.navbar-default .navbar-link:hover { color: #333; }
.navbar-default .btn-link { color: #777; }
.navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333; }

.navbar-inverse { background-color: #222; border-color: #080808; }
.navbar-inverse .navbar-brand { color: #9d9d9d; }
.navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #fff; background-color: transparent; }
.navbar-inverse .navbar-text { color: #9d9d9d; }
.navbar-inverse .navbar-nav > li > a { color: #9d9d9d; }
.navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #fff; background-color: transparent; }
.navbar-inverse .navbar-nav > .active > a,
.navbar-inverse .navbar-nav > .active > a:hover,
.navbar-inverse .navbar-nav > .active > a:focus { color: #fff; background-color: #080808; }
.navbar-inverse .navbar-nav > .disabled > a,
.navbar-inverse .navbar-nav > .disabled > a:hover,
.navbar-inverse .navbar-nav > .disabled > a:focus { color: #444; background-color: transparent; }
.navbar-inverse .navbar-nav > .open > a,
.navbar-inverse .navbar-nav > .open > a:hover,
.navbar-inverse .navbar-nav > .open > a:focus { color: #fff; background-color: #080808; }
@media (max-width: 767px) {
  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; }
  .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; }
  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #9d9d9d; }
  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #fff; background-color: transparent; }
  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-color: #080808; }
  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444; background-color: transparent; }
}
.navbar-inverse .navbar-toggle { border-color: #333; }
.navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333; }
.navbar-inverse .navbar-toggle .icon-bar { background-color: #fff; }
.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; }
.navbar-inverse .navbar-link { color: #9d9d9d; }
.navbar-inverse .navbar-link:hover { color: #fff; }
.navbar-inverse .btn-link { color: #9d9d9d; }
.navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #fff; }

/* clearfix de BS3 para contener los floats de header/collapse/nav.
   OJO: ".navbar" NO entra acá (a diferencia de header/collapse, que siguen
   siendo block+float en BS5, ver arriba ".navbar-header{float:left}").
   ".navbar" es display:flex en BS5, y un ::before/::after con
   content:" "; display:table adentro de un contenedor flex no queda fuera
   del flujo como en BS3: se convierte en un item flex real (ancho 0) más.
   Con justify-content:space-between (heredado/definido para separar
   brand de menú) eso deja 3 items en vez de 1 (fantasma-vacío, contenido
   real, fantasma-vacío), y el contenido real termina centrado entre los
   dos fantasmas en vez de pegado al borde. Caso real: navbar de login
   (nav.navbar-iweb) con un solo hijo real (el logo "portada" cuando el
   navbar-brand de texto está comentado en el HTML) quedaba centrado en vez
   de pegado a la izquierda. Un contenedor flex no necesita clearfix (los
   floats de los hijos no aplican en contexto flex), así que directamente
   se lo saca de la lista. Verificado en vivo en i1-qa-bonita, pantalla de
   login (2026-07-06). */
.navbar-header:before, .navbar-header:after,
.navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; }
.navbar-header:after, .navbar-collapse:after { clear: both; }

/* ==========================================================================
   8. DROPDOWN, MODAL, COLLAPSE, TAB, ALERT: BS3 usaba la clase ".in"
      para marcar "abierto/visible" en elementos ".fade"/".collapse".
      BS5 usa ".show". El shim JS (bs3-bs5-bridge.js) mantiene ambas
      clases sincronizadas en tiempo real, así que acá sólo garantizamos
      que el estado ".in" (por si quedó escrito estático en el HTML,
      p. ej. un collapse que arranca abierto) se vea igual que ".show".
   ========================================================================== */
/* Items de dropdown: en BS3 el padding/color de cada opción venía de una
   regla BASE ".dropdown-menu > li > a" (fuera de cualquier media query).
   Esa regla nunca se portó a este bridge — solo quedó la variante mobile
   del navbar colapsado (@media max-767px, más abajo en NAVBAR) — por lo
   que en desktop cada <a> queda con padding:0 (BS5 solo da padding a
   ".dropdown-item", clase que el HTML viejo no tiene). Sin esto, las
   últimas opciones de cualquier dropdown (ej. "Editar perfil" / "Cerrar
   sesión" en el menú de usuario) quedan pegadas al margen izquierdo. */
.dropdown-menu > li > a {
  display: block;
  padding: 3px 20px;
  clear: both;
  font-weight: 400;
  line-height: 1.42857143;
  color: #333;
  white-space: nowrap;
  background-color: transparent;
  border: 0;
}
.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
  color: #262626;
  text-decoration: none;
  background-color: #f5f5f5;
}
.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {
  color: #fff;
  text-decoration: none;
  background-color: #337ab7;
  outline: 0;
}
.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
  color: #777;
}
.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
  text-decoration: none;
  cursor: not-allowed;
  background-color: transparent;
  background-image: none;
}

.collapse.in { display: block; }
.collapse.in.width { display: flex; }
.fade.in { opacity: 1; }
/* En BS3 esta regla venía DESPUÉS de .fade.in y ganaba por orden; sin ella,
   el .fade.in de arriba (el shim JS agrega .in al backdrop porque es .fade)
   pisa el opacity:.5 del .modal-backdrop.show de BS5 → fondo negro sólido. */
.modal-backdrop.in { opacity: 0.5; }
.modal.in { display: block; }

/* Botón de cerrar (.close) — reemplazado en BS5 por .btn-close (ícono SVG).
   Si tus pantallas siguen usando <button class="close">&times;</button>
   lo recreamos igual que en BS3. */
.close {
  float: right;
  font-size: 21px;
  font-weight: 700;
  line-height: 1;
  color: #000;
  text-shadow: 0 1px 0 #fff;
  opacity: .2;
  background: transparent;
  border: 0;
  appearance: none;
}
.close:hover, .close:focus { color: #000; text-decoration: none; opacity: .5; }
.alert-dismissible .close {
  position: relative;
  top: -2px;
  right: -21px;
  padding: 0;
  color: inherit;
}
/* ".close { float: right }" (arriba) no hace nada dentro de ".modal-header",
   porque BS5 pone ese header en flex ("display:flex"), y float se ignora en
   un flex item. En BS5 el que queda pegado al extremo derecho es su propio
   botón ".btn-close" gracias a "margin-left: auto" (truco de flexbox) — pero
   ese estilo apunta puntualmente a la clase ".btn-close", no a ".close", así
   que el botón viejo (<button class="close">&times;</button>) no lo hereda y
   queda pegado al título en vez de ir al extremo derecho del modal. Se le
   da el mismo "margin-left: auto" para que se comporte igual en flex.

   OJO: NO se le suma el mismo "top:-2px; right:-21px" que usa
   ".alert-dismissible .close" arriba. Ese offset está pensado para un
   ".close" con "float:right" (como en BS3): el float lo deja pegado al
   borde INTERNO del padding del header, y el "right:-21px" lo empuja
   20px más para compensar el padding y que visualmente quede pegado al
   borde EXTERNO del modal. Acá el botón ya llega a ese mismo borde
   interno solo con "margin-left:auto" (flex), así que sumarle el mismo
   "right:-21px" lo manda 21px de más, afuera del modal — de ahí el
   scroll horizontal. Alcanza con dejarlo en su posición natural. */
.modal-header .close {
  margin-left: auto;
  position: relative;
  top: 0;
  right: 0;
  padding: 0;
  color: inherit;
}

/* El "margin-left:auto" de arriba asume que ".close" es el ÚLTIMO hijo del
   header en el flex, como en el modal de ejemplo de la guía de BS3. Pero
   hay pantallas (ej.: admin.php > Agregar Administrador > modal de
   selección) donde el HTML trae <button class="close"> ANTES que
   <h4 class="modal-title"> -algo que en BS3 no importaba, porque el
   float sacaba al botón del flujo normal sin importar su posición en el
   DOM-. En flex sí importa: "margin-left:auto" empuja al propio botón
   (el primer hijo) hacia la derecha, y el título, que va DESPUÉS en el
   DOM, lo sigue pegado -todo el header terminaba amontonado del lado
   derecho, con el título invisible/vacío de contenido a la izquierda.
   Se fuerza el orden visual (título primero, cerrar al final) sin tocar
   el HTML de cada pantalla, para que dé igual en qué orden vengan los
   hijos en el marcado. */
.modal-header .modal-title { order: 1; }
.modal-header .close { order: 2; }

/* ==========================================================================
   9. PAGINATION y BREADCRUMB: BS5 exige .page-item/.page-link y
      .breadcrumb-item; si el HTML tiene el marcado plano de BS3
      (<ul class="pagination"><li><a>), BS5 no aplica ningún estilo.
   ========================================================================== */
.pagination {
  display: inline-block;
  padding-left: 0;
  margin: 20px 0;
  border-radius: 4px;
}
.pagination > li { display: inline; }
.pagination > li > a, .pagination > li > span {
  position: relative;
  float: left;
  padding: 6px 12px;
  margin-left: -1px;
  line-height: 1.42857143;
  color: #337ab7;
  text-decoration: none;
  background-color: #fff;
  border: 1px solid #ddd;
}
.pagination > li:first-child > a, .pagination > li:first-child > span {
  margin-left: 0;
  border-top-left-radius: 4px;
  border-bottom-left-radius: 4px;
}
.pagination > li:last-child > a, .pagination > li:last-child > span {
  border-top-right-radius: 4px;
  border-bottom-right-radius: 4px;
}
.pagination > li > a:hover, .pagination > li > span:hover,
.pagination > li > a:focus, .pagination > li > span:focus {
  color: #23527c;
  background-color: #eee;
  border-color: #ddd;
}
.pagination > .active > a, .pagination > .active > span,
.pagination > .active > a:hover, .pagination > .active > span:hover,
.pagination > .active > a:focus, .pagination > .active > span:focus {
  z-index: 3;
  color: #fff;
  cursor: default;
  background-color: #337ab7;
  border-color: #337ab7;
}
.pagination > .disabled > span, .pagination > .disabled > span:hover,
.pagination > .disabled > span:focus, .pagination > .disabled > a,
.pagination > .disabled > a:hover, .pagination > .disabled > a:focus {
  color: #777;
  cursor: not-allowed;
  background-color: #fff;
  border-color: #ddd;
}

.breadcrumb {
  padding: 8px 15px;
  margin-bottom: 20px;
  list-style: none;
  background-color: #f5f5f5;
  border-radius: 4px;
}
.breadcrumb > li { display: inline-block; }
.breadcrumb > li + li:before {
  padding: 0 5px;
  color: #ccc;
  content: "/\00a0";
}
.breadcrumb > .active { color: #777; }

/* ==========================================================================
   10. GLYPHICONS: no se recrean acá (son ~250 íconos vía font-face +
       content, con riesgo alto de tipear mal un código unicode).
       Lo correcto es seguir cargando el font + CSS original de
       Bootstrap 3 (glyphicons-halflings-regular.woff/.ttf +
       la sección .glyphicon del bootstrap.css viejo) como un archivo
       aparte. No colisiona con Bootstrap 5 porque BS5 no define nada
       con esos nombres de clase. Ver GUIA-INTEGRACION.md.
       Acá sólo dejamos el detalle fino de espaciado que sí vivía en
       bootstrap.css (no en glyphicons.css):
   ========================================================================== */
.glyphicon {
  position: relative;
  top: 1px;
  display: inline-block;
  font-style: normal;
  font-weight: 400;
  line-height: 1;
  -webkit-font-smoothing: antialiased;
}
.btn .glyphicon { top: 0; }
.nav .glyphicon, .navbar .glyphicon { top: 2px; }

/* ==========================================================================
   11. LINKS: Bootstrap 5 cambió el color por defecto (#0d6efd, azul nuevo
       de marca) y subraya los links siempre. Bootstrap 3 usaba el azul
       #337ab7, sin subrayado salvo al pasar el mouse. Se pisan tanto las
       variables CSS de BS5 (por si algún componente las referencia
       internamente) como la regla directa sobre "a".
   ========================================================================== */
:root {
  --bs-link-color: #337ab7;
  --bs-link-color-rgb: 51, 122, 183;
  --bs-link-hover-color: #23527c;
  --bs-link-hover-color-rgb: 35, 82, 124;
  --bs-link-decoration: none;
}
a {
  color: #337ab7;
  text-decoration: none;
}
a:hover, a:focus {
  color: #23527c;
  text-decoration: underline;
}

/* ==========================================================================
   12. TAMAÑO DE MODALES: BS5 achicó el ancho por defecto de .modal-dialog
       (500px vs 600px de BS3) y .modal-lg (800px vs 900px), y redujo el
       padding de header/footer. Se restablecen los valores de BS3.

       OJO "width" vs "max-width": la primera versión de este fix usaba
       "max-width" (pensando que alcanzaba con poner un techo al ancho),
       pero el ".modal-dialog" real de BS3 usa "width" a secas (un ancho
       FIJO, no un techo). En BS3 eso no generaba diferencia porque
       ".modal" era display:block: un ".modal-dialog" con "width:auto" ya
       ocupaba todo el ancho disponible por default, así que poner un
       "max-width" o un "width" de 600px daba lo mismo visualmente. Pero
       ".modal" en BS5 es flex (centra el dialog con
       align-items:center/justify-content:center), así que ".modal-dialog"
       pasa a ser un flex item: con flex-basis:auto (el default) un item
       flex se dimensiona por su CONTENIDO, no por el espacio disponible.
       "max-width:600px" ahí solo pone un techo -nunca un piso-, así que un
       modal con poco contenido (ej. una tabla chica) queda angosto,
       encogido a lo que ocupa el contenido (se vio en vivo con una tabla
       de 3 filas: el modal quedaba en ~265px en vez de 600px). "width"
       (no max-width) sí fija el tamaño real, sea cual sea el contenido,
       igual a como se comportaba en BS3. Se deja igual "max-width:100%"
       como red de seguridad para pantallas angostas (mismo rol que la
       media query de abajo hace para viewports chicos). Verificado en
       vivo en i1-qa-bonita, modal "Tabla de Datos" del botón "Expandir
       Tabla" en Análisis > Gráficos (2026-07-08).
   ========================================================================== */
.modal-header, .modal-body, .modal-footer { padding: 15px; }
.modal-footer { text-align: right; }
.modal-title { font-size: 18px; line-height: 1.42857143; margin: 0; }

@media (min-width: 768px) {
  .modal-dialog { width: 600px; max-width: 100%; margin: 30px auto; }
  .modal-sm { width: 300px; }
}
@media (min-width: 992px) {
  .modal-lg { width: 900px; }
}

/* ==========================================================================
   13. TIPOGRAFÝA BASE: BS5 usa una escala en rem calculada sobre una
       raíz de 16px; Bootstrap 3 calculaba todo en px sobre una base de
       14px (la misma que ya fuerza tu custom.css en <body>). El resultado
       es que títulos, botones, inputs y textos "código/cita" se ven más
       grandes/anchos de lo esperado. Se fijan los tamaños de BS3 en px
       para que no dependan de la raíz.
   ========================================================================== */
h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
  font-family: inherit;
  font-weight: 500;
  line-height: 1.1;
  color: inherit;
}
h1, .h1, h2, .h2, h3, .h3 { margin-top: 20px; margin-bottom: 10px; }
h4, .h4, h5, .h5, h6, .h6 { margin-top: 10px; margin-bottom: 10px; }
h1, .h1 { font-size: 36px; }
h2, .h2 { font-size: 30px; }
h3, .h3 { font-size: 24px; }
h4, .h4 { font-size: 18px; }
h5, .h5 { font-size: 14px; }
h6, .h6 { font-size: 12px; }
h1 small, h1 .small, h2 small, h2 .small, h3 small, h3 .small,
.h1 small, .h1 .small, .h2 small, .h2 .small, .h3 small, .h3 .small {
  font-size: 65%;
  font-weight: 400;
  line-height: 1;
  color: #777;
}
h4 small, h4 .small, h5 small, h5 .small, h6 small, h6 .small,
.h4 small, .h4 .small, .h5 small, .h5 .small, .h6 small, .h6 .small {
  font-size: 75%;
  font-weight: 400;
  line-height: 1;
  color: #777;
}

small, .small { font-size: 85%; }
mark, .mark { padding: .2em; background-color: #fcf8e3; }

/* <b>/<strong>: Bootstrap 3 fijaba "font-weight: bold" (700, absoluto).
   Bootstrap 5 usa "font-weight: bolder" (relativo: "un escalón más negro
   que el elemento padre"). Normalmente da lo mismo (bolder sobre texto
   normal de 400 también da 700), pero si el <b>/<strong> queda anidado
   adentro de un elemento que YA es bold por otro lado (ej: un título
   ".iweb-bonita-nombre-formulario" con font-weight:700 propio), "bolder"
   sube un escalón MÝS, a 900 -texto más "pesado"/intenso que antes-, en
   vez de quedarse en 700 como en BS3. Se vuelve al valor absoluto de BS3.
   Caso real: título de pantalla (ej. "Seguimiento y gestión de auditorías
   para pruebas de iWeb Bonita"), que va envuelto en <b> adentro de un
   <h5 class="iweb-bonita-nombre-formulario">. Verificado en vivo en
   i1-qa-bonita (2026-07-07). */
b, strong { font-weight: bold; }

.lead { margin-bottom: 20px; font-size: 16px; font-weight: 300; line-height: 1.4; }
@media (min-width: 768px) {
  .lead { font-size: 21px; }
}

hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eee; }

dl { margin-top: 0; margin-bottom: 20px; }
dt, dd { line-height: 1.42857143; }
dt { font-weight: 700; }
dd { margin-left: 0; }

blockquote {
  padding: 10px 20px;
  margin: 0 0 20px;
  font-size: 17.5px;
  border-left: 5px solid #eee;
}
blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; }
blockquote footer, blockquote small, blockquote .small {
  display: block;
  font-size: 80%;
  line-height: 1.42857143;
  color: #777;
}
blockquote footer:before, blockquote small:before, blockquote .small:before {
  content: "\2014 \00A0";
}
.blockquote-reverse, blockquote.pull-right {
  padding-right: 15px;
  padding-left: 0;
  text-align: right;
  border-right: 5px solid #eee;
  border-left: 0;
}

code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; }
code {
  padding: 2px 4px;
  font-size: 90%;
  color: #c7254e;
  background-color: #f9f2f4;
  border-radius: 4px;
}
kbd {
  padding: 2px 4px;
  font-size: 90%;
  color: #fff;
  background-color: #333;
  border-radius: 3px;
  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
}
pre {
  display: block;
  padding: 9.5px;
  margin: 0 0 10px;
  font-size: 13px;
  line-height: 1.42857143;
  color: #333;
  word-break: break-all;
  word-wrap: break-word;
  background-color: #f5f5f5;
  border: 1px solid #ccc;
  border-radius: 4px;
}
pre code { padding: 0; font-size: inherit; color: inherit; background-color: transparent; border-radius: 0; }

/* ==========================================================================
   14. TAMAÑO DE TEXTO EN COMPONENTES: en BS5 ".btn"/".form-control" fijan
       font-size:1rem (16px, relativo a la raíz del documento) en vez de
       heredar del body. Como tu body está en 14px, quedan más grandes que
       en BS3. Se fija el tamaño explícito para que no dependa de la raíz.
   ========================================================================== */
.btn {
  padding: 6px 12px;
  font-size: 14px;
  line-height: 1.42857143;
  border-radius: 4px;
  font-weight: 400;
}
.btn-lg { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; }
.btn-sm { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; }

.form-control, .form-select {
  height: 34px;
  padding: 6px 12px;
  font-size: 14px;
  line-height: 1.42857143;
  border-radius: 4px;
}
textarea.form-control { height: auto; }
.form-control-sm, .form-select-sm { height: 30px; padding: 5px 10px; font-size: 12px; border-radius: 3px; }
.form-control-lg, .form-select-lg { height: 46px; padding: 10px 16px; font-size: 18px; border-radius: 6px; }

.nav:not(.navbar-nav) > li > a,
.nav-tabs .nav-link,
.nav-pills .nav-link {
  padding: 10px 15px;
  font-size: 14px;
}

/* ==========================================================================
   15. GRID: offset / push / pull para sm, md y lg. Bootstrap 5 renombro
       el concepto (offset-sm-3 en vez de col-sm-offset-3) y elimino
       push/pull por completo. Valores extraidos 1:1 del bootstrap.css 3.4.1
       real (mismos breakpoints y porcentajes).
   ========================================================================== */
@media (min-width: 768px) {
  .col-sm-pull-12 { right: 100%; }
  .col-sm-pull-11 { right: 91.66666667%; }
  .col-sm-pull-10 { right: 83.33333333%; }
  .col-sm-pull-9 { right: 75%; }
  .col-sm-pull-8 { right: 66.66666667%; }
  .col-sm-pull-7 { right: 58.33333333%; }
  .col-sm-pull-6 { right: 50%; }
  .col-sm-pull-5 { right: 41.66666667%; }
  .col-sm-pull-4 { right: 33.33333333%; }
  .col-sm-pull-3 { right: 25%; }
  .col-sm-pull-2 { right: 16.66666667%; }
  .col-sm-pull-1 { right: 8.33333333%; }
  .col-sm-pull-0 { right: auto; }
  .col-sm-push-12 { left: 100%; }
  .col-sm-push-11 { left: 91.66666667%; }
  .col-sm-push-10 { left: 83.33333333%; }
  .col-sm-push-9 { left: 75%; }
  .col-sm-push-8 { left: 66.66666667%; }
  .col-sm-push-7 { left: 58.33333333%; }
  .col-sm-push-6 { left: 50%; }
  .col-sm-push-5 { left: 41.66666667%; }
  .col-sm-push-4 { left: 33.33333333%; }
  .col-sm-push-3 { left: 25%; }
  .col-sm-push-2 { left: 16.66666667%; }
  .col-sm-push-1 { left: 8.33333333%; }
  .col-sm-push-0 { left: auto; }
  .col-sm-offset-12 { margin-left: 100%; }
  .col-sm-offset-11 { margin-left: 91.66666667%; }
  .col-sm-offset-10 { margin-left: 83.33333333%; }
  .col-sm-offset-9 { margin-left: 75%; }
  .col-sm-offset-8 { margin-left: 66.66666667%; }
  .col-sm-offset-7 { margin-left: 58.33333333%; }
  .col-sm-offset-6 { margin-left: 50%; }
  .col-sm-offset-5 { margin-left: 41.66666667%; }
  .col-sm-offset-4 { margin-left: 33.33333333%; }
  .col-sm-offset-3 { margin-left: 25%; }
  .col-sm-offset-2 { margin-left: 16.66666667%; }
  .col-sm-offset-1 { margin-left: 8.33333333%; }
  .col-sm-offset-0 { margin-left: 0; }
}
@media (min-width: 992px) {
  .col-md-pull-12 { right: 100%; }
  .col-md-pull-11 { right: 91.66666667%; }
  .col-md-pull-10 { right: 83.33333333%; }
  .col-md-pull-9 { right: 75%; }
  .col-md-pull-8 { right: 66.66666667%; }
  .col-md-pull-7 { right: 58.33333333%; }
  .col-md-pull-6 { right: 50%; }
  .col-md-pull-5 { right: 41.66666667%; }
  .col-md-pull-4 { right: 33.33333333%; }
  .col-md-pull-3 { right: 25%; }
  .col-md-pull-2 { right: 16.66666667%; }
  .col-md-pull-1 { right: 8.33333333%; }
  .col-md-pull-0 { right: auto; }
  .col-md-push-12 { left: 100%; }
  .col-md-push-11 { left: 91.66666667%; }
  .col-md-push-10 { left: 83.33333333%; }
  .col-md-push-9 { left: 75%; }
  .col-md-push-8 { left: 66.66666667%; }
  .col-md-push-7 { left: 58.33333333%; }
  .col-md-push-6 { left: 50%; }
  .col-md-push-5 { left: 41.66666667%; }
  .col-md-push-4 { left: 33.33333333%; }
  .col-md-push-3 { left: 25%; }
  .col-md-push-2 { left: 16.66666667%; }
  .col-md-push-1 { left: 8.33333333%; }
  .col-md-push-0 { left: auto; }
  .col-md-offset-12 { margin-left: 100%; }
  .col-md-offset-11 { margin-left: 91.66666667%; }
  .col-md-offset-10 { margin-left: 83.33333333%; }
  .col-md-offset-9 { margin-left: 75%; }
  .col-md-offset-8 { margin-left: 66.66666667%; }
  .col-md-offset-7 { margin-left: 58.33333333%; }
  .col-md-offset-6 { margin-left: 50%; }
  .col-md-offset-5 { margin-left: 41.66666667%; }
  .col-md-offset-4 { margin-left: 33.33333333%; }
  .col-md-offset-3 { margin-left: 25%; }
  .col-md-offset-2 { margin-left: 16.66666667%; }
  .col-md-offset-1 { margin-left: 8.33333333%; }
  .col-md-offset-0 { margin-left: 0; }
}
@media (min-width: 1200px) {
  .col-lg-pull-12 { right: 100%; }
  .col-lg-pull-11 { right: 91.66666667%; }
  .col-lg-pull-10 { right: 83.33333333%; }
  .col-lg-pull-9 { right: 75%; }
  .col-lg-pull-8 { right: 66.66666667%; }
  .col-lg-pull-7 { right: 58.33333333%; }
  .col-lg-pull-6 { right: 50%; }
  .col-lg-pull-5 { right: 41.66666667%; }
  .col-lg-pull-4 { right: 33.33333333%; }
  .col-lg-pull-3 { right: 25%; }
  .col-lg-pull-2 { right: 16.66666667%; }
  .col-lg-pull-1 { right: 8.33333333%; }
  .col-lg-pull-0 { right: auto; }
  .col-lg-push-12 { left: 100%; }
  .col-lg-push-11 { left: 91.66666667%; }
  .col-lg-push-10 { left: 83.33333333%; }
  .col-lg-push-9 { left: 75%; }
  .col-lg-push-8 { left: 66.66666667%; }
  .col-lg-push-7 { left: 58.33333333%; }
  .col-lg-push-6 { left: 50%; }
  .col-lg-push-5 { left: 41.66666667%; }
  .col-lg-push-4 { left: 33.33333333%; }
  .col-lg-push-3 { left: 25%; }
  .col-lg-push-2 { left: 16.66666667%; }
  .col-lg-push-1 { left: 8.33333333%; }
  .col-lg-push-0 { left: auto; }
  .col-lg-offset-12 { margin-left: 100%; }
  .col-lg-offset-11 { margin-left: 91.66666667%; }
  .col-lg-offset-10 { margin-left: 83.33333333%; }
  .col-lg-offset-9 { margin-left: 75%; }
  .col-lg-offset-8 { margin-left: 66.66666667%; }
  .col-lg-offset-7 { margin-left: 58.33333333%; }
  .col-lg-offset-6 { margin-left: 50%; }
  .col-lg-offset-5 { margin-left: 41.66666667%; }
  .col-lg-offset-4 { margin-left: 33.33333333%; }
  .col-lg-offset-3 { margin-left: 25%; }
  .col-lg-offset-2 { margin-left: 16.66666667%; }
  .col-lg-offset-1 { margin-left: 8.33333333%; }
  .col-lg-offset-0 { margin-left: 0; }
}

/* ==========================================================================
   16. BOTONES extra: btn-block, btn-group-xs, btn-group-justified
   ========================================================================== */
.btn-block { display: block; width: 100%; }
.btn-block + .btn-block { margin-top: 5px; }
input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; }
.modal-footer .btn-block + .btn-block { margin-left: 0; }

.btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; }
.btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; }

.btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; }
.btn-group-justified > .btn { display: table-cell; float: none; width: 1%; }
.btn-group-justified > .btn-group { display: table-cell; float: none; width: 1%; }
.btn-group-justified > .btn-group .btn { width: 100%; }
.btn-group-justified > .btn-group .dropdown-menu { left: auto; }

/* ==========================================================================
   17. FORMULARIOS extra: tamaños de form-group, feedback de validacion,
       form-inline, boton dentro de input-group (todo eliminado en BS5)
   ========================================================================== */
.form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; }
.form-group-sm select.form-control { height: 30px; line-height: 30px; }
.form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; }
.form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; }
.form-group-lg .form-control { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; }
.form-group-lg select.form-control { height: 46px; line-height: 46px; }
.form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; }
.form-group-lg .form-control-static { height: 46px; min-height: 38px; padding: 11px 16px; font-size: 18px; line-height: 1.3333333; }

.has-feedback { position: relative; }
.has-feedback .form-control { padding-right: 42.5px; }
.form-control-feedback {
  position: absolute; top: 0; right: 0; z-index: 2; display: block;
  width: 34px; height: 34px; line-height: 34px; text-align: center; pointer-events: none;
}
.input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback,
.form-group-lg .form-control + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; }
.input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback,
.form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; }
.has-success .form-control-feedback { color: #3c763d; }
.has-warning .form-control-feedback { color: #8a6d3b; }
.has-error .form-control-feedback { color: #a94442; }
.has-feedback label ~ .form-control-feedback { top: 25px; }
.has-feedback label.sr-only ~ .form-control-feedback { top: 0; }
.form-horizontal .has-feedback .form-control-feedback { right: 15px; }

@media (min-width: 768px) {
  .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; }
  .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; }
  .form-inline .form-control-static { display: inline-block; }
  /* BS3 usaba inline-table, pero el .input-group de BS5 es flex y además trae
     width:100% y flex-wrap:wrap (que BS3 no tenía). Sin neutralizar esos dos,
     el input-group ocupa toda la línea y los .form-group se apilan.
     Se usa inline-flex (no inline-table) para convivir con los
     .input-group-addon/.input-group-btn flex definidos más abajo. */
  .form-inline .input-group { display: inline-flex; width: auto; flex-wrap: nowrap; vertical-align: middle; }
  .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn,
  .form-inline .input-group .form-control { width: auto; }
  /* BS5 le pone width:1% + flex:1 1 auto al form-control dentro de input-group;
     con el contenedor en width:auto eso lo colapsa. width:auto = ancho intrínseco,
     mismo resultado visual que BS3. */
  .form-inline .input-group > .form-control { width: auto; }

  /* Excepción: cuando el .input-group vive dentro de una columna del grid
     (.col-*) que a su vez está dentro de un .form-inline, NO es un formulario
     inline real con varios controles en una fila (el caso que las reglas de
     arriba resuelven): es un .form-inline usado solo como utilidad de layout
     dentro de una celda de tabla/columna (ej: buscador de "Listado de
     Usuarios" en Administración de Usuarios). Ahí el .input-group tiene que
     LLENAR el ancho de la columna, igual que en BS3 (donde display:table +
     .form-control{width:100%} terminaba ocupando todo el ancho disponible
     del contenedor). Con width:auto (regla de arriba) el input-group se
     dimensiona por contenido y se desborda fuera de la columna, tapando lo
     que venga después en el layout (ej: el botón "Editar" quedaba tapado
     detrás del buscador). Selector con mayor especificidad que
     ".form-inline .input-group" para ganarle. Verificado en vivo en
     i1-qa-bonita, Administración de Usuarios (2026-07-06). */
  .form-inline [class*="col-"] .input-group { display: flex; width: 100%; flex-wrap: nowrap; }
  .form-inline [class*="col-"] .input-group .input-group-addon,
  .form-inline [class*="col-"] .input-group .input-group-btn { width: auto; flex: 0 0 auto; }
  .form-inline [class*="col-"] .input-group > .form-control { width: 1%; flex: 1 1 auto; min-width: 0; }

  .form-inline .control-label { margin-bottom: 0; vertical-align: middle; }
  .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; }
  .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; }
  .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; }
  .form-inline .has-feedback .form-control-feedback { top: 0; }
  .form-horizontal .form-group-lg .control-label { padding-top: 11px; font-size: 18px; }
  .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; }
}

/* input-group-btn: en BS3 era una celda de tabla; el .input-group de BS5 es
   flex, así que se adapta a flex en vez de table-cell para que conviva bien */
.input-group-btn {
  position: relative;
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  font-size: 0;
  white-space: nowrap;
}
.input-group-btn > .btn { position: relative; }
.input-group-btn > .btn + .btn { margin-left: -1px; }
.input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; }
.input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; }
.input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; }
.input-group-lg > .input-group-btn > .btn { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; }
.input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; }

/* ==========================================================================
   18. IMAGENES: nombres viejos de utilidades de imagen
   ========================================================================== */
.img-responsive { display: block; max-width: 100%; height: auto; }
.img-rounded { border-radius: 6px; }
.img-circle { border-radius: 50%; }

/* ==========================================================================
   19. UTILIDADES varias eliminadas: hidden, hidden-print/visible-print,
       sr-only/sr-only-focusable (renombrado a visually-hidden en BS5),
       text-hide, row-no-gutters
   ========================================================================== */
.hidden { display: none !important; }
.hide { display: none; }

.sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  border: 0;
}
.sr-only-focusable:active, .sr-only-focusable:focus {
  position: static;
  width: auto; height: auto;
  margin: 0;
  overflow: visible;
  clip: auto;
}
.has-feedback label.sr-only ~ .form-control-feedback { top: 0; }

.text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; }

.visible-print, .visible-print-block, .visible-print-inline, .visible-print-inline-block { display: none !important; }
@media print {
  .visible-print { display: block !important; }
  table.visible-print { display: table !important; }
  tr.visible-print { display: table-row !important; }
  th.visible-print, td.visible-print { display: table-cell !important; }
  .visible-print-block { display: block !important; }
  .visible-print-inline { display: inline !important; }
  .visible-print-inline-block { display: inline-block !important; }
  .hidden-print { display: none !important; }
}

.row-no-gutters { margin-right: 0; margin-left: 0; }
.row-no-gutters [class*="col-"] { padding-right: 0; padding-left: 0; }

/* ==========================================================================
   20. NAVBAR: todo el navbar (default, inverse, left/right, link) vive en
       la sección 7, copiado completo del bootstrap 3.4.6 del proyecto.
   ========================================================================== */

/* ==========================================================================
   21. PROGRESS BARS: variantes de color y rayado, renombradas en BS5
       (progress-bar-danger -> text-bg-danger, etc.)
   ========================================================================== */
.progress-bar-success { background-color: #5cb85c; }
.progress-bar-info { background-color: #5bc0de; }
.progress-bar-warning { background-color: #f0ad4e; }
.progress-bar-danger { background-color: #d9534f; }

.progress-bar-striped,
.progress-striped .progress-bar {
  background-image: linear-gradient(45deg, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
  background-size: 40px 40px;
}
@keyframes progress-bar-stripes-bs3 {
  from { background-position: 40px 0; }
  to { background-position: 0 0; }
}
.progress.active .progress-bar,
.progress-bar.active {
  animation: progress-bar-stripes-bs3 2s linear infinite;
}

/* ==========================================================================
   22. LIST-GROUP contextual (success/info/warning/danger) y encabezado/texto
   ========================================================================== */
.list-group-item-heading { margin-top: 0; margin-bottom: 5px; }
.list-group-item-text { margin-bottom: 0; line-height: 1.3; }

.list-group-item-success { color: #3c763d; background-color: #dff0d8; }
a.list-group-item-success, button.list-group-item-success { color: #3c763d; }
a.list-group-item-success:hover, a.list-group-item-success:focus,
button.list-group-item-success:hover, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; }
a.list-group-item-success.active, button.list-group-item-success.active {
  color: #fff; background-color: #3c763d; border-color: #3c763d;
}

.list-group-item-info { color: #31708f; background-color: #d9edf7; }
a.list-group-item-info, button.list-group-item-info { color: #31708f; }
a.list-group-item-info:hover, a.list-group-item-info:focus,
button.list-group-item-info:hover, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; }
a.list-group-item-info.active, button.list-group-item-info.active {
  color: #fff; background-color: #31708f; border-color: #31708f;
}

.list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; }
a.list-group-item-warning, button.list-group-item-warning { color: #8a6d3b; }
a.list-group-item-warning:hover, a.list-group-item-warning:focus,
button.list-group-item-warning:hover, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; }
a.list-group-item-warning.active, button.list-group-item-warning.active {
  color: #fff; background-color: #8a6d3b; border-color: #8a6d3b;
}

.list-group-item-danger { color: #a94442; background-color: #f2dede; }
a.list-group-item-danger, button.list-group-item-danger { color: #a94442; }
a.list-group-item-danger:hover, a.list-group-item-danger:focus,
button.list-group-item-danger:hover, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; }
a.list-group-item-danger.active, button.list-group-item-danger.active {
  color: #fff; background-color: #a94442; border-color: #a94442;
}

/* ==========================================================================
   23. COMPONENTES eliminados por completo en BS5: jumbotron, page-header,
       pager, dl-horizontal, media object, pre-scrollable, table-condensed
   ========================================================================== */
.jumbotron {
  padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px;
  color: inherit; background-color: #eee;
}
.jumbotron h1, .jumbotron .h1 { color: inherit; }
.jumbotron p { margin-bottom: 15px; font-size: 21px; font-weight: 200; }
.jumbotron > hr { border-top-color: #d5d5d5; }
.container .jumbotron, .container-fluid .jumbotron { padding-right: 15px; padding-left: 15px; border-radius: 6px; }
.jumbotron .container { max-width: 100%; }
@media screen and (min-width: 768px) {
  .jumbotron { padding-top: 48px; padding-bottom: 48px; }
  .container .jumbotron, .container-fluid .jumbotron { padding-right: 60px; padding-left: 60px; }
  .jumbotron h1, .jumbotron .h1 { font-size: 63px; }
}

.page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eee; }

.pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; }
.pager li { display: inline; }
.pager li > a, .pager li > span {
  display: inline-block; padding: 5px 14px;
  background-color: #fff; border: 1px solid #ddd; border-radius: 15px;
}
.pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eee; }
.pager .next > a, .pager .next > span { float: right; }
.pager .previous > a, .pager .previous > span { float: left; }
.pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span {
  color: #777; cursor: not-allowed; background-color: #fff;
}

@media (min-width: 768px) {
  .dl-horizontal dt {
    float: left; width: 160px; clear: left; text-align: right;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  .dl-horizontal dd { margin-left: 180px; }
}
.dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; }
.dl-horizontal dd:after { clear: both; }

.media { margin-top: 15px; overflow: hidden; }
.media:first-child { margin-top: 0; }
.media-body { overflow: hidden; width: 10000px; display: table-cell; vertical-align: top; }
.media-object { display: block; }
.media-object.img-thumbnail { max-width: none; }
.media-right, .media > .pull-right { padding-left: 10px; }
.media-left, .media > .pull-left { padding-right: 10px; }
.media-left, .media-right { display: table-cell; vertical-align: top; }
.media-middle { vertical-align: middle; }
.media-bottom { vertical-align: bottom; }
.media-heading { margin-top: 0; margin-bottom: 5px; }
.media-list { padding-left: 0; list-style: none; }

.pre-scrollable { max-height: 340px; overflow-y: scroll; }

.table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th,
.table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td {
  padding: 5px;
}

/* ==========================================================================
   24. NAV / DROPDOWN extra: apilado, justificado, separador, posicion del
       menu (BS5 renombro left/right a start/end)
   ========================================================================== */
.nav-stacked > li { float: none; }
.nav-stacked > li + li { margin-top: 2px; margin-left: 0; }

.nav-tabs-justified { border-bottom: 0; }
.nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; }
.nav-tabs-justified > .active > a,
.nav-tabs-justified > .active > a:hover,
.nav-tabs-justified > .active > a:focus { border: 1px solid #ddd; }
@media (min-width: 768px) {
  .nav-tabs-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; }
  .nav-tabs-justified > .active > a,
  .nav-tabs-justified > .active > a:hover,
  .nav-tabs-justified > .active > a:focus { border-bottom-color: #fff; }
}

.nav .nav-divider, .dropdown-menu .divider {
  height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5;
}

/* BS5 ya trae .dropdown-menu-start/.dropdown-menu-end; se agregan los
   nombres viejos como alias para no tener que tocar el markup */
.dropdown-menu-left { --bs-position: start; left: 0; right: auto; }
.dropdown-menu-right { --bs-position: end; right: 0; left: auto; }

/* ==========================================================================
   25. TOOLTIPS y POPOVERS: el contenido lo genera en tiempo real el JS de
       Bootstrap 5 (via el puente jQuery de bs3-bs5-bridge.js), así que la
       estructura final ya es la de BS5 (.tooltip-inner, .popover-header,
       .popover-body). Lo único que hace falta es pisar las variables de
       color/tamaño para que coincidan con los valores de BS3.
   ========================================================================== */
.tooltip {
  --bs-tooltip-padding-x: 8px;
  --bs-tooltip-padding-y: 3px;
  --bs-tooltip-font-size: 12px;
  --bs-tooltip-color: #fff;
  --bs-tooltip-bg: #000;
  --bs-tooltip-border-radius: 4px;
  --bs-tooltip-opacity: 0.9;
}
.popover {
  --bs-popover-font-size: 14px;
  --bs-popover-bg: #fff;
  --bs-popover-border-color: rgba(0,0,0,.2);
  --bs-popover-border-radius: 6px;
  --bs-popover-header-padding-x: 14px;
  --bs-popover-header-padding-y: 8px;
  --bs-popover-header-font-size: 14px;
  --bs-popover-header-bg: #f7f7f7;
  --bs-popover-body-padding-x: 14px;
  --bs-popover-body-padding-y: 9px;
}

/* ==========================================================================
   26. CAROUSEL: BS5 renombro ".item" a ".carousel-item" (el JS de BS5 busca
       ese nombre de clase puntual para reconocer cada slide). El resto de
       las clases visuales (carousel-control, icon-prev/icon-next,
       carousel-indicators, carousel-caption) se recrean tal cual BS3;
       el shim JS agrega ".carousel-item" en paralelo a ".item" para que
       el plugin de BS5 pueda encontrar los slides. Ver bs3-bs5-bridge.js.
   ========================================================================== */
.carousel { position: relative; }
.carousel-inner { position: relative; width: 100%; overflow: hidden; }
.carousel-inner > .item {
  position: relative;
  display: none;
  transition: .6s ease-in-out left;
}
.carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; line-height: 1; }
.carousel-inner > .active { display: block; left: 0; }
.carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; display: block; }
.carousel-inner > .next { left: 100%; }
.carousel-inner > .prev { left: -100%; }
.carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; }
.carousel-inner > .active.left { left: -100%; }
.carousel-inner > .active.right { left: 100%; }

.carousel-control {
  position: absolute; top: 0; bottom: 0; left: 0; width: 15%;
  font-size: 20px; color: #fff; text-align: center;
  text-shadow: 0 1px 2px rgba(0,0,0,.6);
  background-color: rgba(0,0,0,0);
  opacity: .5;
}
.carousel-control.right { right: 0; left: auto; }
.carousel-control:hover, .carousel-control:focus { color: #fff; text-decoration: none; outline: 0; opacity: .9; }
.carousel-control .icon-prev, .carousel-control .icon-next {
  position: absolute; top: 50%; z-index: 5; display: inline-block;
  width: 20px; height: 20px; margin-top: -10px;
  font-family: serif; line-height: 1;
}
.carousel-control .icon-prev { left: 50%; margin-left: -10px; }
.carousel-control .icon-next { right: 50%; margin-right: -10px; }
.carousel-control .icon-prev:before { content: "\2039"; }
.carousel-control .icon-next:before { content: "\203a"; }

.carousel-indicators {
  position: absolute; bottom: 10px; left: 50%; z-index: 15;
  width: 60%; padding-left: 0; margin-left: -30%;
  text-align: center; list-style: none;
}
.carousel-indicators li {
  display: inline-block; width: 10px; height: 10px; margin: 1px;
  text-indent: -999px; cursor: pointer;
  background-color: rgba(0,0,0,0);
  border: 1px solid #fff; border-radius: 10px;
}
.carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #fff; }

.carousel-caption {
  position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10;
  padding-top: 20px; padding-bottom: 20px;
  color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0,0,0,.6);
}
.carousel-caption .btn { text-shadow: none; }

@media screen and (min-width: 768px) {
  .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -10px; font-size: 30px; }
  .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; }
  .carousel-indicators { bottom: 20px; }
}

/* ==========================================================================
   27. EMBED RESPONSIVE: reemplazado en BS5 por la utilidad ".ratio"
   ========================================================================== */
.embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; }
.embed-responsive .embed-responsive-item,
.embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video {
  position: absolute; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; border: 0;
}
.embed-responsive-16by9 { padding-bottom: 56.25%; }
.embed-responsive-4by3 { padding-bottom: 75%; }

/* ==========================================================================
   28. LAYOUT DE SIDEBAR + CONTENIDO (.container-portada): esto NO es de
       Bootstrap — es el layout flex propio del rediseño de sidebar
       (custom.css: ".container-portada { display:flex }", sidebar de
       ancho fijo vía --sidebar-width, y un <div> de contenido sin clase
       propia como último hijo). Ese <div> de contenido no tiene
       flex-grow, así que con flex-basis:auto un flex item se dimensiona
       por "shrink-to-fit" de su contenido: en pantallas con pocos
       elementos (ej. el panel "Administración" con 5 accesos, contra
       "Procesos" con 12) el contenido no necesita todo el ancho
       disponible y el <div> se angosta en vez de ocupar el espacio
       libre junto al sidebar — de ahí el ancho "limitado" en pantallas
       con menos contenido. Se fuerza a que ese panel siempre ocupe el
       espacio remanente, sin importar cuánto contenido tenga.
   ========================================================================== */
.container-portada > div:last-child {
  flex: 1 1 auto;
  min-width: 0;
}

/* ==========================================================================
   29. PAGINACIÓN ".paginado-bonita" (custom.css): usa font-size/padding en
       REM (1.5rem, 0.5rem, 1.25rem) asumiendo el truco típico de BS3 de
       fijar la raíz en 10px (para que 1rem = 10px y sea fácil de calcular
       a ojo). Bootstrap 5 deja la raíz en 16px (default del navegador) y
       el bridge, a propósito, no la toca — sección 14 ya fija en PX cada
       componente de BOOTSTRAP que dependía de la raíz para no romper el
       resto de las medidas en rem que sí usa Bootstrap 5 internamente.
       Pero ".paginado-bonita" es una clase de CUSTOM.CSS (no es de
       Bootstrap) que quedó afuera de ese trabajo, así que con raíz de
       16px todo salió 60% más grande (16/10) que en BS3. Se fija en PX
       el tamaño que tenía en BS3 (10px de raíz × 1.5rem/0.5rem/1.25rem).

       OJO orden de carga: "custom.css" define ".paginado-bonita" con esos
       mismos rem y carga DESPUÉS de este bridge (a propósito, para que tus
       cambios en custom.css ganen sobre el bridge). Como ambas reglas
       tienen la MISMA especificidad (una sola clase), si acá se escribe
       ".paginado-bonita" a secas, custom.css la pisa igual por venir
       después en el cascade. Por eso se sube la especificidad calzando
       el selector con el contenedor real (nav.pager > a > .paginado-bonita)
       en vez de usar !important.
   ========================================================================== */
.pager .paginado-bonita {
  font-size: 15px;
  padding: 5px 12.5px;
}

/* ==========================================================================
   30. DIVISIÓN LATERAL EN HOVER DE TD: Bootstrap 3 traía en su reset base
       "table { border-collapse: collapse; border-spacing: 0; }" (bootstrap.css
       líneas 180-181). Bootstrap 5 solo fija "border-collapse: collapse" en
       su reboot (no hace falta fijar el spacing si siempre está en modo
       collapse). El problema es que ".table-iweb-bonita-listado" (custom.css)
       vuelve a poner "border-collapse: separate" a propósito, para que
       funcione el position:sticky de la primera columna/header — y como
       nadie fijó "border-spacing: 0" en ningún lado, esa tabla hereda el
       valor por defecto del navegador para modo separate (2px). En estado
       normal no se nota (el espacio queda blanco, igual que el fondo), pero
       al hacer hover el <td> se pinta de gris y ese espacio de 2px entre
       columnas queda blanco en el medio, viéndose como una línea/división
       lateral. Se restaura el spacing:0 de BS3 de forma global.
   ========================================================================== */
table {
  border-spacing: 0;
}

/* ==========================================================================
   31. LÝNEAS EN LOS TD DE LA TABLA DE ADJUNTOS (".iweb-bonita-table-header"):
       custom.css ya intenta sacarle el borde a esta tabla con
       ".iweb-bonita-table-header { border: none !important; }" — pero eso
       solo apaga el borde del <table> en sí. Bootstrap 5 no dibuja las
       líneas de una tabla en el <table>: las dibuja en CADA <td>/<th>
       (".table > :not(caption) > * > * { border-bottom-width: ... }"), y
       esas celdas toman el color con "border-color: inherit" (reboot de
       BS5). Como el <table> quedó con "border-color: currentcolor" (por el
       !important de arriba) en vez de heredar un gris, cada celda hereda
       ese currentcolor, que termina resolviendo en el color de texto
       (negro) en vez de transparente/gris clarito — de ahí la línea negra
       que no estaba en BS3 (ahí el borde si se quitaba en la celda
       directamente, no en el <table>). Se apaga en la celda, que es donde
       Bootstrap 5 realmente lo dibuja.
   ========================================================================== */
.iweb-bonita-table-header > tbody > tr > td {
  border-bottom-width: 0 !important;
}

/* ==========================================================================
   32. LISTA DE OPCIONES DE SELECT2 INVISIBLE DENTRO DE UN MODAL: la
       librería Select2 (select2.css, ajena a Bootstrap) trae
       ".select2-dropdown { z-index: 1051; }" fijo, tuneado para quedar
       apenas arriba del z-index de un modal de BOOTSTRAP 3 (1050). El
       dropdown de Select2 se agrega directo al <body> (no adentro del
       modal), así que compite con el modal por z-index en el mismo nivel.
       Bootstrap 5 subió el z-index del modal a 1055 — más alto que el
       1051 de Select2 — así que ahora el contenido del modal (opaco)
       tapa visualmente las opciones del dropdown, aunque sigan estando
       ahí en el DOM con el tamaño correcto (por eso "no se ven las
       opciones" pero sí se puede tipear y filtrar). Se sube el z-index
       de Select2 por encima del modal de BS5.
   ========================================================================== */
.select2-dropdown {
  z-index: 1075 !important;
}

/* ==========================================================================
   33. ".btn-xs" NO GANABA: en el bootstrap.css real de BS3, ".btn-xs" está
       declarado DESPUÉS de ".btn" (línea 3505 vs 3085 del archivo del
       proyecto), así que sus valores (más chicos) ganan por orden de
       cascada ante una especificidad igual (una sola clase cada uno). En
       este bridge, ".btn-xs" quedó en la sección 5 (arriba) y ".btn" en
       la sección 14 (abajo) — orden invertido respecto al original — así
       que ".btn" terminaba pisando el padding/font-size/border-radius de
       ".btn-xs" en cualquier botón con ambas clases (ej. el botón de
       ordenar ↕ de "Historial de Notas Anexas" en el modal de Notas,
       que usa "btn btn-default btn-xs" y se veía grande porque tomaba el
       tamaño de ".btn" en vez del de ".btn-xs"). Se repite acá, al final
       del archivo, para que gane por orden sin tocar la sección 5.
   ========================================================================== */
.btn-xs {
  padding: 1px 5px;
  font-size: 12px;
  line-height: 1.5;
  border-radius: 3px;
}

/* ==========================================================================
   34. LÝNEAS NEGRAS Y HOVER "OSCURO" EN LA GRILLA DE MULTI-REGISTRO
       (".iweb-bonita-multi", ej. la grilla dinámica de "Acciones..." con
       alta de registros hijos tipo "Campo Fecha", "Texto enriquecido", etc.):
       mismo bug de fondo que la sección 31, pero en otra tabla. custom.css
       intenta sacar el borde con ".iweb-bonita-multi { border: none !important; }",
       que solo apaga el borde del <table>. Bootstrap 5 dibuja la línea en
       cada <td> (".table > :not(caption) > * > * { border-bottom-width: ... }")
       y esa celda hereda "border-color: inherit" → termina resolviendo en
       negro (currentcolor / color de texto) en vez del gris clarito que
       usaba BS3 (ahí era "border-top: 1px solid #ddd" en la celda). Como
       en esta tabla TODAS las celdas de un registro nuevo caen dentro de
       una única fila <tr> (se fuerza "display:block" en cada <td> para
       apilarlas verticalmente en mobile/alta de registro), el ".table-hover
       > tbody > tr:hover > td" de custom.css se dispara sobre TODAS las
       celdas del formulario a la vez al pasar el mouse por cualquier
       parte — con las líneas negras de por medio, cada campo quedaba
       enmarcado en un recuadro negro grueso encima del gris de hover,
       dando la sensación de que el hover "se ve oscuro". Sacando el borde
       de la celda (como en la sección 31) el hover vuelve a verse como el
       gris sutil (#F5F5F5) que ya define custom.css, sin las líneas
       negras que lo afeaban.
   ========================================================================== */
.iweb-bonita-multi > tbody > tr > td {
  border-bottom-width: 0 !important;
}

/* ==========================================================================
   35. HOVER GRIS EN TODO EL FORMULARIO DE "NUEVO" (alta de registro hijo
       en la grilla multi-registro): la fila <tr class="iweb-bonita-frm-alta-hijo">
       que contiene el formulario para dar de alta un registro nuevo es, en
       términos de tabla, UNA SOLA fila (un registro = una fila, aunque
       visualmente sus <td> se apilen en vertical por el "display:block" de
       la sección 2/mobile). Al ser ".table-hover", la regla genérica de
       custom.css (".table-hover > tbody > tr:hover > td") se dispara sobre
       TODAS las celdas de esa fila apenas se pasa el mouse por CUALQUIER
       campo del formulario, poniendo gris el fondo completo — algo que no
       pasaba en BS3 porque además ahí no golpeaba con las celdas.
       Para las filas de registros YA GUARDADOS, custom.css ya define un
       hover propio y controlado (".iweb-bonita-registro-multi:hover"), así
       que el hover genérico de tabla nunca debería aplicar sobre la fila
       de ALTA (es un formulario que se está completando, no una fila de
       listado para navegar). Se neutraliza puntualmente para esa fila,
       sin tocar el hover normal de las filas de registros existentes.
   ========================================================================== */
.iweb-bonita-frm-alta-hijo:hover > td,
.iweb-bonita-frm-alta-hijo:hover > td > a.btn-default-iweb-bonita-link {
  background-color: transparent !important;
  box-shadow: none !important;
}

/* ==========================================================================
   37. COLORES DE MARCA (theme colors): Bootstrap 5 cambió toda la paleta
       "primary/secondary/success/info/warning/danger" respecto a Bootstrap 3
       (ej: primary pasó de #337ab7 a #0d6efd, success de #5cb85c a #198754,
       etc.). El proyecto sigue usando esos nombres semánticos (sobre todo en
       botones) esperando los colores VIEJOS de BS3. Se pisan tanto las
       variables CSS de tema de BS5 (":root, [data-bs-theme=light]", que
       alimentan utilidades como .text-primary/.bg-primary/.border-primary)
       como las variables propias de cada componente: inspeccionando el
       bootstrap.min.css real del proyecto se confirmó que BS 5.3 NO hace
       que ".btn-primary" lea "var(--bs-primary)" -cada componente ya trae
       sus colores resueltos a hex adentro de su propio selector-, así que
       pisar solo la variable de :root no alcanza para los botones. Mismo
       mecanismo que ya usa la sección 11 (LINKS) para "a", extendido acá al
       resto de la paleta.

       Bootstrap 3 no tenía "secondary" (lo agregó recién Bootstrap 4): el
       botón "neutro" de BS3 es ".btn-default" (blanco, texto oscuro, borde
       gris). Se mapeó "secondary" a esos mismos valores para no dejar un
       gris sólido de BS5 sin relación con la paleta vieja del proyecto.

       Los valores de :hover/:focus/:active de los botones NO hace falta
       reescribirlos aparte: ".btn:hover/:focus/:active" en BS5 ya están
       armados para leer las variables locales del componente
       (--bs-btn-hover-bg, --bs-btn-active-bg, etc.), así que alcanza con
       pisarlas una sola vez en el selector base de cada color.

       Valores sacados 1:1 del bootstrap.css 3.4.6 real del proyecto
       (carpeta v3_example), mismo método que el resto del bridge.
       Verificado en vivo en i1-qa-bonita (2026-07-06).
   ========================================================================== */
:root, [data-bs-theme="light"] {
  --bs-primary: #337ab7;
  --bs-primary-rgb: 51, 122, 183;
  --bs-secondary: #777777;
  --bs-secondary-rgb: 119, 119, 119;
  --bs-success: #5cb85c;
  --bs-success-rgb: 92, 184, 92;
  --bs-info: #5bc0de;
  --bs-info-rgb: 91, 192, 222;
  --bs-warning: #f0ad4e;
  --bs-warning-rgb: 240, 173, 78;
  --bs-danger: #d9534f;
  --bs-danger-rgb: 217, 83, 79;
}

.btn-primary {
  --bs-btn-color: #fff;
  --bs-btn-bg: #337ab7;
  --bs-btn-border-color: #2e6da4;
  --bs-btn-hover-color: #fff;
  --bs-btn-hover-bg: #286090;
  --bs-btn-hover-border-color: #204d74;
  --bs-btn-focus-shadow-rgb: 51, 122, 183;
  --bs-btn-active-color: #fff;
  --bs-btn-active-bg: #204d74;
  --bs-btn-active-border-color: #122b40;
  --bs-btn-disabled-color: #fff;
  --bs-btn-disabled-bg: #337ab7;
  --bs-btn-disabled-border-color: #2e6da4;
}
.btn-secondary {
  --bs-btn-color: #333;
  --bs-btn-bg: #fff;
  --bs-btn-border-color: #ccc;
  --bs-btn-hover-color: #333;
  --bs-btn-hover-bg: #e6e6e6;
  --bs-btn-hover-border-color: #adadad;
  --bs-btn-focus-shadow-rgb: 119, 119, 119;
  --bs-btn-active-color: #333;
  --bs-btn-active-bg: #d4d4d4;
  --bs-btn-active-border-color: #8c8c8c;
  --bs-btn-disabled-color: #333;
  --bs-btn-disabled-bg: #fff;
  --bs-btn-disabled-border-color: #ccc;
}
.btn-success {
  --bs-btn-color: #fff;
  --bs-btn-bg: #5cb85c;
  --bs-btn-border-color: #4cae4c;
  --bs-btn-hover-color: #fff;
  --bs-btn-hover-bg: #449d44;
  --bs-btn-hover-border-color: #398439;
  --bs-btn-focus-shadow-rgb: 92, 184, 92;
  --bs-btn-active-color: #fff;
  --bs-btn-active-bg: #398439;
  --bs-btn-active-border-color: #255625;
  --bs-btn-disabled-color: #fff;
  --bs-btn-disabled-bg: #5cb85c;
  --bs-btn-disabled-border-color: #4cae4c;
}
.btn-info {
  --bs-btn-color: #fff;
  --bs-btn-bg: #5bc0de;
  --bs-btn-border-color: #46b8da;
  --bs-btn-hover-color: #fff;
  --bs-btn-hover-bg: #31b0d5;
  --bs-btn-hover-border-color: #269abc;
  --bs-btn-focus-shadow-rgb: 91, 192, 222;
  --bs-btn-active-color: #fff;
  --bs-btn-active-bg: #269abc;
  --bs-btn-active-border-color: #1b6d85;
  --bs-btn-disabled-color: #fff;
  --bs-btn-disabled-bg: #5bc0de;
  --bs-btn-disabled-border-color: #46b8da;
}
.btn-warning {
  --bs-btn-color: #fff;
  --bs-btn-bg: #f0ad4e;
  --bs-btn-border-color: #eea236;
  --bs-btn-hover-color: #fff;
  --bs-btn-hover-bg: #ec971f;
  --bs-btn-hover-border-color: #d58512;
  --bs-btn-focus-shadow-rgb: 240, 173, 78;
  --bs-btn-active-color: #fff;
  --bs-btn-active-bg: #d58512;
  --bs-btn-active-border-color: #985f0d;
  --bs-btn-disabled-color: #fff;
  --bs-btn-disabled-bg: #f0ad4e;
  --bs-btn-disabled-border-color: #eea236;
}
.btn-danger {
  --bs-btn-color: #fff;
  --bs-btn-bg: #d9534f;
  --bs-btn-border-color: #d43f3a;
  --bs-btn-hover-color: #fff;
  --bs-btn-hover-bg: #c9302c;
  --bs-btn-hover-border-color: #ac2925;
  --bs-btn-focus-shadow-rgb: 217, 83, 79;
  --bs-btn-active-color: #fff;
  --bs-btn-active-bg: #ac2925;
  --bs-btn-active-border-color: #761c19;
  --bs-btn-disabled-color: #fff;
  --bs-btn-disabled-bg: #d9534f;
  --bs-btn-disabled-border-color: #d43f3a;
}

/* Resto de componentes que también hardcodean el color adentro de su
   propio selector (mismo motivo que los botones): pills activos, barra de
   progreso "sin variante" (BS3 la pintaba con brand-primary por defecto) y
   el badge dentro de un botón de color (BS3: fondo blanco + texto del
   color del botón, no el contraste fijo que trae BS5 de fábrica). */
.nav-pills {
  --bs-nav-pills-link-active-bg: #337ab7;
}
.progress-bar {
  background-color: #337ab7;
}
.btn-primary .badge { color: #337ab7; background-color: #fff; }
.btn-success .badge { color: #5cb85c; background-color: #fff; }
.btn-info .badge { color: #5bc0de; background-color: #fff; }
.btn-warning .badge { color: #f0ad4e; background-color: #fff; }
.btn-danger .badge { color: #d9534f; background-color: #fff; }

/* ==========================================================================
   38. LÝNEAS EN LOS <TD> DE LA TABLA ".iweb-bonita-tablero-filtros" (resumen
       "Partes / Registros / Filtrar Por" arriba de todo modal de Filtros):
       mismo motivo de fondo que la sección 31 (tabla de Adjuntos), pero
       encontrado en esta otra tabla.

       OJO nombre de clase: dentro de un modal de Filtros hay DOS tablas
       distintas con nombres parecidos -se confirmó con getBoundingClientRect
       en vivo, no alcanza con mirar el HTML por arriba-:
         - ".iweb-bonita-table-filtros"  -> la tabla GRANDE que arma el
           formulario entero de filtros (una fila de tabla por cada campo).
         - ".iweb-bonita-tablero-filtros" -> la tabla CHICA de 4 filas
           ("Resumen de registros por parte") que es la que el usuario pidió
           arreglar. Un primer intento apuntó por error a
           ".iweb-bonita-table-filtros" (por el nombre parecido) y no
           tocaba esta tabla chica para nada -se la había medido con
           getComputedStyle recién al pedir doble check, border-bottom
           seguía en 1px-. El nombre correcto es CON "tablero".

       custom.css ya tiene, desde la época de BS3, una regla GENÉRICA para
       que las tablas ".table" comunes (sin .table-bordered) no muestren
       líneas, apuntando al selector EXACTO que usaba Bootstrap 3 para
       dibujarlas (borde ARRIBA de cada celda):
         .table > thead > tr > th, .table > tbody > tr > th, ... ,
         .table > thead > tr > td, .table > tbody > tr > td, ... {
           border-top: 0;
         }
       Bootstrap 5 dibuja esa misma línea con un selector completamente
       distinto (".table > :not(caption) > * > * { border-bottom-width: ... }",
       borde ABAJO en vez de arriba), así que la regla de custom.css sigue
       "funcionando" (mata un borde-arriba que BS5 ya ni dibuja) pero nunca
       llega a tocar el borde-abajo real de BS5: de ahí las líneas nuevas
       entre filas que antes no estaban.

       OJO: la regla de custom.css es genérica (aplica a CUALQUIER ".table"
       del sitio sin excepción), pero acá el fix se dejó a propósito
       ACOTADO a ".iweb-bonita-tablero-filtros" (la tabla de resumen del
       modal de Filtros) en vez de repetir la regla de forma igual de
       genérica sobre TODO ".table:not(.table-bordered)" del sitio: no se
       pudo confirmar tabla por tabla que ninguna otra ".table" plana
       dependa hoy del borde-abajo de BS5 para verse bien (a diferencia de
       custom.css, que sí se armó explícitamente sabiendo que ninguna tabla
       del sitio breaba con eso en BS3). Si aparece el mismo síntoma
       (líneas nuevas entre filas) en otra tabla ".table" sin
       .table-bordered, agregar su clase puntual acá en vez de generalizar
       el selector, hasta confirmar cada caso en vivo.
       Verificado en vivo en i1-qa-bonita con getComputedStyle (no solo
       captura de pantalla), tabla "Resumen de registros por parte" del
       modal de Filtros (2026-07-07).

       Se agrega también ".iweb-bonita-table-filtros" (la tabla GRANDE que
       arma el formulario entero del modal de Filtros -una fila por campo:
       Categoría, Gr. Funcional, Elaborador, etc.-, la que en un primer
       intento se confundió con la de arriba): mismo bug de fondo, mismo
       componente compartido por TODOS los modales de Filtros del sitio (se
       confirmó en la pantalla "Gestor documental" -Documentación-, un
       módulo sin la tabla "Resumen de registros por parte" pero con este
       mismo wrapper). Como ambas clases son justamente el modal de
       Filtros en sí (no tablas de listado sueltas), tiene sentido
       agruparlas en la misma regla. Verificado en vivo con
       getComputedStyle en i1-qa-bonita, pantalla "Gestor documental"
       (2026-07-07).
   ========================================================================== */
.iweb-bonita-tablero-filtros > :not(caption) > * > *,
.iweb-bonita-table-filtros > :not(caption) > * > * {
  border-bottom-width: 0;
}

/* ==========================================================================
   39. BOTÓN "Ingresar" DEL LOGIN: SIN BORDER-RADIUS Y MÝS ANCHO QUE ANTES.
       El botón queda solo (sin ningún <input> al lado) adentro de un
       <div class="input-group"> que además tiene, antes y después del
       botón, un <span class="iconos-login"> vacío/decorativo a cada lado
       (los mismos spans de ícono que usan Usuario/Contraseña, acá sin
       ícono real) -están ahí nada más para que el ancho total del grupo
       quede consistente con los inputs de arriba, no porque sea un
       input-group real de ícono+campo+botón-.

       a) Border-radius en 0 (esquinas cuadradas): Bootstrap 5 trae varias
          reglas para "aplanar" las esquinas de los hijos de .input-group
          que no son ni el primero ni el último de la fila (para que el
          borde pegue bien contra el input de al lado, ej.
          ".input-group > :not(:first-child):not(.dropdown-menu):not(...)
          { border-top-left-radius:0; ... }"). Ese selector trae varias
          alternativas separadas por coma y alguna le termina pegando
          también a este botón, dejándolo con las 4 esquinas en 0 -cuadrado-
          en vez de los 4px redondeados que tenía en BS3 (ahí el
          input-group es tabla, nunca le tocaba el radius a sus hijos).
          Esas reglas de BS5 encadenan varios ":not()" y ganan por
          especificidad a un simple ".btn"/".btn-login", así que hace
          falta "!important" para revertirlo.

       b) Más ancho que antes (pisa los dos spans de ícono en vez de dejarles
          su lugar): en BS3 el .input-group es "display:table" y el botón
          (que no es ".input-group-addon"/".input-group-btn") queda
          envuelto en una celda de tabla anónima que el navegador arma
          solo -no existe un concepto equivalente en flexbox-; esa celda se
          angosta al ancho de su contenido (233px), dejando a los dos
          ".iconos-login" (38px c/u, sin ancho real) su lugar reservado a
          los costados, y el "width:100% !important" de custom.css termina
          siendo 100% de esa celda angosta, no de todo el grupo. En BS5, al
          ser flex, no hay celda anónima: el botón ES el flex item
          directamente, y "width:100%" ahí sí es 100% del ancho TOTAL del
          .input-group (icono + botón + icono), tapando por completo a los
          dos ".iconos-login" (que ya vienen con flex:0 0 auto por la
          sección de arriba de ".iconos-login", pero eso no importa: el
          botón los superpone igual porque nunca "cede" el espacio, no
          shrinkea). Se le pisa el "width:100%" de custom.css con
          "flex: 1 1 0%; min-width: 0" -mismo patrón que ya se usa para
          ".form-control" dentro de ".input-group" en otras secciones-,
          para que ocupe exactamente el espacio que sobra después de los
          dos íconos en vez de todo el ancho del grupo.

       Comparado visualmente contra https://ado.iwebjbs.com.ar/ para las
       proporciones (x/width en px de botón vs. input de Usuario). Nota
       aparte para no perseguir un fantasma: el color de borde y el
       sombreado del botón lucían distintos en ese sitio, pero es porque
       ESE sitio carga "bootstrap-theme.css" (el skin opcional con
       gradientes de Bootstrap 3) y este proyecto nunca lo cargó ni antes
       ni ahora -no aparece en ninguna lista de red de i1-qa-bonita-: no es
       un bug de la migración, es otro cliente con un skin distinto. No se
       tocó nada de eso.
       Verificado en vivo con getBoundingClientRect en i1-qa-bonita, botón
       "Ingresar" del login (2026-07-07).
   ========================================================================== */
.input-group > .btn-login {
  border-radius: 4px !important;
  flex: 1 1 0% !important;
  min-width: 0 !important;
}

/* ==========================================================================
   40. MODAL "Tabla de Datos" (botón "Expandir Tabla" de Análisis >
       Gráficos, id="modal-grafico", compartido por todos los widgets de
       gráfico de la pantalla) queda angosto en vez de ancho: custom.css le
       pisa el ancho por defecto de la sección 12 con
       "#modal-grafico > .modal-dialog { max-width: 95%; width: auto
       !important; }" -a propósito, para que este modal en particular
       quede bien ancho (no el 600px fijo de un modal común)-.

       El "width: auto !important" es la causa: en BS3, ".modal" es
       display:block (NO flex), así que un hijo en flujo normal con
       "width:auto" siempre RELLENA el ancho disponible de su contenedor
       (es la definición de "auto" para un bloque en flujo normal, CSS2 -no
       es "achicate al contenido", eso es shrink-to-fit y aplica a
       flotantes/inline-block/abs-position, no a un bloque normal-). Por
       eso en BS3 este modal SIEMPRE se veía ancho (95% del viewport),
       tuviera la tabla que tuviera adentro. En BS5, ".modal" es flex
       (para centrar el dialog), así que ".modal-dialog" pasa a ser un
       flex item: ahí "width:auto" SÍ dispara flex-basis:auto, que se
       resuelve por CONTENIDO (fit-content), no por el espacio disponible.
       Con una tabla de pocas filas, el modal se ve angosto (~265px en vez
       de ~95% del viewport). Mismo tipo de bug que ya apareció con
       ".input-group" adentro de ".form-inline"/".col-*": la palabra "auto"
       significa cosas distintas en flujo normal (bloque) vs. flex.

       No alcanza con volver a poner "width" en vez de "max-width" (ya
       corregido en la sección 12 de forma general): acá el problema es
       PUNTUAL de este modal, que a propósito vuelve a "auto" con
       "!important" pisando la sección 12. Se responde en el mismo nivel
       de especificidad (mismo selector con ID) fijando un ancho real de
       95% en vez de "auto", para lograr el mismo resultado visual que
       daba "auto" en BS3 sin depender de cómo BS5 resuelve "auto" en
       flex. Verificado en vivo en i1-qa-bonita, botón "Expandir Tabla" en
       Análisis > Gráficos (2026-07-08).
   ========================================================================== */
#modal-grafico > .modal-dialog {
  width: 95% !important;
}

/* ==========================================================================
   41. OVERLAY GRIS DOBLE en el modal "Tabla de Datos" (mismo modal de la
       sección 40, id="modal-grafico", botón "Expandir Tabla"/"Expandir
       Gráfico" de Análisis > Gráficos): al abrirlo se veía un fondo mucho
       más oscuro que el resto de los modales del sistema.

       Causa: el <div id="modal-grafico"> trae, HARDCODEADO EN EL HTML de la
       pantalla (no generado por JS, confirmado leyendo el HTML crudo antes
       de que corra cualquier script), un estilo inline propio:
       style="background: rgba(0, 0, 0, 0.5);". Esto es una técnica vieja,
       de la época BS3: en vez de confiar en el backdrop que arma Bootstrap
       al mostrar el modal, este modal puntual se pinta a sí mismo un fondo
       semitransparente negro.

       En BS3 el plugin jQuery de modal, con las opciones por default
       (backdrop:true, que es lo que tiene este modal: no hay ningún
       data-backdrop="false" ni en el botón disparador ni en el propio
       div), TAMBIÉN arma su propio ".modal-backdrop.in" -así que técnicamente
       este doble fondo ya existía desde BS3-, pero btw en BS3 el modal en sí
       (".modal") es "display:block" sin z-index/posicionamiento propio
       relevante acá, así que el problema real es simplemente que HOY (BS5)
       se nota mucho más: BS5 crea su ".modal-backdrop.show" con
       "opacity:.5" en un div separado (z-index 1050) Y ADEMÁS este modal
       sigue trayendo su propio "background:rgba(0,0,0,.5)" (z-index del
       propio modal, 1049) -las dos capas semitransparentes se apilan una
       sobre la otra y el resultado visual es un oscurecido de
       aproximadamente 0.75 en vez de 0.5, notoriamente más gris/oscuro que
       cualquier otro modal del sistema (que sólo tienen el backdrop de
       Bootstrap, sin el estilo inline extra).

       Se revisó bs3-bs5-bridge.js (el shim bridgePlugin() que envuelve
       bootstrap.Modal) y no toca nada de "backdrop"; y el botón dispara el
       modal de forma NATIVA vía "data-bs-toggle/data-bs-target" (migrado
       automático desde "data-toggle/data-target" de BS3), no hay backdrop
       custom seteado por JS en ningún punto -así que la superposición es
       pura y exclusivamente por el estilo inline heredado del HTML.

       Como este modal en particular YA se autooscurece con su propio
       estilo inline, no necesita el backdrop de Bootstrap: se oculta ESE
       backdrop puntualmente cuando el modal-grafico está abierto, dejando
       que el propio fondo inline del modal haga el trabajo (mismo
       resultado visual que daba BS3, un solo nivel de oscurecido). Se
       resuelve con ":has()" -soportado en todos los navegadores modernos-
       para alcanzar al ".modal-backdrop" (que Bootstrap siempre inserta
       como hijo de <body>, en un nivel del DOM distinto al del modal, por
       lo que un combinador de hermanos común no alcanza) desde una
       condición sobre el propio modal-grafico.

       No se toca el backdrop de NINGÚN otro modal del sistema (la regla
       apunta puntualmente a cuando #modal-grafico está con .show; el resto
       de los modales sigue con su backdrop normal de Bootstrap).
       Verificado en vivo en i1-qa-bonita: con la regla activa,
       getComputedStyle(.modal-backdrop).display pasa a "none" y el modal
       queda con un solo nivel de oscurecido (rgba(0,0,0,.5), el propio),
       en vez de los dos apilados. Botón "Expandir Tabla" en Análisis >
       Gráficos (2026-07-14).
   ========================================================================== */
body:has(#modal-grafico.show) .modal-backdrop {
  display: none;
}

/* ==========================================================================
   42. INPUTS DE FECHA (input-group-sm con datepicker, ej. filtro "Fecha"
       de iDMS > Tablero Documental) se ven "aplanados": el input y los
       botones de ícono (limpiar "x" y calendario) quedan mucho más bajos
       que el alto del propio grupo, con un hueco vacío arriba y abajo dentro
       de cada uno -en vez de ocupar toda la altura del input-group como en
       BS3-, dando un aspecto chato en vez del look con botones "de caja"
       de antes.

       Causa: `custom.css` trae, para CUALQUIER `.input-group-sm` (chico),
       la regla `.input-group-sm > .form-control, .input-group-sm >
       .input-group-addon, .input-group-sm > .input-group-btn > .btn {
       height: auto; }`. Esto era inofensivo en BS3: ahí ".input-group" es
       "display:table", así que un "height:auto" en una celda de tabla
       (".form-control"/".input-group-addon" son table-cell) simplemente
       significa "igualá la altura de la FILA de la tabla" -que a su vez
       la determina la celda más alta (normalmente el propio ".form-control"
       con su padding/font-size de BS3)-, así que en la práctica el
       resultado visual siempre terminaba siendo "todos parejos, altura
       de fila completa".

       En BS5, ".input-group" es flex (no tabla). Un "height:auto" en un
       flex item, en teoría, debería poder estirarse con
       "align-items:stretch" (que Bootstrap 5 sí define en ".input-group")
       para llenar la altura de la fila -pero en la práctica, con el
       anidado real de este proyecto (".input-group-addon" es display:flex
       puertas adentro, para centrar el ícono; más el propio contenedor del
       datepicker con su padding/line-height chico de ".input-sm"), el
       estirado no se aplica: cada hijo termina con la altura mínima de su
       propio contenido (20px, por line-height+padding del tamaño "sm") en
       vez de la altura real del grupo (30px, la que define
       ".input-sm{height:30px}" de la sección 4 de este mismo bridge sobre
       el propio contenedor). El resultado: el input y los dos botones de
       ícono quedan "flotando" centrados en una fila 10px más alta que
       ellos, con aire arriba y abajo -de ahí el aspecto aplanado/chato,
       muy distinto al de https://iwebjbs.com/iweb (referencia BS3 viva,
       donde el input-group es "display:inline-table" y las celdas SÍ
       llenan la fila completa, 33px de alto sin huecos-.

       No alcanza con pisar el "height:auto" con "height:100%" ni con
       "align-self:stretch" (probado en vivo, sin efecto -el resultado
       seguía en 20px-): se fija un alto explícito de 30px, el mismo valor
       real que ya usa ".input-sm" en la sección 4 para el tamaño chico de
       inputs/botones en BS3, así que no es un número mágico nuevo sino
       reutilizar el que ya rige la altura visual del propio grupo. Se
       responde con el MISMO selector de custom.css (misma especificidad)
       y "!important" para ganarle, mismo patrón que otros casos donde una
       regla de custom.css -correcta para BS3- necesita corrección para
       BS5. Verificado en vivo en i1-qa-bonita: el input y los dos botones
       de ícono pasaron de 20px a 30px de alto (igual que el grupo, 0px de
       hueco), visualmente igual que la referencia BS3. Filtro "Fecha" en
       iDMS > Tablero Documental (2026-07-15).
   ========================================================================== */
.input-group-sm > .form-control,
.input-group-sm > .input-group-addon,
.input-group-sm > .input-group-btn > .btn {
  height: 30px !important;
}

/* Corrección al fix de arriba: al fijar los hijos en 30px de alto real,
   apareció un problema nuevo -reportado como "le falta el espacio de
   abajo que tenía antes"- en los input-group que, ADEMÁS de
   ".input-group-sm", tienen la clase ".input-sm" puesta directo sobre el
   propio contenedor (caso real: el datepicker de jQuery le agrega
   "input-sm" al DIV ".input-group" entero, no solo al <input> de adentro,
   algo que en el HTML de un input-group normal no pasa). La sección 4 de
   este bridge define ".input-sm{height:30px; padding:5px 10px}" pensado
   para un <input> suelto (ahí 30px YA incluye el padding, por
   box-sizing:border-box, y da bien: 20px de contenido + 5px arriba/abajo).
   Pero cuando esa MISMA clase cae sobre el CONTENEDOR del input-group, el
   contenedor queda con su propia caja pisada en esos mismos 30px totales
   -con el mismo padding de 5px arriba/abajo restando del espacio interno-,
   dejando solo 20px de "hueco" para meter adentro a los hijos que el fix
   de arriba ahora fuerza a 30px: los hijos exceden ese hueco y se comen
   directo el padding del contenedor (quedan al ras de su borde exterior,
   sin aire), perdiendo visualmente el espacio que sí tenía la referencia
   BS3 (ahí el contenedor es "inline-table" y crece con el contenido:
   33px de hijos + 5px arriba + 5px abajo = 43px reales, nunca se pisan
   uno a otro).

   Se responde puntualmente para el combo ".input-group.input-sm"
   (contenedor con AMBAS clases a la vez -no cualquier .input-sm suelto,
   ese sigue en 30px fijo como corresponde-): se le saca el "height:30px"
   fijo y se deja "auto", para que el contenedor vuelva a CRECER según sus
   hijos (30px) más su propio padding (5+5), en vez de quedar pisado en un
   total fijo que no alcanza. Verificado en vivo en i1-qa-bonita: el
   contenedor pasó de 30px (hijos pisando el padding) a 40px (30 de hijos
   + 10 de padding, sin pisarse), con aire visible arriba y abajo otra
   vez, igual que en https://iwebjbs.com/iweb (43px ahí, por la pequeña
   diferencia de 30 vs 33px de alto de hijo -no relacionada con este fix-).
   Filtro "Fecha" en iDMS > Tablero Documental (2026-07-15). */
.input-group.input-sm {
  height: auto !important;
}

/* ==========================================================================
   43. BOTÓN OUTLINE ("Iniciar timer", clase propia ".btn-bonita-outline" de
       custom.css) pierde el borde al pasar el mouse (hover): en reposo se
       ve el recuadro celeste normal, pero en hover el borde desaparece por
       completo, como si el botón quedara "flotando" sin caja.

       Causa: `.btn-bonita-outline` (y su variante
       `.btn-bonita-outline-danger`) son clases 100% propias del proyecto
       (NO son ".btn-primary"/".btn-outline-primary" de Bootstrap), y
       ponen su borde con una propiedad CSS directa y simple:
       `border: thin solid var(--iweb-bonita-primario)`. Eso alcanza y
       sobra en BS3 (ahí ":hover" es sólo lo que se declare explícitamente
       -acá sólo cambia el "color" del texto, nunca se tocó el borde-).

       En BS5, CUALQUIER elemento con la clase base ".btn" (aunque sea
       sólo eso, sin ningún ".btn-primary"/".btn-outline-*" de Bootstrap)
       hereda la regla nativa ".btn:hover { border-color:
       var(--bs-btn-hover-border-color); ... }" (bootstrap.min.css). Como
       ".btn-bonita-outline" nunca definió esa variable (es una clase
       propia, no uno de los variantes reales de Bootstrap que sí la
       traen predefinida), `--bs-btn-hover-border-color` cae al default
       de la clase base ".btn" sola: "transparent" -pensado para que un
       ".btn" desnudo, sin variante, no tenga borde propio-. El resultado:
       al pasar el mouse, ese ".btn:hover" nativo pisa puntualmente el
       "border-color" (no todo el "border", sólo el color) con
       "transparent", dejando el grosor/estilo del borde intacto pero
       invisible.

       Mismo patrón ya documentado en este bridge para colores de botones
       reales de Bootstrap (sección 37): los estados (:hover/:focus/:active)
       de BS5 se resuelven con variables CSS locales del propio botón, no
       heredan un valor "de fábrica" a menos que el componente las defina.
       La solución es la misma: definir esas variables directamente en la
       clase, UNA sola vez en el selector base (no hace falta repetirlas
       en ":hover"), y bootstrap.min.css las toma solo al necesitarlas.
       Se agrega `--bs-btn-border-color` y `--bs-btn-hover-border-color`
       (mismo valor que el borde real de cada variante) a
       ".btn-bonita-outline" y ".btn-bonita-outline-danger".

       Verificado en vivo en https://iwebjbs.com/iweb/test, con el cursor
       realmente posicionado sobre el botón (":hover" real, no simulado):
       antes de la regla, "border-color" computado daba "rgba(0,0,0,0)"
       (transparente); con la regla, da "rgb(51,122,183)" (el celeste real
       del proyecto), igual que en reposo. Botón "Iniciar timer" de F-019
       TAREA (2026-07-16).
   ========================================================================== */
.btn-bonita-outline {
  --bs-btn-border-color: var(--iweb-bonita-primario);
  --bs-btn-hover-border-color: var(--iweb-bonita-primario);
}
.btn-bonita-outline-danger {
  --bs-btn-border-color: red;
  --bs-btn-hover-border-color: red;
}

/* ==========================================================================
   44. BOTONES DESORDENADOS en el modal "Se debe finalizar la siguiente
       tarea" (aparece al tocar "Iniciar timer" sobre una tarea con un
       timer previo sin cerrar): los botones "Cerrar"/"Guardar" quedaban
       apilados uno arriba del otro (en vez de uno al lado del otro) y
       pegados al borde IZQUIERDO del modal, con el texto "[TE: Tiempo
       ejecutado]" corrido al costado en la misma línea -en vez de en su
       propio renglón, alineado a la izquierda, con los botones arriba a
       la derecha, como en la referencia BS3 viva
       (https://iwebjbs.com/iweb)-.

       Causa (dos bugs distintos, apilados uno sobre el otro):

       a) El HTML de este modal -viejo, de Bonita/BS3- mete los botones
          "Cerrar"/"Guardar" como hijos DIRECTOS de un `.row`, sin
          envolverlos en ningún `.col-*` (algo que en BS3 no generaba
          ningún problema: ".row" ahí es sólo un clearfix, y un <button>
          suelto adentro simplemente fluye a su tamaño natural, uno al
          lado del otro por ser inline-block). En BS5, ".row" es flex, y
          Bootstrap 5 aplica un selector universal ".row > *" a CUALQUIER
          hijo directo (tenga clase de columna o no) con "width:100%"
          -pensado para que los ".col-*" reales ocupen su celda de grid-.
          Sin ser un ".col-*", el <button>/<input class="btn"> IGUAL
          recibe ese "width:100%", y al ser flex-items en una fila con
          "flex-wrap:wrap", cada uno "ocupa la fila completa" y empuja al
          siguiente a una línea nueva -de ahí quedaban apilados en vez de
          en línea-. Mismo mecanismo ya documentado en la sección 2 de
          este bridge para ".pull-left"/".pull-right" sueltos adentro de
          un ".row" (ahí ya se corrigió con el mismo criterio: sacarles el
          "width:100%" y darles "flex:0 1 auto" para que vuelvan a
          angostarse a su contenido).

       b) Con (a) corregido, aparece un SEGUNDO problema: el HTML tiene
          DOS ".row" hermanos dentro de ".modal-footer" (uno con los
          botones, otro con el texto "[TE: Tiempo ejecutado]") que en BS3
          simplemente se apilan uno debajo del otro (son bloques). Pero
          ".modal-footer" en Bootstrap 5 YA viene "display:flex;
          flex-wrap:wrap; justify-content:flex-end" de fábrica (para
          alinear a la derecha un par de botones simple, su caso de uso
          típico). Sin ancho explícito, cada ".row" se angosta a su propio
          contenido (por (a) ya resuelto) y, al no superar el ancho total
          del footer entre los dos, ambos terminan cabiendo en la MISMA
          línea del flex en vez de en renglones separados -de ahí el
          texto "[TE:...]" corrido al lado de los botones en vez de abajo-.
          Se le da "width:100%" a cada ".row" hijo directo de
          ".modal-footer" para que cada uno ocupe todo el ancho disponible
          y el "flex-wrap:wrap" del footer los mande a su propio renglón,
          igual que en BS3.

       Con (a) y (b) juntas, los botones quedan en línea (ya no apilados) y
       el texto "[TE:...]" pasa a su propio renglón abajo. Verificado en
       vivo en https://iwebjbs.com/iweb/test: "Cerrar"/"Guardar" pasaron de
       estar apilados (dos filas separadas, ancho angosto cada uno) a estar
       en la misma fila. Modal de "Iniciar timer" en tareas F-019
       (2026-07-16).

       Corrección: al probarlo en el servidor, la posición/separación
       final no coincidía con lo esperado. Sin especificar
       "justify-content" de forma explícita, el resultado depende de qué
       otra regla del sitio (custom.css u otra) termine tocando ese ".row"
       en cada entorno -no es un valor fijo garantizado por Bootstrap 5
       solo con "width:100%"-, de ahí la diferencia entre lo probado acá y
       lo visto en el servidor en un primer intento. Tras confirmar con el
       equipo cuál es el criterio correcto para este modal (derecha, igual
       que la referencia BS3 real en https://iwebjbs.com/iweb, donde
       "Cerrar"/"Guardar" quedan pegados al margen derecho), se fija
       explícitamente "justify-content:flex-end" (para no depender de qué
       gane por otro lado en cada entorno) y "gap:5px" entre los botones
       (mismo valor que ya usa BS3 real en ".btn + .btn
       {margin-left:5px}"). Verificado en vivo: "Cerrar"/"Guardar" quedan
       pegados al margen derecho del modal, con 5px de separación entre
       ellos, igual que la referencia. Modal de "Iniciar timer" en tareas
       F-019 (2026-07-16).
   ========================================================================== */
.row > .btn {
  width: auto;
  max-width: 100%;
  flex: 0 1 auto;
}
.modal-footer > .row {
  width: 100%;
  justify-content: flex-end;
  gap: 5px;
}

/* ==========================================================================
   45. FILA "Total General" (y cualquier fila resaltada con color de fondo
       propio vía estilo inline, ej. `<tr style="background-color:#555;
       color:white;">`) pierde su color: en vez de verse oscura/resaltada
       como en la referencia BS3, se ve blanca (o el color de fondo normal
       de la tabla) y con el texto en negro en vez de blanco, como si el
       estilo inline no aplicara.

       Causa: el estilo inline SÍ se aplica -y de hecho gana, es lo más
       específico posible- pero se aplica sobre el <tr>, y tanto Bootstrap
       5 como custom.css pintan tanto el FONDO como el TEXTO en la celda
       (<td>/<th>), no en la fila:
         - Bootstrap 5 (bootstrap.min.css): ".table > :not(caption) > * > *
           { color: var(--bs-table-color-state,...); background-color:
           var(--bs-table-bg); ... }" -texto oscuro y fondo blanco por
           default-, aplicado a TODAS las celdas de cualquier ".table".
         - Además, "custom.css" trae su PROPIA regla ".table td, .table th
           { background-color: #fff; }", reforzando el blanco explícito en
           cada celda.
       Ninguna de esas reglas "gana" por especificidad al estilo inline del
       <tr> -de hecho ni compiten: son propiedades sobre elementos
       DISTINTOS-. El problema es puramente de pintado: el <td>, al ser
       HIJO del <tr> y tener su PROPIO fondo (blanco, opaco) y su PROPIO
       color de texto (oscuro), se dibuja encima y tapa por completo el
       fondo del padre -y su color de texto nunca hereda el "white" del
       <tr>, porque el <td> ya trae uno explícito propio-, sin importar
       qué tan específica sea la regla del <tr>. En BS3 esto no pasaba
       porque ninguna de esas reglas existía a nivel celda -ni Bootstrap 3
       ni, aparentemente, la versión de custom.css de esa época pintaban un
       fondo/color propio en cada <td>-, así que el <tr> siempre se veía "a
       través" de celdas transparentes que heredaban su color de texto.
       Mismo patrón que otros casos ya documentados en este bridge (sección
       "Propiedades nuevas de BS5" en HANDOFF.md): no alcanza con que el
       HTML/estilo inline siga igual, si BS5 (o custom.css, migrado para
       BS5) le agrega una propiedad nueva a un elemento intermedio que
       antes no la tenía.

       Se soluciona con un selector de atributo que detecta puntualmente
       cualquier <tr> con un estilo inline que intente pintar un fondo
       (`tr[style*="background"]`), y le hace transparente el fondo Y
       "color:inherit" al texto de sus celdas hijas directas -dejando
       pasar tanto el fondo como el color de texto del <tr>-. No se toca
       ".table td, .table th" en general (evita romper el blanco/texto por
       defecto del resto de la tabla): sólo actúa cuando el propio <tr>
       trae un intento explícito de pintarse un color vía HTML/inline, que
       es justamente la señal de que ESA fila se pensó para resaltar con
       un color propio (totales, filas de estado, etc.).

       Verificado en vivo en i1-qa-bonita, reproduciendo el patrón exacto
       (`<tr style="background-color:#555;color:white">`) en una tabla
       real de la pantalla iDMS > Tablero Documental: antes de la regla,
       el <td> computaba fondo "rgb(255,255,255)" (blanco, tapando el gris
       del padre) y texto "rgb(0,0,0)" (negro, en vez del blanco esperado);
       con la regla, el fondo pasa a "rgba(0,0,0,0)" (transparente,
       dejando ver el gris del <tr>) y el texto a "rgb(255,255,255)"
       (blanco, heredado del <tr>). Fila "Total General" de iWeb > Plan
       Diario (2026-07-16).
   ========================================================================== */
tr[style*="background"] > td,
tr[style*="background"] > th {
  background-color: transparent !important;
  color: inherit !important;
}
