/* ============================================================
   NORTHERN LIGHTS - fan club: the game (game.js)
   The glow card on the member home, ways to earn, badges, the
   check-in sheet, and how bright a pass glows. Uses club.css tokens.
   Phone first: everything below is the phone layout; the one media
   query at the bottom spreads it out on wider screens. No filters or
   blurs on anything that repeats (the wall can hold hundreds of passes).
   ============================================================ */

/* ---------- the card ---------- */
.lgame{margin:0 0 14px;padding:20px 18px 22px;border-radius:var(--r-md);border:1px solid var(--line);
  background:radial-gradient(120% 90% at 0% 0%,color-mix(in srgb,var(--light) 9%,transparent),transparent 60%),linear-gradient(150deg,var(--panel),var(--panel-2))}
.lgame__top{display:grid;grid-template-columns:1fr;gap:20px}
.lgame .kicker{display:flex;align-items:center;gap:6px}
/* a 22px dot that's a 40px tap target */
.lgame__how{position:relative;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border-radius:50%;
  border:1px solid var(--line);background:none;color:var(--muted);font-size:13px;cursor:pointer;touch-action:manipulation}
.lgame__how::after{content:"";position:absolute;inset:-9px}
.lgame__count{display:flex;align-items:baseline;gap:10px;margin-top:8px;font-family:var(--font-display);font-size:24px;line-height:1;text-transform:uppercase;letter-spacing:.01em}
.lgame__count b{font-weight:400;font-size:56px;color:var(--light);text-shadow:0 0 24px color-mix(in srgb,var(--light) 50%,transparent)}
.lgame .ltile__text{margin-top:6px}
.lgame__best{margin-top:8px;font-family:var(--font-cond);font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted-2)}
.lgame__best:empty{display:none}

/* the last eight weeks: lit, kept by a battery, this week, dark */
.gbars{display:grid;grid-template-columns:repeat(8,1fr);gap:5px;margin-top:16px}
.gbar{display:flex;align-items:center;justify-content:center;height:30px;border-radius:6px;background:rgba(255,255,255,.06)}
.gbar--lit{background:linear-gradient(to top,var(--light),color-mix(in srgb,var(--light) 45%,var(--teal)))}
.gbar--saved{background:color-mix(in srgb,var(--light) 22%,transparent);color:var(--light)}
.gbar--saved svg{width:14px;height:14px}
.gbar--now{background:none;border:1.5px dashed color-mix(in srgb,var(--light) 60%,var(--line))}

