/* ============================================================================
   PANTALLA DE INGRESO — hoja compartida por los dos sistemas.

   ┌─ ESTE ARCHIVO ES GEMELO ──────────────────────────────────────────────┐
   │  C:\Build\HistorialPreciosWeb\wwwroot\lib\css\login-sistema.css       │
   │  C:\Build\RetailWeb\wwwroot\css\login.css                             │
   │                                                                        │
   │  Son BYTE A BYTE IDENTICOS. Al tocar uno, copiar el otro y verificar   │
   │  con Get-FileHash. Antes divergian porque la copia de ML tenia la      │
   │  regla de `body` recortada; ahora ninguna de las dos toca `body`, asi  │
   │  que el archivo es literalmente el mismo y no hay nada que adaptar.    │
   └────────────────────────────────────────────────────────────────────────┘

   Dos identidades sobre la MISMA estructura, para que el conmutador del logo
   se lea como una transicion y no como un salto entre dos sitios:

     data-sistema="pvp"     -> MercadoLibre. Carmin. Valores espejados de
                               hh-theme.css (--hh-primary, --hh-accent-dark).
     data-sistema="retail"  -> Retail. Teal profundo con acento ambar.

   POR QUE TOKENS PROPIOS Y NO --hh-*:
   retail NO carga hh-theme.css (es otra app, con CSP 'self'), asi que
   var(--hh-primary) no resolveria. Los tokens de abajo son el espejo local
   de hh-theme: mismos valores, declarados una sola vez. Si cambia la marca
   en hh-theme, se actualizan aca y en ningun otro lado de la pantalla.

   TIPOGRAFIA: stack del sistema a proposito. hh-theme importa Inter desde
   Google Fonts, pero la CSP de retail es 'self' y ahi no cargaria: las dos
   pantallas terminarian con tipografias distintas. La jerarquia se construye
   con escala, peso y tracking, no con la familia.
   ============================================================================ */

/* ══════════════════════════════════════════════════════════════════════════
   0. LA BASE DE LOS rem, IGUAL EN LAS DOS APPS

   Toda esta hoja mide en rem, y rem sale del font-size del <html>. En ML el
   layout carga site.css, que baja el html a 14px por debajo de 768px; retail
   no carga esa hoja y se queda en los 16px del navegador. Resultado: en el
   celular los dos logins tenian espaciados distintos —12,5% de diferencia en
   todo— y el logo dejaba de caer en el mismo punto al conmutar.

   El selector engancha con data-sistema, que las DOS pantallas ponen en el
   <html> (pvp / retail) y ninguna otra pagina usa: asi el resto del sistema
   conserva su escala legacy intacta.
   ══════════════════════════════════════════════════════════════════════════ */
html[data-sistema]{ font-size:16px; }

/* ══════════════════════════════════════════════════════════════════════════
   1. TOKENS BASE — geometria, movimiento y escala
   ══════════════════════════════════════════════════════════════════════════ */
:root{
  /* Radios */
  --lg-radio:16px;
  --lg-radio-sm:10px;
  --lg-radio-pill:999px;

  /* Movimiento. Una sola familia de duraciones para toda la pantalla:
     la guia de motion pide ritmo unificado. */
  --lg-t-rapida:140ms;
  --lg-t-media:240ms;
  --lg-t-identidad:520ms;   /* cambios de paleta al conmutar */
  --lg-giro:620ms;          /* vuelta y media de la moneda */
  --lg-ease:cubic-bezier(.22,.61,.36,1);
  --lg-ease-peso:cubic-bezier(.22,.8,.3,1);

  /* Espaciado */
  --lg-sp-1:.35rem;
  --lg-sp-2:.6rem;
  --lg-sp-3:.9rem;
  --lg-sp-4:1.25rem;
  --lg-sp-5:1.75rem;

  /* Escala tipografica fluida: sin media queries para el tamano, y sin
     saltos bruscos entre un notebook y un monitor grande. */
  --lg-txt-xs:clamp(.72rem, .68rem + .18vw, .79rem);
  --lg-txt-sm:clamp(.81rem, .78rem + .16vw, .87rem);
  --lg-txt-md:clamp(.88rem, .85rem + .18vw, .95rem);
  --lg-txt-lg:clamp(1.28rem, 1.12rem + .78vw, 1.6rem);

  /* Ancho de la columna del formulario. Igual en las dos pantallas: de aca
     sale la posicion horizontal del logo. */
  --lg-col:400px;
}

/* ══════════════════════════════════════════════════════════════════════════
   2. IDENTIDADES — lo unico que cambia entre los dos sistemas
   ══════════════════════════════════════════════════════════════════════════ */

