/* MoneyWithJJ Sound — design system
   Dark OLED ground with a warm accent. Inter throughout.
   Replaces the per-page inline styles that were on every page. */

:root{
  --bg:#0F0F23;
  --card:#1B1B30;
  --muted:#27273B;
  --ink:#F8FAFC;
  --dim:#94A3B8;
  --line:#2A2A45;
  --accent:#F97316;
  --accent-ink:#FDBA74;
  --on-accent:#0F172A;
  --ring:#F97316;

  --space-1:8px; --space-2:16px; --space-3:24px;
  --space-4:32px; --space-5:48px; --space-6:64px;

  --radius:12px;
  --maxw:1120px;
  color-scheme:dark;
}

*{box-sizing:border-box}

html{-webkit-text-size-adjust:100%}

body{
  margin:0;
  background:var(--bg);
  color:var(--ink);
  font:400 16px/1.6 Inter,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  font-feature-settings:"cv02","cv03","cv04","calt";
  -webkit-font-smoothing:antialiased;
}

/* A soft glow behind the top of the page so the dark ground is not flat. */
body::before{
  content:"";
  position:fixed;
  inset:-20% -20% auto -20%;
  height:70vh;
  background:radial-gradient(60% 60% at 50% 0%,rgba(249,115,22,.10),transparent 70%);
  pointer-events:none;
  z-index:0;
}

a{color:var(--accent-ink);text-underline-offset:3px}
a:hover{color:var(--accent)}

:focus-visible{outline:2px solid var(--ring);outline-offset:3px;border-radius:4px}

.wrap{max-width:var(--maxw);margin:0 auto;padding:0 var(--space-3);position:relative;z-index:1}

/* ---------- header ---------- */
header{
  border-bottom:1px solid var(--line);
  background:rgba(15,15,35,.72);
  backdrop-filter:blur(12px);
  position:sticky;top:0;z-index:20;
}
nav{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);min-height:68px;flex-wrap:wrap}
.brand{
  font-weight:700;letter-spacing:-.01em;text-decoration:none;color:var(--ink);
  display:inline-flex;align-items:center;gap:10px;font-size:16px;
}
.brand::before{
  content:"";width:10px;height:10px;border-radius:2px;
  background:var(--accent);box-shadow:0 0 12px rgba(249,115,22,.7);
}
nav ul{list-style:none;display:flex;gap:var(--space-3);margin:0;padding:0;flex-wrap:wrap}
nav ul a{
  text-decoration:none;color:var(--dim);font-size:15px;
  padding:10px 2px;display:inline-block;min-height:44px;line-height:24px;
  transition:color .18s ease;
}
nav ul a:hover{color:var(--ink)}
/* Accent sweep under the nav links on hover. */
nav ul a{position:relative}
nav ul a::after{
  content:"";position:absolute;left:0;right:100%;bottom:8px;height:2px;
  background:var(--accent);border-radius:2px;
  transition:right .28s cubic-bezier(.22,1,.36,1);
}
nav ul a:hover::after{right:0}

/* ---------- hero ---------- */
.hero{padding:var(--space-6) 0 var(--space-4)}
.hero h1{
  font-size:clamp(30px,5vw,52px);
  line-height:1.08;letter-spacing:-.025em;font-weight:700;
  margin:0 0 var(--space-2);max-width:20ch;text-wrap:balance;
}
.hero p{max-width:64ch;color:var(--dim);font-size:clamp(16px,1.6vw,19px);margin:0 0 var(--space-2)}

.facts{
  display:flex;flex-wrap:wrap;gap:var(--space-1) var(--space-3);
  margin:var(--space-3) 0 0;padding:0;list-style:none;font-size:14px;color:var(--dim);
}
.facts li{
  display:inline-flex;align-items:center;gap:9px;
  background:var(--muted);border:1px solid var(--line);
  border-radius:999px;padding:7px 14px;
}
.facts li::before{
  content:"";width:6px;height:6px;border-radius:50%;
  background:var(--accent);flex:none;
}

/* ---------- hero waveform ----------
   Injected by site.js. Idles gently, then locks onto whichever preview is
   playing via the Web Audio analyser. Decorative, so it is aria-hidden. */