.lgame__stats{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.gstat{display:flex;flex-direction:column;gap:4px;min-width:0;padding:12px 14px;border-radius:12px;border:1px solid var(--line);background:rgba(255,255,255,.02)}
.gstat b{font-family:var(--font-display);font-weight:400;font-size:30px;line-height:1;letter-spacing:.01em}
.gstat span{font-family:var(--font-cond);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.gstat--batt{grid-column:1 / -1;flex-direction:row;align-items:center;gap:12px}
.gstat--batt > span:last-child{font-family:var(--font-body);font-size:13px;letter-spacing:0;text-transform:none;line-height:1.45;color:var(--muted)}
.gstat--batt .step__link{display:inline;padding:0;font-size:13px;color:var(--white)}
.batts{display:flex;gap:4px;flex-shrink:0}
.batt{display:inline-flex;color:var(--muted-2)}
.batt svg{width:24px;height:24px}
.batt.is-full{color:var(--light)}
.lgame__stats .btn{grid-column:1 / -1;justify-content:center;min-height:48px}

/* staff: tonight's code, big enough to hold up to a crowd */
.gstaff{margin-top:18px;padding:16px 18px;border-radius:12px;border:1.5px dashed color-mix(in srgb,#e9c46a 60%,transparent);background:rgba(233,196,106,.05)}
.gstaff .kicker{color:#e9c46a}
.gstaff__code{margin-top:6px;font-family:var(--font-display);font-size:clamp(46px,15vw,76px);line-height:1;letter-spacing:.16em;color:var(--white)}

/* ---------- ways to earn ---------- */
.lgame__earn,.lgame__shelf{margin-top:22px;padding-top:18px;border-top:1px solid var(--line)}
.earns{display:grid;grid-template-columns:1fr;gap:8px;margin-top:12px;list-style:none;padding:0}
.earn__btn{display:flex;align-items:center;gap:12px;width:100%;min-height:56px;padding:10px 12px;border-radius:12px;border:1px solid var(--line);
  background:rgba(255,255,255,.02);color:inherit;font:inherit;text-align:left;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}
.earn__btn:active:not(:disabled){background:rgba(255,255,255,.06)}
.earn__btn:disabled{cursor:default}
.earn__ic{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:34px;height:34px;border-radius:10px;
  background:color-mix(in srgb,var(--light) 12%,transparent);color:var(--light)}
.earn__ic svg{width:17px;height:17px}
.earn__txt{flex:1;min-width:0;line-height:1.3}
.earn__txt b{display:block;font-family:var(--font-cond);font-weight:500;font-size:15px;letter-spacing:.03em}
.earn__txt small{display:block;margin-top:2px;color:var(--muted);font-size:12.5px}
.earn__pts{flex-shrink:0;padding:4px 10px;border-radius:100px;background:color-mix(in srgb,var(--light) 16%,transparent);
  font-family:var(--font-cond);font-weight:600;font-size:13px;letter-spacing:.06em;color:var(--light)}
.earn__done{display:inline-flex;flex-shrink:0;width:26px;height:26px;align-items:center;justify-content:center;border-radius:50%;background:var(--light);color:var(--bg)}
.earn__done svg{width:14px;height:14px}
.earn.is-done .earn__ic,.earn.is-locked .earn__ic{background:rgba(255,255,255,.05);color:var(--muted-2)}
.earn.is-done .earn__txt b{color:var(--muted)}
/* phones: three rows, then a button for the rest */
.earns.is-short .earn:nth-child(n+4){display:none}
.earns__more{width:100%;min-height:44px;margin-top:8px;border:0;background:none;color:var(--muted);font-family:var(--font-cond);font-size:12.5px;
  letter-spacing:.14em;text-transform:uppercase;text-decoration:underline;text-underline-offset:4px;cursor:pointer}

/* ---------- badges: earned ones lit, the rest waiting; one swipeable row on phones ---------- */
.gshelf{display:flex;gap:8px;margin:12px -18px 0;padding:0 18px 4px;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.gshelf::-webkit-scrollbar{display:none}
.gbadge{display:inline-flex;align-items:center;flex-shrink:0;gap:7px;padding:7px 12px 7px 9px;border-radius:100px;border:1px dashed var(--line);
  font-family:var(--font-cond);font-size:12px;letter-spacing:.08em;text-transform:uppercase;white-space:nowrap;color:var(--muted-2)}
.gbadge svg{width:15px;height:15px}
.gbadge.is-earned{order:-1;border-style:solid;border-color:color-mix(in srgb,var(--light) 50%,var(--line));color:var(--white);background:color-mix(in srgb,var(--light) 8%,transparent)}
.gbadge.is-earned svg{color:var(--light)}

/* ---------- sheets ---------- */
.gcheck{display:flex;flex-direction:column;gap:12px;margin-top:16px}
/* 16px+ so iOS doesn't zoom the page when it's focused */
.gcheck__code{text-align:center;font-family:var(--font-display);font-size:38px;letter-spacing:.3em;text-transform:uppercase;padding:14px 10px 14px calc(10px + .3em)}
.gcheck__code::placeholder{color:rgba(255,255,255,.12)}
.gdone{display:flex;align-items:center;gap:16px;margin:16px 0 20px}
.gdone > svg{flex-shrink:0;width:44px;height:44px;color:var(--light)}
.gdone p{color:var(--muted);line-height:1.5}
.ghow{display:flex;flex-direction:column;gap:12px;margin:14px 0 20px;color:var(--muted);line-height:1.55;font-size:15px}
.ghow b{color:var(--white)}

/* profile: keep the glow off the wall */
.ptoggle{display:flex;align-items:center;gap:12px;min-height:44px;margin:6px 0 4px;cursor:pointer;font-size:15px}
.ptoggle input{width:22px;height:22px;accent-color:var(--light)}

/* ---------- a pass glows brighter the longer the glow ----------
   A static halo behind the pass (the wrapper is its own stacking context),
   so nothing is re-filtered while the pass tilts or the sheen moves. */
.passwrap[data-glow]:not([data-glow="0"])::before{content:"";position:absolute;inset:6% 4%;z-index:-1;border-radius:7cqw;pointer-events:none;
  box-shadow:0 0 var(--halo,30px) var(--halo-s,0px) color-mix(in srgb,var(--light) var(--halo-a,28%),transparent)}
.passwrap[data-glow="2"]{--halo:44px;--halo-s:2px;--halo-a:40%}
.passwrap[data-glow="3"]{--halo:58px;--halo-s:6px;--halo-a:52%}
.passwrap[data-glow="4"]{--halo:72px;--halo-s:10px;--halo-a:64%}
.passwrap[data-glow="3"] .pass__sheen{opacity:.75}
.passwrap[data-glow="4"] .pass__sheen{opacity:.9}

/* ---------- wider screens ---------- */
@media (min-width:861px){
  .lgame{padding:24px}
  .lgame__top{grid-template-columns:1.25fr 1fr;gap:22px 34px;align-items:start}
  .lgame__count b{font-size:64px}
  .gbars{max-width:420px;gap:6px}
  .gbar{height:34px}
  .gbar--now{animation:gbarPulse 2.4s ease-in-out infinite}
  .gstat b{font-size:34px}
  .earns{grid-template-columns:1fr 1fr}
  .earns.is-short .earn:nth-child(n+4){display:block}
  .earns__more{display:none}
  .earn__btn{transition:border-color .2s,background .2s}
  .gshelf{flex-wrap:wrap;margin:12px 0 0;padding:0;overflow:visible}
}
@media (hover:hover){
  .lgame__how:hover{color:var(--white);border-color:var(--muted)}
  .earn__btn:hover:not(:disabled){border-color:color-mix(in srgb,var(--light) 45%,var(--line));background:rgba(255,255,255,.04)}
}
@keyframes gbarPulse{50%{border-color:var(--line)}}
@media (prefers-reduced-motion:reduce){ .gbar--now{animation:none} }