/* --boton se separa de --acento a proposito: el acento es decorativo (halos,
   bordes, vinetas) y sobre texto blanco no llega a 4.5:1. Medido: carmin
   350 72% 48% da 3.9:1 y el teal 174 72% 36% da 3.65:1. Los tonos de --boton
   si cumplen AA. No unificar. */
html[data-sistema="pvp"]{
  --lg-acento:350 72% 48%;      /* = --hh-primary        */
  --lg-acento-2:350 72% 40%;    /* = --hh-primary-strong */
  --lg-boton:350 72% 38%;
  --lg-fondo-a:220 24% 14%;     /* = --hh-accent-dark    */
  --lg-fondo-b:350 45% 20%;
}

html[data-sistema="retail"]{
  --lg-acento:174 72% 36%;
  --lg-acento-2:38 92% 52%;
  --lg-boton:174 78% 26%;
  --lg-fondo-a:196 45% 10%;
  --lg-fondo-b:174 55% 16%;
}

/* Sin data-sistema: cae a la identidad de ML en vez de quedar sin color. */
:root{
  --lg-acento:350 72% 48%;
  --lg-acento-2:350 72% 40%;
  --lg-boton:350 72% 38%;
  --lg-fondo-a:220 24% 14%;
  --lg-fondo-b:350 45% 20%;
}

/* ══════════════════════════════════════════════════════════════════════════
   3. SUPERFICIES — dual-mode real

   El fondo es SIEMPRE el degradado oscuro de identidad: la pantalla de
   ingreso es inmersiva en los dos temas y de ahi sale su caracter.
   Lo que cambia con el tema es la TARJETA. Antes estaba clavada en blanco y
   el boton de tema no producia ningun efecto visible: existia y no hacia
   nada. Ahora el cambio se nota donde el usuario esta mirando.
   ══════════════════════════════════════════════════════════════════════════ */
:root,
html[data-theme="light"]{
  --lg-tarjeta:0 0% 100%;
  --lg-tarjeta-alpha:.97;
  --lg-campo:0 0% 100%;
  --lg-texto:220 25% 14%;
  --lg-texto-suave:220 10% 45%;
  --lg-borde:220 15% 88%;
  --lg-peligro:0 72% 42%;
  --lg-peligro-bg:0 70% 97%;
  --lg-peligro-borde:0 65% 88%;
  --lg-aviso:38 70% 26%;
  --lg-aviso-bg:38 92% 50%;
  --lg-aviso-borde:38 92% 40%;
}

html[data-theme="dark"]{
  --lg-tarjeta:220 20% 13%;
  --lg-tarjeta-alpha:.94;
  --lg-campo:220 20% 17%;
  --lg-texto:220 10% 95%;
  --lg-texto-suave:220 10% 68%;
  --lg-borde:220 15% 26%;
  --lg-peligro:0 72% 72%;
  --lg-peligro-bg:0 45% 18%;
  --lg-peligro-borde:0 55% 34%;
  --lg-aviso:38 92% 76%;
  --lg-aviso-bg:38 60% 22%;
  --lg-aviso-borde:38 55% 38%;
}

/* Sombras en capas: una sola sombra grande se lee como una mancha; dos capas
   (contacto corta + difusion larga) leen como elevacion real. */
:root{
  --lg-sombra-tarjeta:
      0 1px 2px hsl(var(--lg-fondo-a) / .28),
      0 18px 48px hsl(var(--lg-fondo-a) / .46);
  --lg-sombra-moneda:
      0 8px 26px hsl(var(--lg-fondo-a) / .55),
      0 0 0 5px hsl(var(--lg-acento) / .2);
}

/* ══════════════════════════════════════════════════════════════════════════
   4. NEUTRALIZAR LOS ENVOLTORIOS DEL LAYOUT DE ML

   En retail la pantalla ES el <body>. En ML vive dentro del layout general,
   que le pone fondo propio al body y envuelve todo en .hh-app > main.
   Antes esto se resolvia sacando la pantalla del flujo con
   `position:fixed; inset:0; z-index:50`, y ese hack traia el bug del alto:
   la pantalla media exactamente el viewport, sobraban 2 px, y al aparecer un
   mensaje de error el contenido se corria SIN barra visible (esta oculta a
   proposito). Se lee como "se rompio la pagina".

   Ahora la pantalla fluye normal y crece si hace falta. Estas reglas apagan
   los envoltorios. Son inocuas en retail: alli no existe .hh-body. */
html[data-theme] body.hh-body.hh-body--fullscreen{
  background:none;
}
html[data-theme] body.hh-body.hh-body--fullscreen .hh-app,
html[data-theme] body.hh-body.hh-body--fullscreen main[role="main"]{
  margin:0;padding:0;max-width:none;background:none;
}

