/* ============================================================================
   game-layer.css — Kumquat / BullpenLM gamification components
   ----------------------------------------------------------------------------
   Reusable "quest" UI built ENTIRELY on theme.css tokens, so the same gamey
   language (rank/XP header, quest cards w/ cleared·active·locked states,
   reward/unlock chips, living aurora) rolls across every surface — onboarding,
   training, the floor — and reskins with one accent-token change.
   Requires: <link href="/theme.css"> (provides --c-* and --font-*).
   ============================================================================ */

/* ---- local derived tokens (glass + aurora, derived from the theme accent) -- */
:root{
  --glass:    color-mix(in srgb, var(--c-text) 4%, transparent);
  --glass-2:  color-mix(in srgb, var(--c-text) 8%, transparent);
  --hair:     color-mix(in srgb, var(--c-text) 12%, transparent);
  --hair-soft:color-mix(in srgb, var(--c-text) 6%, transparent);
  --q-r:16px;
}

/* ---------------- living citrus aurora (the "world" behind the HUD) -------- */
.aurora{position:fixed;inset:-20% -10%;z-index:0;pointer-events:none;filter:blur(10px) saturate(1.05)}
.aurora b{position:absolute;border-radius:50%;mix-blend-mode:screen;opacity:.30;will-change:transform}
.aurora .a1{width:60vw;height:60vw;left:-8vw;top:-12vw;background:radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--c-accent) 90%, transparent), transparent 62%);animation:q-drift1 26s ease-in-out infinite}
.aurora .a2{width:52vw;height:52vw;right:-6vw;top:8vh;background:radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--c-bad) 70%, transparent), transparent 60%);animation:q-drift2 32s ease-in-out infinite}
.aurora .a3{width:46vw;height:46vw;left:18vw;bottom:-18vw;background:radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--c-warn) 65%, transparent), transparent 64%);animation:q-drift3 38s ease-in-out infinite}
.grain{position:fixed;inset:0;z-index:1;pointer-events:none;opacity:.04;mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
.vignette{position:fixed;inset:0;z-index:1;pointer-events:none;background:radial-gradient(120% 90% at 50% 0%, transparent 55%, var(--c-bg) 100%)}
@keyframes q-drift1{0%,100%{transform:translate3d(0,0,0) scale(1)}50%{transform:translate3d(6vw,4vh,0) scale(1.12)}}
@keyframes q-drift2{0%,100%{transform:translate3d(0,0,0) scale(1.05)}50%{transform:translate3d(-5vw,6vh,0) scale(.92)}}
@keyframes q-drift3{0%,100%{transform:translate3d(0,0,0) scale(.95)}50%{transform:translate3d(4vw,-5vh,0) scale(1.1)}}

/* ---------------- component: PLAYER card (rank + XP meter) ------------------ */
.player{position:relative;border-radius:var(--q-r);padding:22px 24px 24px;
  background:linear-gradient(160deg, var(--glass-2), var(--glass));
  border:1px solid var(--hair);backdrop-filter:blur(22px) saturate(1.2);
  box-shadow:0 30px 80px -40px oklch(0 0 0 / .9), inset 0 1px 0 color-mix(in srgb, var(--c-text) 7%, transparent)}
.player::before{content:"";position:absolute;inset:0;border-radius:var(--q-r);padding:1px;pointer-events:none;
  background:linear-gradient(150deg, color-mix(in srgb, var(--c-accent-soft) 50%, transparent), transparent 40%);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude}
.player .pl-top{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:18px}
.player .greet{font-family:var(--font-mono);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--c-text-faint)}
.player .name{font-family:var(--font-display);font-size:clamp(26px,6vw,36px);line-height:.95;text-transform:uppercase;letter-spacing:-.01em;margin-top:6px}
.player .lvl{text-align:right;flex:none}
.player .lvl .k{font-family:var(--font-mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--c-text-faint)}
.player .lvl .v{font-family:var(--font-display);font-size:30px;line-height:1;color:var(--c-accent-soft);text-shadow:0 0 24px color-mix(in srgb, var(--c-accent) 55%, transparent)}
.player .lvl .tier{font-family:var(--font-mono);font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--c-accent);margin-top:4px}
.xpwrap{display:flex;align-items:center;gap:13px}
.xpbar{flex:1;height:12px;border-radius:999px;background:color-mix(in srgb, var(--c-bg) 80%, #000);border:1px solid var(--hair-soft);overflow:hidden;position:relative}
.xpfill{position:absolute;inset:0;transform-origin:left;transform:scaleX(var(--xp,0));border-radius:999px;
  background:linear-gradient(90deg, var(--c-accent), var(--c-accent-soft));
  box-shadow:0 0 18px -2px var(--c-accent-soft);animation:q-fill 1.3s .4s cubic-bezier(.16,1,.3,1) forwards}
.xpfill::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--c-text) 45%,transparent),transparent);
  transform:translateX(-100%);animation:q-sweep 2.6s 1.6s ease-in-out infinite}
