/* frontend-design · aesthetic=sportif-bold · production stylesheet
 * Sportif Bold *composition* primitives. This file no longer mints a parallel
 * token system — every value reaches for the single @theme contract compiled
 * into :root by static/css/style.css (the SB exemplar values ARE that contract
 * now). It carries the look the @theme tokens can't express on their own: the
 * two-surface (navy field + chalk ticket) layout, hard-offset shadows, jersey
 * badge, chip group, waiver, and section headers.
 *
 * IMPORT ORDER (htmx-django adapter): style.css -> motion.css -> THIS FILE.
 * Standalone <link> (NOT bundled into the Tailwind build), so it consumes the
 * compiled :root custom properties at runtime.
 *
 * Token contract: surfaces/ink/accent/line via --color-* (--color-field,
 * --color-paper, --color-ink, --color-accent-500, --color-line-strong, …);
 * type via --font-display; radius via --radius-md. Motion: the former SB base
 * ease consolidates onto the shared --ease-out-strong; the overshoot snap is
 * --ease-snap and the stagger step is --stagger-step (input.css :root). The
 * former composite micro-transition shorthand is expanded inline to
 * `var(--dur-micro) var(--ease-out-strong)` at each site.
 *
 * Styles the skill's structural classes (.fd-field, .fd-submit, .fd-field-help,
 * .fd-field-error, .fd-field-reveal) AND Sportif Bold primitives (.sb-*).
 * floor: focus✓ validation-timing✓ all-states✓ a11y✓ slop✓ reduced-motion✓
 *
 * The Druk Text + Söhne @font-face rules live in input.css (compiled into
 * style.css) alongside the @theme type tokens — single source for the faces.
 */

/* ── dark canvas: the browser paints the ROOT element's background into the
   overscroll / rubber-band area (drag past the top or bottom edge). With no
   html background it flashes the light <body> bg; this keeps it navy like the
   field. Only Sportif Bold pages load this file, so admin/marketing canvases
   stay light. ─────────────────────────────────────────────────────────────── */
html { background-color: var(--color-field); }

/* ── page field (navy + diagonal stripe ornament) ────────────────────── */
.sb-page {
  margin: 0;
  min-height: 100vh;
  color: var(--color-ink-inverse);
  font-family: Söhne, ui-sans-serif, system-ui, -apple-system, sans-serif;
  font-size: 15px;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  background:
    repeating-linear-gradient(135deg, transparent 0 30px, var(--color-field-stripe) 30px 32px),
    var(--color-field);
}
.sb-wrap { max-width: 720px; margin: 0 auto; padding: 56px 24px 96px; position: relative; }

/* ── header + jersey number badge ────────────────────────────────────── */
.sb-head { display: flex; align-items: center; gap: 16px; margin-bottom: 32px; color: var(--color-ink-inverse); }
.sb-num {
  width: 60px; height: 60px;
  background: var(--color-accent-500);
  display: grid; place-items: center;
  font-family: var(--font-display);
  font-weight: 800; font-size: 32px; letter-spacing: .02em;
  color: var(--color-ink-inverse);
  box-shadow: 6px 6px 0 var(--color-paper);
  animation: sb-badge-stamp var(--dur-base) var(--ease-snap) both;
}
.sb-brand { font-family: var(--font-display); font-weight: 800; font-size: 20px; text-transform: uppercase; letter-spacing: .04em; }
.sb-brand small { display: block; font-family: Söhne, system-ui; font-weight: 400; font-size: 12px; letter-spacing: .1em; text-transform: uppercase; color: var(--color-ink-inverse-soft); margin-top: 4px; }
@keyframes sb-badge-stamp {
  0%   { transform: rotate(-8deg) translate(-4px, -4px); box-shadow: 10px 10px 0 var(--color-paper); }
  100% { transform: rotate(0) translate(0, 0);           box-shadow: 6px 6px 0 var(--color-paper); }
}

/* ── display headings ────────────────────────────────────────────────── */
.sb-h1 {
  font-family: var(--font-display);
  font-weight: 800; font-size: clamp(40px, 7vw, 72px); line-height: .9;
  letter-spacing: .02em; text-transform: uppercase; margin: 0 0 16px;
  color: var(--color-ink-inverse);
}
.sb-h1 .accent { color: var(--color-accent-500); }
.sb-lede { color: var(--color-ink-inverse-soft); margin: 0 0 36px; max-width: 540px; font-size: 16px; }