/* ══════════════════════════════════════════════════════════════════════════
   5. EL LIENZO

   .hh-login-page es <body> en retail y un <div> en ML: por eso nunca se
   estiliza `body` directamente y todo cuelga de esta clase.
   ══════════════════════════════════════════════════════════════════════════ */
.hh-login-page{
  box-sizing:border-box;
  margin:0;
  /* dvh y no vh: en el navegador movil la barra de direcciones cambia el vh
     y la pantalla saltaba al aparecer el teclado. */
  min-height:100dvh;
  width:100%;
  /* Este padding define donde cae el logo. Es el mismo archivo en las dos
     pantallas, asi que ya no puede desincronizarse. */
  padding:1.4rem 1.5rem 1.6rem;
  display:grid;
  grid-auto-rows:min-content;
  justify-items:center;
  align-content:start;
  gap:1rem;

  font-family:"Segoe UI Variable Text","Segoe UI",-apple-system,
              BlinkMacSystemFont,"Helvetica Neue",Arial,sans-serif;
  font-size:var(--lg-txt-md);
  line-height:1.5;
  color:hsl(var(--lg-texto));
  -webkit-font-smoothing:antialiased;

  background:
    radial-gradient(1200px 600px at 15% -10%, hsl(var(--lg-acento) / .30), transparent 60%),
    radial-gradient(900px 500px at 110% 110%, hsl(var(--lg-acento-2) / .24), transparent 55%),
    linear-gradient(160deg, hsl(var(--lg-fondo-a)), hsl(var(--lg-fondo-b)));
  /* Sin background-attachment:fixed: en movil fuerza repintado en cada scroll
     y era el punto mas caro de la pantalla. Con el degradado en un contenedor
     que ya cubre todo el alto, se ve igual y no cuesta nada. */
  background-color:hsl(var(--lg-fondo-a));
  transition:background var(--lg-t-identidad) var(--lg-ease);

  /* La barra queda oculta pero el scroll sigue vivo (rueda, teclado, touch).
     Si una pantalla la muestra y la otra no, cambia el ancho util y el logo
     se corre al conmutar. */
  scrollbar-width:none;-ms-overflow-style:none;
}
.hh-login-page::-webkit-scrollbar{width:0;height:0}
.hh-login-page *,
.hh-login-page *::before,
.hh-login-page *::after{box-sizing:border-box}

.hh-login-page .pantalla{width:100%;max-width:var(--lg-col);text-align:center}

/* ══════════════════════════════════════════════════════════════════════════
   6. LOGO CONMUTADOR — la moneda

   Concepto intacto: gira SIEMPRE en el mismo sentido y acumula vueltas, como
   una moneda real. Se conserva tal cual estaba; solo cambian los tokens.
   ══════════════════════════════════════════════════════════════════════════ */

/* login-cabecera y no cabecera a secas: site.css define .cabecera para las
   grillas del sistema, con fondo oscuro !important, y dibujaba una caja negra
   detras del logo. */
.hh-login-page .login-cabecera{margin-bottom:1.5rem}

/* El marco aporta la PERSPECTIVE: sin ella el rotateY se renderiza plano y el
   giro no se percibe. Ademas aloja el halo, que dentro del boton quedaria
   atrapado en su contexto 3D. */
.hh-login-page .logo-marco{
  position:relative;width:104px;height:104px;margin:0 auto .85rem;
  perspective:900px;
}

.hh-login-page .halo{
  position:absolute;inset:-11px;border-radius:50%;
  border:2px solid hsl(var(--lg-acento) / .55);
  animation:lg-latir 2.6s ease-in-out infinite;
  transition:border-color var(--lg-t-identidad) var(--lg-ease);
  pointer-events:none;
}
/* Segundo anillo desfasado: hace el latido claramente visible */
.hh-login-page .halo::before{
  content:"";position:absolute;inset:-9px;border-radius:50%;
  border:1px solid hsl(var(--lg-acento) / .35);
  animation:lg-latir 2.6s ease-in-out infinite .6s;
}
@keyframes lg-latir{
  0%,100%{transform:scale(.94);opacity:.75}
  50%    {transform:scale(1.12);opacity:.12}
}

/* El enlace solo maneja hover, foco y clic. No rota: si compartiera transform
   con la moneda, una animacion pisaria a la otra. */
.hh-login-page .logo-boton{
  position:relative;width:100%;height:100%;padding:0;margin:0;
  display:block;cursor:pointer;background:none;border:0;border-radius:50%;
  transition:transform 220ms cubic-bezier(.34,1.4,.64,1);
  text-decoration:none;color:inherit;-webkit-tap-highlight-color:transparent;
}
.hh-login-page .logo-boton:focus-visible{
  outline:3px solid hsl(var(--lg-acento) / .85);outline-offset:8px;
}
.hh-login-page .logo-boton:hover{transform:scale(1.06)}
.hh-login-page .logo-boton:active{transform:scale(.96)}

