/* =========================================================================
   simia-custom.css  --  el custom nuevo de la etapa 2. E2/F6, 2026-09-15.

   ⛔ QUE ES Y QUE NO ES

   Es la UNICA hoja donde se escribe CSS nuevo en esta etapa. Va DESPUES de
   `global-simia.css` en el <head> (`application/views/front/header.php`), o
   sea ULTIMA en la cascada del front.

   ⛔ `global-simia.css` NO SE TOCA, Y NO ES una preferencia de estilo. Es un
   extracto generado por herramienta, con 126 selectores repetidos y tres
   tramos concatenados: mover una regla de ahi es la ida y vuelta que esta
   etapa existe para evitar. TODO LO NUEVO VA ACA.

   ⛔ REGLA DE LA FASE (`D-C29`): ninguna clase, id ni atributo se borra, se
   renombra ni se reemplaza. SOLO SE AGREGA. Borrar es F8, al final, con su
   propia verificacion.

   ⚠️ EL ORDEN DE LA HOJA SOLO DECIDE ENTRE REGLAS DE IGUAL ESPECIFICIDAD.
   Estar ultima NO alcanza para ganarle a un selector mas especifico de
   Bootstrap. Cada bloque de abajo dice CON QUE ESPECIFICIDAD gana.
   ========================================================================= */


/* -------------------------------------------------------------------------
   H-242  --  el cartel de error de jQuery Validate deja de correr el boton
   -------------------------------------------------------------------------
   ⛔ ES UNA REGRESION DE E2/F5a, NO UN DEFECTO HEREDADO. Medido con clicks
   REALES y conteo de POST el 2026-09-15 en :8099, 1280x900:

       /login, /site/alta y /site/recuperapass/<guid>
           CON F5a     -> el boton baja 10 px DURANTE el click y los clicks
                          en los primeros 10 px del boton NO producen NINGUN
                          POST. Franja muerta = [0, 10).
           ABLACION    -> (bootstrap.min.css `disabled = true`, misma pagina)
                          los 10 offsets, de 1 a 38 px, producen POST.
                          Franja muerta = NINGUNA.

   El mecanismo: `jquery.validate` crea un <span class="help-block ..."> por
   campo al validarlo. Bootstrap lo define `display:block; margin-top:5px;
   margin-bottom:10px`; ANTES DE F5a ninguna hoja servida lo definia, asi que
   era `display:inline` con margenes 0 y ALTURA CERO cuando el span sale
   vacio. El `mousedown` saca el foco del campo -> corre la validacion ->
   aparece el span -> el boton baja 10 px -> el `mouseup` cae afuera -> el
   navegador NO sintetiza el `click`. CERO errores de consola.

   ⛔ POR QUE LAS TRES PROPIEDADES Y NO SOLO `margin-bottom`. El span sale
   VACIO en el camino bueno (datos validos), asi que sus dos margenes
   ADYACENTES se autocolapsan en `max(5, 10) = 10`. Anular solo el
   `margin-bottom` baja el corrimiento de 20 a 10 px y DEJA LA FRANJA MUERTA
   VIVA -- porque 10 px es justo la primera altura que envia.

   ⛔ Y VA SOBRE `.help-block`, NO SOBRE `.help-block-error`. Son dos
   `errorClass` distintos en el front y uno de ellos NO lleva el sufijo:
       front/js/custom.js:18                 'help-block help-block-error'
       front/js/vistas/bienvenido_footer.js:76  'help-block help-block-error'
       front/js/vistas/recuperapass_footer.js:10 'help-block help-block-error'
       front/js/vistas/login_footer.js:9     'help-block'   <- el modal
                                             «Olvide mi contraseña»
   Escribir solo `.help-block-error` dejaba ese modal sin cubrir.

   Especificidad 0-1-0, la misma que `.help-block` de Bootstrap: gana por
   ORDEN DE LA HOJA, que es el unico desempate disponible y el que esta
   garantizado por el <head>.

   ⛔ NO REVERTIR. Como se comprueba que sigue vivo -- en /login, :8099:
       1. llenar mail y clave con datos validos
       2. click a 2 px del borde SUPERIOR del boton INGRESAR
       3. tiene que salir UN POST. Si no sale ninguno, esta regla se perdio.
   (Preguntar `elementFromPoint` NO sirve: mide el layout ya asentado y este
   defecto vive en la transicion. Es la trampa 9 de CONTINUIDAD-AUDITORIA §6.)
   ------------------------------------------------------------------------- */