/* ── the ticket (chalk card on the navy field) ───────────────────────── */
.sb-ticket {
  background: var(--color-paper);
  color: var(--color-ink);
  border-radius: var(--radius-md);
  box-shadow: 10px 10px 0 var(--color-accent-500);
  padding: 32px;
  position: relative;
  transition: box-shadow var(--dur-quick) var(--ease-out-strong), transform var(--dur-quick) var(--ease-out-strong);
}
.sb-ticket::before {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 8px;
  background: var(--color-ink); border-radius: var(--radius-md) var(--radius-md) 0 0;
}
/* single-fire success stamp: set data-stamped=true, strip after ~400ms */
.sb-ticket[data-stamped="true"] { animation: sb-ticket-stamp 360ms var(--ease-out-strong); }
@keyframes sb-ticket-stamp {
  0%   { transform: translate(0, 0);     box-shadow: 10px 10px 0 var(--color-accent-500); }
  30%  { transform: translate(-2px, -2px); box-shadow: 14px 14px 0 var(--color-accent-500); }
  100% { transform: translate(0, 0);     box-shadow: 10px 10px 0 var(--color-accent-500); }
}
/* section entrance stagger — opt-in via @starting-style, no JS */
.sb-ticket section {
  opacity: 1; transform: translateY(0);
  transition: opacity var(--dur-quick) var(--ease-out-strong), transform var(--dur-quick) var(--ease-out-strong);
}
@starting-style { .sb-ticket section { opacity: 0; transform: translateY(8px); } }
.sb-ticket section:nth-of-type(1) { transition-delay: 0ms; }
.sb-ticket section:nth-of-type(2) { transition-delay: calc(var(--stagger-step) * 1); }
.sb-ticket section:nth-of-type(3) { transition-delay: calc(var(--stagger-step) * 2); }
.sb-ticket section:nth-of-type(4) { transition-delay: calc(var(--stagger-step) * 3); }
.sb-ticket section:nth-of-type(5) { transition-delay: calc(var(--stagger-step) * 4); }

/* ── section headers ─────────────────────────────────────────────────── */
.sb-section { margin-bottom: 28px; padding-top: 4px; }
.sb-section-head { display: flex; align-items: baseline; gap: 12px; border-bottom: 2px solid var(--color-ink); padding-bottom: 8px; margin-bottom: 18px; }
.sb-section-num { font-family: var(--font-display); font-weight: 800; font-size: 16px; color: var(--color-accent-500); text-transform: uppercase; letter-spacing: .06em; }
.sb-section-title { font-family: var(--font-display); font-weight: 800; font-size: 22px; letter-spacing: .02em; text-transform: uppercase; margin: 0; }
.sb-section-hint { color: var(--color-ink-soft); font-size: 13.5px; margin: -8px 0 16px; }
.sb-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
@media (max-width: 540px) { .sb-grid-2 { grid-template-columns: 1fr; } }

/* ── fields (skill contract: .fd-field) ──────────────────────────────── */
.fd-field { display: flex; flex-direction: column; gap: 6px; position: relative; }
.fd-field label, .sb-label {
  font-family: var(--font-display);
  font-weight: 800; font-size: 11px; letter-spacing: .08em; text-transform: uppercase;
  color: var(--color-ink);
}
.sb-req { color: var(--color-accent-500); margin-left: 4px; }

