/* PairPulse games kit — shared look for every couple game.
   Works standalone on the site and inside a Telegram Mini App
   (theme follows Telegram when present, else the system). */
:root{
  --plum:#1E1330; --surface:#2B1D42; --surface-2:#352552; --line:rgba(255,244,230,.12);
  --ink:#FFF4E6; --ink-soft:rgba(255,244,230,.66);
  --pip:#FF5C8A; --pip-deep:#C93A66; --tum:#4FC3F7; --tum-deep:#2A8FC0;
  --butter:#FFD166; --butter-deep:#D9A93A; --veto:#8C7AA8;
  --r-s:12px; --r-m:18px; --r-l:28px;
  --f-display:'Unbounded',system-ui,sans-serif; --f-body:'Golos Text',system-ui,sans-serif;
  color-scheme:dark;
}
:root[data-theme="light"]{
  --plum:#FFF6EC; --surface:#FFFFFF; --surface-2:#F6EADC; --line:rgba(43,29,66,.12);
  --ink:#2B1D42; --ink-soft:rgba(43,29,66,.62); --veto:#A797BF;
  color-scheme:light;
}
*{box-sizing:border-box}
html,body{margin:0}
body{background:var(--plum);color:var(--ink);font:16px/1.5 var(--f-body);
  -webkit-font-smoothing:antialiased;min-height:100vh;min-height:100dvh;overflow-x:hidden}
button{font:inherit;color:inherit}
.pp-wrap{max-width:480px;margin:0 auto;padding:16px 16px 120px}

/* type */
.pp-h1{font:700 26px/1.15 var(--f-display);letter-spacing:-.01em;margin:4px 0 6px}
.pp-h2{font:600 18px/1.25 var(--f-display);margin:0 0 4px}
.pp-sub{color:var(--ink-soft);font-size:15px;margin:0 0 16px}

/* chunky pressable buttons: a solid "base" under the face sinks on press */
.pp-btn{--face:var(--butter);--base:var(--butter-deep);--txt:#2B1D42;
  position:relative;display:inline-flex;align-items:center;justify-content:center;gap:8px;
  min-height:52px;padding:0 22px;border:0;border-radius:var(--r-m);cursor:pointer;
  background:var(--face);color:var(--txt);font:600 16px/1 var(--f-display);
  box-shadow:0 5px 0 var(--base);transform:translateY(0);
  transition:transform .08s ease,box-shadow .08s ease,filter .15s}