.help-block {
	display: inline;
	margin-top: 0;
	margin-bottom: 0;
}


/* -------------------------------------------------------------------------
   H-240  --  el campo de contraseña de «Recuperar clave» vuelve a su ancho
   -------------------------------------------------------------------------
   ⛔ ES CONDICION DE DESPLIEGUE. Es la UNICA pantalla donde un Proveedor
   Logistico fija su contraseña nueva, y despues de F5a se veia PEOR que
   antes de la rama: el campo pasaba de 457,50 px a 132,49 px y el
   placeholder salia cortado («Nueva Passwor...»).

   La causa es un HUECO, no un choque: `global-simia.css` define `col-md-1`,
   `2`, `3`, `5`, `6`, `11` y `12` y NO define `col-md-4`, que es la unica
   `col-md-*` que el front usa sin cubrir -- en `:20` y `:26` de
   `application/views/front/items/recuperapass.php`, los dos unicos lugares
   de todo `application/views/front/`. Bootstrap no pisa nada: RELLENA, con
   `width:33.33%` + `float:left` + `padding:0 15px`.

   ⛔ NO SE REEMPLAZA `col-md-4` (`D-C29`): se le AGREGO `simia-campo-clave`
   al lado, en la vista, y la regla vive aca.

   ⛔ POR QUE SON DOS REGLAS Y NO UNA -- Y ESTA MEDIDO. `form-horizontal`
   aporta 10 de los 162,5 px, por `margin-left/right:-15px` en el
   `.form-group`: con el, la fila mide 487,5 px; sin el, 457,5. Una sola
   regla con `width` o con padding fijo ata el ancho objetivo a que
   `form-horizontal` siga puesto, y el dia que alguien lo saque «de paso»
   el campo cambia de ancho solo, sin que nadie toque esta hoja.
   Con las dos, el campo mide 457,50 px y arranca en x = 167,5 EN LOS DOS
   CASOS -- que es exactamente el ancho del <form>, o sea lo que se veia
   antes de la rama.

   ⚠️ Y NO TOCA EL TELEFONO. `width:33.33%` de Bootstrap vive dentro de
   `@media (min-width:992px)`; por debajo `.col-md-4` solo aporta
   `position:relative` y el padding. Medido a 375 px: identico antes y
   despues (col-md-4 = 375 px, input = 345 px).

   ⛔ NO REVERTIR. Como se comprueba -- en /site/recuperapass/<guid>, 1280 px:
       document.querySelector('#js-forget-password').getBoundingClientRect().width
       tiene que dar 457.5. Si da 132.484, esta regla se perdio.
   ------------------------------------------------------------------------- */
.simia-campo-clave {
	float: none;
	width: auto;
	padding-left: 0;
	padding-right: 0;
}

/* Especificidad 0-2-0: le gana a `.col-md-4` (0-1-0) sin `!important`.
   Repone los 15 px de canaleta SOLO cuando la fila los compensa con sus
   margenes negativos, que es lo que hace `form-horizontal`. */
.form-horizontal .simia-campo-clave {
	padding-left: 15px;
	padding-right: 15px;
}


/* -------------------------------------------------------------------------
   LISTA 3  --  las trampas de ESPECIFICIDAD que SE VEN
   -------------------------------------------------------------------------
   `global-simia.css` es una copia PODADA de Bootstrap 3: trae las reglas de
   TAG PELADO --`label`, `input`, `button`-- y NO trae los bloques de
   componente --`.radio`, `.checkbox`, `.close`, `.control-label`--, que son
   los de alta especificidad. Apilar el Bootstrap completo abajo repone
   exactamente esos bloques, y desde abajo LE GANAN a lo propio: la cascada
   resuelve primero por ESPECIFICIDAD y recien despues por orden de hoja.

   ⛔ POR ESO ESTAR ULTIMO NO ALCANZA Y LAS REGLAS DE ACA SON MAS ESPECIFICAS
   QUE LAS QUE PIERDEN. Cada bloque dice contra que selector compite.

   Medido el 2026-09-15 recorriendo el CSSOM de las tres hojas servidas contra
   el DOM real de las cinco pantallas: 16 pares vivos, de los cuales 12 SE VEN
   --o sea, el valor computado difiere del que declara `global-simia`--.

   ⚠️ Y DOS DE ELLOS GANAN DESDE LA CAPA BASE DE FORMULARIOS, no desde un
   bloque de componente: `input[type="radio"]` (0-1-1) le gana a `input`
   (0-0-1). Quien busque solo componentes se pierde esa familia entera.
   ------------------------------------------------------------------------- */

