/* ==========================================================================
   Public pages — sign in, apply, verify.

   Composition: a slim bar across the top, the form on the left as a raised
   glass card, and a showcase column on the right carrying the live delivery
   feed over a layered basil aurora.

   The form column is the job; the showcase is the pitch. So the form gets the
   quieter ground and the sharper contrast, and the showcase gets the colour —
   never the other way round, or the thing people came to do competes with
   decoration.
   ========================================================================== */

.auth {
  display: grid;
  grid-template-rows: auto 1fr;
  min-height: 100vh;
  min-height: 100dvh;
  position: relative;
  isolation: isolate;
}

/* Ambient ground. Two soft blooms and a vignette, fixed behind everything, so
   the page has depth without any element having to carry a heavy background. */
.auth::before {
  content: '';
  position: fixed;
  inset: 0;
  z-index: -1;
  background:
    radial-gradient(900px 620px at 82% -6%, rgba(47,191,113,.13), transparent 60%),
    radial-gradient(700px 520px at 8% 108%, rgba(58,194,182,.07), transparent 62%),
    radial-gradient(1200px 800px at 50% 50%, transparent 40%, rgba(0,0,0,.55) 100%),
    var(--bg);
}

/* --------------------------------------------------------------- topbar -- */

.auth-bar {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 15px 30px;
  border-bottom: 1px solid var(--line-soft);
  background: rgba(7,8,11,.72);
  backdrop-filter: blur(12px);
  position: sticky;
  top: 0;
  z-index: 5;
}
.auth-bar-spacer { flex: 1; }

.auth-bar .status-link {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 5px 11px 5px 9px;
  border: 1px solid var(--line);
  border-radius: 99px;
  background: var(--surface);
  font-size: 11.5px;
  color: var(--text-2);
  text-decoration: none;
  transition: border-color .18s var(--ease), color .18s var(--ease);
}
.auth-bar .status-link:hover {
  color: var(--text);
  border-color: var(--line-strong);
  text-decoration: none;
}

.brand {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 14.5px;
  letter-spacing: -.03em;
  color: var(--text);
  text-decoration: none;
  white-space: nowrap;   /* never break the name across two lines */
}
.brand:hover { text-decoration: none; }

.brand-mark {
  width: 30px; height: 30px;
  border-radius: 10px;
  display: grid; place-items: center;
  background: var(--accent-grad);
  box-shadow: 0 5px 20px -6px var(--accent-glow), inset 0 1px 0 rgba(255,255,255,.3);
}
.brand-mark svg { width: 17px; height: 17px; }

/* ---------------------------------------------------------------- body -- */

.auth-body {
  display: grid;
  grid-template-columns: minmax(0, 47%) minmax(0, 53%);
  min-height: 0;
}

/* ---------------------------------------------------------------- form -- */

.panel {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  padding: 56px 48px;
  position: relative;
}

/* The card itself. A hairline gradient border reads as crisper than a flat
   1px line at this size, and separates the form from the ambient ground. */
.form-card {
  width: 100%;
  max-width: 392px;
  padding: 36px 34px 32px;
  border-radius: var(--radius-lg);
  position: relative;
  background:
    linear-gradient(180deg, rgba(255,255,255,.045), transparent 42%),
    rgba(15,17,22,.82);
  backdrop-filter: blur(14px);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.06),
    0 30px 70px -34px rgba(0,0,0,.9),
    0 2px 10px -4px rgba(0,0,0,.6);
}
.form-card::before {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(180deg, rgba(255,255,255,.14), rgba(255,255,255,.03) 38%, rgba(255,255,255,.02));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  pointer-events: none;
}

.form-title {
  font-size: 26px;
  letter-spacing: -.04em;
  line-height: 1.15;
  margin-bottom: 8px;
}
.form-sub {
  font-size: 13px;
  color: var(--text-2);
  margin: 0 0 26px;
  line-height: 1.6;
}

.form-alt {
  margin-top: 22px;
  padding-top: 18px;
  border-top: 1px solid var(--line-soft);
  font-size: 12.5px;
  color: var(--text-3);
}
.form-alt a { font-weight: 600; }

.form-error {
  display: flex; align-items: flex-start; gap: 8px;
  background: var(--red-dim);
  border: 1px solid #3d1c22;
  color: #ffa3aa;
  padding: 10px 12px;
  border-radius: var(--radius);
  font-size: 12.5px;
  margin-bottom: 16px;
  animation: slide-in .25s var(--ease);
}
.form-note {
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-left: 2px solid var(--accent);
  border-radius: var(--radius);
  padding: 10px 12px;
  font-size: 12.5px;
  color: var(--text-2);
  margin-bottom: 16px;
}

/* Quiet reassurance under the card rather than inside it, so it never
   competes with the fields. */