.xpnum{font-family:var(--font-mono);font-size:12px;font-weight:700;color:var(--c-text);white-space:nowrap}
.xpnum b{color:var(--c-accent-soft)}
@keyframes q-fill{from{transform:scaleX(0)}to{transform:scaleX(var(--xp,0))}}
@keyframes q-sweep{0%{transform:translateX(-100%)}55%,100%{transform:translateX(100%)}}

/* ---------------- component: chain header ---------------------------------- */
.chain-h{display:flex;align-items:center;gap:11px;margin:20px 2px 14px}
.chain-h h2{font-family:var(--font-mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--c-text-faint)}
.chain-h .line{flex:1;height:1px;background:var(--hair)}

/* ---------------- component: QUEST (node + card, 3 states) ------------------ */
.quest{position:relative;display:grid;grid-template-columns:42px 1fr;gap:16px;padding:0 0 18px}
.quest .node{position:relative;display:flex;justify-content:center}
.quest .node::before{content:"";position:absolute;top:34px;bottom:-22px;width:2px;background:var(--hair-soft)}
.quest:last-child .node::before{display:none}
.quest.done .node::before{background:linear-gradient(var(--c-good),color-mix(in srgb, var(--c-good) 25%, transparent))}
.dot{position:relative;z-index:1;width:34px;height:34px;border-radius:50%;display:grid;place-items:center;flex:none;margin-top:4px;
  background:var(--c-bg-card);border:1.5px solid var(--hair);font-family:var(--font-mono);font-size:12px;font-weight:700;color:var(--c-text-faint)}
.quest.done .dot{border-color:var(--c-good);color:var(--c-good);background:var(--c-good-wash);box-shadow:0 0 16px -3px color-mix(in srgb, var(--c-good) 60%, transparent)}
.quest.active .dot{border-color:var(--c-accent);color:var(--c-accent-soft);background:color-mix(in srgb, var(--c-accent) 14%, transparent)}
.quest.locked .dot{opacity:.5}

.q-card{position:relative;border-radius:14px;padding:15px 17px;
  background:var(--glass);border:1px solid var(--hair-soft);backdrop-filter:blur(14px);
  transition:transform .35s cubic-bezier(.16,1,.3,1), background .35s, border-color .35s}
.quest.active .q-card{background:linear-gradient(150deg, color-mix(in srgb, var(--c-accent) 13%, transparent), var(--glass-2));
  border-color:color-mix(in srgb, var(--c-accent) 50%, transparent);
  box-shadow:0 0 0 1px color-mix(in srgb, var(--c-accent) 25%, transparent), 0 24px 60px -34px color-mix(in srgb, var(--c-accent) 80%, transparent)}