/* Los radios. Compite contra `input[type="radio"]` (0-1-1) y contra
   `.radio input[type="radio"]` (0-2-1) de Bootstrap.
   ANTES de la rama: position static · margin-top 0 · margin-left 0 ·
   line-height 22px. El `position:absolute` de Bootstrap ademas BLOQUIFICA el
   input --de `inline-block` a `block`--, asi que reponer `position` arregla
   las dos lineas del volcado con una sola declaracion. */
.radio input[type="radio"],
.radio-inline input[type="radio"],
.checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"] {
	position: static;
	margin-left: 0;
	margin-top: 0;
	line-height: 22px;
}

/* Compite contra `.radio` / `.checkbox` (0-1-0) de Bootstrap Y contra
   `.form-horizontal .radio` (0-2-0), que es la que de verdad pone los 7 px.
   ⛔ MEDIDO: con solo `.radio` la regla NO GANA -- la de Bootstrap es mas
   especifica y el padding se quedaba en 7 px. Es el mismo error que esta
   seccion existe para documentar. */
.radio,
.checkbox,
.form-horizontal .radio,
.form-horizontal .checkbox {
	padding-top: 0;
}

/* Compite contra `.radio label` (0-1-1), que es la que le gana a
   `global-simia.css:560  label { margin-bottom: 5px }` (0-0-1). */
.radio label,
.radio-inline label,
.checkbox label,
.checkbox-inline label {
	margin-bottom: 5px;
	padding-left: 0;
}

/* El boton del cartel de error. Compite contra `.close` (0-1-0) y
   `button.close` (0-1-1). ⛔ OJO: en el volcado este MISMO nodo aparece dos
   veces --como `button[N]` y como `.close[N]`--, asi que una excepcion escrita
   contra uno de los dos nombres NO exime al otro. */
.alert .close,
.alert button.close {
	float: none;
	opacity: 1;
	color: #777777;
	font-size: inherit;
	font-weight: 400;
	line-height: 22px;
	padding: 1px 6px;
	background-color: #efefef;
	/* ⛔ EL COLOR DEL BORDE VA EXPLICITO. `outset` sin color usa `currentColor`,
	   y como este bloque tambien repone `color: #777`, el borde salia gris
	   cuando antes de la rama era negro -- medido: border-top-color
	   rgb(0,0,0) en el ANTES contra rgb(119,119,119). Un arreglo que
	   introduce su propia diferencia. */
	border: 2px outset rgb(0, 0, 0);
	-webkit-appearance: button;
	appearance: button;
}


/* -------------------------------------------------------------------------
   LISTA 2  --  los huecos de ELEMENTO
   -------------------------------------------------------------------------
   Un TAG que Bootstrap estila con selector pelado y `global-simia` no. El
   barrido de clases de F4 no puede verlos: cruza CLASES, y un `<h5>` sin
   `class` no aparece en ningun inventario de clases.

   Medido: el front usa 37 tags; Bootstrap define 63 con selector pelado y
   `global-simia` 18. De ahi salen SEIS con hueco -- y solo `h5` se ve:

     h5      ⬅️ se ve, y mucho: mueve entre el 6 % y el 10 % de los pixeles
                de los pasos 2 a 5 del asistente
     html    solo aporta `-webkit-text-size-adjust` y
             `-webkit-tap-highlight-color`; ninguna sale en el volcado
     strong  `font-weight: 700` vs el default `bolder`, que es RELATIVO al
             padre: coinciden porque los 11 padres reales computan 400
     ul      `ul.detalle` de `global-simia` ya pisa las dos declaraciones
     table   `global-simia` ya define 26 propiedades; lo unico que suma
             Bootstrap son dos `-webkit-border-*-spacing`
     tr      idem, `break-inside`

   ⛔ ESCRIBIR LOS OTROS CINCO SERIA RUIDO PURO, y esta medido, no supuesto.
   ------------------------------------------------------------------------- */

