/*
 * Signed-out pages: sign-in (email or mobile + one-time code), contract
 * OTP and sign-up (templates/user_app/base_auth.html and its children).
 *
 * Load order: ui-tokens.css -> bootstrap.min.css -> this file.
 * Standalone on purpose: it does not need ui.css, so the login screen keeps
 * working whatever happens to the rest of the v5 layer. Every colour, font,
 * radius and shadow comes from ui-tokens.css; the only literal colours here
 * are neutral white/black overlays on the brand panel.
 */

/* ------------------------------------------------------------------------
 * Bootstrap 5.3 theming, scoped to the auth body
 * --------------------------------------------------------------------- */
.ui-auth {
  --bs-body-font-family: var(--ui-font);
  --bs-body-font-size: var(--ui-font-size-lg);
  --bs-body-line-height: var(--ui-line-height);
  --bs-body-color: var(--ui-text);
  --bs-body-bg: var(--ui-bg);
  --bs-secondary-color: var(--ui-text-muted);
  --bs-border-color: var(--ui-border-strong);
  --bs-border-radius: var(--ui-radius-control);
  --bs-border-radius-sm: var(--ui-radius-sm);
  --bs-border-radius-lg: var(--ui-radius-lg);
  --bs-primary: var(--ui-primary);
  --bs-primary-rgb: var(--ui-primary-rgb);
  --bs-link-color: var(--ui-primary);
  --bs-link-color-rgb: var(--ui-primary-rgb);
  --bs-link-hover-color: var(--ui-primary-hover);
  --bs-link-hover-color-rgb: var(--ui-primary-rgb);
  --bs-focus-ring-color: rgba(var(--ui-primary-rgb), 0.25);
  --bs-form-invalid-color: var(--ui-danger);
  --bs-form-invalid-border-color: var(--ui-danger);
  --bs-danger: var(--ui-danger);

  min-height: 100vh;
  background: var(--ui-bg);
  -webkit-font-smoothing: antialiased;
}

.ui-auth a {
  text-underline-offset: 2px;
}

.ui-auth a:hover {
  color: var(--ui-primary-hover);
}

.ui-auth a:focus-visible,
.ui-auth .ui-auth-link-btn:focus-visible {
  outline: 2px solid var(--ui-primary);
  outline-offset: 2px;
  border-radius: 2px;
  box-shadow: none;
}

.ui-auth .btn-primary {
  --bs-btn-bg: var(--ui-primary);
  --bs-btn-border-color: var(--ui-primary);
  --bs-btn-hover-bg: var(--ui-primary-hover);
  --bs-btn-hover-border-color: var(--ui-primary-hover);
  --bs-btn-active-bg: var(--ui-primary-active);
  --bs-btn-active-border-color: var(--ui-primary-active);
  --bs-btn-disabled-bg: var(--ui-primary);
  --bs-btn-disabled-border-color: var(--ui-primary);
  --bs-btn-focus-shadow-rgb: var(--ui-primary-rgb);
  --bs-btn-font-weight: 600;
  --bs-btn-padding-y: 0.625rem;
  --bs-btn-border-radius: var(--ui-radius-control);
}

.ui-auth .btn-close {
  --bs-btn-close-focus-shadow: var(--ui-focus-ring);
}

.ui-auth .form-label {
  margin-bottom: 0.375rem;
  font-size: var(--ui-font-size);
  font-weight: 500;
  color: var(--ui-text);
}

/* 1rem inputs: anything smaller makes iOS Safari zoom on focus. */
.ui-auth .form-control {
  padding: 0.625rem 0.75rem;
  font-size: 1rem;
  color: var(--ui-text);
  background-color: var(--ui-surface);
  border-color: var(--ui-border-strong);
  border-radius: var(--ui-radius-control);
}

.ui-auth .form-control::placeholder {
  color: var(--ui-text-muted);
  opacity: 0.8;
}

.ui-auth .form-control:focus,
.ui-auth .form-check-input:focus {
  border-color: var(--ui-primary);
  box-shadow: var(--ui-focus-ring);
}

.ui-auth .form-check-input:checked {
  background-color: var(--ui-primary);
  border-color: var(--ui-primary);
}