.wave{
  display:block;width:100%;height:104px;margin:var(--space-4) 0 0;
  transform-origin:bottom center;
  filter:drop-shadow(0 0 22px rgba(249,115,22,.18));
  transition:filter .4s ease;
}
.wave.is-live{filter:drop-shadow(0 0 30px rgba(249,115,22,.42))}
@media (max-width:640px){.wave{height:72px}}

/* ---------- headings & prose ---------- */
h2{font-size:clamp(20px,2.4vw,26px);letter-spacing:-.015em;margin:var(--space-6) 0 var(--space-2);text-wrap:balance}
h3{letter-spacing:-.01em}
.prose{max-width:70ch}
.prose p{margin:0 0 var(--space-2);color:var(--dim)}
.prose p strong{color:var(--ink)}

/* ---------- cards ---------- */
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:var(--space-3)}
.card{
  background:var(--card);
  border:1px solid var(--line);
  border-radius:var(--radius);
  overflow:hidden;display:flex;flex-direction:column;
  transition:transform .22s ease,border-color .22s ease,box-shadow .22s ease;
}
.card:hover{
  transform:translateY(-3px);
  border-color:rgba(249,115,22,.45);
  box-shadow:0 12px 32px rgba(0,0,0,.45);
}
.card img{
  width:100%;display:block;aspect-ratio:16/10;object-fit:cover;
  transition:transform .5s cubic-bezier(.22,1,.36,1);
}
.card:hover img{transform:scale(1.045)}
.card .body{padding:var(--space-2) 18px 18px;display:flex;flex-direction:column;gap:10px;flex:1}
.card h3{margin:0;font-size:17px}
.card p{margin:0;font-size:15px;color:var(--dim)}
/* Sound count sits above the description on the pack cards. */
.card .count{
  display:inline-block;font-size:12px;letter-spacing:.06em;text-transform:uppercase;
  font-weight:600;color:var(--accent-ink);
}
.card p strong{color:var(--ink)}
.card.wide{grid-column:1/-1}
.card.wide img{aspect-ratio:auto;max-height:420px}

/* The named anti-pattern for this product type is a poor audio player, so the
   native control gets a real surface rather than sitting loose on the card. */
.card audio,audio{
  width:100%;margin-top:auto;height:40px;
  border-radius:8px;background:var(--muted);
  outline-offset:3px;
}
audio::-webkit-media-controls-panel{background:var(--muted)}

/* ---------- buttons ---------- */
.dl,.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:10px;
  background:var(--accent);color:var(--on-accent);
  text-decoration:none;font-weight:650;font-size:17px;
  padding:15px 26px;border-radius:10px;min-height:48px;cursor:pointer;
  border:1px solid transparent;
  transition:transform .16s ease,box-shadow .16s ease,background .16s ease;
  box-shadow:0 6px 20px rgba(249,115,22,.22);
}
.dl:hover,.btn:hover{background:#FB8B3C;color:var(--on-accent);transform:translateY(-2px);box-shadow:0 10px 26px rgba(249,115,22,.32)}
.dl:active,.btn:active{transform:translateY(0)}
.dlnote{font-size:14px;color:var(--dim);margin:0}

/* ---------- manifest (pack pages) ---------- */
.manifest{columns:2;column-gap:var(--space-4);list-style:none;padding:0;margin:0 0 18px;font-size:15px;color:var(--dim)}
.manifest li{break-inside:avoid;padding:6px 0;border-bottom:1px solid var(--line)}
@media (max-width:560px){.manifest{columns:1}}

/* ---------- footer ---------- */
footer{
  margin-top:var(--space-6);border-top:1px solid var(--line);
  padding:var(--space-4) 0 var(--space-5);color:var(--dim);font-size:14px;
}
footer .wrap{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);justify-content:space-between}

/* ---------- motion ----------
   Elements start hidden ONLY once JS has confirmed it can animate them, so a
   script failure leaves the page fully readable instead of blank. */
.js-motion [data-reveal]{opacity:0}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms !important;transition-duration:.001ms !important}
  .js-motion [data-reveal]{opacity:1 !important;transform:none !important}
  .card:hover{transform:none}
}

@media (max-width:640px){
  .hero{padding:var(--space-5) 0 var(--space-3)}
  nav{min-height:auto;padding:12px 0}
  .grid{grid-template-columns:1fr}
}