/* Compite contra `h5` (0-0-1) de Bootstrap, que le pone `font-size:14px`,
   `font-weight:500` y margenes de 10px. Los valores de abajo son los del
   navegador --que es lo que habia antes de la rama-- y por eso van en `em`:
   medido, 11,62 px a 1280 y 10,79 px a 375, que son 0,83em en cada caso. */
h5 {
	font-size: 0.83em;
	font-weight: bold;
	line-height: inherit;
	margin-top: 1.67em;
	margin-bottom: 1.67em;
	color: inherit;
}


/* Los enlaces con pinta de boton. Compite contra `.btn` (0-1-0) de Bootstrap,
   que trae `display:inline-block`; `global-simia` define `.btn` con 126
   declaraciones repartidas en 6 reglas y NINGUNA pone `display`, asi que antes
   de la rama esos `<a>` eran `inline`. Es el grupo mas grande del volcado:
   368 lineas entre `a[N]` y `.btn[N]`, todas en *Bienvenido* y sus modales.

   ⛔ VA ACOTADA A `a.btn`, NO A `.btn` A SECAS, Y ES LA DIFERENCIA ENTRE
   ARREGLAR Y ROMPER. Un `<button class="btn">` o un `<input type="submit"
   class="btn">` son `inline-block` POR DEFECTO DEL NAVEGADOR, o sea que ya
   eran `inline-block` antes de la rama: ponerles `inline` seria una regresion
   NUEVA, introducida por el arreglo. Los que cambiaron son solo los `<a>`. */
a.btn {
	display: inline;
}


/* =========================================================================
   LAS FUENTES  --  fuera Google Fonts, a Arial. E2/F7b, 2026-09-21. `D-C42`
   =========================================================================

   Decision de la persona, textual: «google Fonts puede pasar todo a helvetica,
   arial, no es necesario seguir cargando». Es de LICENCIA: ni Open Sans
   (Apache 2.0 / OFL) ni Shadows Into Light (OFL) son MIT.

   ⛔ POR QUE HACE FALTA ESTE BLOQUE, SI EL <link> YA SE SACO. Porque sacarlo
   NO alcanza: `global-simia.css` --que NO SE TOCA-- trae SETENTA @font-face
   propios apuntando a `fonts.gstatic.com`. Un @font-face no descarga nada por
   si solo; el navegador baja la fuente SOLO cuando alguna regla usa la familia.

   Los que la usaban son estos CINCO, medidos sobre la hoja (8 reglas, porque
   `global-simia` repite tramos):

       body · .login textarea · .mfp-close · .upload-text · .css-gracias

   Con la familia redefinida aca, los 70 @font-face quedan INERTES: siguen
   escritos y no se pide ni un byte. Medido en :8099 contando pedidos de red:
       antes    3 pedidos a Google por pantalla · 5 de 125 @font-face cargadas
       despues  0 pedidos                       · 0 cargadas

   ⛔ POR QUE `Arial` PRIMERO Y NO `Helvetica`, aunque la frase diga «helvetica,
   arial». Dos razones medidas, y ninguna es de gusto:

     1. ARIAL ES LO QUE EL SISTEMA YA MUESTRA HOY cuando el CDN falla -- la
        familia era `"Open Sans", Arial, sans-serif`, o sea que el fallback
        SIEMPRE fue Arial. Poner Arial primero es el cambio MAS CHICO posible.
     2. HACE LA REFERENCIA DETERMINISTA, que es la trampa 11 de este proyecto:
        el CDN de tipografia es intermitente --medido `200` un dia y
        `ERR_CONNECTION_RESET` al siguiente-- y eso movia CADA ancho de texto
        del volcado. Helvetica existe en macOS y no en Windows, asi que
        ponerla primero cambiaria el ancho segun la maquina que mide.

   Si la persona quiere Helvetica primero, es una linea -- y entonces la
   referencia deja de ser comparable entre maquinas.

   ESPECIFICIDAD, que es lo unico que decide: esta hoja va ULTIMA, asi que gana
   entre IGUALES. Cada selector de abajo repite EXACTAMENTE el de
   `global-simia.css`, ni mas ni menos. `.mfp-close` va con sus dos formas
   (0-1-0 y 0-2-0) porque alli estan escritas las dos.

   ⛔ NO REVERTIR sin volver a poner el <link>: sin esta hoja, `body` vuelve a
   pedir "Open Sans" y los 70 @font-face vuelven a descargar de gstatic. */