/* El angulo se aplica como transform INLINE desde el JS, no via variable CSS:
   `transition` no interpola custom properties salvo que se registren con
   @property, y con var(--giro) el giro saltaba de golpe. */
.hh-login-page .moneda{
  position:absolute;inset:0;display:block;
  transform-style:preserve-3d;
  transform:rotateY(0deg);
  transition:transform var(--lg-giro) var(--lg-ease-peso);
}

.hh-login-page .logo-cara{
  position:absolute;inset:0;display:grid;place-items:center;
  border-radius:50%;backface-visibility:hidden;
  background:hsl(0 0% 100% / .97);
  box-shadow:var(--lg-sombra-moneda);
  transition:box-shadow var(--lg-t-identidad) var(--lg-ease);
  /* translateZ(0) fuerza capa propia: sin esto el navegador rasteriza la cara
     al tamano en pantalla y la escala, y el logo se ve borroso al rotar. */
  transform:translateZ(0);
}
.hh-login-page .logo-dorso{transform:rotateY(180deg) translateZ(0)}

.hh-login-page .logo-cara img{
  width:74%;height:auto;display:block;
  image-rendering:auto;backface-visibility:hidden;
}

html[data-sistema="retail"] .hh-login-page .logo-cara,
html[data-sistema="retail"].hh-login-page .logo-cara{
  box-shadow:
      0 8px 26px hsl(var(--lg-fondo-a) / .55),
      0 0 0 5px hsl(var(--lg-acento) / .4);
}
.hh-login-page .logo-boton:hover .logo-cara{
  box-shadow:
      0 12px 34px hsl(var(--lg-fondo-a) / .65),
      0 0 0 8px hsl(var(--lg-acento) / .3);
}

/* Canto: el borde metalico que asoma cuando la moneda pasa de perfil. */
.hh-login-page .canto{
  position:absolute;inset:0;border-radius:50%;
  transform:rotateY(90deg);
  background:linear-gradient(90deg,
      hsl(var(--lg-acento) / .95) 0%,
      hsl(var(--lg-acento) / .55) 22%,
      hsl(0 0% 100% / .85)        50%,
      hsl(var(--lg-acento) / .55) 78%,
      hsl(var(--lg-acento) / .95) 100%);
  box-shadow:0 0 22px hsl(var(--lg-acento) / .6);
  transition:background var(--lg-t-identidad) var(--lg-ease);
  pointer-events:none;
}

/* Destello que barre la cara: refuerza la lectura de material solido */
.hh-login-page .brillo{
  position:absolute;inset:0;border-radius:50%;pointer-events:none;
  background:linear-gradient(115deg,
      transparent 30%, hsl(0 0% 100% / .55) 47%, transparent 62%);
  opacity:0;
}
.hh-login-page .moneda.girando .brillo{animation:lg-destello var(--lg-giro) ease-out}
@keyframes lg-destello{
  0%  {opacity:0;   transform:translateX(-45%)}
  35% {opacity:.85}
  70% {opacity:.25}
  100%{opacity:0;   transform:translateX(45%)}
}

/* Mientras gira se levanta y vuelve a apoyar: da peso al movimiento. El salto
   va en el MARCO porque la moneda ya usa transform para rotar. */
.hh-login-page .logo-marco.girando{animation:lg-saltito var(--lg-giro) var(--lg-ease-peso)}
@keyframes lg-saltito{
  0%  {transform:translateY(0)    scale(1)}
  30% {transform:translateY(-9px) scale(1.08)}
  60% {transform:translateY(-4px) scale(1.04)}
  100%{transform:translateY(0)    scale(1)}
}
.hh-login-page .logo-marco.girando .halo{animation:lg-halo var(--lg-giro) var(--lg-ease-peso)}
@keyframes lg-halo{
  0%  {transform:scale(.94);opacity:.75}
  35% {transform:scale(1.3); opacity:.15}
  100%{transform:scale(.94);opacity:.75}
}

/* ══════════════════════════════════════════════════════════════════════════
   7. TEXTOS DEL SISTEMA
   ══════════════════════════════════════════════════════════════════════════ */
.hh-login-page .sistema{transition:opacity var(--lg-t-media) ease}
.hh-login-page .sistema.cambiando{opacity:0}

/* Usa --boton (tono oscuro ya verificado) y no --acento: con texto blanco el
   acento se queda en 3.65:1 en la identidad teal. */
.hh-login-page .pill{
  display:inline-block;padding:.24rem .82rem;border-radius:var(--lg-radio-pill);
  background:hsl(var(--lg-boton) / .92);
  color:hsl(0 0% 100%);
  border:1px solid hsl(var(--lg-acento) / .75);
  font-size:var(--lg-txt-xs);font-weight:600;
  letter-spacing:.06em;text-transform:uppercase;
  transition:background var(--lg-t-identidad) var(--lg-ease),
             border-color var(--lg-t-identidad) var(--lg-ease);
}