.ui-auth .form-control.is-invalid,
.ui-auth .form-control.is-invalid:focus {
  border-color: var(--ui-danger);
}

.ui-auth .form-control.is-invalid:focus {
  box-shadow: 0 0 0 3px var(--ui-danger-soft);
}

.ui-auth .invalid-feedback {
  font-size: var(--ui-font-size-sm);
}

/* Messages and inline alerts: dark text on a soft tint, level shown by the
 * left accent (the strong warning/success tokens are too light for text). */
.ui-auth .alert {
  --ui-auth-accent: var(--ui-info);
  --bs-alert-color: var(--ui-text);
  --bs-alert-bg: var(--ui-info-soft);
  --bs-alert-border-color: var(--ui-border);
  --bs-alert-padding-y: 0.75rem;
  --bs-alert-padding-x: 0.875rem;
  --bs-alert-margin-bottom: 1rem;
  --bs-alert-border-radius: var(--ui-radius);
  border-left: 4px solid var(--ui-auth-accent);
  font-size: var(--ui-font-size);
}

.ui-auth .alert-dismissible {
  padding-right: 2.75rem;
}

.ui-auth .alert-dismissible .btn-close {
  padding: 0.95rem 0.875rem;
}

.ui-auth .alert-danger {
  --ui-auth-accent: var(--ui-danger);
  --bs-alert-bg: var(--ui-danger-soft);
}

.ui-auth .alert-warning {
  --ui-auth-accent: var(--ui-warning);
  --bs-alert-bg: var(--ui-warning-soft);
}

.ui-auth .alert-success {
  --ui-auth-accent: var(--ui-success);
  --bs-alert-bg: var(--ui-success-soft);
}

.ui-auth .alert-secondary {
  --ui-auth-accent: var(--ui-border-strong);
  --bs-alert-bg: var(--ui-surface-2);
}

/* ------------------------------------------------------------------------
 * Layout: brand panel (>= 992px) + form column
 * --------------------------------------------------------------------- */
.ui-auth-shell {
  display: flex;
  min-height: 100vh;
  min-height: 100dvh;
}

.ui-auth-brand {
  display: none;
}

.ui-auth-main {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  align-items: center;
  min-width: 0;
  padding: 1.5rem 1rem 1.25rem;
}

.ui-auth-body {
  width: 100%;
  max-width: 420px;
  margin-block: auto;
  padding-block: 1.5rem;
}

.ui-auth-body--wide {
  max-width: 560px;
}

/* Compact header (below 992px the brand panel collapses into this). */
.ui-auth-compact {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.5rem;
}

.ui-auth-compact img {
  display: block;
  width: auto;
  height: 40px;
}

.ui-auth-compact span {
  font-size: var(--ui-font-size-sm);
  font-weight: 500;
  color: var(--ui-text-muted);
}