body {
	font-family: Arial, Helvetica, sans-serif;
}
.login textarea {
	font-family: Arial, Helvetica, sans-serif;
}
.mfp-close,
.mfp-close-btn-in .mfp-close {
	font-family: Arial, Helvetica, sans-serif;
}
.upload-text {
	font-family: Arial, Helvetica, sans-serif;
}
.css-gracias {
	font-family: Arial, Helvetica, sans-serif;
}

/* =========================================================================
   LOS ICONOS  --  Bootstrap Icons. E2/F9, 2026-09-22. `D-C49`
   =========================================================================

   Font Awesome 4.7 sale; entra Bootstrap Icons 1.13.1 local
   (`front/vendor/bootstrap-icons/`). `global-simia.css` --que NO SE TOCA--
   dimensionaba los iconos por `.fa` y le daba forma de boton a `.fa-upload`;
   con la clase nueva esas reglas quedan inertes y su equivalente va aca.

       global-simia.css:717/2054  .fa        { display:inline-block; font:14px/1 ...; font-size:inherit }
       global-simia.css:10        .fa-upload { el circulo verde del boton «Subir» de Documentacion }

   `.fa-chevron-up:before` (global-simia.css:729/2066) no necesita equivalente:
   solo fijaba el glifo de Font Awesome, y `.bi-chevron-up` trae el suyo.
   ========================================================================= */