/* Especificidad reforzada en el h1: hh-theme pinta los titulos con
   `html[data-theme] body.hh-body h1` (0,2,3) y le ganaba a un `.sistema h1`,
   dejandolos gris oscuro e ilegibles sobre el degradado. Se iguala el peso
   del selector en vez de recurrir a !important. */
.hh-login-page .sistema h1,
html[data-theme] body.hh-body .hh-login-page .sistema h1{
  margin:.6rem 0 .25rem;
  font-size:var(--lg-txt-lg);
  font-weight:700;
  letter-spacing:-.015em;
  line-height:1.15;
  color:hsl(0 0% 100%);
  text-shadow:0 2px 14px hsl(var(--lg-fondo-a) / .85);
}
.hh-login-page .sistema .sub,
html[data-theme] body.hh-body .hh-login-page .sistema .sub{
  margin:0;color:hsl(0 0% 100% / .72);font-size:var(--lg-txt-sm);
}

.hh-login-page .pista{
  margin:.9rem 0 0;color:hsl(0 0% 100% / .5);font-size:var(--lg-txt-xs);
  display:flex;align-items:center;justify-content:center;gap:var(--lg-sp-1);
}
.hh-login-page .pista .flecha{display:inline-block;animation:lg-subir 1.9s ease-in-out infinite}
@keyframes lg-subir{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}

/* ══════════════════════════════════════════════════════════════════════════
   8. TARJETA DEL FORMULARIO
   ══════════════════════════════════════════════════════════════════════════ */
.hh-login-page .tarjeta{
  background:hsl(var(--lg-tarjeta) / var(--lg-tarjeta-alpha));
  border:1px solid hsl(0 0% 100% / .1);
  border-radius:var(--lg-radio);
  padding:var(--lg-sp-5);
  box-shadow:var(--lg-sombra-tarjeta);
  text-align:left;
  color:hsl(var(--lg-texto));
  transition:box-shadow var(--lg-t-identidad) var(--lg-ease),
             background var(--lg-t-media) ease;
}

.hh-login-page .tarjeta label{
  display:block;
  font-size:var(--lg-txt-sm);
  font-weight:500;
  color:hsl(var(--lg-texto-suave));
  margin:var(--lg-sp-3) 0 var(--lg-sp-1);
}
.hh-login-page .tarjeta label:first-of-type{margin-top:0}

/* min-height 48px: el minimo tactil es 44 y los campos median 43. */
.hh-login-page .tarjeta input:not([type="checkbox"]){
  width:100%;font:inherit;font-size:var(--lg-txt-md);
  padding:.72rem .8rem;min-height:48px;
  border:1px solid hsl(var(--lg-borde));
  border-radius:var(--lg-radio-sm);
  background:hsl(var(--lg-campo));
  color:hsl(var(--lg-texto));
  transition:border-color var(--lg-t-rapida) ease,
             box-shadow var(--lg-t-rapida) ease;
}
.hh-login-page .tarjeta input::placeholder{color:hsl(var(--lg-texto-suave) / .7)}
.hh-login-page .tarjeta input:not([type="checkbox"]):focus{
  outline:none;
  border-color:hsl(var(--lg-acento));
  box-shadow:0 0 0 3px hsl(var(--lg-acento) / .26);
}
/* El navegador pinta el autofill con un amarillo fijo que ignora el tema y en
   modo oscuro deja texto negro sobre celeste. El inset lo tapa. */
.hh-login-page .tarjeta input:-webkit-autofill{
  -webkit-text-fill-color:hsl(var(--lg-texto));
  box-shadow:0 0 0 100px hsl(var(--lg-campo)) inset;
}

/* ── Campo con icono ──────────────────────────────────────────────────────
   El icono es decorativo (aria-hidden): el <label> ya nombra el campo. El
   padding del input le reserva el lugar en vez de superponerse al texto. */
.hh-login-page .campo-icono{position:relative}
.hh-login-page .campo-icono > i,
.hh-login-page .campo-icono > .ico{
  position:absolute;left:.85rem;top:50%;
  transform:translateY(-50%);
  color:hsl(var(--lg-texto-suave));
  font-size:.95rem;
  width:1.05rem;height:1.05rem;
  pointer-events:none;
}
/* El SVG de retail se dibuja con stroke; el <i> de Font Awesome con fill. */
.hh-login-page .campo-icono > .ico{
  fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
}
/* OJO CON LA ESPECIFICIDAD: la regla base de arriba es
   `.hh-login-page .tarjeta input:not([type="checkbox"])` = (0,3,1) y aplica el
   shorthand `padding`. Estas dos reglas tienen que IGUALARLA O SUPERARLA o su
   padding no se aplica nunca: sin el `.tarjeta` quedaban en (0,2,1), perdian,
   y el texto arrancaba debajo del icono (se montaban). Con `.tarjeta` van a
   (0,4,1) y ganan. Si algun dia se toca el selector base, revisar estos dos. */