.fd-field input[type=text],  .fd-field input[type=email], .fd-field input[type=tel],
.fd-field input[type=date],  .fd-field input[type=number], .fd-field input[type=password],
.fd-field input[type=url],   .fd-field input[type=search], .fd-field textarea,
.fd-field select {
  font: inherit; font-family: Söhne, system-ui, sans-serif;
  font-size: max(16px, 15px); font-weight: 500;
  color: var(--color-ink); background: var(--color-paper);
  border: 2px solid var(--color-line-strong); border-radius: var(--radius-md);
  padding: 11px 12px; width: 100%;
  transition: box-shadow var(--dur-micro) var(--ease-out-strong), transform var(--dur-micro) var(--ease-out-strong);
}
.fd-field input:hover,  .fd-field textarea:hover, .fd-field select:hover { box-shadow: 4px 4px 0 var(--color-line-strong); }
.fd-field input:focus,  .fd-field textarea:focus, .fd-field select:focus {
  outline: none; box-shadow: 4px 4px 0 var(--color-accent-500); transform: translate(-1px, -1px);
}
.fd-field input:-webkit-autofill {
  -webkit-text-fill-color: var(--color-ink);
  -webkit-box-shadow: 0 0 0 1000px var(--color-paper) inset;
  caret-color: var(--color-ink);
}
.fd-field textarea { resize: vertical; min-height: 90px; }

/* invalid: red border + snappy shake, fired by SERVER-set aria-invalid="true" on
   submit (NOT :user-invalid post-blur — premature inline validation is FORMS.md-
   banned). status is NOT motion-only — the border color carries it for reduced-motion. */
.fd-field input[aria-invalid="true"], .fd-field textarea[aria-invalid="true"] {
  border-color: var(--color-accent-500);
  animation: sb-field-shake var(--dur-considered) var(--ease-out-strong);
}
@keyframes sb-field-shake {
  0%, 100% { transform: translateX(0); }
  20%      { transform: translateX(-3px); }
  40%      { transform: translateX(3px); }
  60%      { transform: translateX(-2px); }
  80%      { transform: translateX(2px); }
}

/* No inline :user-valid "completion tick" — premature per-field positive feedback
   on blur is off-pattern (FORMS.md uses submit-time validation, not live per-field).
   Removed in the form-motion standardization (epic league-code-gb4sm). */

/* skill help / error text */
.fd-field-help  { color: var(--color-ink-soft); font-size: 13.5px; margin: 2px 0 0; }
.fd-field-error { color: var(--color-accent-500); font-weight: 600; font-size: 13.5px; margin: 2px 0 0; }

/* error summary (submit-time, focusable) */
.fd-error-summary {
  border: 2px solid var(--color-accent-500); border-radius: var(--radius-md);
  background: var(--color-sunken); color: var(--color-ink);
  padding: 14px 16px; margin: 0 0 20px;
}
.fd-error-summary h2 { font-family: var(--font-display); text-transform: uppercase; font-size: 15px; margin: 0 0 8px; }
.fd-error-summary a { color: var(--color-accent-500); font-weight: 600; }

/* ── chip / toggle radio groups ──────────────────────────────────────── */
.sb-chips { display: grid; grid-template-columns: repeat(6, 1fr); gap: 8px; }
@media (max-width: 540px) { .sb-chips { grid-template-columns: repeat(3, 1fr); } }
.sb-toggle { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; max-width: 360px; }
.sb-chip { position: relative; }
.sb-chip input { position: absolute; opacity: 0; pointer-events: none; }
.sb-chip label {
  display: grid; place-items: center; padding: 14px 0; min-height: 52px;
  border: 2px solid var(--color-line-strong); border-radius: var(--radius-md); background: var(--color-paper);
  font-family: var(--font-display); font-weight: 800; font-size: 16px;
  letter-spacing: .03em; text-transform: uppercase; cursor: pointer;
  transition: transform var(--dur-micro) var(--ease-out-strong), box-shadow var(--dur-micro) var(--ease-out-strong), background var(--dur-micro) var(--ease-out-strong), color var(--dur-micro) var(--ease-out-strong);
}
.sb-toggle .sb-chip label { padding: 14px; }
.sb-chip label:hover { box-shadow: 4px 4px 0 var(--color-line-strong); transform: translate(-1px, -1px); }
.sb-chip input:focus-visible + label { box-shadow: 4px 4px 0 var(--color-accent-500); transform: translate(-1px, -1px); }
.sb-chip input:checked + label {
  background: var(--color-ink); color: var(--color-paper);
  box-shadow: 4px 4px 0 var(--color-accent-500); transform: translate(-1px, -1px);
  animation: sb-chip-lock var(--dur-micro) var(--ease-snap);
}
.sb-chip label:active { box-shadow: 0 0 0 var(--color-line-strong) !important; transform: translate(0, 0) !important; }
@keyframes sb-chip-lock {
  0%   { box-shadow: 0 0 0 var(--color-accent-500);     transform: translate(0, 0); }
  60%  { box-shadow: 5px 5px 0 var(--color-accent-500); transform: translate(-2px, -2px); }
  100% { box-shadow: 4px 4px 0 var(--color-accent-500); transform: translate(-1px, -1px); }
}

