﻿@charset "UTF-8";
/* =============================================================================
   SIPES · Acceso al sistema
   Capa de presentación sobre Vuetify 2 (v-app, v-card, v-form, v-text-field,
   v-btn, v-icon, v-divider). No contiene lógica de negocio.

   Se enlaza al final del <head>, después de vuetify.min.css, para resolver los
   empates de especificidad con las reglas de tema de Vuetify sin recurrir a
   !important.
   ============================================================================= */

/* -----------------------------------------------------------------------------
   1. Lienzo
   -------------------------------------------------------------------------- */
html.login-html {
    /* Vuetify aplica overflow-y:scroll al <html> y muestra la barra siempre. */
    overflow-y: auto;
}

/* -----------------------------------------------------------------------------
   2. Tokens de diseño (un único punto de ajuste para toda la vista)
   -------------------------------------------------------------------------- */
.login {
    --login-surface: rgba(11, 27, 51, .48);
    --login-line: rgba(255, 255, 255, .18);
    --login-text: #f5f8fc;
    --login-muted: rgba(233, 240, 250, .74);
    --login-field: rgba(255, 255, 255, .95);
    --login-focus: #9dc0f2;
    --login-radius: 26px;
    --login-blur: 20px;
    --login-photo-blur: 2px;
    --login-gap: clamp(1rem, .85rem + .6vw, 1.25rem);
    --login-shadow: 0 28px 70px -28px rgba(2, 8, 20, .92);

    color: var(--login-text);
}

/* -----------------------------------------------------------------------------
   3. Fondo: fotografía difuminada + velo de contraste
   -------------------------------------------------------------------------- */
.login__photo,
.login__veil {
    position: fixed;
    pointer-events: none;
}

.login__photo {
    /* El desenfoque difumina también los bordes: se desborda el viewport para
       que no aparezca el halo claro del filtro. */
    inset: calc(var(--login-photo-blur) * -3);
    background-position: center;
    background-size: cover;
    filter: blur(var(--login-photo-blur)) saturate(115%);
}

/* Velo de contraste. Los alfas son el "grado" del degradado: cuanto más bajos,
   más se aprecia la fotografía. Se mantiene algo más oscuro en la parte baja
   para que el texto del pie conserve legibilidad. */
.login__veil {
    inset: 0;
    background:
        radial-gradient(115% 90% at 50% 6%, rgba(9, 22, 44, .24), rgba(5, 12, 26, .64) 78%),
        linear-gradient(180deg, rgba(6, 14, 30, .28), rgba(4, 10, 22, .56));
}

/* -----------------------------------------------------------------------------
   4. Estructura
   -------------------------------------------------------------------------- */
.login__shell {
    position: relative;
    z-index: 1;
    flex: 1 1 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: clamp(1rem, 3vw, 2.5rem);
}

.login__footer {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .55rem;
    padding: 0 clamp(1rem, 3vw, 2.5rem) clamp(1rem, 3vh, 1.75rem);
    font-size: .72rem;
    line-height: 1.5;
    text-align: center;
    color: var(--login-muted);
}

/* -----------------------------------------------------------------------------
   5. Tarjeta de acceso
   -------------------------------------------------------------------------- */
.login .login__card.v-card {
    width: 100%;
    max-width: 26rem;
    padding: clamp(1.5rem, 1.1rem + 1.6vw, 2.5rem);
    border: 1px solid var(--login-line);
    border-radius: var(--login-radius);
    background: var(--login-surface);
    color: var(--login-text);
    box-shadow: var(--login-shadow);
    -webkit-backdrop-filter: blur(var(--login-blur)) saturate(160%);
    backdrop-filter: blur(var(--login-blur)) saturate(160%);
}

/* Navegadores sin backdrop-filter: el vidrio se vuelve opaco para no perder
   legibilidad sobre la fotografía. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
    .login .login__card.v-card {
        background: rgba(9, 22, 42, .93);
    }
}

.login__brand {
    margin-bottom: clamp(1.25rem, 1rem + 1vw, 1.75rem);
    text-align: center;
}

.login__logo {
    width: clamp(8.5rem, 46%, 11.5rem);
    height: auto;
    max-width: 100%;
}

.login__tagline {
    margin-top: .7rem;
    font-size: clamp(.68rem, .64rem + .1vw, .75rem);
    font-weight: 500;
    line-height: 1.5;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--login-muted);
}

.login .login__divider.v-divider {
    margin-bottom: clamp(1rem, .85rem + .6vw, 1.35rem);
    border-color: var(--login-line);
}

.login__form {
    display: grid;
    gap: var(--login-gap);
}

/* -----------------------------------------------------------------------------
   6. Campos de captura
   -------------------------------------------------------------------------- */