.hh-login-page .tarjeta .campo-icono input{padding-left:2.5rem}
/* Sitio para el boton de ver la contrasena */
.hh-login-page .tarjeta .campo-icono--clave input{padding-right:3rem}

/* ── Ver / ocultar contrasena ─────────────────────────────────────────────
   Recomendacion de Material: escribir una clave a ciegas es la causa mas
   comun de "credenciales invalidas" cuando en realidad estaba bien tipeada. */
.hh-login-page .ver-clave{
  position:absolute;right:.35rem;top:50%;transform:translateY(-50%);
  width:40px;height:40px;
  display:grid;place-items:center;
  padding:0;border:0;border-radius:var(--lg-radio-sm);
  background:none;color:hsl(var(--lg-texto-suave));
  cursor:pointer;
  transition:color var(--lg-t-rapida) ease,background var(--lg-t-rapida) ease;
}
.hh-login-page .ver-clave:hover{
  color:hsl(var(--lg-texto));
  background:hsl(var(--lg-texto-suave) / .12);
}
.hh-login-page .ver-clave:focus-visible{
  outline:2px solid hsl(var(--lg-acento));outline-offset:1px;
}
.hh-login-page .ver-clave i,
.hh-login-page .ver-clave .ico{
  width:1.05rem;height:1.05rem;font-size:.95rem;
  fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
}
.hh-login-page .ver-clave .ico-off{display:none}
.hh-login-page .ver-clave.is-visible .ico-on{display:none}
.hh-login-page .ver-clave.is-visible .ico-off{display:block}

/* ── Recordar cuenta ──────────────────────────────────────────────────────
   Toda la fila es el area de clic, no solo el cuadradito de 17 px. */
.hh-login-page .tarjeta .recordar{
  display:flex;align-items:center;gap:var(--lg-sp-2);
  margin:var(--lg-sp-4) 0 0;
  font-size:var(--lg-txt-sm);font-weight:400;
  color:hsl(var(--lg-texto-suave));
  cursor:pointer;min-height:44px;
}
.hh-login-page .tarjeta .recordar input{
  width:18px;height:18px;min-height:0;margin:0;padding:0;
  accent-color:hsl(var(--lg-boton));
  cursor:pointer;
}

/* ── Boton principal ──────────────────────────────────────────────────────
   Unico CTA primario de la pantalla. */
.hh-login-page .entrar{
  width:100%;margin-top:var(--lg-sp-4);
  padding:.8rem;min-height:50px;
  display:flex;align-items:center;justify-content:center;gap:var(--lg-sp-2);
  font:inherit;font-size:var(--lg-txt-md);font-weight:600;
  color:hsl(0 0% 100%);
  background:hsl(var(--lg-boton));
  border:0;border-radius:var(--lg-radio-sm);cursor:pointer;
  transition:background var(--lg-t-identidad) var(--lg-ease),
             transform var(--lg-t-rapida) ease,
             box-shadow var(--lg-t-media) ease;
}
.hh-login-page .entrar:hover{box-shadow:0 8px 22px hsl(var(--lg-boton) / .5)}
.hh-login-page .entrar:active{transform:translateY(1px)}
.hh-login-page .entrar:focus-visible{outline:3px solid hsl(var(--lg-acento));outline-offset:2px}
.hh-login-page .entrar .ico,
.hh-login-page .entrar i{
  width:1.05rem;height:1.05rem;
  fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
}
/* Sin este reset el <i> de Font Awesome hereda stroke y se dibuja hueco. */
.hh-login-page .entrar i,
.hh-login-page .campo-icono > i,
.hh-login-page .ver-clave i{stroke:none;fill:currentColor}

/* ── Refuerzo de hover, solo por ML ───────────────────────────────────────
   hh-theme.css pisa el color de CUALQUIER <button> al pasar el mouse con
   `html[data-theme] body.hh-body button:not(.hh-btn--primary):not(.hh-btn--danger):hover`,
   que pesa (0,5,3). Sin esto, en ML el texto de "Iniciar sesion" se volvia
   oscuro sobre el carmin —ilegible— y el icono del boton de tema se apagaba.
   En retail no pasaba porque alli no se carga hh-theme: era una divergencia
   silenciosa entre dos pantallas que tienen que verse iguales.

   Se gana por peso de selector, no con !important, que v2 prohibe. Las tres
   reglas llegan a 6 clases contra las 5 de hh-theme. El boton de tema no vive
   dentro de .tarjeta, asi que ahi el peso se completa repitiendo su clase.
   Todo esto es inocuo en retail: no existe .hh-body. */