/* ── conditional reveal: use the skill's .fd-field-reveal (motion-tokens.css
      owns the grid-rows + opacity transition). Toggle [data-visible="true"]. ── */

/* ── waiver checkbox (custom check, clip-path draw-in) ───────────────── */
.sb-waiver {
  display: flex; gap: 12px; align-items: flex-start; padding: 14px;
  border: 2px solid var(--color-line-strong); border-radius: var(--radius-md); background: var(--color-sunken);
}
.sb-waiver input {
  appearance: none; -webkit-appearance: none;
  width: 22px; height: 22px; flex-shrink: 0; margin-top: 1px; cursor: pointer;
  border: 2px solid var(--color-line-strong); border-radius: var(--radius-md); background: var(--color-paper);
  display: grid; place-items: center;
  transition: background var(--dur-micro) var(--ease-out-strong);
}
.sb-waiver input:checked { background: var(--color-accent-500); }
.sb-waiver input::after {
  content: ""; width: 7px; height: 11px;
  border: solid var(--color-ink); border-width: 0 2.5px 2.5px 0;
  transform: rotate(45deg) translate(-1px, -2px);
  clip-path: inset(0 100% 0 0);
  transition: clip-path var(--dur-micro) var(--ease-out-strong);
}
.sb-waiver input:checked::after { clip-path: inset(0 0 0 0); }
.sb-waiver input:focus-visible { outline: 3px solid var(--color-accent-500); outline-offset: 2px; }
.sb-waiver-text { font-size: 14px; color: var(--color-ink); line-height: 1.5; }
.sb-waiver-text a { color: var(--color-accent-500); font-weight: 600; text-underline-offset: 2px; }

/* ── submit button (skill contract: .fd-submit + state machine) ──────── */
.sb-submit-row { margin-top: 28px; }
.fd-submit {
  position: relative; width: 100%; min-height: 58px; padding: 18px 28px; cursor: pointer;
  font: inherit; font-family: var(--font-display);
  font-weight: 800; font-size: 19px; letter-spacing: .04em; text-transform: uppercase;
  color: var(--color-paper); background: var(--color-accent-500);
  border: 2px solid var(--color-line-strong); border-radius: var(--radius-md);
  box-shadow: 6px 6px 0 var(--color-line-strong);
  transition: transform var(--dur-instant) var(--ease-out-strong),
              box-shadow var(--dur-micro) var(--ease-out-strong), background var(--dur-micro) var(--ease-out-strong);
}
.fd-submit:hover  { transform: translate(-1px, -1px); box-shadow: 7px 7px 0 var(--color-line-strong); background: var(--color-accent-600); }
.fd-submit:focus-visible { outline: none; box-shadow: 6px 6px 0 var(--color-line-strong), 0 0 0 4px var(--color-accent-ring); }
/* signature "push down" press — overrides motion-tokens' scale(0.97) */
.fd-submit:not(:disabled):active { transform: translate(4px, 4px); box-shadow: 2px 2px 0 var(--color-line-strong); }
.fd-submit:disabled { opacity: .5; cursor: not-allowed; }
.fd-submit[data-state="success"] { background: var(--color-ink); color: var(--color-accent-500); }

.fd-submit-spinner, .fd-submit-success { position: absolute; inset: 0; margin: auto; opacity: 0; }
.fd-submit-spinner {
  width: 22px; height: 22px; border: 3px solid oklch(96% 0.005 250 / .35);
  border-top-color: var(--color-paper); border-radius: 50%;
}
.fd-submit[data-state="loading"] .fd-submit-label   { opacity: 0; }
.fd-submit[data-state="loading"] .fd-submit-spinner { opacity: 1; animation: sb-spin 700ms linear infinite; }
.fd-submit[data-state="success"] .fd-submit-label   { opacity: 0; }
.fd-submit[data-state="success"] .fd-submit-success { opacity: 1; }
@keyframes sb-spin { to { transform: rotate(360deg); } }