@media (min-width: 992px) {
  .ui-auth-brand {
    position: relative;
    display: flex;
    flex: 0 0 44%;
    max-width: 680px;
    align-items: center;
    justify-content: center;
    padding: 3rem;
    overflow: hidden;
    color: #fff;
    background-color: var(--ui-cera-blue);
    background-image:
      radial-gradient(120% 80% at 0% 0%, rgba(255, 255, 255, 0.16) 0%, rgba(255, 255, 255, 0) 55%),
      radial-gradient(90% 70% at 100% 100%, rgba(0, 0, 0, 0.28) 0%, rgba(0, 0, 0, 0) 60%);
  }

  /* Dot grid that fades out towards the bottom right. */
  .ui-auth-brand::before {
    position: absolute;
    inset: 0;
    content: "";
    background-image: radial-gradient(rgba(255, 255, 255, 0.18) 1px, transparent 1.5px);
    background-size: 22px 22px;
    -webkit-mask-image: linear-gradient(160deg, #000 0%, transparent 60%);
    mask-image: linear-gradient(160deg, #000 0%, transparent 60%);
  }

  /* Concentric rings, bottom right. */
  .ui-auth-brand::after {
    position: absolute;
    right: -200px;
    bottom: -220px;
    width: 560px;
    height: 560px;
    content: "";
    border: 1px solid rgba(255, 255, 255, 0.16);
    border-radius: 50%;
    box-shadow:
      0 0 0 70px rgba(255, 255, 255, 0.035),
      0 0 0 140px rgba(255, 255, 255, 0.025);
  }

  .ui-auth-brand-inner {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
  }

  /* The SVG carries its own padding around the letters. */
  .ui-auth-brand-logo {
    display: block;
    width: min(380px, 100%);
    height: auto;
  }

  .ui-auth-brand-tagline {
    margin: -0.75rem 0 0;
    font-size: 1.125rem;
    font-weight: 500;
    letter-spacing: 0.04em;
    color: rgba(255, 255, 255, 0.88);
  }

  .ui-auth-brand-tagline::before {
    display: block;
    width: 40px;
    height: 2px;
    margin: 0 auto 1rem;
    content: "";
    background: rgba(255, 255, 255, 0.5);
    border-radius: 2px;
  }

  .ui-auth-main {
    padding: 2rem 1.5rem 1.5rem;
  }

  .ui-auth-compact {
    display: none;
  }
}

/* ------------------------------------------------------------------------
 * Card
 * --------------------------------------------------------------------- */
.ui-auth-card {
  padding: 2rem;
  background: var(--ui-surface);
  border: 1px solid var(--ui-border);
  border-radius: var(--ui-radius-lg);
  box-shadow: var(--ui-shadow-lg);
}

@media (max-width: 399.98px) {
  .ui-auth-card {
    padding: 1.5rem 1.25rem;
  }
}

.ui-auth-title {
  margin: 0 0 0.375rem;
  font-size: 1.5rem;
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -0.01em;
  color: var(--ui-heading);
}

.ui-auth-lead {
  margin-bottom: 1.5rem;
  font-size: var(--ui-font-size);
  color: var(--ui-text-muted);
}

.ui-auth-note {
  margin-bottom: 1.25rem;
  font-size: var(--ui-font-size-sm);
  color: var(--ui-text-muted);
}

/* Secondary links under the form ("Use a different account"). */
.ui-auth-alt {
  margin: 1.5rem 0 0;
  font-size: var(--ui-font-size);
  text-align: center;
  color: var(--ui-text-muted);
}

.ui-auth-alt a {
  font-weight: 600;
  text-decoration: none;
}

.ui-auth-alt a:hover {
  text-decoration: underline;
}

/* ------------------------------------------------------------------------
 * Password show/hide (button injected by ui-auth.js)
 * --------------------------------------------------------------------- */
.ui-auth-password {
  position: relative;
}

.ui-auth-password .form-control {
  padding-right: 2.75rem;
}

/* No Bootstrap invalid icon here: the toggle sits in that spot. */
.ui-auth-password .form-control.is-invalid {
  padding-right: 2.75rem;
  background-image: none;
}

.ui-auth-pw-toggle {
  position: absolute;
  top: 1px;
  right: 1px;
  bottom: 1px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  padding: 0;
  color: var(--ui-text-muted);
  background: transparent;
  border: 0;
  border-radius: 0 var(--ui-radius) var(--ui-radius) 0;
}

.ui-auth-pw-toggle::before {
  width: 1.25rem;
  height: 1.25rem;
  content: "";
  background-color: currentColor;
  -webkit-mask: var(--ui-auth-icon-eye) center / contain no-repeat;
  mask: var(--ui-auth-icon-eye) center / contain no-repeat;
}

.ui-auth-pw-toggle[aria-pressed="true"]::before {
  -webkit-mask-image: var(--ui-auth-icon-eye-off);
  mask-image: var(--ui-auth-icon-eye-off);
}

.ui-auth-pw-toggle:hover {
  color: var(--ui-text);
}

.ui-auth-pw-toggle:focus-visible {
  outline: 2px solid var(--ui-primary);
  outline-offset: -3px;
}

/* ------------------------------------------------------------------------
 * OTP entry
 * --------------------------------------------------------------------- */
.ui-auth-otp-input {
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.3em;
}

/* Sign-in code (login_verify.html): one large centred field. */
.ui-auth .ui-auth-code-input {
  font-size: 1.5rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.4em;
  text-align: center;
}

.ui-auth .ui-auth-code-input::placeholder {
  letter-spacing: 0.4em;
  opacity: 0.35;
}

.ui-auth-resend-timer {
  font-variant-numeric: tabular-nums;
}

/* Small centred note under a form. */
.ui-auth-hint {
  margin: 1.25rem 0 0;
  font-size: var(--ui-font-size-sm);
  text-align: center;
  color: var(--ui-text-muted);
}

.ui-auth-resend {
  margin: 1.25rem 0 0;
  font-size: var(--ui-font-size);
  text-align: center;
  color: var(--ui-text-muted);
}

.ui-auth-resend a,
.ui-auth-link-btn {
  font-weight: 600;
  text-decoration: none;
}

.ui-auth .ui-auth-link-btn {
  --bs-btn-padding-x: 0.25rem;
  --bs-btn-padding-y: 0;
  --bs-btn-font-size: var(--ui-font-size);
  --bs-btn-color: var(--ui-primary);
  --bs-btn-hover-color: var(--ui-primary-hover);
  --bs-btn-active-color: var(--ui-primary-active);
  --bs-btn-focus-shadow-rgb: var(--ui-primary-rgb);
  vertical-align: baseline;
}

.ui-auth-resend .spinner-border {
  margin-top: 0.5rem;
}

/* Shown by the page script (it sets style.display). */
.ui-auth-timer {
  display: none;
  margin-top: 0.5rem;
  font-variant-numeric: tabular-nums;
}

/* Submit spinner added by ui-auth.js */
.ui-auth-spinner {
  margin-right: 0.5rem;
  vertical-align: -0.125em;
}

/* ------------------------------------------------------------------------
 * Footer: client copyright + "Powered by" Nuvena (kept small)
 * --------------------------------------------------------------------- */
.ui-auth-footer {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 0.25rem 0.5rem;
  font-size: 0.75rem;
  color: var(--ui-text-muted);
  text-align: center;
}

.ui-auth-powered {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
}

.ui-auth-powered img {
  display: block;
  width: auto;
  height: 12px;
}

/* ------------------------------------------------------------------------
 * Icons (masks, coloured with currentColor)
 * --------------------------------------------------------------------- */
.ui-auth {
  --ui-auth-icon-eye: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/svg%3E");
  --ui-auth-icon-eye-off: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24'/%3E%3Cpath d='M1 1l22 22'/%3E%3C/svg%3E");
}

/* ------------------------------------------------------------------------
 * Feedback and motion (shared tokens; motion only without reduced-motion)
 * --------------------------------------------------------------------- */
.ui-auth .btn:disabled,
.ui-auth .btn.disabled {
  cursor: not-allowed;
}

@media (prefers-reduced-motion: no-preference) {
  .ui-auth a,
  .ui-auth .btn,
  .ui-auth .form-control,
  .ui-auth .form-check-input,
  .ui-auth .ui-auth-link-btn,
  .ui-auth .ui-auth-pw-toggle {
    transition: color var(--ui-dur) var(--ui-ease), background-color var(--ui-dur) var(--ui-ease),
      border-color var(--ui-dur) var(--ui-ease), box-shadow var(--ui-dur) var(--ui-ease),
      transform var(--ui-dur-fast) var(--ui-ease);
  }
  .ui-auth .btn:active:not(:disabled):not(.disabled) {
    transform: scale(0.98);
  }
  .ui-auth .alert {
    animation: ui-auth-slide-down var(--ui-dur) var(--ui-ease);
  }
  .ui-auth-card {
    animation: ui-auth-fade-in var(--ui-dur) var(--ui-ease);
  }
}

@keyframes ui-auth-slide-down {
  from { opacity: 0; translate: 0 -4px; }
  to { opacity: 1; translate: 0 0; }
}

@keyframes ui-auth-fade-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

/* ------------------------------------------------------------------ */
/* CERA brand layer (2026-09-28): navy panel with a CERA-blue glow,    */
/* the CERA wordmark, a gold rule and Prata for titles.                */
/* ------------------------------------------------------------------ */
.ui-auth-title { font-family: var(--ui-font-display); font-size: 1.75rem; font-weight: 400; letter-spacing: 0; }
.ui-auth-compact img { height: 26px; }
@media (min-width: 992px) {
  .ui-auth-brand {
    background-color: var(--ui-cera-navy);
    background-image:
      radial-gradient(110% 80% at 0% 0%, rgba(var(--ui-primary-rgb), 0.55) 0%, rgba(var(--ui-primary-rgb), 0) 62%),
      radial-gradient(90% 70% at 100% 100%, rgba(0, 0, 0, 0.32) 0%, rgba(0, 0, 0, 0) 60%);
  }
  .ui-auth-brand-logo { width: auto; max-width: 100%; height: 56px; }
  .ui-auth-brand-tagline {
    margin: 1.5rem 0 0;
    font-family: var(--ui-font-display);
    font-size: 1.3rem;
    font-weight: 400;
    letter-spacing: 0.02em;
    color: rgba(255, 255, 255, 0.9);
  }
  .ui-auth-brand-tagline::before { width: 48px; margin-bottom: 1.25rem; background: var(--ui-cera-gold); }
}

/* ------------------------------------------------------------------ */
/* Sign-in flip card (newlogin.html, 2026-09-29): one-time code on the  */
/* front, password on the back. Both faces sit in one grid cell, so the */
/* card keeps the height of the taller face and nothing jumps.          */
/* ------------------------------------------------------------------ */
.ui-auth-flip { perspective: 1800px; }
.ui-auth-flip-inner {
  display: grid;
  transform-style: preserve-3d;
}
.ui-auth-flip.is-flipped .ui-auth-flip-inner { transform: rotateY(180deg); }
.ui-auth-face {
  display: flex;
  flex-direction: column;
  grid-area: 1 / 1;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}
/* The shorter face keeps its closing note at the bottom of the card. */
.ui-auth-face > .ui-auth-hint:last-child { margin-top: auto; padding-top: 1.25rem; }
.ui-auth-face.ui-auth-card { animation: none; }
.ui-auth-face--back { transform: rotateY(180deg); }

@media (prefers-reduced-motion: no-preference) {
  .ui-auth-flip { animation: ui-auth-fade-in var(--ui-dur) var(--ui-ease); }
  .ui-auth-flip-inner { transition: transform 0.6s cubic-bezier(0.2, 0.7, 0.2, 1); }
}

/* Reduced motion: no turn, a quick cross-fade instead. */
@media (prefers-reduced-motion: reduce) {
  .ui-auth-flip.is-flipped .ui-auth-flip-inner,
  .ui-auth-face--back { transform: none; }
  .ui-auth-face { transition: opacity 0.15s linear; }
  .ui-auth-face[inert] { opacity: 0; visibility: hidden; }
}

/* "One-time code | Password" switch at the top of each face. */
.ui-auth-switch {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 4px;
  margin: -0.25rem 0 1.5rem;
  padding: 4px;
  background: var(--ui-surface-2);
  border: 1px solid var(--ui-border);
  border-radius: var(--ui-radius-pill);
}
.ui-auth .ui-auth-switch-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.5rem 0.75rem;
  font-size: var(--ui-font-size);
  font-weight: 600;
  line-height: 1.25;
  white-space: nowrap;
  color: var(--ui-text-muted);
  text-decoration: none;
  border-radius: var(--ui-radius-pill);
}
.ui-auth .ui-auth-switch-btn:hover { color: var(--ui-heading); }
.ui-auth .ui-auth-switch-btn.is-active {
  color: var(--ui-primary);
  background: var(--ui-surface);
  box-shadow: var(--ui-shadow-sm);
}
.ui-auth-switch-btn svg {
  flex: 0 0 auto;
  width: 1.05rem;
  height: 1.05rem;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

@media (max-width: 419.98px) {
  .ui-auth-switch-btn svg { display: none; }
}

/* Password rules under "New password" (password_set.html). */
.ui-auth-rules {
  margin: 0.5rem 0 0;
  font-size: var(--ui-font-size-sm);
  color: var(--ui-text-muted);
}