.trust-row {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 8px 16px;
  width: 100%;
  max-width: 392px;
  margin-top: 20px;
}
.trust-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 11px;
  color: var(--text-4);
  white-space: nowrap;
}
.trust-item svg { width: 13px; height: 13px; color: var(--text-3); }

.panel-copy {
  margin-top: 28px;
  font-size: 11px;
  color: var(--text-4);
  text-align: center;
}
.panel-copy span { margin-left: 12px; }

/* -------------------------------------------------------------- showcase */

.showcase {
  position: relative;
  overflow: hidden;
  padding: 56px 56px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  border-left: 1px solid var(--line-soft);
  background: linear-gradient(165deg, rgba(12,15,20,.6), rgba(10,12,16,.25));
}

/* fine grid, faded out at the edges so it reads as texture not wallpaper */
.showcase::after {
  content: '';
  position: absolute; inset: 0;
  background-image:
    linear-gradient(rgba(255,255,255,.028) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.028) 1px, transparent 1px);
  background-size: 46px 46px;
  mask-image: radial-gradient(ellipse 78% 68% at 55% 45%, #000 8%, transparent 74%);
  pointer-events: none;
}
.showcase > * { position: relative; z-index: 1; }

.showcase-inner { width: 100%; max-width: 480px; }

.showcase-head { margin-bottom: 32px; }