/* ── prefers-reduced-motion: keep final states, drop motion ──────────── */
@media (prefers-reduced-motion: reduce) {
  .sb-num { animation: none; transform: none; box-shadow: 6px 6px 0 var(--color-paper); }
  .sb-ticket section { animation: none; opacity: 1; transform: none; }
  .sb-ticket[data-stamped="true"] { animation: none; }
  .sb-chip input:checked + label { animation: none; box-shadow: 4px 4px 0 var(--color-accent-500); transform: translate(-1px, -1px); }
  .sb-waiver input::after { transition: none; }
  .fd-field input[aria-invalid="true"], .fd-field textarea[aria-invalid="true"] {
    animation: none; outline: 2px solid var(--color-accent-500); outline-offset: 2px;
  }
  .fd-submit[data-state="loading"] .fd-submit-spinner { animation-duration: .01ms; }
}

/* ── navigation (shared player-nav primitive — member + public shells) ────
   Lead-added shared composition class (not a per-screen style). Navy bar that
   sits flush above the .sb-page field; jersey-red active underline; Druk-Text
   brand; hard-offset mobile toggle. Reduced-motion handled globally by motion.css. */
.sb-nav { background: var(--color-field-alt); position: relative; z-index: 30; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, sans-serif; }
.sb-nav-inner { max-width: 1120px; margin: 0 auto; padding: 0 24px; min-height: 60px; display: flex; align-items: center; gap: 18px; }
.sb-brandmark { display: inline-flex; align-items: center; gap: 10px; text-decoration: none; flex-shrink: 0; }
.sb-brandmark-badge { width: 32px; height: 32px; flex-shrink: 0; background: var(--color-accent-500); border-radius: var(--radius-md); display: grid; place-items: center; box-shadow: 3px 3px 0 var(--color-paper); }
.sb-brandmark-badge svg { width: 18px; height: 18px; color: var(--color-ink-inverse); }
.sb-brandmark-text { font-family: var(--font-display); font-weight: 800; font-size: 17px; letter-spacing: .04em; text-transform: uppercase; color: var(--color-ink-inverse); }
.sb-nav-links { display: flex; align-items: center; gap: 2px; flex: 1; min-width: 0; }
.sb-nav-link { display: inline-flex; align-items: center; min-height: 44px; padding: 0 13px; font-family: Söhne, ui-sans-serif, system-ui, sans-serif; font-weight: 600; font-size: 13px; letter-spacing: .05em; text-transform: uppercase; white-space: nowrap; color: var(--color-ink-inverse-soft); text-decoration: none; border-bottom: 3px solid transparent; transition: color var(--dur-micro) var(--ease-out-strong), border-color var(--dur-micro) var(--ease-out-strong); }
.sb-nav-link:hover { color: var(--color-ink-inverse); }
.sb-nav-link[aria-current="page"] { color: var(--color-ink-inverse); border-bottom-color: var(--color-accent-500); }
.sb-nav-link:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--color-accent-500); border-radius: var(--radius-md); }
.sb-nav-account { display: flex; align-items: center; gap: 14px; flex-shrink: 0; }
.sb-nav-user { font-size: 13px; color: var(--color-ink-inverse-soft); max-width: 11rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sb-nav-signout { display: inline-flex; align-items: center; min-height: 44px; font-family: Söhne, ui-sans-serif, system-ui; font-weight: 600; font-size: 13px; letter-spacing: .05em; text-transform: uppercase; color: var(--color-ink-inverse-soft); text-decoration: none; transition: color var(--dur-micro) var(--ease-out-strong); }
.sb-nav-signout:hover { color: var(--color-accent-500); }
.sb-nav-cta { display: inline-flex; align-items: center; min-height: 40px; padding: 0 16px; font-family: var(--font-display); font-weight: 800; font-size: 13px; letter-spacing: .05em; text-transform: uppercase; color: var(--color-paper); background: var(--color-accent-500); border: 2px solid var(--color-line-strong); border-radius: var(--radius-md); box-shadow: 3px 3px 0 var(--color-paper); text-decoration: none; transition: transform var(--dur-instant) var(--ease-out-strong), box-shadow var(--dur-micro) var(--ease-out-strong); }
.sb-nav-cta:hover { transform: translate(-1px,-1px); box-shadow: 4px 4px 0 var(--color-paper); }
.sb-nav-cta:not(:disabled):active { transform: translate(3px,3px); box-shadow: 0 0 0 var(--color-paper); }
.sb-nav-cta:focus-visible { outline: none; box-shadow: 3px 3px 0 var(--color-paper), 0 0 0 4px var(--color-accent-ring); }
.sb-nav-toggle { display: none; width: 44px; height: 44px; align-items: center; justify-content: center; background: var(--color-paper); color: var(--color-ink); border: 2px solid var(--color-line-strong); border-radius: var(--radius-md); box-shadow: 3px 3px 0 var(--color-accent-500); cursor: pointer; flex-shrink: 0; }
.sb-nav-toggle:active { transform: translate(3px,3px); box-shadow: 0 0 0 var(--color-accent-500); }
.sb-nav-toggle:focus-visible { outline: none; box-shadow: 3px 3px 0 var(--color-accent-500), 0 0 0 4px var(--color-accent-ring); }
.sb-nav-toggle svg { width: 22px; height: 22px; }
.sb-nav-drawer { background: var(--color-field-alt); padding: 6px 24px 14px; }
.sb-nav-drawer a { display: block; min-height: 44px; line-height: 44px; padding: 0 6px; font-family: Söhne, ui-sans-serif, system-ui; font-weight: 600; font-size: 14px; letter-spacing: .04em; text-transform: uppercase; color: var(--color-ink-inverse); text-decoration: none; border-bottom: 1px solid var(--color-field-stripe); }
.sb-nav-drawer a[aria-current="page"] { color: var(--color-accent-500); }
@media (max-width: 860px) { .sb-nav-links, .sb-nav-user { display: none; } .sb-nav-toggle { display: inline-flex; } }

/* ── shell-scoped form conform — restyle legacy style.css form/auth classes as
   Sportif Bold ONLY inside .sb-page. A page conforms by extending a navy-field
   shell; the brutalist operator shell (never inside .sb-page) is untouched, and
   the shared form partials need no edits. ──────────────────────────────────── */
.sb-page .auth-title { font-family: var(--font-display); font-weight: 800; font-size: clamp(34px,6vw,56px); line-height: .92; letter-spacing: .02em; text-transform: uppercase; color: var(--color-ink-inverse); margin: 0 0 24px; }
.sb-page .auth-card, .sb-page .card { position: relative; background: var(--color-paper); color: var(--color-ink); border-radius: var(--radius-md); box-shadow: 10px 10px 0 var(--color-accent-500); padding: 28px; }
.sb-page .auth-card::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 8px; background: var(--color-ink); border-radius: var(--radius-md) var(--radius-md) 0 0; }
.sb-page .auth-back-link { display: inline-flex; align-items: center; min-height: 44px; font-family: Söhne, ui-sans-serif, system-ui; font-weight: 600; font-size: 14px; color: var(--color-ink-inverse-soft); text-decoration: none; }
.sb-page .auth-back-link:hover { color: var(--color-accent-500); }
.sb-page .form-group { display: flex; flex-direction: column; gap: 6px; margin-bottom: 2px; position: relative; }
.sb-page .form-label { font-family: var(--font-display); font-weight: 800; font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--color-ink); }
.sb-page .form-label-optional { color: var(--color-ink-soft); font-weight: 500; letter-spacing: 0; text-transform: none; }
.sb-page .form-section-title-lg, .sb-page legend.form-section-title-lg { font-family: var(--font-display); font-weight: 800; font-size: 22px; letter-spacing: .02em; text-transform: uppercase; color: var(--color-ink); border-bottom: 2px solid var(--color-ink); padding-bottom: 8px; margin: 0 0 18px; }
.sb-page .form-input { font-family: Söhne, ui-sans-serif, system-ui, sans-serif; font-size: max(16px,15px); font-weight: 500; color: var(--color-ink); background: var(--color-paper); border: 2px solid var(--color-line-strong); border-radius: var(--radius-md); padding: 11px 12px; width: 100%; transition: box-shadow var(--dur-micro) var(--ease-out-strong), transform var(--dur-micro) var(--ease-out-strong); }
.sb-page .form-input:hover { box-shadow: 4px 4px 0 var(--color-line-strong); }
.sb-page .form-input:focus { outline: none; box-shadow: 4px 4px 0 var(--color-accent-500); transform: translate(-1px,-1px); }
.sb-page .form-input-error, .sb-page .form-input[aria-invalid="true"] { border-color: var(--color-accent-500); }
.sb-page .form-error { color: var(--color-accent-500); font-weight: 600; font-size: 13.5px; margin: 2px 0 0; }
.sb-page .form-hint { color: var(--color-ink-soft); font-size: 13.5px; margin: 2px 0 0; }
.sb-page .btn-primary { display: inline-flex; align-items: center; justify-content: center; min-height: 52px; padding: 14px 26px; font-family: var(--font-display); font-weight: 800; font-size: 16px; letter-spacing: .04em; text-transform: uppercase; color: var(--color-paper); background: var(--color-accent-500); border: 2px solid var(--color-line-strong); border-radius: var(--radius-md); box-shadow: 6px 6px 0 var(--color-line-strong); cursor: pointer; transition: transform var(--dur-instant) var(--ease-out-strong), box-shadow var(--dur-micro) var(--ease-out-strong), background var(--dur-micro) var(--ease-out-strong); }
.sb-page .btn-primary:hover { transform: translate(-1px,-1px); box-shadow: 7px 7px 0 var(--color-line-strong); background: var(--color-accent-600); }
.sb-page .btn-primary:not(:disabled):active { transform: translate(4px,4px); box-shadow: 2px 2px 0 var(--color-line-strong); }
.sb-page .btn-primary:focus-visible { outline: none; box-shadow: 6px 6px 0 var(--color-line-strong), 0 0 0 4px var(--color-accent-ring); }
.sb-page .btn-secondary { display: inline-flex; align-items: center; justify-content: center; min-height: 52px; padding: 14px 22px; font-family: var(--font-display); font-weight: 800; font-size: 15px; letter-spacing: .04em; text-transform: uppercase; color: var(--color-ink); background: var(--color-paper); border: 2px solid var(--color-line-strong); border-radius: var(--radius-md); box-shadow: 4px 4px 0 var(--color-line-strong); cursor: pointer; text-decoration: none; }
.sb-page .btn-secondary:hover { transform: translate(-1px,-1px); box-shadow: 5px 5px 0 var(--color-line-strong); }
/* focus ring lives HERE (unlayered) — the @layer components ring in style.css
   loses to this file's unlayered base box-shadow, so the shared ring never paints
   inside .sb-page (WCAG 2.4.7, THEMING-CHROME.md must-fix #1). */