.quest.active .q-card::after{content:"";position:absolute;inset:-1px;border-radius:14px;pointer-events:none;
  box-shadow:0 0 34px -4px var(--c-accent);opacity:.45;animation:q-pulse 2.6s ease-in-out infinite}
.quest.locked .q-card{opacity:.5}
.q-card:hover{transform:translateY(-2px)}
@keyframes q-pulse{0%,100%{opacity:.28}50%{opacity:.56}}

.q-top{display:flex;align-items:center;gap:10px;margin-bottom:4px;flex-wrap:wrap}
.q-name{font-family:var(--font-ui);font-weight:700;font-size:16.5px;letter-spacing:-.01em;color:var(--c-text)}
.quest.done .q-name{color:var(--c-text-dim)}
.q-desc{font-family:var(--font-body);font-size:13.5px;line-height:1.55;color:var(--c-text-dim);max-width:62ch}
.q-desc b{color:var(--c-accent-soft);font-family:var(--font-ui);font-weight:700;font-style:normal}
.q-reward{margin-top:11px;font-family:var(--font-mono);font-size:10.5px;letter-spacing:.04em;color:var(--c-text-faint);display:flex;align-items:center;gap:7px}
.q-reward i{color:var(--c-good);font-style:normal}
.q-reward svg{width:12px;height:12px;color:var(--c-good)}

/* ---------------- component: chips / tags ---------------------------------- */
.tag{font-family:var(--font-mono);font-size:9px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;padding:3px 8px;border-radius:6px;white-space:nowrap}
.tag.cleared{color:var(--c-good);background:var(--c-good-wash)}
.tag.now{color:var(--c-on-accent);background:var(--c-accent);box-shadow:0 0 16px -2px var(--c-accent)}
.tag.lock{color:var(--c-text-faint);background:var(--hair-soft);display:inline-flex;align-items:center;gap:5px}
.tag.lock svg{width:11px;height:11px}
.tag.good{color:var(--c-good);background:var(--c-good-wash)} .tag.warn{color:var(--c-warn);background:var(--c-warn-wash)} .tag.bad{color:var(--c-bad);background:var(--c-bad-wash)} .tag.slate{color:var(--c-slate);background:color-mix(in srgb,var(--c-slate) 14%,transparent)}

/* ---------------- DASHBOARD / WORKSPACE accents (gamey skin on clean data) ----
   For data surfaces (cockpit, dashboards). Use .aurora.calm not the full aurora,
   and these accents ON rows/tiles — never quest-cards on a table. ---------------- */
/* dampened ambient world for workspaces */
.aurora.calm{filter:blur(13px) saturate(.95)}
.aurora.calm b{opacity:.14}

/* rank/level chip — an agent/person's stage shown as a "LVL · stage" badge on a row */
.rank-chip{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-mono);font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--c-accent);border:1px solid color-mix(in srgb,var(--c-accent) 38%,transparent);background:color-mix(in srgb,var(--c-accent) 9%,transparent);border-radius:6px;padding:2px 8px;white-space:nowrap}
.rank-chip .lv{color:var(--c-text-faint)}
.rank-chip.good{color:var(--c-good);border-color:color-mix(in srgb,var(--c-good) 38%,transparent);background:var(--c-good-wash)}
.rank-chip.slate{color:var(--c-slate);border-color:color-mix(in srgb,var(--c-slate) 34%,transparent);background:color-mix(in srgb,var(--c-slate) 12%,transparent)}