.hero-title {
  font-size: clamp(30px, 3.1vw, 46px);
  line-height: 1.04;
  font-weight: 800;
  letter-spacing: -.052em;
  margin-bottom: 15px;
}
.hero-title em {
  font-style: normal;
  background: linear-gradient(100deg, #6ff0ab, #2fbf71 52%, #1a8f55);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

.hero-sub {
  font-size: 13.5px;
  line-height: 1.68;
  color: var(--text-2);
  max-width: 400px;
  margin: 0;
}

/* ---- delivery feed ---- */

.pulse-head {
  display: flex; align-items: center; gap: 8px;
  margin-bottom: 11px;
  color: var(--accent);
}
.pulse-head .eyebrow { color: var(--text-3); }

.pulse-list {
  list-style: none;
  margin: 0 0 30px; padding: 0;
  display: grid;
  gap: 7px;
}

.pulse-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 13px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: linear-gradient(100deg, rgba(20,23,30,.9), rgba(15,17,22,.45));
  box-shadow: inset 0 1px 0 var(--sheen-soft), var(--shadow-sm);
  animation: slide-in .5s var(--ease-out) both;
  transition: border-color .2s var(--ease), transform .2s var(--ease);
}
.pulse-item:hover { border-color: var(--line-strong); transform: translateX(2px); }
/* The feed fades out downward — the newest delivery is the one that matters. */
.pulse-item:nth-child(2) { opacity: .72; }
.pulse-item:nth-child(3) { opacity: .46; }
.pulse-item:nth-child(n+4) { display: none; }

@keyframes slide-in { from { opacity: 0; transform: translateY(-7px) } }

.pulse-tick {
  width: 27px; height: 27px; flex: none;
  border-radius: 8px;
  display: grid; place-items: center;
  background: var(--accent-dim);
  border: 1px solid #17452f;
  color: var(--accent-hi);
}
.pulse-body { min-width: 0; flex: 1; }
.pulse-line { display: flex; align-items: baseline; gap: 8px; }
.pulse-name {
  font-size: 12.5px; font-weight: 600; letter-spacing: -.01em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pulse-meta { font-size: 11px; color: var(--text-3); flex: none; }
.pulse-key {
  display: block;
  font-family: var(--font-mono);
  font-size: 10.5px;
  color: var(--text-4);
  margin-top: 2px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pulse-lat {
  flex: none;
  font-family: var(--font-mono);
  font-size: 10.5px;
  color: var(--accent);
}

/* ---- proof strip ---- */

.hero-stats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 9px;
}
.hero-stat {
  padding: 15px 16px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--card-bg);
  box-shadow: var(--card-shadow);
  transition: border-color .2s var(--ease), transform .2s var(--ease);
}
.hero-stat:hover { border-color: var(--line-strong); transform: translateY(-2px); }
.hero-stat b {
  display: block;
  font-family: var(--font-display);
  font-size: 23px; font-weight: 700; letter-spacing: -.045em;
  margin-bottom: 3px;
  background: linear-gradient(160deg, #ffffff, #9fb0bf);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.hero-stat span { font-size: 11px; color: var(--text-3); }

/* --------------------------------------------------------------- steps -- */

.steps {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 26px;
}
.step {
  display: flex; align-items: center; gap: 7px;
  font-size: 11.5px; color: var(--text-4);
  white-space: nowrap;
}
.step-num {
  width: 20px; height: 20px; flex: none;
  border-radius: 7px;
  display: grid; place-items: center;
  font-size: 10px; font-weight: 700;
  background: var(--surface-2);
  border: 1px solid var(--line);
  color: var(--text-3);
  transition: all .2s var(--ease);
}
.step.done .step-num { background: var(--accent-dim); border-color: #1c6041; color: var(--accent-hi); }
.step.active .step-num {
  background: var(--accent); border-color: var(--accent); color: #04140c;
  box-shadow: 0 0 0 3px var(--accent-glow);
}
.step.active { color: var(--text); font-weight: 600; }
.step-rule { flex: 1; height: 1px; background: var(--line); min-width: 6px; }

/* Discord verification button — brand colour, so it reads as "this hands you
   to Discord" rather than as another form action. */
.btn-discord {
  --btn-bg: #5865f2;
  --btn-border: #4752c4;
  --btn-fg: #fff;
  gap: 9px;
}
.btn-discord:hover { --btn-bg: #4752c4; --btn-border: #3c45a5; }
.btn-discord svg { flex: none; }

/* password strength */
.strength { display: flex; gap: 4px; margin-top: 9px; }
.strength i {
  flex: 1; height: 3px; border-radius: 99px;
  background: var(--surface-3);
  transition: background .25s var(--ease);
}
.strength[data-score='1'] i:nth-child(1) { background: var(--red); }
.strength[data-score='2'] i:nth-child(-n+2) { background: var(--gold); }
.strength[data-score='3'] i:nth-child(-n+3) { background: var(--lime); }
.strength[data-score='4'] i { background: var(--accent); }

/* verification code boxes */
.code-row { display: flex; gap: 8px; margin-bottom: 6px; }
.code-box {
  flex: 1; min-width: 0;
  height: 54px;
  text-align: center;
  font-family: var(--font-mono);
  font-size: 19px;
  font-weight: 600;
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  color: var(--text);
  outline: none;
  transition: border-color .16s var(--ease), box-shadow .16s var(--ease), background .16s var(--ease);
}
.code-box:focus { border-color: var(--accent); box-shadow: var(--ring); background: var(--surface-3); }
.code-box.filled { border-color: #2a4438; background: var(--surface-3); }

/* the "you're in review" end state */
.review-state { text-align: left; }
.review-icon {
  width: 46px; height: 46px; margin-bottom: 20px;
  border-radius: 13px;
  display: grid; place-items: center;
  background: var(--accent-dim);
  border: 1px solid #1c6041;
  color: var(--accent-hi);
}

/* ------------------------------------------------------------ responsive */

@media (max-width: 1080px) {
  .panel { padding: 46px 34px; }
  .showcase { padding: 46px 38px; }
}

@media (max-width: 900px) {
  .auth-body { grid-template-columns: 1fr; }
  .showcase {
    order: -1;
    border-left: 0;
    border-bottom: 1px solid var(--line-soft);
    padding: 34px 24px 32px;
  }
  .showcase-inner { max-width: none; }
  .hero-sub { max-width: none; }
  .pulse-list { margin-bottom: 22px; }
  .pulse-item:nth-child(n+3) { display: none; }
  .panel { padding: 34px 24px 52px; }
  .form-card { max-width: 440px; }
  .trust-row { max-width: 440px; }
}

@media (max-width: 480px) {
  .auth-bar { padding: 12px 16px; gap: 10px; }
  .showcase, .panel { padding-left: 16px; padding-right: 16px; }
  .form-card { padding: 28px 22px 26px; }
  .form-title { font-size: 23px; }

  /* The status pill must not push the brand onto a second line — it truncates
     instead, and the dot alone still reads as "something is live". */
  .auth-bar .status-link {
    min-width: 0;
    padding: 4px 9px 4px 8px;
    font-size: 10.5px;
  }
  .auth-bar .status-link #status-text {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  /* Three short tiles read better across than stacked — stacking turned the
     proof strip into half a screen of scrolling. */
  .hero-stats { grid-template-columns: repeat(3, 1fr); gap: 7px; }
  .hero-stat { padding: 12px 10px; }
  .hero-stat b { font-size: 19px; }
  .hero-stat span { font-size: 10px; }

  /* keep the numbered chips, drop only the word labels */
  .steps .step span:not(.step-num) { display: none; }
  .code-box { height: 48px; font-size: 17px; }
  .trust-row { gap: 6px 12px; }
  .trust-item { font-size: 10.5px; }
}

/* Respect a reduced-motion preference: the feed still arrives, it just does
   not slide. */
@media (prefers-reduced-motion: reduce) {
  .pulse-item { animation: none; }
  .pulse-item:hover { transform: none; }
  .hero-stat:hover { transform: none; }
}