.sb-page .btn-secondary:focus-visible { outline: none; box-shadow: 4px 4px 0 var(--color-line-strong), 0 0 0 4px var(--color-accent-ring); }
.sb-page .btn-secondary:not(:disabled):active { transform: translate(2px,2px); box-shadow: 2px 2px 0 var(--color-line-strong); }

/* ── wizard chrome — registration + tournament team wizards ──────────────────
   Shared by templates/registration/wizard_base.html and
   templates/tournaments/team_registration/wizard_base.html; graduated out of
   the per-page <style> block per THEMING-CHROME.md so the two templates
   consume one definition. Program title on the navy field; muted on-field
   step/kicker text (7.8:1); completed-steps summary on paper with text
   recolored for AA (ink-muted 5.81:1) — the old --color-line-strong border was 1.00:1
   against the field (dead) and is dropped: the paper edge carries the shape. */
.sb-wizard-program {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(26px, 4.5vw, 38px);
  line-height: 0.95;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: var(--color-ink-inverse);
  margin: 0 0 8px;
}
.sb-wizard-step-text { color: var(--color-ink-inverse-soft); }
.sb-wizard-summary { background: var(--color-paper); border-radius: var(--radius-md); }
.sb-wizard-summary .text-gray-500 { color: var(--color-ink-soft); }  /* 5.81:1 on paper (AA) */
.sb-wizard-summary .text-gray-800 { color: var(--color-ink); }
.sb-wizard-summary .border-gray-100 { border-color: var(--color-line); }  /* row dividers: gray-100 on paper ≈ 1:1 */
.sb-wizard-actions {
  display: flex; align-items: center; justify-content: space-between;
  margin-top: 32px; padding-top: 24px;
  border-top: 1px solid var(--color-line);  /* border-gray-200 measured 1.10:1 on paper */
}