/* gamey stat tile — headline metric with a level-badge feel */
.stat-tile{position:relative;background:linear-gradient(160deg,var(--glass-2),var(--glass));border:1px solid var(--hair);border-radius:14px;padding:15px 17px;backdrop-filter:blur(16px);overflow:hidden}
.stat-tile .v{font-family:var(--font-display);font-weight:400;font-size:27px;line-height:1;color:var(--c-text)}
.stat-tile .k{font-family:var(--font-mono);font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--c-text-dim);margin-top:8px}
.stat-tile .sub{font-family:var(--font-mono);font-size:9.5px;color:var(--c-text-faint);margin-top:3px}
.stat-tile.accent .v{color:var(--c-accent-soft);text-shadow:0 0 20px color-mix(in srgb,var(--c-accent) 45%,transparent)}
.stat-tile.good .v{color:var(--c-good)} .stat-tile.bad .v{color:var(--c-bad)} .stat-tile.warn .v{color:var(--c-warn)} .stat-tile.slate .v{color:var(--c-slate)}

/* segmented XP track — a person's stage progression as glowing segments (board rows) */
.xp-seg{display:flex;gap:3px;align-items:center}
.xp-seg i{flex:1;height:7px;background:color-mix(in srgb,var(--c-bg) 65%,#000);border:1px solid var(--hair-soft);border-radius:2px}
.xp-seg i.on{background:var(--c-accent);border-color:transparent;box-shadow:0 0 8px -2px var(--c-accent)}
.xp-seg i.cur{background:transparent;border-color:var(--c-accent);box-shadow:inset 0 0 0 1px var(--c-accent)}
.xp-seg i.good{background:var(--c-good);box-shadow:0 0 8px -2px var(--c-good)}

/* ---------------- component: FUNNEL RAIL (cross-screen onboarding stepper) ---
   One shared component + /funnel-rail.js (single source of the step spine) render
   the same "step X of N" rail on every funnel screen — set data-step per screen. */
.frail{display:flex;align-items:flex-start;margin:0 0 24px}
.fr-step{display:flex;flex-direction:column;align-items:center;gap:7px;flex:none}
.fr-dot{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-family:var(--font-mono);font-size:12px;font-weight:700;background:var(--c-bg-card);border:1.5px solid var(--hair);color:var(--c-text-faint);transition:border-color .35s,color .35s,background .35s,box-shadow .35s}
.fr-lab{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--c-text-faint);white-space:nowrap;transition:color .35s}
.fr-bar{flex:1;height:2px;margin:14px 8px 0;border-radius:2px;background:var(--hair-soft);position:relative;overflow:hidden}
.fr-bar::after{content:"";position:absolute;inset:0;transform-origin:left;transform:scaleX(0);border-radius:2px;background:linear-gradient(90deg,var(--c-good),color-mix(in srgb,var(--c-good) 40%,transparent));transition:transform .6s cubic-bezier(.16,1,.3,1)}
.fr-bar.done::after{transform:scaleX(1)}
.fr-step.done .fr-dot{border-color:var(--c-good);color:var(--c-good);background:var(--c-good-wash)}
.fr-step.done .fr-lab{color:var(--c-good)}
.fr-step.active .fr-dot{border-color:var(--c-accent);color:var(--c-accent-soft);background:color-mix(in srgb,var(--c-accent) 14%,transparent);box-shadow:0 0 16px -3px color-mix(in srgb,var(--c-accent) 60%,transparent)}
.fr-step.active .fr-lab{color:var(--c-accent)}
@media (max-width:430px){ .fr-dot{width:26px;height:26px;font-size:11px} .fr-lab{font-size:8.5px;letter-spacing:.06em} .fr-bar{margin:12px 5px 0} }

/* ---------------- entrance orchestration (opt-in via .q-rise) -------------- */
.q-rise{opacity:0;animation:q-up .65s var(--d,0ms) cubic-bezier(.16,1,.3,1) forwards}
@keyframes q-up{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}

@media (prefers-reduced-motion: reduce){
  .aurora b{animation:none}
  .xpfill{animation:none;transform:scaleX(var(--xp,0))}
  .xpfill::after,.quest.active .q-card::after{animation:none}
  .q-rise{animation:none;opacity:1}
}
@media (max-width:560px){ .quest{grid-template-columns:34px 1fr;gap:11px} .dot{width:30px;height:30px} }