.login .v-text-field.v-text-field--solo > .v-input__control > .v-input__slot {
    background: var(--login-field);
    transition: background-color .2s ease, box-shadow .2s ease;
}

.login .v-text-field.v-text-field--solo.v-input--is-focused > .v-input__control > .v-input__slot {
    box-shadow: 0 0 0 2px var(--login-focus), 0 6px 18px -10px rgba(2, 8, 20, .8);
}

.login .v-text-field input {
    font-size: .95rem;
    color: rgba(9, 20, 38, .92);
}

.login .v-text-field input::placeholder {
    color: rgba(9, 20, 38, .55);
    opacity: 1;
}

/* El icono de estado cambia de color sin saltos: el color lo fija la vista. */
.login .v-text-field .v-input__icon--append .v-icon,
.login .v-text-field .v-input__prepend-inner .v-icon {
    transition: color .2s ease;
}

/* -----------------------------------------------------------------------------
   7. Acciones
   -------------------------------------------------------------------------- */
.login .login__submit.v-btn {
    height: 52px;
    font-size: .95rem;
    font-weight: 700;
    letter-spacing: .09em;
    text-transform: uppercase;
    transition: transform .2s ease, box-shadow .2s ease, background-color .2s ease;
}

.login .login__submit.v-btn:hover {
    transform: translateY(-1px);
    box-shadow: 0 14px 28px -14px rgba(2, 8, 20, .95);
}

.login .login__recover.v-btn {
    height: 40px;
    font-size: .78rem;
    font-weight: 500;
    letter-spacing: .02em;
    text-transform: none;
    color: var(--login-muted);
}

.login .login__recover.v-btn:hover {
    color: var(--login-text);
}

/* -----------------------------------------------------------------------------
   8. Pie de página
   -------------------------------------------------------------------------- */
.login__seal {
    display: flex;
    justify-content: center;
    filter: drop-shadow(0 4px 12px rgba(2, 8, 20, .45));
}

.login__seal img {
    max-width: 100%;
    height: auto;
}

.login__copy {
    letter-spacing: .08em;
}

.login__legal {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: .35rem .9rem;
}

.login__legal a {
    padding-bottom: 1px;
    font-weight: 600;
    letter-spacing: .04em;
    color: var(--login-text);
    text-decoration: none;
    border-bottom: 1px solid var(--login-line);
    transition: border-color .2s ease, color .2s ease;
}

.login__legal a:hover,
.login__legal a:focus-visible {
    color: #fff;
    border-bottom-color: currentColor;
}

.login__slogan {
    font-style: italic;
}

.login a:focus-visible,
.login button:focus-visible {
    outline: 2px solid var(--login-focus);
    outline-offset: 2px;
}

/* -----------------------------------------------------------------------------
   9. Adaptaciones responsivas
   -------------------------------------------------------------------------- */
@media (max-width: 600px) {
    .login {
        --login-radius: 22px;
        --login-blur: 14px;
        --login-photo-blur: 3px;
    }

    .login .login__card.v-card {
        max-width: none;
    }
}

/* Teléfonos en horizontal o ventanas muy bajas: se comprime la composición
   para que el formulario nunca quede fuera de la pantalla. */
@media (max-height: 640px) {
    .login__logo {
        width: clamp(7rem, 34%, 9rem);
    }

    .login__brand {
        margin-bottom: .85rem;
    }

    .login .login__card.v-card {
        padding-block: 1.15rem;
    }
}

@media (prefers-reduced-motion: reduce) {
    .login *,
    .login *::before,
    .login *::after {
        transition-duration: .01ms !important;
    }

    .login .login__submit.v-btn:hover {
        transform: none;
    }
}

/* -----------------------------------------------------------------------------
   10. Indicador de progreso
   blockUI lo inserta directamente en el <body>, fuera del árbol de Vue, por eso
   se estiliza sin el prefijo .login.

   blockUI coloca su mensaje con top:40% / left:35% / width:30%; el spinner se
   fija al viewport para quedar centrado en la pantalla, sin depender de ese
   bloque (que va transparente y sin bordes).
   -------------------------------------------------------------------------- */
.login-spinner {
    position: fixed;
    inset: 0;
    width: 44px;
    height: 44px;
    margin: auto;
    border: 3px solid rgba(11, 27, 51, .18);
    border-top-color: #2e5c9e;
    border-radius: 50%;
    animation: login-spin .8s linear infinite;
}

@keyframes login-spin {
    to {
        transform: rotate(360deg);
    }
}