html[data-theme] body.hh-body .hh-login-page .tarjeta .entrar:hover{
  color:hsl(0 0% 100%);
}
html[data-theme] body.hh-body .hh-login-page .tarjeta .ver-clave:hover{
  color:hsl(var(--lg-texto));
}
html[data-theme] body.hh-body .hh-login-page .hh-login-theme-toggle.hh-login-theme-toggle:hover{
  color:hsl(0 0% 100% / .9);
}

/* ══════════════════════════════════════════════════════════════════════════
   9. MENSAJES

   La guia pide que el color no sea el unico portador del significado: los dos
   llevan icono, y el texto dice que pasa y que hacer.
   ══════════════════════════════════════════════════════════════════════════ */
.hh-login-page .alerta{
  display:flex;align-items:flex-start;gap:var(--lg-sp-2);
  background:hsl(var(--lg-peligro-bg));
  color:hsl(var(--lg-peligro));
  border:1px solid hsl(var(--lg-peligro-borde));
  padding:.65rem .8rem;border-radius:var(--lg-radio-sm);
  margin-bottom:var(--lg-sp-4);
  font-size:var(--lg-txt-sm);line-height:1.45;
}

/* Token vencido. Ambar y no el rojo de .alerta porque NO es un error del
   usuario: la credencial puede estar perfecta. */
.hh-login-page .aviso-expirado{
  display:flex;align-items:flex-start;gap:var(--lg-sp-2);
  background:hsl(var(--lg-aviso-bg) / .16);
  color:hsl(var(--lg-aviso));
  border:1px solid hsl(var(--lg-aviso-borde) / .45);
  padding:.65rem .8rem;border-radius:var(--lg-radio-sm);
  margin-bottom:var(--lg-sp-4);
  font-size:var(--lg-txt-sm);line-height:1.45;
}
html[data-theme="dark"] .hh-login-page .aviso-expirado{
  background:hsl(var(--lg-aviso-bg));
}
.hh-login-page .alerta .ico,
.hh-login-page .alerta i,
.hh-login-page .aviso-expirado .ico,
.hh-login-page .aviso-expirado i{
  width:1.05rem;height:1.05rem;flex-shrink:0;margin-top:.12rem;
  fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
}
.hh-login-page .alerta i,
.hh-login-page .aviso-expirado i{stroke:none;fill:currentColor}

/* Error de un campo puntual, debajo del campo y no en un resumen arriba. */
.hh-login-page .error-campo{
  display:block;margin-top:var(--lg-sp-1);
  color:hsl(var(--lg-peligro));
  font-size:var(--lg-txt-xs);
}
.hh-login-page .error-campo:empty{display:none}

/* ══════════════════════════════════════════════════════════════════════════
   10. BLOQUE TRADEMARK

   Va FUERA de .pantalla para usar mas ancho: dentro de los 400 px del
   formulario estiraba la pagina a lo largo.
   ══════════════════════════════════════════════════════════════════════════ */
.hh-login-page .trademark{
  width:100%;
  /* 840 y no 760: con la caja angosta el texto de la nota caia en 5 renglones
     y el bloque pasaba 23 px del viewport. */
  max-width:840px;
  margin:0;text-align:center;
  color:hsl(0 0% 100% / .85);
}
.hh-login-page .trademark-badge{
  display:inline-flex;align-items:center;gap:.45rem;
  padding:.3rem .9rem;border-radius:var(--lg-radio-pill);
  background:hsl(0 0% 100% / .12);
  border:1px solid hsl(0 0% 100% / .3);
  color:hsl(0 0% 100%);
  font-size:var(--lg-txt-xs);font-weight:600;
  letter-spacing:.05em;text-transform:uppercase;
}
.hh-login-page .trademark-badge .ico,
.hh-login-page .trademark-badge i{
  width:.95rem;height:.95rem;
  fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
}
.hh-login-page .trademark-badge i{stroke:none;fill:currentColor}

.hh-login-page .trademark h2,
html[data-theme] body.hh-body .hh-login-page .trademark h2{
  margin:.5rem 0 .3rem;
  font-size:clamp(1.02rem, .95rem + .34vw, 1.2rem);
  font-weight:700;letter-spacing:-.01em;
  color:hsl(0 0% 100%);
  text-shadow:0 2px 14px hsl(var(--lg-fondo-a) / .85);
}
.hh-login-page .trademark-sub{
  margin:0 0 .8rem;
  font-size:var(--lg-txt-sm);line-height:1.5;
  color:hsl(0 0% 100% / .72);
}

