/* HoraFiel · capa de plataforma e interacción (común a todas las páginas de la app).
   Criterios: respuesta al presionar en 140 ms con ease-out fuerte; hover solo donde existe hover real;
   nada de zoom al enfocar campos en iPhone; movimiento reducido si el sistema lo pide. */
:root{--ease-out:cubic-bezier(.23,1,.32,1)}
html{-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%}

/* Controles: sin retraso de toque, sin selección de texto ni menú de pulsación larga */
button,a,summary,[role=button],[role=link]{touch-action:manipulation}
button,summary,[role=button],[role=link],.btn,.gran,.pill{user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}

/* Respuesta al presionar (el dedo baja, el botón responde; no al soltar) */
.btn,.gran,button{transition:transform 140ms var(--ease-out),filter 140ms ease,background-color 140ms ease,opacity 140ms ease}
.btn:active,button:active{transform:scale(.97)}
.gran:active{transform:scale(.96)}
.btn:disabled,.gran:disabled,button:disabled{transform:none!important;cursor:default}

/* Hover solo con mouse: en celular el hover se queda pegado después del toque */
@media (hover:hover) and (pointer:fine){
  .btn:hover{filter:brightness(1.1)}
  .btn.l:hover{filter:none;background-color:#F1F3EE}
  .gran:hover{filter:brightness(1.06)}
  a:hover{text-decoration-thickness:2px}
  tbody tr:hover td{background:#FAFBF8}
}

/* Foco visible para teclado, invisible para mouse y dedo */
:focus-visible{outline:2.5px solid #17845F;outline-offset:2px;border-radius:6px}
input:focus-visible,select:focus-visible,textarea:focus-visible{outline:none;border-color:#17845F;box-shadow:0 0 0 3px rgba(23,132,95,.18)}
input,select,textarea{transition:border-color 140ms ease,box-shadow 140ms ease}

/* iPhone hace zoom (y no regresa) si el campo tiene letra menor a 16 px */
@media (pointer:coarse){input,select,textarea{font-size:16px!important}}

/* Entradas suaves: mensajes, vistas y diálogo. Ocasionales → animación estándar, < 300 ms */
.ok,.err,.aviso,#msg,section,.card#rDetalle{transition:opacity 220ms var(--ease-out),transform 220ms var(--ease-out)}
@starting-style{
  #msg:not([hidden]),section:not([hidden]),#rDetalle:not([hidden]),#errEntrar:not([hidden]),#errConsent:not([hidden]),#err:not([hidden]){opacity:0;transform:translateY(8px)}
}
dialog{opacity:0;transform:scale(.96);transition:opacity 180ms var(--ease-out),transform 180ms var(--ease-out),overlay 180ms allow-discrete,display 180ms allow-discrete}
dialog[open]{opacity:1;transform:scale(1)}
@starting-style{dialog[open]{opacity:0;transform:scale(.96)}}
dialog::backdrop{background:rgba(14,27,61,0);transition:background-color 180ms ease,overlay 180ms allow-discrete,display 180ms allow-discrete}
dialog[open]::backdrop{background:rgba(14,27,61,.45)}
@starting-style{dialog[open]::backdrop{background:rgba(14,27,61,0)}}

/* Momento de éxito al checar: pasa 2 veces al día, merece confirmación clara */
.gran{position:relative;overflow:hidden}
.gran .hecho{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;border-radius:50%;background:#17845F;color:#fff;opacity:0;transform:scale(.92);transition:opacity 200ms var(--ease-out),transform 260ms var(--ease-out);pointer-events:none}
.gran .hecho b{font-size:20px}
.gran.listo .hecho{opacity:1;transform:scale(1)}
.gran .hecho svg path{stroke-dasharray:30;stroke-dashoffset:30;transition:stroke-dashoffset 380ms var(--ease-out) 120ms}
.gran.listo .hecho svg path{stroke-dashoffset:0}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{transition-duration:.01ms!important;animation-duration:.01ms!important}
  .btn:active,button:active,.gran:active{transform:none}
}