/* ── Flash notifications (django.contrib.messages) ───────────────────────────
   Defined in THIS stylesheet, so it lands only on player pages that load it —
   the operator shell (never loads sportif-bold.css) keeps its own banners.
   Chalk ticket + hard-offset shadow + per-severity left bar. Works whether the
   flash sits inside or above .sb-page (e.g. the bespoke dashboard). ─────────── */
.flash-stack { margin-bottom: 24px; }
.flash-stack .flash-item {
  gap: 12px;
  padding: 14px 18px;
  border: 2px solid var(--color-line-strong);
  border-left-width: 8px;
  border-radius: var(--radius-md);
  background: var(--color-paper);
  color: var(--color-ink);
  box-shadow: 6px 6px 0 var(--color-accent-500);
  font-family: Söhne, ui-sans-serif, system-ui, sans-serif;
  font-weight: 600;
  font-size: 15px;
}
.flash-stack .flash-item > span { color: var(--color-ink); }
.flash-stack .flash-item > svg  { width: 22px; height: 22px; }
.flash-stack .flash-item[data-level="success"]       { border-left-color: oklch(56% 0.13 150); }
.flash-stack .flash-item[data-level="success"] > svg { color: oklch(52% 0.13 150); }
.flash-stack .flash-item[data-level="warning"]       { border-left-color: oklch(74% 0.16 80); }
.flash-stack .flash-item[data-level="warning"] > svg { color: oklch(60% 0.15 70); }
.flash-stack .flash-item[data-level="error"]         { border-left-color: var(--color-accent-500); }
.flash-stack .flash-item[data-level="error"] > svg   { color: var(--color-accent-500); }
.flash-stack .flash-item[data-level="info"],
.flash-stack .flash-item[data-level="debug"]         { border-left-color: var(--color-field); }
.flash-stack .flash-item[data-level="info"] > svg,
.flash-stack .flash-item[data-level="debug"] > svg   { color: var(--color-field); }
@media (prefers-reduced-motion: no-preference) {
  .flash-stack .flash-item { animation: sb-flash-in 240ms var(--ease-out-strong) both; }
}
@keyframes sb-flash-in { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }

/* ── Cookie-consent banner ───────────────────────────────────────────────────
   Player pages only (this stylesheet isn't loaded by admin/marketing, so they
   keep the neutral banner). Hooks on the existing #id — no markup change. Deep
   navy bar that integrates with the field + jersey-red edge & Druk-Text CTA. ── */
#cookie-consent-banner {
  background: var(--color-field-alt);
  border-top: 3px solid var(--color-accent-500);
  box-shadow: 0 -4px 0 rgba(0,0,0,.18);
}
#cookie-consent-banner p { color: var(--color-ink-inverse); }
#cookie-consent-banner a { color: var(--color-accent-500); text-decoration-thickness: 2px; text-underline-offset: 2px; }
#cookie-consent-banner a:hover { color: var(--color-ink-inverse); }
#cookie-consent-banner button {
  font-family: var(--font-display);
  font-weight: 800; letter-spacing: .04em; text-transform: uppercase;
  color: var(--color-paper); background: var(--color-accent-500);
  border: 2px solid var(--color-paper); border-radius: var(--radius-md);
  box-shadow: 4px 4px 0 rgba(0,0,0,.35);
  transition: transform var(--dur-instant) var(--ease-out-strong), box-shadow var(--dur-micro) var(--ease-out-strong), background var(--dur-micro) var(--ease-out-strong);
}
#cookie-consent-banner button:hover  { transform: translate(-1px,-1px); box-shadow: 5px 5px 0 rgba(0,0,0,.35); background: var(--color-accent-600); }
#cookie-consent-banner button:active { transform: translate(4px,4px); box-shadow: 0 0 0 rgba(0,0,0,.35); }
#cookie-consent-banner button:focus-visible { outline: none; box-shadow: 4px 4px 0 rgba(0,0,0,.35), 0 0 0 3px var(--color-accent-ring); }
