/* consent.css — the cookie notice. Loaded from the page head, because the CSP has no
   'unsafe-inline' for styles any more than it does for scripts.

   Colours are copied from tokens.css rather than referencing its custom properties: this sheet has
   to work on the very first paint, before the bundle's stylesheet has necessarily arrived, and a
   var() that resolves to nothing renders a banner in the browser default blue-on-white. Copied
   values drift; a banner that renders wrong on a slow connection is worse. */

.consent {
  position: fixed;
  inset-inline: 0;
  inset-block-end: 0;
  z-index: 2147483000;          /* above the page's own layers, below nothing we own */
  padding: 16px;                /* the phone gutter */
  /* The entrance: up from the edge it belongs to. Removed under reduced motion, below. */
  transform: translateY(12px);
  opacity: 0;
  transition: opacity .3s ease-out, transform .3s ease-out;
  font: 400 14px/1.5 Inter, system-ui, -apple-system, sans-serif;
}
.consent.is-in { transform: none; opacity: 1; }

.consent-inner {
  max-inline-size: 720px;
  margin-inline: auto;
  display: flex;
  flex-wrap: wrap;              /* the phone stacks it; nothing is clipped at 320px */
  align-items: center;
  gap: 16px 24px;
  padding: 16px 20px;
  border-radius: 14px;
  background: #0E1013;
  border: 1px solid rgba(247, 248, 248, 0.09);
  box-shadow: 0 18px 50px rgba(0, 0, 0, .55);
}

.consent-text { flex: 1 1 320px; min-inline-size: 0; }

.consent-title {
  margin: 0 0 4px;
  font-size: 13.5px;
  font-weight: 600;
  color: #F7F8F8;
  letter-spacing: .01em;
}
.consent-body {
  margin: 0;
  font-size: 13px;
  line-height: 1.5;
  color: #8A8F98;
  max-inline-size: 62ch;
  text-wrap: pretty;
}

.consent-actions {
  flex: 0 0 auto;
  display: flex;
  gap: 10px;
  /* On a phone the buttons take the full row and split it evenly, so neither reads as the
     afterthought. */
  flex: 1 1 auto;
  justify-content: flex-end;
}

.consent-btn {
  /* 44px, the recommended target, not the 24px minimum. This is the one control on the page
     everybody has to hit and half of them are doing it one-handed. */
  min-block-size: 44px;
  padding: 0 20px;
  border-radius: 10px;
  border: 1px solid transparent;
  background: #F7F8F8;
  color: #08090A;
  font: inherit;
  font-weight: 600;
  cursor: pointer;
  white-space: nowrap;
  transition: opacity .18s ease;
}
.consent-btn:hover { opacity: .88; }
.consent-btn:active { opacity: .76; }
/* SAME SIZE, SAME WEIGHT, SAME TARGET as Accept. Only the fill differs, which is the least a
   secondary action can be given without becoming the dark pattern this banner exists to avoid. */
.consent-btn-ghost {
  background: transparent;
  color: #F7F8F8;
  border-color: rgba(247, 248, 248, 0.22);
}
.consent-btn-ghost:hover { background: rgba(247, 248, 248, 0.06); opacity: 1; }

/* A visible ring at 3:1 against both fills. It matters more here than elsewhere: consent.js moves
   focus to the refusal as the banner appears, so this is the first ring a keyboard user sees. */
.consent-btn:focus-visible {
  outline: 2px solid #7C4DFF;
  outline-offset: 2px;
}

@media (max-width: 560px) {
  .consent-actions { justify-content: stretch; }
  .consent-btn { flex: 1 1 0; justify-content: center; display: inline-flex; align-items: center; }
}

@media (prefers-reduced-motion: reduce) {
  .consent { transition: none; transform: none; }
}

/* Forced colours: the banner must not become an unreadable block. Let the system own the paint. */
@media (forced-colors: active) {
  .consent-inner { border: 1px solid CanvasText; }
  .consent-btn { border: 1px solid ButtonText; }
}