.bi {
	display: inline-block;
	font-size: inherit;
	line-height: 1;
	text-rendering: auto;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.bi::before {
	vertical-align: top;		/* bootstrap-icons.css pone -.125em y line-height 1: baja el glifo. `top`, no `baseline`: medido en el admin, ver simia-iconos.css */
	line-height: inherit;		/* y agranda la linea. Font Awesome lo dibujaba como texto sobre la base. */
}

.bi-upload {
	color: #fff;
	padding: 15px 11px;
	margin-top: 23px;
	background-color: #90c464;
	border-radius: 15px;
}


/* =========================================================================
   E14 R2-F  --  EL FRONT EN PANTALLA ANGOSTA. 2026-10-13. D-C325, D-C156 y D-C157
   =========================================================================
   Tres decisiones de la persona sobre la misma pantalla angosta y esta misma
   hoja (T14): van juntas por acoplamiento (D-C325). Las tres las mide
   `tools/verificar-front-angosto.py` (`front-angosto`, en la bateria), cada
   una en su grupo, y cada una tiene su control negativo (`CN-R2F.txt` del
   cierre de R2-F).
   ========================================================================= */

/* -------------------------------------------------------------------------
   D-C325 (O-6 del cierre de R1)  --  NINGUNA PANTALLA DEL FRONT DESBORDA A LO ANCHO
   -------------------------------------------------------------------------
   Decision de la persona, 2026-10-12, textual: «o6 corregí la plantilla,
   tanto esta como el resto, no te preocupes, podes corregirlo.»

   Medido ANTES en :8484: las seis pantallas del marco (login, el link de
   Recuperar password, el alta, Bienvenido, Documentacion y Cambiar clave) y
   todos sus estados median 390 de ancho a 375 y 774 a 768 -- 15 y 6 px de
   desplazamiento horizontal --. /site/informacion (otro <head>, sin el
   marco): 0.

   LA CAUSA: la plantilla pone un `.row` DIRECTO dentro de otro `.row`
   (`.row.mt-xlg > .row`; en el alta, `.row.mt-xlg > form > .row`). Bootstrap
   compensa los 15 px de relleno del `.container` con UN margen de -15; el
   segundo `.row` resta otros 15 y sale 15 px de cada lado de la pantalla. A
   la izquierda no se ve (no hay scroll negativo); a la derecha es el
   desplazamiento. A 768 el `.container` mide 750 y le sobran 9 px de cada
   lado: por eso ahi son 6. Desde 780 px ya no desborda.

   EL ARREGLO, y por que son DOS reglas: el `.row` de adentro deja su -15 (ya
   no sale de la pantalla) y la columna que cuelga de el deja sus 15 de
   relleno. Las dos cosas se cancelaban entre si, asi que EL CONTENIDO QUEDA
   EN EL MISMO PIXEL: medido elemento por elemento en las seis pantallas, a
   375 y a 768, las unicas cajas que cambian son esas filas y columnas (a 375
   pasan de 405 a 375 de ancho); ningun texto, campo ni boton se mueve.
   ⛔ Sacar solo el margen corre TODO el contenido 15 px hacia adentro.

   La tercera regla es la SEGUNDA causa, que la primera tapaba: `.btn` de
   Bootstrap es `white-space: nowrap`, y «GUARDAR y agregar OTRO MATERIAL a
   esta orden de compra» (el paso 2 de Bienvenido) no entra a 375: con las
   filas arregladas la pagina seguia midiendo 385. Con `normal` se parte en
   renglones; un boton que entra queda igual (su ancho es el de su texto).

   ⛔ NO es `overflow-x: hidden` sobre `body` o `html`: eso esconde el
   desborde y recorta lo que se pasa; no lo arregla.

   LAS FILAS, HASTA 999 PX (E14 R2F.C, 2026-10-13: D-C325 por principio, O-2
   del cierre de R2-F). R2-F las arreglo debajo de 992, y el mismo desborde
   seguia ARRIBA: de 992 a 1199 el `.container` mide 970 y el `.row` de
   adentro 1000, asi que hasta 999 px de pantalla se pasa (a 992, la pagina
   medía 996). Desde 1000 ya no, y desde 1200 tampoco (el `.container` mide
   1170 y el `.row`, 1200). Las columnas que cuelgan de esas filas son
   `.col-md-12` en todas las pantallas del marco: de 992 a 999 tambien queda
   todo en el mismo pixel (medido caja por caja a 995). A 1000 y mas no
   cambia nada.
   LOS BOTONES, SOLO por debajo de 992 px, donde las columnas se apilan (el
   mismo corte que D-C156). A 992 y a 1280 no cambian.

   ⛔ NO REVERTIR. Como se comprueba -- en /login, a 375 x 812:
       document.documentElement.scrollWidth   ->  375 (sin esto, 390)
   y a 992 x 900, 992 (sin esto, 996); los grupos `desborde` y `ancho` de
   `tools/verificar-front-angosto.py`.
   ------------------------------------------------------------------------- */
@media (max-width: 999px) {
	.row.mt-xlg > .row,
	.row.mt-xlg > form > .row {
		margin-left: 0;
		margin-right: 0;
	}
	.row.mt-xlg > .row > [class*="col-"],
	.row.mt-xlg > .row > form > [class*="col-"],
	.row.mt-xlg > form > .row > [class*="col-"] {
		padding-left: 0;
		padding-right: 0;
	}
}
@media (max-width: 991px) {
	.row.mt-xlg .btn {
		white-space: normal;
	}
}


/* -------------------------------------------------------------------------
   D-C156 (H-239)  --  POR DEBAJO DE 992 PX, INGRESAR A LO ANCHO, DEBAJO DE LA CLAVE
   -------------------------------------------------------------------------
   Decision de la persona, 2026-09-27, textual: «SI», a «en pantalla angosta
   el botón pasa a ocupar todo el ancho, debajo de la clave».

   LA CAUSA (H-239): el boton es `input.btn.pull-right` y, apiladas las
   columnas, sigue FLOTANDO: su `.grupo-form` mide 0 de alto y el renglon de
   «Olvidé mi contraseña | Solicitud de alta» le queda ENCIMA de la mitad de
   abajo. Un tap en el centro no lo apretaba: `elementFromPoint` devolvia el
   `.col-md-6`, el `.col-md-1` o el `.col-md-5` de abajo, por ORDEN DEL
   DOCUMENTO, no por z-index. ⛔ Subirle el z-index «funcionaria por
   accidente» y dejaria el contenedor de 0 px.

   ⛔ `float: none` LLEVA `!important` Y NO ES CAPRICHO: `.pull-right` de
   Bootstrap es `float: right !important`, y una declaracion `!important`
   solo la pisa otra `!important`. Es la unica de esta hoja.

   El selector arranca en `.row.login > #form_proveedor` porque el alta usa el
   MISMO id con otra estructura (`form#form_proveedor > .row.login`): su boton
   no entra en esta decision.

   ⛔ NO REVERTIR. Como se comprueba -- en /login, a 375 x 812: el boton va de
   x=15 a 360, igual que el campo de la clave, y `elementFromPoint` en su
   centro devuelve el boton; a 992 y a 1280 sigue a la derecha, con su ancho
   (113 px). El grupo `ingresar` de `tools/verificar-front-angosto.py`.
   ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.row.login > #form_proveedor input[type=submit] {
		float: none !important;
		display: block;
		width: 100%;
	}
}


/* -------------------------------------------------------------------------
   D-C157 (H-243) Y D-C341  --  EL ERROR DEL INGRESO, COMPACTO, Y SIN SALTO
   -------------------------------------------------------------------------
   D-C157, decision de la persona, 2026-09-27, textual: «a»: «el grupo del
   campo reserva desde el principio el alto del cartel, así el botón queda
   siempre un poco más abajo y no salta». En esta hoja, no en
   `global-simia.css`.
   D-C341, 2026-10-13 (cambia la FORMA de D-C157), textual: «Variante
   compacta (Recomendado)»: el campo con el borde rojo y el texto rojo
   debajo, sin el recuadro gris; cada campo reserva solo el renglon del texto.

   LA CAUSA (H-243): `jquery.validate` le pone `.has-error` al `.grupo-form`
   (`front/js/custom.js`, `highlight`) y `global-simia.css` la dibuja como un
   recuadro gris: margin 15px 0 30px, padding 12px, borde de 1 px, fondo,
   borde redondeado y sombra, y el renglon del texto (22 px). Medido a 1280,
   antes de R2-F: el grupo pasaba de 73 a 121 px de alto y sumaba 30 de
   margen -- +78 px POR CAMPO -- en el mismo `mousedown` que le saca el foco
   al mail: INGRESAR bajaba de y=343 a 421 (un cartel) o a 499 (los dos), el
   `mouseup` caia afuera y el clic se perdia. R2-F reservo el recuadro entero
   (INGRESAR en 499 SIEMPRE: «se nota bastante», O-4 de su cierre).

   EL ARREGLO (R2F.C): en el login el grupo deja de ser recuadro en LOS DOS
   estados -- los margenes de siempre (0 arriba, 15 abajo, `.grupo-form`), sin
   relleno arriba ni abajo, sin borde, sin fondo, sin redondeo y sin sombra --
   y en reposo reserva SOLO el renglon del texto (el `::after`, 22 px); con
   `.has-error` se apaga el renglon reservado, ocupa su lugar el del texto y
   el campo lleva el borde rojo. Nada vertical cambia entre los dos estados.
   Medido: el `y` de INGRESAR es el mismo en reposo, con el error del mail y
   con el mail corregido, a 1280 (387) y a 375 (469): un renglon por campo
   (44 px) debajo de donde estaba antes de R2-F (343 y 425).
   (Despues de un ENVIO con errores aparece ademas el cartel del formulario,
   arriba del mail -- D-C342, `custom.js` --: corre todo, ya despues del clic.)

   ⛔ EL RELLENO DE LOS COSTADOS VA ESCRITO (15 px, el de las columnas de
   Bootstrap): `.has-error` trae `padding: 12px` y un borde de 1 px, y el
   campo se corria 2 px a la izquierda al marcar el error. Con 0, todo el
   formulario se correria 15 px (la maqueta del auditor lo hacia).
   ⛔ ESTE SELECTOR (1-5-0) LE GANA A `.has-error` (0-1-0): por eso una sola
   regla sirve para los dos estados. El color rojo del rotulo y el tamaño del
   texto (12 px) siguen saliendo de `.has-error`.
   ⛔ EL BORDE ROJO VA SOLO CON ERROR: `.login .input-lg` es `border: 0`, y con
   `box-sizing: border-box` y el alto fijo de `.input-lg` (46 px) el borde no
   cambia el tamaño del campo. Es el rojo del rotulo (#ff0000); el texto
   conserva el suyo (el de Bootstrap para `.has-error .help-block`).
   ⛔ POR QUE `:not(:last-child)`: el tercer `.col-md-12` del formulario es el
   del boton; no tiene campo y nunca lleva `.has-error`: reservarle lugar
   solo bajaria mas el boton. (`:has()` lo diria mejor y no se usa: los
   telefonos viejos no lo conocen.)
   ⛔ EL RENGLON RESERVADO MIDE LO QUE EL DEL TEXTO: `line-height: 22px` (el
   del texto, medido) y una sola linea -- el texto mas largo, «Por favor,
   escribe una dirección de correo válida», mide 257 px y entra a 375 --.

   SOLO el login (`.row.login > #form_proveedor`): D-C157 y D-C341 son de
   `/login`. El modal «Olvidé» y el resto del front conservan el recuadro.

   ⛔ NO REVERTIR. Como se comprueba -- en /login, 1280 x 900: el `y` de
   INGRESAR es 387 (R2-F: 499; antes de R2-F: 343); escribir «noesunmail» en
   el mail y hacer clic en la clave: el `y` NO cambia, el grupo del mail no
   tiene fondo (`rgba(0, 0, 0, 0)`), su campo tiene `1px solid rgb(255, 0,
   0)` y el mismo `x` (167.5); y un clic SOSTENIDO 600 ms a 5 px del borde de
   arriba del boton, con el mail invalido y el foco en el mail, llega al
   boton. Los grupos `salto` y `compacto` de `tools/verificar-front-angosto.py`.
   ------------------------------------------------------------------------- */
.row.login > #form_proveedor > .col-md-12:not(:last-child) > .grupo-form {
	margin-top: 0;
	margin-bottom: 15px;
	padding: 0 15px;
	border: 0;
	border-radius: 0;
	background-color: transparent;
	box-shadow: none;
}
.row.login > #form_proveedor > .col-md-12:not(:last-child) > .grupo-form.has-error .form-control {
	border: 1px solid #ff0000;
}
.row.login > #form_proveedor > .col-md-12:not(:last-child) > .grupo-form::after {
	content: "\00a0";
	display: block;
	font-size: 12px;
	line-height: 22px;
}
.row.login > #form_proveedor > .col-md-12:not(:last-child) > .grupo-form.has-error::after {
	display: none;
}