.pp-btn:active{transform:translateY(4px);box-shadow:0 1px 0 var(--base)}
.pp-btn:disabled{filter:grayscale(.8) opacity(.5);cursor:default;transform:none;box-shadow:0 5px 0 var(--base)}
.pp-btn.wide{width:100%}
.pp-btn.pip{--face:var(--pip);--base:var(--pip-deep);--txt:#fff}
.pp-btn.tum{--face:var(--tum);--base:var(--tum-deep);--txt:#0D2A3A}
.pp-btn.ghost{--face:var(--surface-2);--base:rgba(0,0,0,.35);--txt:var(--ink)}
:root[data-theme="light"] .pp-btn.ghost{--base:#E3D3C0}
.pp-btn:focus-visible,.pp-chip:focus-visible,.pp-icon:focus-visible,input:focus-visible{outline:3px solid var(--butter);outline-offset:3px}

.pp-icon{width:44px;height:44px;border-radius:14px;border:0;background:var(--surface);cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;font-size:20px}

/* top bar */
.pp-top{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}
.pp-brand{font:700 16px var(--f-display)}
.pp-brand span{color:var(--pip)}

/* mascots */
.pp-mascot{display:inline-block;width:72px;height:72px}
.pp-mascot svg{width:100%;height:100%;overflow:visible}
.pp-mascot.bounce{animation:pp-bounce .6s cubic-bezier(.3,1.6,.5,1)}
.pp-mascot.shake{animation:pp-shake .5s ease}
.pp-mascot.idle svg{animation:pp-breathe 3.2s ease-in-out infinite}
@keyframes pp-bounce{0%{transform:translateY(0) scale(1)}35%{transform:translateY(-18px) scale(1.06,.94)}70%{transform:translateY(0) scale(.96,1.04)}100%{transform:none}}
@keyframes pp-shake{0%,100%{transform:none}20%{transform:rotate(-8deg)}40%{transform:rotate(7deg)}60%{transform:rotate(-5deg)}80%{transform:rotate(3deg)}}
@keyframes pp-breathe{0%,100%{transform:scale(1)}50%{transform:scale(1.03,.97) translateY(1px)}}

/* speech bubble */
.pp-say{position:relative;background:var(--surface);border-radius:var(--r-m);padding:10px 14px;font-size:15px;
  max-width:260px;box-shadow:0 2px 0 var(--line)}
.pp-say.pop{animation:pp-pop .35s cubic-bezier(.3,1.5,.5,1)}
@keyframes pp-pop{from{transform:scale(.7);opacity:0}to{transform:none;opacity:1}}

/* chips */
.pp-chip{display:inline-flex;align-items:center;gap:6px;min-height:40px;padding:6px 12px 6px 10px;border-radius:999px;
  border:2px solid transparent;background:var(--surface);cursor:pointer;font-size:15px;line-height:1.2;
  transition:transform .12s, opacity .25s}
.pp-chip .dot{width:10px;height:10px;border-radius:50%;flex:none}
.pp-chip.by-pip .dot{background:var(--pip)} .pp-chip.by-tum .dot{background:var(--tum)}
.pp-chip.vetoed{text-decoration:line-through;opacity:.45}
.pp-chip:active{transform:scale(.96)}

/* toast */
.pp-toast{position:fixed;left:50%;bottom:96px;transform:translate(-50%,20px);opacity:0;pointer-events:none;
  background:var(--ink);color:var(--plum);padding:10px 16px;border-radius:999px;font-size:14px;z-index:50;
  transition:all .25s}
.pp-toast.on{opacity:1;transform:translate(-50%,0)}

/* sticky action bar */
.pp-bar{position:fixed;left:0;right:0;bottom:0;padding:12px 16px calc(12px + env(safe-area-inset-bottom));
  background:linear-gradient(to top,var(--plum) 70%,transparent);z-index:20}
.pp-bar .pp-btn{max-width:448px;margin:0 auto;display:flex}


/* ---------- 3D pets: one pose, emotions by motion + small effects ---------- */
.pp-mascot{container-type:inline-size}
.pet{position:relative;display:block;width:100%;height:100%}
.pet img{position:relative;z-index:1;width:100%;height:100%;object-fit:contain;transform-origin:50% 96%;
  transition:transform .35s cubic-bezier(.3,1.4,.5,1),filter .35s;-webkit-user-drag:none;user-select:none}
.pet .glow{position:absolute;left:12%;right:12%;bottom:-2%;height:26%;border-radius:50%;
  background:radial-gradient(closest-side,var(--c) 0%,transparent 100%);opacity:.6;z-index:0}
.pet .fx{position:absolute;z-index:2;font-style:normal;pointer-events:none;line-height:1}
.pp-mascot.idle .pet img{animation:pp-breathe 3.2s ease-in-out infinite}
.pp-mascot.bounce .pet img{animation:pp-hop .65s cubic-bezier(.3,1.5,.5,1)}
.pp-mascot.shake .pet img{animation:pp-shake .5s ease}
@keyframes pp-hop{0%{transform:none}30%{transform:translateY(-14%) scale(.94,1.06)}60%{transform:translateY(0) scale(1.08,.92)}100%{transform:none}}
/* happy: lifted, sparkles */
.m-happy img{transform:translateY(-3%) scale(1.04)}
.m-happy .fx{color:var(--butter);font-size:17cqw;animation:pp-twinkle 1.4s ease-in-out infinite;text-shadow:0 0 6px rgba(255,209,102,.8)}
.m-happy .s1{left:4%;top:14%}.m-happy .s2{right:6%;top:6%;animation-delay:.45s;font-size:12cqw}.m-happy .s3{right:0;top:40%;animation-delay:.9s;font-size:10cqw}
@keyframes pp-twinkle{0%,100%{transform:scale(.4) rotate(0);opacity:0}50%{transform:scale(1) rotate(25deg);opacity:1}}
/* sad: slumped, greyer, a tear */
.m-sad img{transform:translateY(5%) scale(.95) rotate(-5deg);filter:saturate(.55) brightness(.92)}
.m-sad .tear{left:34%;top:36%;width:7cqw;height:10cqw;background:#7CCBFF;border-radius:50% 50% 50% 50%/60% 60% 40% 40%;
  box-shadow:inset -2px -2px 0 rgba(255,255,255,.5);animation:pp-tear 1.6s ease-in infinite}
@keyframes pp-tear{0%{transform:translateY(0) scale(.6);opacity:0}20%{opacity:1;transform:scale(1)}100%{transform:translateY(42cqw);opacity:0}}
/* smug: head tilt, speech bubble */
.m-smug img{transform:rotate(7deg) translateX(3%)}
.m-smug .bub{right:-6%;top:2%;background:var(--ink);color:var(--plum);font:600 11cqw var(--f-body);padding:4% 8%;border-radius:999px;
  white-space:nowrap;animation:pp-pop .35s cubic-bezier(.3,1.5,.5,1)}
/* wow: startled jump, exclamation */
.m-wow img{transform:translateY(-6%) scale(1.06);animation:pp-jitter .18s linear 3}
.m-wow .bang{left:72%;top:-10%;color:var(--butter);font:800 24cqw var(--f-display);
  text-shadow:0 2px 0 rgba(0,0,0,.35);animation:pp-pop .3s cubic-bezier(.3,1.6,.5,1)}
@keyframes pp-jitter{25%{translate:-2% 0}75%{translate:2% 0}}
/* love: sway, hearts float up */
.m-love img{animation:pp-sway 1.8s ease-in-out infinite}
.m-love .fx{color:var(--pip);font-size:15cqw;bottom:40%;animation:pp-float 2.2s ease-in infinite;opacity:0}
.m-love .h1{left:6%}.m-love .h2{right:8%;animation-delay:.7s;font-size:11cqw}.m-love .h3{left:42%;animation-delay:1.4s;font-size:12cqw}
@keyframes pp-sway{0%,100%{transform:rotate(-4deg)}50%{transform:rotate(4deg)}}
@keyframes pp-float{0%{transform:translateY(0) scale(.5);opacity:0}20%{opacity:1}100%{transform:translateY(-70cqw) scale(1.1);opacity:0}}
@media (prefers-reduced-motion:reduce){.pet .fx{animation:none!important;opacity:1}}

canvas.pp-confetti{position:fixed;inset:0;pointer-events:none;z-index:60}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
}

/* two-phone games: no partner yet */
.pp-gate{position:fixed;inset:0;z-index:60;background:var(--plum);display:flex;align-items:center;justify-content:center;padding:24px}
.pp-gate-card{max-width:380px;width:100%;text-align:center;animation:pp-pop .35s cubic-bezier(.3,1.5,.5,1)}
.pp-gate-pets{display:flex;justify-content:center;align-items:center;gap:14px;margin-bottom:8px}
.pp-gate-pets .pp-mascot{width:120px;height:120px}
.pp-gate-q{width:96px;height:96px;border:3px dashed var(--line);border-radius:50%;display:flex;align-items:center;justify-content:center;font:700 34px var(--f-display);color:var(--ink-soft)}
.pp-gate h2{font:700 24px var(--f-display);margin:6px 0}
.pp-gate p{color:var(--ink-soft);margin:0 0 18px}
.pp-gate a{display:block;margin-top:14px;color:var(--ink-soft);font-size:14px}
.pp-webhint{display:flex;flex-wrap:wrap;gap:6px;align-items:center;justify-content:center;font-size:13px;color:var(--ink-soft);background:var(--surface);border-radius:var(--r-m);padding:9px 12px;margin:0 0 14px;text-align:center}
.pp-webhint a{color:var(--pip);font-weight:600;text-decoration:none}

/* web-only links to the scan and the Telegram app, at the end of every game page */
.pp-bridge{display:grid;gap:10px;margin:36px 0 10px}
.pp-bridge a{display:flex;align-items:center;gap:12px;background:var(--surface);border-radius:var(--r-m);padding:12px 14px;color:inherit;text-decoration:none}
.pp-bridge a > span:first-child{font-size:26px}
.pp-bridge b{display:block;font:600 15px var(--f-display)}
.pp-bridge small{color:var(--ink-soft);font-size:13px}