/* Las dos cajas en paralelo: apiladas empujaban el alto por encima del
   viewport. La nota lleva mas texto, asi que se queda con mas ancho: en
   mitades iguales necesitaba un renglon extra y era ese renglon el que
   empujaba la pantalla al scroll. */
.hh-login-page .trademark-cols{
  display:grid;
  grid-template-columns:.88fr 1.12fr;
  gap:.8rem;align-items:stretch;
}

.hh-login-page .trademark-lista{
  list-style:none;
  display:grid;gap:.3rem;align-content:center;
  margin:0;padding:.8rem 1rem;text-align:left;
  border-radius:var(--lg-radio);
  background:hsl(0 0% 100% / .08);
  border:1px solid hsl(0 0% 100% / .16);
}
.hh-login-page .trademark-lista li{
  position:relative;padding-left:1.1rem;margin:0;
  font-size:var(--lg-txt-sm);line-height:1.45;
  color:hsl(0 0% 100% / .88);
}
.hh-login-page .trademark-lista li::before{
  content:"";position:absolute;left:0;top:.55em;
  width:6px;height:6px;border-radius:50%;
  background:hsl(var(--lg-acento));
  box-shadow:0 0 8px hsl(var(--lg-acento) / .8);
}

.hh-login-page .trademark-nota{
  display:flex;gap:.7rem;text-align:left;
  padding:.8rem 1rem;border-radius:var(--lg-radio);
  background:hsl(0 0% 100% / .07);
  border:1px solid hsl(0 0% 100% / .14);
  font-size:var(--lg-txt-sm);line-height:1.55;
  color:hsl(0 0% 100% / .8);
}
.hh-login-page .trademark-nota .ico,
.hh-login-page .trademark-nota i{
  margin-top:.2rem;flex-shrink:0;
  width:1.05rem;height:1.05rem;
  color:hsl(var(--lg-acento));
  fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
}
.hh-login-page .trademark-nota i{stroke:none;fill:currentColor}
.hh-login-page .trademark-nota strong{
  display:block;color:hsl(0 0% 100%);margin-bottom:.15rem;
}

/* ══════════════════════════════════════════════════════════════════════════
   11. BOTON DE TEMA (solo ML)
   ══════════════════════════════════════════════════════════════════════════ */
.hh-login-theme-toggle{
  position:absolute;top:18px;right:18px;
  width:44px;height:44px;
  display:grid;place-items:center;
  border-radius:50%;
  border:1px solid hsl(0 0% 100% / .28);
  background:hsl(0 0% 100% / .12);
  color:hsl(0 0% 100% / .9);
  cursor:pointer;z-index:2;
  transition:background var(--lg-t-media) ease,
             border-color var(--lg-t-media) ease,
             transform var(--lg-t-media) ease;
}
.hh-login-theme-toggle:hover{
  background:hsl(0 0% 100% / .22);
  border-color:hsl(0 0% 100% / .5);
  transform:rotate(15deg);
}
.hh-login-theme-toggle:focus-visible{
  outline:3px solid hsl(0 0% 100% / .8);outline-offset:2px;
}

/* ══════════════════════════════════════════════════════════════════════════
   12. MENOS MOVIMIENTO

   Windows Server suele venir con las animaciones desactivadas y por escritorio
   remoto es lo habitual, asi que el navegador reporta reduce. Anular TODO
   dejaba el conmutador sin ninguna respuesta visual y parecia roto: lo que la
   preferencia pide es evitar movimiento excesivo, no eliminar la animacion
   funcional. Se conserva el giro, mas corto y en media vuelta, y se quitan los
   adornos (latido, destello, salto).
   ══════════════════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: reduce){
  .hh-login-page .halo,
  .hh-login-page .halo::before{animation:none;opacity:.4}
  .hh-login-page .pista .flecha{animation:none}
  .hh-login-page .moneda{transition-duration:420ms}
  .hh-login-page .moneda.girando .brillo{animation:none;opacity:0}
  .hh-login-page .logo-marco.girando{animation:none}
  .hh-login-page .logo-boton{transition-duration:120ms}
  .hh-login-page,
  .hh-login-page .tarjeta,
  .hh-login-page .entrar{transition-duration:1ms}
}

/* ══════════════════════════════════════════════════════════════════════════
   13. PANTALLAS ANGOSTAS
   ══════════════════════════════════════════════════════════════════════════ */
/* Sin ancho para dos cajas, la lista y la nota vuelven a apilarse: ahi el
   scroll es esperable y no compite con nada. */
@media (max-width:700px){
  .hh-login-page .trademark-cols{grid-template-columns:1fr}
}
@media (max-width:420px){
  .hh-login-page{padding:1.5rem 1rem 2.5rem}
  .hh-login-page .logo-marco{width:92px;height:92px}
  .hh-login-page .tarjeta{padding:var(--lg-sp-4)}
}