/* =========================================================================
   E14 R2F.C  --  LA CORRECCION DE R2-F. 2026-10-13. D-C341, D-C342 y D-C325
   =========================================================================
   D-C341 (el error compacto) cambio la forma del bloque de D-C157, arriba, y
   D-C342 (el reintento) es de `front/js/custom.js`. Aca va lo de D-C325 POR
   PRINCIPIO (O-2 del cierre de R2-F; la persona, textual: «corregí la
   plantilla, tanto esta como el resto»): de 992 a 1440 ninguna pantalla del
   front tiene desplazamiento horizontal. Habia TRES causas, medidas:
     1. las filas anidadas de 992 a 999 px (a 992 la pagina medía 996): es la
        regla de D-C325, arriba, que paso de 991 a 999 px;
     2. el boton «¡Comunicación Importante!» de Bienvenido y Documentacion, de
        992 a 1439 px (a 1280 la pagina medía 1347): abajo;
     3. la imagen de /site/informacion, de 769 a 1023 px (a 992 la pagina
        medía 1024): abajo.
   Lo mide el grupo `ancho` de `tools/verificar-front-angosto.py` (cada
   pantalla a 992, 1024, 1280 y 1440, y cada estado a 1280).
   ========================================================================= */

/* -------------------------------------------------------------------------
   EL BOTON «¡COMUNICACIÓN IMPORTANTE!» (`#js-advertencia`) NO SE PASA DEL ANCHO
   -------------------------------------------------------------------------
   LA CAUSA: el boton mide 199 px (`.btn` es `nowrap`) y vive en la ultima
   columna de la cabecera, un `.col-md-1` de 97 px a 1280 (81 a 992): se sale
   por la derecha. A 1280 llegaba a x=1342 (la pagina, 1347); a 1024, 1135; a
   992, 1119. A 1440 se salia de la columna sin pasarse de la pantalla.

   EL ARREGLO: de 992 para arriba (las columnas en fila) el boton se ancla al
   borde DERECHO de su columna (`position: absolute; right: 15px`, el relleno
   de la columna; la columna es `position: relative`, de Bootstrap) y crece
   hacia la IZQUIERDA, sobre el `.col-md-5` vacio de al lado: queda entero, en
   el mismo renglon y a la misma altura, lejos del titulo. Debajo de 992 las
   columnas se apilan y el boton entra en su renglon: no se toca (R2-F).
   ⛔ NO es `white-space: normal`: partido en tres renglones de 81 px cambia
   la cabecera. Ni `overflow-x: hidden`, que lo recortaria.

   ⛔ NO REVERTIR. Como se comprueba -- en Bienvenido con un comunicado
   vigente, a 1280 x 900: `document.documentElement.scrollWidth` -> 1280 (sin
   esto, 1347).
   ------------------------------------------------------------------------- */
@media (min-width: 992px) {
	.initial-header > .com-imp > #js-advertencia {
		position: absolute;
		right: 15px;
	}
}
