
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}
}
:root{
  --pond-deep:#1E1B4B;--pond-mid:#4338CA;--pond-teal:#6D28D9;--pond-sky:#A5B4FC;
  --pond-lily:#FFC93C;--duck-yellow:#F2A900;--duck-orange:#E8622C;--duck-brown:#5C3B18;
  --reed:#C99A5B;--mud:#44403C;--foam:#F0EDFF;--ripple:#E0D9FA;
  --bg:#F1EEFA;--surface:#FFFFFF;--surface-2:#E9E4F9;--border:#D3C7F0;
  --border-strong:#AC9AE0;--text:#1A1638;--text-2:#3D3670;--text-3:#726A9E;
  --accent:var(--pond-mid);--accent-dk:var(--pond-deep);--accent-light:#DEDAFC;
  --green:#0F7A3D;--green-light:#C9F5D9;--green-dk:#0D3B1F;
  --red:#E11D2E;--red-light:#FBD5D5;--red-dk:#7F1D1D;
  --yellow:var(--duck-yellow);--yellow-light:#FDECC5;
  --radius-sm:8px;--radius-md:12px;--radius-lg:16px;--radius-xl:22px;
  --shadow-xs:0 1px 3px rgba(26,22,56,.10);--shadow-sm:0 2px 10px rgba(26,22,56,.14);
  --shadow-md:0 4px 20px rgba(26,22,56,.18);--shadow-lg:0 8px 36px rgba(26,22,56,.24);
  /* "Ink" variables: use these (not the raw --pond-* colors) for TEXT that
     needs to read as "brand-colored" — headings, labels, stat values, the
     selected-answer state, etc. The raw --pond-deep/-mid/-teal colors stay
     fixed dark shades because they're also used as BUTTON/PILL BACKGROUNDS
     with white text on top; darkening or lightening them to fix text
     contrast would break those buttons instead. These -ink variables give
     text its own independently-tunable color per theme. */
  --heading-ink:var(--pond-deep);--accent-ink:var(--pond-mid);--teal-ink:var(--pond-teal);
}
body.dark{
  --bg:#0F0D1A;--surface:#1C1830;--surface-2:#282143;--border:#443A72;--border-strong:#5B4D96;
  --text:#F0EDFF;--text-2:#C9BFEE;--text-3:#8F84BC;--accent:#8B7FF0;--accent-dk:#4338CA;
  --accent-light:#282143;--green:#4ADE80;--green-light:#132A1C;--green-dk:#22C55E;
  --red:#F87171;--red-light:#2E1620;--red-dk:#DC2626;--yellow-light:#332905;
  --shadow-xs:0 1px 3px rgba(0,0,0,.4);--shadow-sm:0 2px 10px rgba(0,0,0,.5);
  --shadow-md:0 4px 20px rgba(0,0,0,.6);--shadow-lg:0 8px 36px rgba(0,0,0,.7);
  /* Bright, high-contrast counterparts of the ink variables above — this is
     the actual fix for the "selected answer text is unreadable in dark
     mode" bug: --pond-deep (#1E1B4B, near-black) was being used as TEXT
     color on top of --accent-light (#282143 in dark mode, also near-black),
     which is dark-on-dark and unreadable. Every place that used to read
     color:var(--pond-deep/-mid/-teal) now reads color:var(--heading-ink) /
     var(--accent-ink) / var(--teal-ink) instead, so dark mode gets its own
     bright values here while light mode is untouched. */
  --heading-ink:#E9E5FB;--accent-ink:#A5B4FC;--teal-ink:#C4B5FD;
}
body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);min-height:100vh;-webkit-font-smoothing:antialiased;font-size:14px;line-height:1.5;transition:background .3s,color .3s}
.page{display:none;min-height:100vh;flex-direction:column}
.page.active{display:flex;animation:pageEnter .32s cubic-bezier(.22,1,.36,1)}
@keyframes pageEnter{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
body::before{content:none}
.page{position:relative;z-index:1}
#page-auth{align-items:center;justify-content:center;padding:2rem;background:linear-gradient(160deg,var(--foam) 0%,var(--ripple) 45%,var(--accent-light) 100%)}
body.dark #page-auth{background:linear-gradient(160deg,var(--bg) 0%,var(--surface-2) 60%,var(--accent-light) 100%)}
.auth-box{background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-xl);padding:2.5rem;width:100%;max-width:400px;box-shadow:var(--shadow-lg)}
.auth-logo{text-align:center;margin-bottom:2rem}
.auth-logo .duck{width:84px;height:84px;object-fit:contain;display:block;margin:0 auto .5rem}
@keyframes bobFloat{0%,100%{transform:translateY(0) rotate(-3deg)}50%{transform:translateY(-8px) rotate(3deg)}}
.auth-logo h1{font-family:'Space Grotesk',sans-serif;font-size:1.75rem;font-weight:900;letter-spacing:-.03em;color:var(--heading-ink)}
body.dark .auth-logo h1{color:var(--duck-yellow)}
.auth-logo p{color:var(--text-3);font-size:.8125rem;margin-top:.25rem;font-weight:600}
.auth-tabs{display:flex;background:var(--surface-2);border-radius:var(--radius-sm);padding:4px;margin-bottom:1.5rem;gap:4px}
.auth-tab{flex:1;padding:.5rem;border:none;background:transparent;border-radius:8px;font-family:'Space Grotesk',sans-serif;font-size:.875rem;font-weight:800;color:var(--text-3);cursor:pointer;transition:all .18s}
.auth-tab.active{background:var(--surface);color:var(--heading-ink);box-shadow:var(--shadow-xs)}
body.dark .auth-tab.active{color:var(--duck-yellow)}
.auth-form{display:flex;flex-direction:column;gap:.875rem}
.field label{display:block;font-size:.75rem;font-weight:700;color:var(--text-2);margin-bottom:.375rem;font-family:'Space Grotesk',sans-serif;letter-spacing:.02em;text-transform:uppercase}
.field input{width:100%;padding:.75rem 1rem;border:2px solid var(--border);border-radius:var(--radius-sm);font-family:'Inter',sans-serif;font-size:.9rem;color:var(--text);outline:none;transition:all .18s;background:var(--surface)}
.field input:focus{border-color:var(--pond-mid);box-shadow:0 0 0 4px rgba(76,111,255,.16)}
.field input.error{border-color:var(--red)}
.err-msg{font-size:.75rem;color:var(--red);display:none;margin-top:.25rem;font-weight:600}
.btn{border:none;border-radius:var(--radius-md);padding:.8rem 1.25rem;font-family:'Space Grotesk',sans-serif;font-size:.95rem;font-weight:800;cursor:pointer;transition:all .18s;width:100%;margin-top:.25rem;letter-spacing:.01em}
.btn.primary{background:var(--pond-mid);color:white;box-shadow:0 5px 0 var(--pond-deep)}
.btn.primary:hover{transform:translateY(-2px);box-shadow:0 7px 0 var(--pond-deep)}
.btn.primary:active{transform:translateY(3px);box-shadow:0 2px 0 var(--pond-deep)}
.btn.ghost{background:transparent;color:var(--text-2);border:2px solid var(--border)}
.btn.ghost:hover{background:var(--surface-2);border-color:var(--border-strong)}
.btn.success{background:var(--pond-teal);color:white;box-shadow:0 5px 0 var(--pond-deep)}
.btn.success:hover{transform:translateY(-2px);box-shadow:0 7px 0 var(--pond-deep)}
.btn.success:active{transform:translateY(3px);box-shadow:0 2px 0 var(--pond-deep)}
.btn.danger{background:var(--red);color:white;box-shadow:0 5px 0 var(--red-dk)}
.btn.danger:active{transform:translateY(3px);box-shadow:0 2px 0 var(--red-dk)}
.btn.review-btn{background:linear-gradient(135deg,var(--duck-orange),#E05A1A);color:white;box-shadow:0 5px 0 #A03A10}
.btn.review-btn:hover{transform:translateY(-2px);box-shadow:0 7px 0 #A03A10}
.btn:disabled{opacity:.4;cursor:default;transform:none!important;box-shadow:none!important}
.topbar{background:var(--surface);border-bottom:2.5px solid var(--border);padding:.75rem 1.5rem;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:100;box-shadow:var(--shadow-xs)}
.topbar-logo{display:flex;align-items:center;gap:.5rem}
.topbar-logo .duck-sm{width:28px;height:28px;object-fit:contain;display:inline-block}
@keyframes waddle{0%,100%{transform:rotate(-5deg)}50%{transform:rotate(5deg)}}
.topbar-logo span{font-family:'Space Grotesk',sans-serif;font-size:1.1rem;font-weight:900;letter-spacing:-.02em;color:var(--heading-ink)}
body.dark .topbar-logo span{color:var(--duck-yellow)}
.topbar-right{display:flex;align-items:center;gap:.625rem}
.user-pill{display:flex;align-items:center;gap:.5rem;padding:.375rem .875rem .375rem .375rem;border-radius:30px;font-size:.8125rem;font-weight:700;color:var(--text-2);border:2px solid var(--border);background:var(--surface);cursor:pointer;transition:all .18s;font-family:'Space Grotesk',sans-serif}
.user-pill:hover{border-color:var(--pond-teal);color:var(--heading-ink)}
body.dark .user-pill:hover{color:var(--duck-yellow)}
.avatar{width:28px;height:28px;border-radius:50%;background:linear-gradient(135deg,var(--pond-teal),var(--pond-mid));color:white;display:flex;align-items:center;justify-content:center;font-size:.7rem;font-weight:800;font-family:'Space Grotesk',sans-serif}
#page-home{background:var(--bg)}
.home-content{padding:1.75rem 1.5rem 8rem;flex:1;max-width:660px;margin:0 auto;width:100%}
.home-greeting{margin-bottom:1.5rem}
.home-greeting h2{font-family:'Space Grotesk',sans-serif;font-size:1.4rem;font-weight:900;letter-spacing:-.02em;color:var(--heading-ink)}
body.dark .home-greeting h2{color:var(--duck-yellow)}
.home-greeting p{color:var(--text-3);font-size:.875rem;margin-top:.2rem;font-weight:600}
.stats-row{display:grid;grid-template-columns:1fr 1fr;gap:.875rem;margin-bottom:1.25rem}
.stat-card{background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-lg);padding:1.125rem 1.25rem;box-shadow:var(--shadow-sm);transition:transform .2s;position:relative;overflow:hidden}
.stat-card::after{content:'';position:absolute;bottom:-10px;right:-10px;width:60px;height:60px;border-radius:50%;background:radial-gradient(circle,var(--accent-light),transparent 70%);pointer-events:none}
.stat-card:hover{transform:translateY(-2px)}
.stat-card .stat-val{font-family:'Space Grotesk',sans-serif;font-size:1.75rem;font-weight:900;letter-spacing:-.04em;line-height:1;color:var(--accent-ink)}
body.dark .stat-card .stat-val{color:var(--duck-yellow)}
.stat-card .stat-lbl{font-size:.6875rem;color:var(--text-3);margin-top:.3rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em}
.streak-days-row{display:flex;gap:.3rem;margin-top:.875rem}
.sday{flex:1;display:flex;flex-direction:column;align-items:center;gap:.25rem}
.sday-dot{width:100%;aspect-ratio:1;border-radius:8px;background:var(--surface-2);border:2px solid var(--border);display:flex;align-items:center;justify-content:center;font-size:.6rem;transition:all .2s}
.sday-dot.active{background:var(--duck-yellow);border-color:var(--duck-orange);color:white}
.sday-dot.today{background:var(--pond-mid);border-color:var(--pond-deep);color:white;box-shadow:0 0 0 3px rgba(76,111,255,.28)}
.sday-lbl{font-size:.5rem;color:var(--text-3);font-weight:700;text-transform:uppercase}
.section-label{font-family:'Space Grotesk',sans-serif;font-size:.7rem;font-weight:800;color:var(--text-3);text-transform:uppercase;letter-spacing:.08em;margin:1.5rem 0 .75rem;display:flex;align-items:center;gap:.5rem}
.section-label::after{content:'';flex:1;height:2px;background:var(--border);border-radius:2px}
.courses-grid{display:grid;grid-template-columns:1fr 1fr;gap:.75rem}
.courses-grid .cc{animation:cardFadeUp .4s cubic-bezier(.22,1,.36,1) backwards}
.courses-grid .cc:nth-child(1){animation-delay:.02s}.courses-grid .cc:nth-child(2){animation-delay:.06s}
.courses-grid .cc:nth-child(3){animation-delay:.10s}.courses-grid .cc:nth-child(4){animation-delay:.14s}
.courses-grid .cc:nth-child(5){animation-delay:.18s}.courses-grid .cc:nth-child(6){animation-delay:.22s}
.courses-grid .cc:nth-child(7){animation-delay:.26s}.courses-grid .cc:nth-child(8){animation-delay:.30s}
.courses-grid .cc:nth-child(9){animation-delay:.34s}.courses-grid .cc:nth-child(n+10){animation-delay:.38s}
@keyframes cardFadeUp{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
.cc{background:var(--surface);border:2.5px solid var(--border);border-left:5px solid var(--ac,var(--border));border-radius:var(--radius-lg);padding:1rem 1.125rem;display:flex;align-items:center;gap:.875rem;cursor:pointer;transition:all .2s;box-shadow:0 3px 0 var(--border);position:relative;overflow:hidden}
.cc:hover{transform:translateY(-3px);box-shadow:0 6px 0 var(--border-strong);border-color:var(--border-strong)}
.cc:active{transform:translateY(1px);box-shadow:0 2px 0 var(--border)}
.cc.wide{grid-column:1/-1}
.cc-bar-wrap{width:52px;height:5px;background:var(--surface-2);border-radius:4px;overflow:hidden;border:1px solid var(--border);flex-shrink:0;}
.cc-bar-fill{height:100%;border-radius:4px;transition:width .5s cubic-bezier(.4,0,.2,1);}
.cc-pct{font-family:'Space Grotesk',sans-serif;font-size:.62rem;font-weight:800;color:var(--text-3);flex-shrink:0;min-width:24px;text-align:right;}
.cc-icon{width:42px;height:42px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:900;flex-shrink:0;font-family:'Space Grotesk',sans-serif;box-shadow:inset 0 -3px 0 rgba(0,0,0,.15)}
.cc-info{flex:1;min-width:0}
.cc-info h3{font-family:'Space Grotesk',sans-serif;font-size:.95rem;font-weight:800;letter-spacing:-.01em;color:var(--text)}
.cc-info p{font-size:.7rem;color:var(--text-3);margin-top:.15rem;white-space:normal;overflow:visible;line-height:1.4;font-weight:600}
.cc-right{display:flex;flex-direction:column;align-items:flex-end;gap:.4rem;flex-shrink:0}
.xp-badge{font-size:.65rem;font-weight:800;color:var(--teal-ink);background:var(--accent-light);border:1.5px solid var(--border);border-radius:20px;padding:.2rem .6rem;font-family:'Space Grotesk',sans-serif;white-space:nowrap;}
.cc-time-est{font-size:.62rem;font-weight:700;color:var(--text-3);white-space:nowrap;}
.cc-progress-row{display:flex;align-items:center;gap:.4rem;}
.pbar-wrap{width:52px;height:6px;background:var(--surface-2);border-radius:6px;overflow:hidden;border:1.5px solid var(--border)}
.pbar{height:100%;border-radius:6px;transition:width .5s cubic-bezier(.4,0,.2,1)}
.cc-chevron{color:var(--text-3);font-size:1rem;flex-shrink:0;font-weight:700}
.review-banner{background:var(--surface-2);border:2.5px solid var(--border);border-radius:var(--radius-lg);padding:1.125rem 1.25rem;display:flex;align-items:center;gap:1rem;margin-bottom:1.125rem;cursor:pointer;transition:all .15s;box-shadow:3px 3px 0 var(--border)}
.review-banner:hover{transform:translate(-2px,-2px);box-shadow:5px 5px 0 var(--border)}
.review-banner-icon{font-size:1.625rem;flex-shrink:0;animation:wobble 3s ease-in-out infinite}
@keyframes wobble{0%,100%{transform:rotate(0)}25%{transform:rotate(-8deg)}75%{transform:rotate(8deg)}}
.review-banner-text{flex:1}
.review-banner-text strong{display:block;font-family:'Space Grotesk',sans-serif;font-size:.95rem;font-weight:800;color:var(--duck-orange)}
.review-banner-text span{font-size:.75rem;color:var(--text-3);font-weight:600}
.review-banner-arrow{color:var(--duck-orange);font-size:1.25rem;font-weight:800}
.badges-shelf{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.375rem}
.badge-chip{display:flex;align-items:center;gap:.375rem;background:var(--surface);border:2px solid var(--border);border-radius:20px;padding:.35rem .75rem;font-size:.7rem;font-weight:700;color:var(--text-2);transition:all .18s;font-family:'Space Grotesk',sans-serif}
.badge-chip.earned{border-color:var(--duck-yellow);background:var(--yellow-light);color:#7A5200}
.badge-chip-icon{font-size:.9rem}
#page-course{background:var(--bg);overflow:hidden}
.course-header{background:var(--surface);border-bottom:2px solid var(--border);padding:.875rem 1.5rem;display:flex;align-items:center;gap:.875rem;position:sticky;top:0;z-index:100;box-shadow:var(--shadow-xs)}
.back-btn{background:none;border:2px solid var(--border);cursor:pointer;font-size:.875rem;color:var(--text-3);padding:.4rem .75rem;border-radius:var(--radius-sm);transition:all .18s;font-weight:700;flex-shrink:0;font-family:'Space Grotesk',sans-serif}
.back-btn:hover{background:var(--surface-2);color:var(--text);border-color:var(--border-strong)}
.ch-info{flex:1;min-width:0}
.ch-info h2{font-family:'Space Grotesk',sans-serif;font-size:1.1rem;font-weight:900;letter-spacing:-.02em;color:var(--heading-ink)}
body.dark .ch-info h2{color:var(--duck-yellow)}
.ch-info p{font-size:.75rem;color:var(--text-3);font-weight:600}
.xp-pill{font-family:'Space Grotesk',sans-serif;font-size:.8rem;font-weight:800;color:var(--accent-ink);background:var(--accent-light);border-radius:20px;padding:.35rem .875rem;border:2px solid var(--border);white-space:nowrap}
.ch-meta{display:contents}
.lang-tabs{display:flex;gap:.5rem;padding:.625rem 1.25rem;background:var(--surface);border-bottom:2px solid var(--border);overflow-x:auto;}
.lang-tabs::-webkit-scrollbar{display:none}
.lang-tab{flex-shrink:0;padding:.3rem .875rem;border:1.5px solid var(--border);border-radius:20px;font-family:'Space Grotesk',sans-serif;font-size:.8rem;font-weight:800;cursor:pointer;background:var(--surface);color:var(--text-3);transition:all .18s;white-space:nowrap;}
.lang-tab:hover{border-color:var(--border-strong);color:var(--text)}
.lang-tab.active-tab{background:var(--pond-mid);border-color:var(--pond-deep);color:white;box-shadow:0 2px 0 var(--pond-deep);}
.course-layout{display:flex;flex:1;overflow:hidden;position:relative;}
.course-path-col{flex:1;overflow-y:auto;overflow-x:hidden;padding:2rem 1.5rem 6rem;min-width:0;}
.course-path-col::-webkit-scrollbar{width:4px}
.course-path-col::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}
.unit-block{margin-bottom:2.75rem;}
.unit-header{display:flex;align-items:baseline;gap:1rem;margin-bottom:.65rem;padding:0;background:none;box-shadow:none;border-radius:0;}
.unit-header::after{content:none;}
.unit-index{font-family:'Space Grotesk',sans-serif;font-size:1.6rem;font-weight:900;letter-spacing:-.03em;color:var(--uc,var(--pond-mid));opacity:.9;flex-shrink:0;line-height:1;}
.unit-ring{display:none;}
.unit-header-text{flex:1;min-width:0;position:relative;z-index:1;}
.unit-tag{font-family:'Space Grotesk',sans-serif;font-size:.62rem;font-weight:900;text-transform:uppercase;letter-spacing:.09em;color:var(--text-3);display:block;}
.unit-title-text{font-family:'Space Grotesk',sans-serif;font-size:1.05rem;font-weight:800;color:var(--text);letter-spacing:-.01em;margin-top:.1rem;display:block;}
.unit-divider{display:none;}
.unit-progress-text{font-family:'Space Grotesk',sans-serif;font-size:.72rem;font-weight:800;color:var(--text-3);white-space:nowrap;position:relative;z-index:1;flex-shrink:0;}
.unit-time-est{font-weight:700;opacity:.75;}
.unit-progress-track{height:3px;background:var(--border);border-radius:3px;margin-bottom:1.5rem;overflow:hidden;}
.unit-progress-fill{height:100%;border-radius:3px;transition:width .5s cubic-bezier(.4,0,.2,1);}
.node-grid{display:flex;flex-direction:column;gap:.6rem;position:relative;padding:.15rem 0;}
.node-path-item{position:relative;animation:cardFadeUp .35s cubic-bezier(.22,1,.36,1) backwards;}
.node-path-item:not(:last-child)::after{content:'';position:absolute;left:38px;top:100%;width:2px;height:.6rem;background:var(--border);}
.node-path-item .node-card{width:100%;}
.node-card{position:relative;background:var(--surface);border:1.5px solid var(--border);border-radius:16px;padding:.875rem 1.125rem;cursor:pointer;display:flex;flex-direction:row;align-items:center;gap:.9rem;text-align:left;transition:transform .18s cubic-bezier(.34,1.2,.64,1), box-shadow .2s, border-color .2s;box-shadow:0 1px 2px rgba(20,16,50,.05);user-select:none;}
.node-card:hover:not(.node-locked){transform:translateX(3px);box-shadow:0 4px 14px rgba(20,16,50,.12);border-color:var(--border-strong);}
.node-card:active:not(.node-locked){transform:translateX(1px);}
.node-card.node-done{border-color:transparent;background:var(--node-done-bg,var(--pond-mid));box-shadow:0 2px 8px rgba(0,0,0,.12);}
.node-card.node-done:hover{box-shadow:0 4px 14px rgba(0,0,0,.18);border-color:transparent;}
.node-card.node-active{border-color:var(--node-active-c,var(--pond-mid));box-shadow:0 0 0 3px var(--node-active-glow,rgba(45,122,90,.12));}
.node-card.node-locked{opacity:.45;cursor:default;filter:grayscale(.6);}
.node-card.node-quiz{border-style:dashed;}
.node-card.node-quiz .node-icon-wrap{width:46px;height:46px;font-size:1.2rem;}
.node-card.node-project{border-color:#4C6FFF55;}
.node-card.node-project .node-icon-wrap{width:46px;height:46px;font-size:1.2rem;}
.node-project-tag{flex-shrink:0;background:#4C6FFF;color:white;font-family:'Space Grotesk',sans-serif;font-size:.55rem;font-weight:900;letter-spacing:.04em;padding:.2rem .5rem;border-radius:8px;white-space:nowrap;}
.node-quiz-tag{flex-shrink:0;background:var(--surface-2);color:var(--text-3);border:1.5px solid var(--border);font-family:'Space Grotesk',sans-serif;font-size:.55rem;font-weight:900;letter-spacing:.04em;padding:.2rem .5rem;border-radius:8px;white-space:nowrap;}
.node-icon-wrap{width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:1.05rem;position:relative;flex-shrink:0;}
.node-card.node-done .node-icon-wrap{background:rgba(255,255,255,.25);}
.node-card.node-done .node-icon-wrap::after{content:'✓';position:absolute;bottom:-3px;right:-4px;width:16px;height:16px;border-radius:50%;background:white;color:var(--accent-ink);font-size:.55rem;font-weight:900;display:flex;align-items:center;justify-content:center;border:1.5px solid rgba(255,255,255,.85);}
.node-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:.15rem;}
.node-label-row{display:flex;align-items:center;gap:.5rem;}
.node-desc{font-size:.72rem;color:var(--text-3);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.node-card.node-done .node-desc{color:rgba(255,255,255,.75)}
.node-meta{display:flex;flex-direction:column;align-items:flex-end;gap:.15rem;flex-shrink:0;}
.node-label{font-family:'Space Grotesk',sans-serif;font-size:.85rem;font-weight:800;color:var(--text);line-height:1.3;}
.node-card.node-done .node-label{color:rgba(255,255,255,.85)}
.node-card.node-active .node-label{color:var(--text-2)}
.node-xp{font-family:'Space Grotesk',sans-serif;font-size:.6rem;font-weight:900;padding:.2rem .55rem;border-radius:20px;background:rgba(0,0,0,.1);color:rgba(255,255,255,.8);}
.node-card:not(.node-done) .node-xp{background:var(--surface-2);color:var(--text-3);border:1.5px solid var(--border);}
.node-card.node-active:not(.node-done) .node-xp{color:var(--text-2);}
.node-time{font-family:'Space Grotesk',sans-serif;font-size:.58rem;font-weight:800;color:rgba(255,255,255,.7);margin-top:.25rem;text-align:right;white-space:nowrap;}
.node-card:not(.node-done) .node-time{color:var(--text-3);}
.node-lock-icon{position:absolute;top:.625rem;right:.625rem;font-size:.75rem;opacity:.6;}
.course-sidebar{width:260px;flex-shrink:0;padding:1.25rem;border-left:2px solid var(--border);overflow-y:auto;background:var(--surface);display:flex;flex-direction:column;gap:.875rem;}
.course-sidebar::-webkit-scrollbar{width:4px}
.course-sidebar::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}
.sb-card{background:var(--bg);border:2px solid var(--border);border-radius:var(--radius-lg);padding:1rem 1.125rem;}
.sb-card-title{font-family:'Space Grotesk',sans-serif;font-size:.65rem;font-weight:900;color:var(--text-3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:.75rem;}
.sb-stat-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:.5rem;font-size:.875rem;}
.sb-stat-label{color:var(--text-2);font-weight:600}
.sb-stat-value{font-family:'Space Grotesk',sans-serif;font-weight:900;color:var(--text)}
.sb-prog-bar{height:8px;background:var(--surface-2);border-radius:8px;overflow:hidden;border:1.5px solid var(--border);margin:.5rem 0 .25rem;}
.sb-prog-fill{height:100%;border-radius:8px;transition:width .6s cubic-bezier(.4,0,.2,1)}
.next-up-card{background:var(--accent-light);border:2px solid var(--pond-teal);border-radius:var(--radius-lg);padding:1rem 1.125rem;cursor:pointer;transition:all .2s;}
.next-up-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-md)}
.next-up-card .sb-card-title{color:var(--teal-ink)}
.next-up-name{font-family:'Space Grotesk',sans-serif;font-size:.9rem;font-weight:800;color:var(--text);line-height:1.3;margin-bottom:.5rem}
.next-up-meta{display:flex;gap:.5rem;align-items:center}
.next-up-xp{font-family:'Space Grotesk',sans-serif;font-size:.7rem;font-weight:800;color:var(--teal-ink)}
.next-up-type{font-size:.7rem;color:var(--text-3);font-weight:600}
.egg-sidebar-wrap{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.875rem;background:var(--bg);border:2px solid var(--border);border-radius:var(--radius-lg);cursor:pointer;}
.egg-sidebar-label{font-family:'Space Grotesk',sans-serif;font-size:.65rem;font-weight:900;color:var(--text-3);text-transform:uppercase;letter-spacing:.06em;}
.egg-sidebar-stage{font-family:'Space Grotesk',sans-serif;font-size:.8rem;font-weight:800;color:var(--text-2);}
#page-sandbox{background:var(--bg);flex-direction:column;min-height:100vh}
.sb-topbar{background:var(--surface);border-bottom:2px solid var(--border);padding:.5rem 1rem;display:flex;align-items:center;gap:.75rem;flex-shrink:0;flex-wrap:wrap}
.sb-back{background:none;border:1.5px solid var(--border);border-radius:var(--radius-sm);padding:.35rem .75rem;font-family:'Space Grotesk',sans-serif;font-size:.8rem;font-weight:700;color:var(--text-3);cursor:pointer;transition:all .18s}
.sb-back:hover{background:var(--surface-2);color:var(--accent)}
.sb-topbar-title{font-family:'Space Grotesk',sans-serif;font-size:.95rem;font-weight:900;color:var(--accent);letter-spacing:-.01em}
.sb-lang-row{display:flex;gap:.375rem;align-items:center;flex-wrap:wrap;flex:1}
.sb-lang-btn{padding:.3rem .875rem;border:1.5px solid var(--border);border-radius:20px;font-family:'Space Grotesk',sans-serif;font-size:.75rem;font-weight:700;cursor:pointer;background:transparent;color:var(--text-3);transition:all .18s}
.sb-lang-btn:hover{border-color:var(--border-strong);color:var(--text)}
.sb-lang-btn.active{background:var(--accent-light);border-color:var(--accent);color:var(--accent-dk)}
.sb-run-btn{display:flex;align-items:center;gap:.375rem;padding:.45rem 1.125rem;background:var(--green);color:white;border:none;border-radius:var(--radius-sm);font-family:'Space Grotesk',sans-serif;font-size:.85rem;font-weight:800;cursor:pointer;transition:all .18s;box-shadow:0 3px 0 var(--green-dk);flex-shrink:0}
.sb-run-btn:hover{transform:translateY(-1px);box-shadow:0 4px 0 var(--green-dk)}
.sb-run-btn:active{transform:translateY(2px);box-shadow:0 1px 0 var(--green-dk)}
.sb-open-btn{display:flex;align-items:center;gap:.375rem;padding:.4rem .875rem;background:var(--accent-light);color:var(--accent-dk);border:1.5px solid var(--accent);border-radius:var(--radius-sm);font-family:'Space Grotesk',sans-serif;font-size:.75rem;font-weight:700;cursor:pointer;transition:all .18s;flex-shrink:0}
.sb-open-btn:hover{background:var(--accent);color:white}
.sb-panes{display:flex;flex:1;overflow:hidden}
.sb-pane-left{display:flex;flex-direction:column;width:50%;border-right:3px solid var(--border);flex-shrink:0}
.sb-pane-right{display:flex;flex-direction:column;flex:1;background:var(--surface)}
.sb-file-tabs{display:flex;align-items:center;gap:0;background:var(--surface);border-bottom:2px solid var(--border);padding:0 .75rem;flex-shrink:0}
.sb-file-tab{padding:.5rem .875rem;font-size:.75rem;font-weight:700;color:var(--text-3);cursor:pointer;border-bottom:2.5px solid transparent;transition:all .18s;margin-bottom:-2px;white-space:nowrap;font-family:'Space Grotesk',sans-serif}
.sb-file-tab.active{color:var(--accent);border-bottom-color:var(--accent)}
.sb-editor-wrap{flex:1;overflow:hidden;position:relative;display:flex}
.sb-line-nums{background:var(--surface-2);width:44px;flex-shrink:0;padding:.75rem 0;display:flex;flex-direction:column;align-items:flex-end;padding-right:.5rem;border-right:1px solid var(--border);overflow:hidden;pointer-events:none}
.sb-ln{font-family:'JetBrains Mono',monospace;font-size:.75rem;color:var(--text-3);line-height:1.6;height:1.2rem;display:flex;align-items:center;opacity:.6}
.sb-textarea{flex:1;background:var(--bg);color:var(--text);font-family:'JetBrains Mono',monospace;font-size:.8125rem;line-height:1.6;border:none;outline:none;resize:none;padding:.75rem .875rem;tab-size:2;overflow-y:auto}
.sb-textarea::placeholder{color:var(--text-3)}
.sb-status-bar{background:var(--surface);border-top:1px solid var(--border);padding:.3rem .875rem;display:flex;align-items:center;gap:.75rem;flex-shrink:0}
.sb-status-bar span{font-size:.6875rem;color:var(--text-3);font-weight:600}
.sb-status-ok{color:var(--green)!important}
.sb-status-err{color:var(--red)!important}
.sb-preview-header{display:flex;align-items:center;gap:.5rem;padding:.5rem .875rem;background:var(--surface);border-bottom:2px solid var(--border);flex-shrink:0}
.sb-preview-label{font-family:'Space Grotesk',sans-serif;font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--text-3)}
.sb-out-dot{width:8px;height:8px;border-radius:50%;background:var(--border-strong)}
.sb-out-dot.ok{background:var(--green);box-shadow:0 0 6px var(--green)}
.sb-out-dot.err{background:var(--red);box-shadow:0 0 6px var(--red)}
.sb-output-console{flex:1;overflow-y:auto;padding:.75rem .875rem;font-family:'JetBrains Mono',monospace;font-size:.8rem;line-height:1.75;color:var(--text-2);background:var(--surface)}
.sb-iframe-wrap{flex:1;overflow:hidden;background:white}
.sb-iframe-wrap iframe{width:100%;height:100%;border:none;background:white}
.out-line{display:block;white-space:pre-wrap;word-break:break-all}
.out-line.err-line{color:var(--red)}
.out-line.ok-line{color:var(--green)}
.out-line.info-line{color:var(--teal-ink)}
.out-empty{color:var(--text-3);font-style:italic;font-size:.75rem}
#page-lesson{background:var(--bg)}
.lesson-topbar{background:var(--surface);border-bottom:2.5px solid var(--border);padding:.75rem 1rem;display:flex;align-items:center;gap:.625rem;position:sticky;top:0;z-index:100;box-shadow:var(--shadow-xs);}
.close-btn{background:none;border:2px solid var(--border);cursor:pointer;font-size:.875rem;color:var(--text-3);padding:.375rem .625rem;border-radius:var(--radius-sm);transition:all .18s;font-weight:700;flex-shrink:0;min-width:38px;text-align:center;}
.close-btn:hover{background:var(--surface-2);color:var(--text)}
.close-btn:disabled{opacity:.3;cursor:default}
.lesson-progress-bar{flex:1;height:12px;background:var(--surface-2);border-radius:12px;overflow:hidden;border:2px solid var(--border)}
.lesson-progress-fill{height:100%;background:linear-gradient(90deg,var(--pond-teal),var(--pond-lily));border-radius:10px;transition:width .45s cubic-bezier(.4,0,.2,1);position:relative}
.lesson-progress-fill::after{content:'';position:absolute;right:0;top:50%;transform:translateY(-50%);width:14px;height:14px;background:white;border-radius:50%;border:2.5px solid var(--pond-teal);box-shadow:0 1px 4px rgba(0,0,0,.2)}
.lesson-body{flex:1;overflow-y:auto;padding:1.75rem 1.5rem 8rem;max-width:600px;margin:0 auto;width:100%}
.step-badge{display:inline-flex;align-items:center;gap:.375rem;border-radius:20px;padding:.3rem 1rem;font-family:'Space Grotesk',sans-serif;font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;margin-bottom:1rem;color:white;box-shadow:0 3px 0 rgba(0,0,0,.15)}
.step-badge.learn{background:var(--pond-mid)}
.step-badge.question{background:#4C6FFF}
.step-badge.fill{background:var(--duck-orange)}
.step-badge.type{background:var(--pond-teal)}
.step-badge.history{background:linear-gradient(135deg,#C17F3A,#F5C842)}
.step-badge.project{background:#4C6FFF}
.project-brief ul li{margin-bottom:.3rem}
.step-badge.review-badge-label{background:linear-gradient(135deg,var(--duck-orange),#E05A1A)}
.lesson-question{font-family:'Space Grotesk',sans-serif;font-size:1.2rem;font-weight:900;letter-spacing:-.02em;line-height:1.4;margin-bottom:.75rem;color:var(--text);}
.step-instruction{font-size:.8rem;color:var(--text-3);font-weight:600;margin-bottom:1.25rem;line-height:1.6;}
.lesson-explain{background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-lg);padding:1.5rem;line-height:1.85;font-size:.9rem;color:var(--text-2);box-shadow:var(--shadow-sm);}
.lesson-explain code{font-family:'JetBrains Mono',monospace;background:var(--surface-2);padding:.2rem .45rem;border-radius:6px;font-size:.8rem;color:var(--accent-ink);border:1.5px solid var(--border)}
body.dark .lesson-explain code{color:var(--duck-yellow)}
.lesson-explain pre{font-family:'JetBrains Mono',monospace;background:#0D1810;color:#A8E063;border-radius:var(--radius-md);padding:1.25rem;font-size:.8125rem;overflow-x:auto;margin:.875rem 0;line-height:1.75;box-shadow:var(--shadow-sm)}
.lesson-explain pre .kw{color:#7ECCD4}
.lesson-explain pre .str{color:#F5C842}
.lesson-explain pre .fn{color:#A8E063}
.lesson-explain pre .num{color:#F07B39}
.lesson-explain pre .cm{color:#3A7A52}
.lesson-tip{margin-top:1.125rem;background:var(--yellow-light);border:2px solid rgba(245,158,11,.55);border-radius:var(--radius-md);padding:.875rem 1.125rem;font-size:.84rem;color:#6A4400;line-height:1.65;font-weight:500;}
body.dark .lesson-tip{background:#1E1500;color:#F5C842;border-color:rgba(245,158,11,.3)}
.mcq-options{display:flex;flex-direction:column;gap:.75rem}
.mcq-opt{background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-lg);padding:1rem 1.25rem;cursor:pointer;font-size:.95rem;font-weight:600;display:flex;flex-wrap:wrap;align-items:center;gap:.875rem;transition:all .2s cubic-bezier(.34,1.56,.64,1);color:var(--text);box-shadow:0 4px 0 var(--border)}
.mcq-opt-explain{flex-basis:100%;font-size:.8rem;font-weight:500;color:var(--text-2);line-height:1.5;padding-top:.25rem;margin-left:calc(34px + .875rem)}
.mcq-opt:hover:not(.disabled){border-color:var(--pond-teal);transform:translateY(-2px);box-shadow:0 6px 0 var(--pond-mid);background:var(--accent-light)}
.mcq-opt.selected{border-color:var(--pond-mid);background:var(--accent-light);box-shadow:0 4px 0 var(--pond-deep);color:var(--heading-ink)}
.mcq-opt.correct{border-color:var(--pond-teal);background:var(--green-light);box-shadow:0 4px 0 var(--pond-deep);color:var(--green-dk)}
.mcq-opt.wrong{border-color:var(--red);background:var(--red-light);box-shadow:0 4px 0 var(--red-dk);color:var(--red);animation:answerShake .4s cubic-bezier(.36,.07,.19,.97)}
@keyframes answerShake{10%,90%{transform:translateX(-1px)}20%,80%{transform:translateX(2px)}30%,50%,70%{transform:translateX(-4px)}40%,60%{transform:translateX(4px)}}
.mcq-opt.disabled{cursor:default;transform:none!important}
.mcq-letter{width:34px;height:34px;border-radius:10px;background:var(--surface-2);border:2px solid var(--border);display:flex;align-items:center;justify-content:center;font-family:'Space Grotesk',sans-serif;font-size:.8rem;font-weight:900;flex-shrink:0;transition:all .18s}
.mcq-opt.selected .mcq-letter{background:var(--pond-mid);border-color:var(--pond-deep);color:white}
.mcq-opt.correct .mcq-letter{background:var(--pond-teal);border-color:var(--pond-deep);color:white}
.mcq-opt.wrong .mcq-letter{background:var(--red);border-color:var(--red-dk);color:white}
.code-challenge{background:#0D1810;border-radius:var(--radius-lg);padding:1.25rem 1.5rem;margin-bottom:1.125rem;font-family:'JetBrains Mono',monospace;font-size:.8125rem;line-height:2.1;color:#A8E063;box-shadow:var(--shadow-sm)}
.code-blank{display:inline-block;min-width:80px;background:rgba(245,158,11,.12);border:2px dashed rgba(245,158,11,.5);border-radius:8px;padding:.1rem .6rem;color:#F5C842;font-family:'JetBrains Mono',monospace;font-size:.8125rem;cursor:pointer;transition:all .18s;vertical-align:baseline}
.code-blank:hover{background:rgba(245,158,11,.22)}
.wb-label{font-family:'Space Grotesk',sans-serif;font-size:.7rem;font-weight:800;color:var(--text-3);text-transform:uppercase;letter-spacing:.06em;margin-bottom:.5rem}
.word-bank{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}
.word-chip{background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-sm);padding:.4rem .875rem;font-family:'JetBrains Mono',monospace;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .2s cubic-bezier(.34,1.56,.64,1);box-shadow:0 3px 0 var(--border);color:var(--text)}
.word-chip:hover{border-color:var(--pond-teal);box-shadow:0 3px 0 var(--pond-mid);transform:translateY(-2px)}
.word-chip.used{opacity:.2;cursor:default;pointer-events:none}
.hint-row{display:flex;align-items:center;margin-bottom:.75rem}
.hint-toggle-btn{background:none;border:1.5px solid var(--border);border-radius:var(--radius-sm);padding:.3rem .875rem;font-family:'Space Grotesk',sans-serif;font-size:.75rem;font-weight:800;color:var(--text-2);cursor:pointer;transition:all .18s;display:inline-flex;align-items:center;gap:.4rem}
.hint-toggle-btn:hover{background:var(--surface-2);border-color:var(--pond-teal);color:var(--accent-ink)}
.hint-cost-tag{font-family:'Inter',sans-serif;font-size:.65rem;font-weight:800;color:var(--red);background:var(--red-light);border-radius:20px;padding:.1rem .5rem}
.hint-cost-tag.free{color:var(--green-dk);background:var(--green-light)}
.hint-box{background:var(--yellow-light);color:#6A4400;border:2px solid rgba(245,158,11,.55);border-radius:var(--radius-md);padding:.875rem 1.125rem;font-family:'Inter',sans-serif;font-size:.84rem;font-weight:500;margin-bottom:.875rem;line-height:1.65;}
body.dark .hint-box{background:#1E1500;color:#F5C842;border-color:rgba(245,158,11,.3)}
.code-input{width:100%;padding:1rem 1.125rem;border:2.5px solid var(--border);border-radius:var(--radius-lg);font-family:'JetBrains Mono',monospace;font-size:.9rem;background:var(--surface);color:var(--text);outline:none;transition:all .18s;resize:vertical;min-height:60px;box-shadow:var(--shadow-xs)}
.code-input:focus{border-color:var(--pond-teal);box-shadow:0 0 0 4px rgba(67,56,202,.12)}
.code-input.correct{border-color:var(--pond-teal);background:var(--green-light)}
.code-input.wrong{border-color:var(--red);background:var(--red-light);animation:answerShake .4s cubic-bezier(.36,.07,.19,.97)}
.step-counter{display:flex;align-items:center;gap:.5rem;margin-bottom:1.25rem}
.step-counter-dot{width:8px;height:8px;border-radius:50%;background:var(--border);transition:all .3s}
.step-counter-dot.done{background:var(--pond-teal)}
.step-counter-dot.active{background:var(--pond-mid);width:20px;border-radius:4px}
.step-counter-text{font-family:'Space Grotesk',sans-serif;font-size:.75rem;font-weight:800;color:var(--text-3);margin-left:auto}
.feedback-bar{position:fixed;bottom:0;left:0;right:0;padding:1.25rem 1.5rem 2rem;z-index:150;transform:translateY(110%);transition:transform .35s cubic-bezier(.34,1.2,.6,1)}
.feedback-bar.show{transform:translateY(0)}
.feedback-bar.correct-fb{background:var(--green-light);border-top:3.5px solid var(--pond-teal)}
.feedback-bar.wrong-fb{background:var(--red-light);border-top:3.5px solid var(--red)}
.fb-inner{max-width:600px;margin:0 auto;display:flex;align-items:center;gap:1rem}
.fb-icon{font-size:2rem;flex-shrink:0}
.fb-text{flex:1}
.fb-text strong{display:block;font-family:'Space Grotesk',sans-serif;font-size:1rem;font-weight:900;color:var(--text)}
.fb-text span{font-size:.8125rem;color:var(--text-2);font-weight:500}
.fb-btn{flex-shrink:0}
.check-area{padding:1rem 1.5rem;background:var(--surface);border-top:2.5px solid var(--border);position:sticky;bottom:0;box-shadow:0 -4px 16px rgba(27,77,62,.06)}
.check-area-inner{max-width:600px;margin:0 auto}
.kbd-hint{font-size:.7rem;color:var(--text-3);font-weight:600;text-align:center;margin-top:.5rem}
.kbd-hint kbd{font-family:'JetBrains Mono',monospace;background:var(--surface-2);border:1px solid var(--border);border-radius:4px;padding:.05rem .35rem;font-size:.68rem;margin:0 .1rem}
.complete-screen{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;gap:0;}
.complete-screen .trophy{font-size:4.5rem;margin-bottom:1.125rem;animation:pop .55s cubic-bezier(.34,1.56,.64,1)}
@keyframes pop{0%{transform:scale(0) rotate(-15deg)}80%{transform:scale(1.12) rotate(3deg)}100%{transform:scale(1)}}
.complete-screen h2{font-family:'Space Grotesk',sans-serif;font-size:1.625rem;font-weight:900;letter-spacing:-.03em;margin-bottom:.375rem;color:var(--heading-ink)}
body.dark .complete-screen h2{color:var(--duck-yellow)}
.complete-screen p{color:var(--text-3);font-size:.9rem;margin-bottom:.5rem;font-weight:600}
.complete-sub{font-size:.825rem;color:var(--text-3);font-weight:600;margin-top:.75rem;background:var(--surface-2);border:1.5px solid var(--border);border-radius:var(--radius-md);padding:.6rem 1rem;display:inline-block;}
.xp-award{background:var(--yellow-light);border:2.5px solid var(--duck-yellow);border-radius:var(--radius-lg);padding:1rem 2rem;font-family:'Space Grotesk',sans-serif;font-size:1.2rem;font-weight:900;color:#6A4400;margin-bottom:1rem;display:inline-block;box-shadow:0 5px 0 var(--duck-orange)}
body.dark .xp-award{color:#F5C842}
.perfect-bonus-tag{display:inline-block;font-family:'Inter',sans-serif;font-size:.7rem;font-weight:800;background:var(--pond-teal);color:white;border-radius:20px;padding:.2rem .6rem;vertical-align:middle;margin-left:.4rem}
.complete-actions{display:flex;flex-direction:column;gap:.75rem;width:100%;max-width:320px;margin-top:1.5rem}

/* ── Course completion celebration screen ────────────────────────────── */
.course-celebration{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;position:relative;overflow:hidden}
.confetti-wrap{position:absolute;inset:0;overflow:hidden;pointer-events:none}
.confetti-piece{position:absolute;top:-20px;border-radius:2px;opacity:.9;animation-name:confettiFall;animation-timing-function:cubic-bezier(.4,0,.6,1);animation-iteration-count:1;animation-fill-mode:forwards}
@keyframes confettiFall{
  0%{transform:translateY(-40px) rotate(0deg);opacity:0}
  10%{opacity:.9}
  100%{transform:translateY(420px) rotate(340deg);opacity:0}
}
@media (prefers-reduced-motion: reduce){.confetti-piece{animation:none;display:none}}
.cc-badge{width:88px;height:88px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:2.25rem;font-weight:900;margin-bottom:1.25rem;position:relative;z-index:1;animation:pop .6s cubic-bezier(.34,1.56,.64,1)}
.course-celebration h1{font-family:'Space Grotesk',sans-serif;font-size:2rem;font-weight:700;letter-spacing:-.02em;color:var(--heading-ink);margin-bottom:.5rem;position:relative;z-index:1}
body.dark .course-celebration h1{color:var(--duck-yellow)}
.cc-course-name{color:var(--text-3);font-size:.95rem;font-weight:600;margin-bottom:1.5rem;position:relative;z-index:1}
.cc-stats-row{display:flex;gap:.75rem;margin-bottom:2rem;position:relative;z-index:1}
.cc-stat{background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-lg);padding:1rem 1.375rem;box-shadow:var(--shadow-sm);min-width:88px}
.cc-stat-val{font-family:'Space Grotesk',sans-serif;font-size:1.5rem;font-weight:900;letter-spacing:-.03em;color:var(--accent-ink)}
body.dark .cc-stat-val{color:var(--duck-yellow)}
.cc-stat-lbl{font-size:.65rem;color:var(--text-3);font-weight:700;text-transform:uppercase;letter-spacing:.05em;margin-top:.2rem}
.cc-actions{display:flex;flex-direction:column;gap:.75rem;width:100%;max-width:320px;position:relative;z-index:1}
#page-profile{background:var(--bg)}
.profile-topbar{background:var(--surface);border-bottom:2.5px solid var(--border);padding:.875rem 1.5rem;display:flex;align-items:center;gap:.875rem;position:sticky;top:0;z-index:100;box-shadow:var(--shadow-xs)}
.profile-topbar span{font-family:'Space Grotesk',sans-serif;font-size:1.05rem;font-weight:900;flex:1;color:var(--heading-ink)}
body.dark .profile-topbar span{color:var(--duck-yellow)}
.profile-content{padding:1.75rem 1.5rem 4rem;max-width:660px;margin:0 auto;width:100%}
.profile-hero{background:linear-gradient(135deg,var(--pond-deep) 0%,var(--pond-mid) 100%);border-radius:var(--radius-xl);padding:1.75rem;display:flex;align-items:center;gap:1.25rem;margin-bottom:1.25rem;box-shadow:var(--shadow-md);position:relative;overflow:hidden}
.profile-hero::before{content:'🌿🌿';position:absolute;bottom:-8px;right:16px;font-size:2.5rem;opacity:.2;pointer-events:none}
.profile-avatar-big{width:76px;height:76px;border-radius:50%;background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));color:white;display:flex;align-items:center;justify-content:center;line-height:1;overflow:hidden;font-family:'Space Grotesk',sans-serif;font-size:1.875rem;font-weight:900;flex-shrink:0;box-shadow:0 4px 16px rgba(0,0,0,.25),0 0 0 4px rgba(255,255,255,.2)}
.profile-hero-info{flex:1;min-width:0}
.profile-hero-info h2{font-family:'Space Grotesk',sans-serif;font-size:1.375rem;font-weight:900;letter-spacing:-.02em;color:white;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.profile-hero-info p{font-size:.8125rem;color:rgba(255,255,255,.65);margin-top:.25rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.profile-hero-badges{margin-top:.625rem;display:flex;gap:.4rem;flex-wrap:wrap}
/* Profile tab bar: hidden on desktop (the panels below all stay
   visible there, unchanged single-scroll layout) — only shown and
   made functional inside the mobile breakpoint further down. */
.qcg-profile-tabs{display:none}
.qcg-profile-tab{font-family:'Space Grotesk',sans-serif;font-weight:800;cursor:pointer;border:2px solid var(--border);background:var(--surface);color:var(--text-3);border-radius:20px;transition:all .18s}
.qcg-profile-tab.active{background:var(--accent-light);border-color:var(--accent);color:var(--accent-dk)}
/* .qcg-profile-panel-hidden intentionally has NO rule here — panels
   always stay visible on desktop regardless of which tab is "active"
   in JS state. It only actually hides anything inside the mobile
   breakpoint below, where it's redefined to display:none. */
.profile-stats-row{display:grid;grid-template-columns:repeat(4,1fr);gap:.75rem;margin-bottom:1.375rem}
.profile-stat{background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-lg);padding:1rem;text-align:center;box-shadow:0 3px 0 var(--border);transition:transform .18s}
.profile-stat:hover{transform:translateY(-2px)}
.profile-stat-val{font-family:'Space Grotesk',sans-serif;font-size:1.5rem;font-weight:900;letter-spacing:-.04em;color:var(--accent-ink)}
body.dark .profile-stat-val{color:var(--duck-yellow)}
.profile-stat-lbl{font-size:.6rem;font-weight:800;color:var(--text-3);text-transform:uppercase;letter-spacing:.05em;margin-top:.25rem}
.profile-section-title{font-family:'Space Grotesk',sans-serif;font-size:.7rem;font-weight:900;color:var(--text-3);text-transform:uppercase;letter-spacing:.08em;margin:1.375rem 0 .875rem;display:flex;align-items:center;gap:.5rem}
.profile-section-title::after{content:'';flex:1;height:2px;background:var(--border);border-radius:2px}
.profile-courses{display:flex;flex-direction:column;gap:.625rem;margin-bottom:1rem}
.profile-course-row{background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-md);padding:.875rem 1.125rem;display:flex;align-items:center;gap:.875rem;transition:all .18s;box-shadow:0 2px 0 var(--border)}
.profile-course-row:hover{transform:translateY(-1px);box-shadow:0 3px 0 var(--border-strong)}
.profile-course-icon{width:34px;height:34px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;font-family:'Space Grotesk',sans-serif;font-size:.75rem;font-weight:900;flex-shrink:0;box-shadow:inset 0 -2px 0 rgba(0,0,0,.12)}
.profile-course-name{flex:1;font-family:'Space Grotesk',sans-serif;font-size:.9rem;font-weight:800;color:var(--text)}
.profile-course-pbar{flex:1;height:8px;background:var(--surface-2);border-radius:8px;overflow:hidden;border:1.5px solid var(--border);max-width:110px}
.profile-course-fill{height:100%;border-radius:8px;transition:width .5s}
.profile-course-pct{font-family:'Space Grotesk',sans-serif;font-size:.8rem;font-weight:800;color:var(--text-3);min-width:36px;text-align:right}
.badges-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;margin-bottom:1rem}
.badge-card{background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-lg);padding:1rem .75rem;display:flex;flex-direction:column;align-items:center;gap:.4rem;text-align:center;transition:all .22s cubic-bezier(.34,1.56,.64,1);position:relative;box-shadow:0 3px 0 var(--border)}
.badge-card:hover{transform:translateY(-3px);box-shadow:0 6px 0 var(--border-strong)}
.badge-card.earned{border-color:var(--duck-yellow);background:var(--yellow-light);box-shadow:0 3px 0 var(--duck-orange)}
body.dark .badge-card.earned .badge-name{color:#F5C842}
.badge-card.earned:hover{box-shadow:0 6px 0 var(--duck-orange)}
.badge-card.locked{opacity:.4;filter:grayscale(.6)}
.badge-icon{font-size:1.875rem;line-height:1}
.badge-name{font-family:'Space Grotesk',sans-serif;font-size:.65rem;font-weight:800;color:var(--text-2);line-height:1.3}
.badge-card.earned .badge-name{color:#6A4400}
.badge-card-desc{font-size:.575rem;color:var(--text-3);line-height:1.35;text-align:center}
.badge-card.earned .badge-card-desc{color:#8A6000}
.badge-earned-tag{position:absolute;top:-8px;right:-8px;background:var(--duck-yellow);color:#6A4400;border-radius:20px;padding:.15rem .5rem;font-family:'Space Grotesk',sans-serif;font-size:.55rem;font-weight:900;border:2.5px solid var(--surface);box-shadow:var(--shadow-xs)}
.badge-unlock-toast{position:fixed;bottom:5rem;left:50%;transform:translateX(-50%) translateY(140px);opacity:0;background:var(--surface);border:2.5px solid var(--duck-yellow);border-radius:var(--radius-xl);padding:1.125rem 1.625rem;display:flex;align-items:center;gap:1rem;box-shadow:var(--shadow-lg),0 0 0 4px rgba(245,158,11,.15);z-index:1000;transition:transform .45s cubic-bezier(.34,1.56,.64,1),opacity .3s ease;pointer-events:none;visibility:hidden}
.badge-unlock-toast.show{transform:translateX(-50%) translateY(0);opacity:1;visibility:visible}
.badge-unlock-icon{font-size:2.125rem}
.badge-unlock-text strong{display:block;font-family:'Space Grotesk',sans-serif;font-size:.9rem;font-weight:900;color:var(--text)}
.badge-unlock-text span{font-size:.775rem;color:var(--text-3);font-weight:600}
.modal-overlay{position:fixed;inset:0;background:rgba(11,30,23,.55);backdrop-filter:blur(4px);display:none;align-items:center;justify-content:center;z-index:300;padding:1rem}
.modal-overlay.open{display:flex;animation:modalOverlayFade .22s ease}
.modal-overlay.open .modal-box, .modal-overlay.open .golden-modal-box, .modal-overlay.open .onboarding-box{animation:modalPopIn .3s cubic-bezier(.22,1,.36,1)}
@keyframes modalOverlayFade{from{opacity:0}to{opacity:1}}
@keyframes modalPopIn{from{opacity:0;transform:scale(.94) translateY(6px)}to{opacity:1;transform:scale(1) translateY(0)}}
.modal-box{background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-xl);padding:2.125rem;width:100%;max-width:420px;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg);position:relative}
.modal-icon-box{width:68px;height:68px;border-radius:var(--radius-lg);display:flex;align-items:center;justify-content:center;font-size:2.25rem;margin-bottom:1.25rem;box-shadow:inset 0 -4px 0 rgba(0,0,0,.1)}
.modal-box h2{font-family:'Space Grotesk',sans-serif;font-size:1.25rem;font-weight:900;letter-spacing:-.02em;margin-bottom:.375rem;color:var(--heading-ink)}
body.dark .modal-box h2{color:var(--duck-yellow)}
.modal-box p{font-size:.9rem;color:var(--text-2);margin-bottom:1rem;font-weight:500;line-height:1.6}
.modal-meta{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:1.75rem}
.modal-close{position:absolute;top:.875rem;right:.875rem;background:none;border:2px solid var(--border);border-radius:var(--radius-sm);padding:.3rem .55rem;font-size:.875rem;cursor:pointer;color:var(--text-3);transition:all .15s}
.modal-close:hover{background:var(--surface-2);border-color:var(--border-strong)}
.toast{position:fixed;bottom:2rem;left:50%;transform:translateX(-50%) translateY(80px);background:var(--pond-deep);color:white;padding:.7rem 1.375rem;border-radius:var(--radius-md);font-family:'Space Grotesk',sans-serif;font-size:.875rem;font-weight:800;z-index:999;transition:transform .35s cubic-bezier(.34,1.56,.64,1);white-space:nowrap;pointer-events:none;box-shadow:var(--shadow-lg)}
.toast.show{transform:translateX(-50%) translateY(0)}
.xp-pop{position:fixed;pointer-events:none;font-family:'Space Grotesk',sans-serif;font-size:1rem;font-weight:900;color:var(--duck-yellow);z-index:998;animation:xpFloat 1.2s ease-out forwards;text-shadow:0 2px 8px rgba(0,0,0,.2)}
@keyframes xpFloat{0%{opacity:1;transform:translateY(0) scale(1)}100%{opacity:0;transform:translateY(-60px) scale(1.3)}}
::-webkit-scrollbar{width:4px;height:6px}
::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}
/* ── STREAK SYSTEM ── */
.streak-flame-wrap{position:relative;display:inline-flex;align-items:center;justify-content:center}
.streak-flame{font-size:1.5rem;display:inline-block;filter:drop-shadow(0 2px 4px rgba(234,88,12,.3))}
.streak-flame.lit{animation:flameFlicker 1.6s ease-in-out infinite}
.streak-flame.unlit{opacity:.3;filter:grayscale(1)}
@keyframes flameFlicker{0%,100%{transform:scale(1) rotate(-2deg)}50%{transform:scale(1.08) rotate(2deg)}}
.streak-milestone-badge{display:inline-flex;align-items:center;gap:.3rem;background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));color:#5A3300;font-family:'Space Grotesk',sans-serif;font-size:.65rem;font-weight:900;padding:.2rem .6rem;border-radius:20px;margin-top:.3rem;box-shadow:0 2px 0 #A03A10}
.sday-dot.frozen{background:var(--pond-sky);border-color:var(--pond-teal)}
/* ── MASTERY EGGS ── */
.mastery-egg-card{display:flex;flex-direction:column;align-items:center;gap:.625rem;padding:1.125rem;background:linear-gradient(160deg,var(--bg),var(--surface-2));border:2px solid var(--border);border-radius:var(--radius-lg);cursor:pointer;transition:all .2s;position:relative;overflow:hidden}
.mastery-egg-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-md);border-color:var(--border-strong)}
.mastery-egg-svg-wrap{width:84px;height:84px;display:flex;align-items:center;justify-content:center;position:relative}
.mastery-egg-svg-wrap svg{width:100%;height:100%;filter:drop-shadow(0 4px 8px rgba(27,77,62,.18))}
.mastery-egg-glow{position:absolute;inset:-12px;border-radius:50%;background:radial-gradient(circle,rgba(245,158,11,.25),transparent 70%);pointer-events:none;animation:eggGlowPulse 3s ease-in-out infinite}
@keyframes eggGlowPulse{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.12)}}
.mastery-egg-stagelabel{font-family:'Space Grotesk',sans-serif;font-size:.8rem;font-weight:800;color:var(--text-2)}
.mastery-egg-sublabel{font-family:'Space Grotesk',sans-serif;font-size:.65rem;font-weight:700;color:var(--text-3);text-transform:uppercase;letter-spacing:.05em}
.mastery-egg-progress-track{width:100%;height:7px;background:var(--surface-2);border-radius:8px;overflow:hidden;border:1.5px solid var(--border);margin-top:.1rem}
.mastery-egg-progress-fill{height:100%;border-radius:8px;background:linear-gradient(90deg,var(--pond-teal),var(--pond-lily));transition:width .6s cubic-bezier(.4,0,.2,1)}
.egg-stage-dots{display:flex;gap:.3rem;margin-top:.15rem}
.egg-stage-dot{width:7px;height:7px;border-radius:50%;background:var(--border)}
.egg-stage-dot.filled{background:var(--duck-yellow)}

/* ── Focus timer (Pomodoro) widget — positioning moved here from inline
   styles (values unchanged) so it can be repositioned on mobile below. ── */
.qcg-pomodoro-widget{position:fixed;bottom:20px;right:20px;z-index:500}
.qcg-pomodoro-fab{width:52px;height:52px;border-radius:50%;border:none;background:var(--pond-teal);color:#fff;font-size:1.3rem;cursor:pointer;box-shadow:0 4px 16px rgba(0,0,0,.25)}
.qcg-pomodoro-panel{position:absolute;bottom:64px;right:0;width:220px;background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);padding:1rem;text-align:center}

/* ── Mobile bottom nav — hidden entirely on desktop. Made visible (and
   given real fixed-bar styling) only inside the mobile breakpoint
   below; .qcg-bottom-nav-hidden additionally hides it on the handful
   of full-screen pages (auth, an active lesson, sandbox, etc) even on
   mobile — see qcgSyncBottomNav() in app.js. ── */
.qcg-bottom-nav{display:none}

/* ═══════════════════════════════════════════════════════════════════
   QUACKCODE — MOBILE RESPONSIVE PATCH
   Only active inside the @media breakpoints below, so the desktop
   layout (anything wider than 900px) is completely untouched.
════════════════════════════════════════════════════════════════════ */

/* ── Tablet / small laptop ── */
@media (max-width:900px){
  .course-sidebar{width:220px}
}

/* ── Phones & narrow tablets ── */
@media (max-width:768px){
  body{font-size:13.5px}

  /* Prevent iOS/Android auto-zoom-on-focus: mobile browsers zoom the whole
     page in the instant a focused input's rendered font-size is under 16px,
     and typically don't zoom back out afterward. Since the 13.5px root
     above shrinks every rem-based input below that threshold, force all
     actual form fields back up to 16px here specifically — this is the
     one thing that must stay full-size on mobile so the page never zooms. */
  input, select, textarea { font-size: 16px !important; }

  /* Topbar: let it wrap instead of overflowing, shrink buttons */
  .topbar{padding:.625rem .875rem;flex-wrap:wrap;row-gap:.5rem}
  .topbar-right{flex-wrap:wrap;justify-content:flex-end;gap:.4rem;width:100%}
  .topbar-right .btn.ghost{padding:.35rem .625rem;font-size:.75rem}
  .user-pill{padding:.3rem .625rem .3rem .3rem;font-size:.75rem}
  .topbar-logo span{font-size:1rem}

  /* Auth box */
  #page-auth{padding:1rem}
  .auth-box{padding:1.5rem}

  /* Home */
  .home-content{padding:1.25rem 1rem 8rem}
  .home-greeting h2{font-size:1.2rem}
  .stats-row{gap:.625rem}
  .stat-card{padding:.875rem 1rem}
  .stat-card .stat-val{font-size:1.4rem}
  /* The "Today's Goal" ring card is injected as a 3rd child into a
     2-column grid, so it sat alone in column 1 with a full card-width
     of dead empty space next to it, plus the full square-card height
     of the two cards above it. Span it across both columns and lay it
     out as a compact horizontal strip instead — same information,
     roughly half the height, no wasted space. */
  #qcg-xp-ring-card{grid-column:1/-1;display:flex;align-items:center;gap:.875rem;padding:.625rem 1rem}
  #qcg-xp-ring-card #qcg-xp-ring-wrap{margin:0}
  #qcg-xp-ring-card .stat-lbl{margin-top:0}
  /* The course picker moves to its own "Lessons" tab (bottom nav)
     instead of living inline at the bottom of Home — desktop still
     shows it right here on Home, unchanged. */
  .qcg-home-courses-section{display:none}

  /* ── Bottom nav: real fixed tab bar, mobile only ── */
  .qcg-bottom-nav{
    display:flex;position:fixed;left:0;right:0;bottom:0;z-index:600;
    background:var(--surface);border-top:2px solid var(--border);
    padding:.4rem .5rem calc(.4rem + env(safe-area-inset-bottom,0px));
    box-shadow:0 -2px 10px rgba(0,0,0,.06);
  }
  .qcg-bottom-nav.qcg-bottom-nav-hidden{display:none}
  .qcg-bottom-nav-btn{
    flex:1;display:flex;flex-direction:column;align-items:center;gap:.15rem;
    background:none;border:none;padding:.35rem .25rem;cursor:pointer;
    color:var(--text-3);font-family:'Space Grotesk',sans-serif;
  }
  .qcg-bnav-icon{font-size:1.25rem;line-height:1}
  .qcg-bnav-label{font-size:.62rem;font-weight:800}
  .qcg-bottom-nav-btn.active{color:var(--accent-ink)}

  /* Reserve room at the bottom of every page the nav bar can appear
     on, so its last bit of content (and the pomodoro widget floating
     just above the nav bar) is never hidden underneath either one.
     .home-content already had 8rem reserved (for the pomodoro widget
     alone, pre-existing) which comfortably covers the nav bar too, so
     it's intentionally left out of this rule rather than shrunk. */
  .profile-content,.social-content{padding-bottom:calc(7rem + env(safe-area-inset-bottom,0px))}
  .course-path-col{padding-bottom:calc(1.5rem + 5.5rem + env(safe-area-inset-bottom,0px))}

  /* Sits just above the bottom nav instead of at the very corner. */
  .qcg-pomodoro-widget{bottom:calc(70px + env(safe-area-inset-bottom,0px))}
  .courses-grid{grid-template-columns:1fr 1fr;gap:.625rem}
  .cc{padding:.75rem .875rem;gap:.625rem}
  .cc-icon{width:36px;height:36px;font-size:.7rem}
  .cc-info h3{font-size:.85rem}
  .cc-info p{font-size:.65rem}
  .review-banner{padding:.875rem 1rem;gap:.75rem}

  /* Course header / tabs: two clean rows instead of one squeezed row —
     row 1 is back + title (title gets full room to breathe so it can
     never be pushed into overflow by the pills), row 2 is the XP/time
     pills, forced onto their own line via ch-meta's flex-basis:100%. */
  .course-header{padding:.75rem 1rem;gap:.5rem .625rem;flex-wrap:wrap}
  .ch-info{flex:1 1 auto;min-width:0}
  .ch-info h2{font-size:1rem;white-space:normal;overflow-wrap:break-word}
  .ch-info p{white-space:normal}
  .ch-meta{display:flex;flex:1 1 100%;gap:.5rem}
  .xp-pill{padding:.3rem .625rem;font-size:.7rem}
  .lang-tabs{padding:.5rem .875rem;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 28px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 28px),transparent)}

  /* Course layout: stack sidebar below the path instead of beside it */
  .course-layout{flex-direction:column;overflow-y:auto;overflow-x:hidden}
  .course-path-col{overflow:visible;padding:1.25rem 1rem 1.5rem;flex:none}
  .course-sidebar{
    width:100%;border-left:none;border-top:2px solid var(--border);
    flex-direction:row;flex-wrap:wrap;gap:.75rem;overflow-y:visible;
  }
  .course-sidebar .sb-card,
  .course-sidebar .next-up-card,
  .course-sidebar .mastery-egg-card{flex:1 1 240px}

  .node-card{padding:.75rem .875rem;gap:.7rem}
  .node-icon-wrap{width:36px;height:36px;font-size:.95rem;border-radius:10px}
  .node-label{font-size:.78rem}
  .node-desc{display:none}
  .node-path-item:not(:last-child)::after{left:32px}
  .unit-header{gap:.75rem}
  .unit-index{font-size:1.3rem}
  .unit-title-text{font-size:.9rem}

  /* Lesson */
  .lesson-body{padding:1.25rem 1rem 8rem}
  .lesson-question{font-size:1.05rem}
  .lesson-explain{padding:1.125rem}
  .lesson-explain pre{padding:.875rem;font-size:.75rem}
  .mcq-opt{padding:.875rem 1rem;font-size:.875rem}
  .code-challenge{padding:1rem 1.125rem;font-size:.75rem}
  .feedback-bar{padding:1rem 1rem 1.5rem}
  .fb-inner{gap:.625rem}
  .fb-icon{font-size:1.5rem}
  .fb-text strong{font-size:.9rem}
  .fb-text span{font-size:.75rem}
  .fb-btn{min-width:88px!important;padding:.65rem .875rem!important}
  .check-area{padding:.875rem 1rem}

  /* Focus timer widget: smaller and tucked closer to the corner so it
     overlaps less real content, with extra scroll clearance below. */
  .qcg-pomodoro-widget{bottom:14px;right:14px}
  .qcg-pomodoro-fab{width:44px;height:44px;font-size:1.05rem}
  .qcg-pomodoro-panel{width:190px;bottom:54px}

  /* Profile: split into tab panels instead of one very long scroll
     (hero, stats, streak freezes, heatmap, all 9 courses, all 48
     badges, and 3 settings/danger-zone cards were all stacked one
     after another). The tab bar becomes visible and functional only
     here; .qcg-profile-panel-hidden only actually hides anything here
     too — both are inert on desktop. */
  .profile-content{padding:1.25rem 1rem 5.5rem}
  .profile-hero{padding:1.25rem;gap:1rem;flex-wrap:wrap}
  .profile-avatar-big{width:60px;height:60px;font-size:1.5rem}
  .profile-hero-info h2{font-size:1.1rem}
  .qcg-profile-tabs{display:flex;gap:.5rem;overflow-x:auto;-webkit-overflow-scrolling:touch;padding:.25rem 0 .875rem;margin:-.25rem 0 0}
  .qcg-profile-tabs::-webkit-scrollbar{display:none}
  .qcg-profile-tab{flex-shrink:0;padding:.5rem 1rem;font-size:.8rem}
  .qcg-profile-panel-hidden{display:none}
  .profile-stats-row{grid-template-columns:repeat(2,1fr);gap:.625rem}
  .badges-grid{grid-template-columns:repeat(2,1fr)}

  /* Modals */
  .modal-box{padding:1.5rem}
  .golden-modal-box{padding:1.5rem}

  /* Sandbox: stack editor above output instead of side-by-side. The
     language picker was wrapping into a tall stack of one-per-row
     pills, pushing the editor almost entirely off-screen — scroll it
     horizontally in one row instead, same pattern as .lang-tabs. */
  .sb-topbar{padding:.5rem .75rem;gap:.5rem}
  .sb-lang-row{
    order:3;width:100%;justify-content:flex-start;
    flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;
  }
  .sb-lang-row::-webkit-scrollbar{display:none}
  .sb-lang-btn{flex-shrink:0}
  .sb-panes{flex-direction:column;overflow-y:auto;overflow-x:hidden}
  .sb-pane-left{width:100%;border-right:none;border-bottom:3px solid var(--border);height:46vh;flex-shrink:0}
  .sb-pane-right{height:46vh;flex-shrink:0;padding-bottom:3rem}
  .sb-editor-wrap{overflow:auto}

  /* Social / leaderboard / duels */
  .social-content{padding:1.25rem 1rem 5.5rem}
  .lb-banner{padding:1.25rem 1.25rem 1rem}
  .podium-slot.place-1 .podium-avatar{width:52px;height:52px;font-size:1.15rem}
  .podium-slot.place-2 .podium-avatar,.podium-slot.place-3 .podium-avatar{width:44px;height:44px;font-size:1rem}
  .duel-vs-row{gap:1rem}
  .duel-side .lb-avatar{width:46px;height:46px;font-size:1.05rem}
  .add-friend-row{flex-wrap:wrap}
  .add-friend-row button{width:100%}

  /* AI chat */
  .ai-chat-body{padding:1rem 1rem .75rem}
  .ai-msg-row{max-width:92%}
  .ai-input-area{padding:.875rem 1rem 1.25rem}

  /* Modal meta / lesson topbar tightened */
  .lesson-topbar{padding:.625rem .75rem;gap:.5rem}
  .close-btn{min-width:34px;padding:.3rem .5rem}
}

/* ── Small phones ── */
@media (max-width:420px){
  .courses-grid{grid-template-columns:1fr}
  .profile-stats-row{grid-template-columns:repeat(2,1fr)}
  .badges-grid{grid-template-columns:repeat(2,1fr)}
  .node-card{padding:.65rem .75rem;gap:.6rem}
  .node-icon-wrap{width:32px;height:32px;font-size:.85rem}
  .stats-row{grid-template-columns:1fr 1fr}
  .topbar-right .btn.ghost{font-size:.7rem;padding:.3rem .55rem}
  .duel-vs-row{gap:.625rem}
  .duel-vs-label{font-size:.85rem}
}

/* ── Landscape phones / short viewports: shrink the sandbox panes ── */
@media (max-width:768px) and (max-height:480px){
  .sb-pane-left,.sb-pane-right{height:auto;max-height:none}
  .sb-panes{flex-direction:row}
  .sb-pane-left{width:50%;border-right:3px solid var(--border);border-bottom:none}
  .sb-pane-right{flex:1}
}


/* ── Improved Friends System ── */
.friends-tabs{display:flex;gap:0;border-bottom:2px solid var(--border);margin-bottom:1rem}
.friend-tab{padding:.55rem 1rem;font-size:.8rem;cursor:pointer;border:none;background:none;color:var(--text-3);border-bottom:2.5px solid transparent;margin-bottom:-2px;transition:color .15s;font-family:'Space Grotesk',sans-serif;font-weight:800}
.friend-tab.ft-active{color:var(--text);border-bottom-color:var(--pond-mid)}
body.dark .friend-tab.ft-active{border-bottom-color:var(--duck-yellow);color:var(--text)}
.friend-tab:hover:not(.ft-active){color:var(--text)}
.friend-badge{display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;border-radius:50%;font-size:.6rem;font-weight:900;background:var(--pond-mid);color:white;margin-left:4px;vertical-align:middle}
.friend-pane{display:none}.friend-pane.fp-active{display:block}
.friend-search-row{display:flex;gap:.5rem;margin-bottom:.875rem}
.friend-search-wrap{flex:1;position:relative;display:flex;align-items:center}
.friend-search-icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-3);font-size:.9rem;pointer-events:none}
.friend-search-input{width:100%;padding:.6rem .75rem .6rem 2.1rem;font-size:.8rem;border:2px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);outline:none;font-family:'Inter',sans-serif;transition:border-color .15s}
.friend-search-input:focus{border-color:var(--pond-teal)}
.fr-card{display:flex;align-items:center;gap:.75rem;padding:.75rem .875rem;border:2px solid var(--border);border-radius:var(--radius-lg);margin-bottom:.5rem;background:var(--surface);transition:border-color .15s;box-shadow:0 2px 0 var(--border)}
.fr-card:hover{border-color:var(--border-strong)}
.fr-avatar{width:38px;height:38px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:800;flex-shrink:0;color:white;font-family:'Space Grotesk',sans-serif;position:relative}
.fr-avatar.sm{width:28px;height:28px;font-size:.65rem}
.fr-online-dot{position:absolute;bottom:0;right:0;width:10px;height:10px;border-radius:50%;border:2px solid var(--surface)}
.dot-online{background:#3BA882}.dot-away{background:#F5C842}.dot-offline{background:var(--border-strong)}
.fr-meta{flex:1;min-width:0}
.fr-name{font-family:'Space Grotesk',sans-serif;font-size:.875rem;font-weight:800;color:var(--text)}
.fr-sub{font-size:.7rem;color:var(--text-3);margin-top:.1rem;font-weight:600}
.fr-xp-bar{height:4px;background:var(--surface-2);border-radius:4px;overflow:hidden;margin-top:.3rem;width:72px;border:1px solid var(--border)}
.fr-xp-fill{height:100%;border-radius:4px;background:var(--pond-teal)}
.fr-actions{display:flex;gap:.375rem;flex-shrink:0}
.fr-icon-btn{width:30px;height:30px;display:flex;align-items:center;justify-content:center;border:2px solid var(--border);border-radius:var(--radius-sm);background:none;cursor:pointer;color:var(--text-3);font-size:.875rem;transition:all .12s}
.fr-icon-btn:hover{background:var(--surface-2);border-color:var(--border-strong);color:var(--text)}
.fr-icon-btn.fr-danger:hover{background:var(--red-light);border-color:var(--red);color:var(--red)}
.fr-icon-btn.fr-success:hover{background:var(--green-light);border-color:var(--pond-teal);color:var(--accent-ink)}
.fr-pill{font-size:.65rem;font-weight:800;padding:.2rem .625rem;border-radius:20px;font-family:'Space Grotesk',sans-serif}
.fr-pill.incoming{background:var(--accent-light);color:var(--heading-ink)}
.fr-pill.outgoing{background:var(--surface-2);color:var(--text-3);border:1.5px solid var(--border)}
.fr-pill-btn{padding:.35rem .875rem;font-size:.72rem;font-weight:800;border-radius:20px;cursor:pointer;border:2px solid;transition:all .12s;white-space:nowrap;font-family:'Space Grotesk',sans-serif}
.fr-pill-btn.add{background:var(--pond-mid);color:white;border-color:var(--pond-deep);box-shadow:0 2px 0 var(--pond-deep)}
.fr-pill-btn.add:hover{transform:translateY(-1px);box-shadow:0 3px 0 var(--pond-deep)}
.fr-pill-btn.cancel{background:none;color:var(--text-3);border-color:var(--border)}
.fr-pill-btn.cancel:hover{background:var(--surface-2);border-color:var(--border-strong)}
.fr-pill-btn.accept{background:var(--pond-teal);color:white;border-color:var(--pond-deep);box-shadow:0 2px 0 var(--pond-deep)}
.fr-pill-btn.accept:hover{transform:translateY(-1px)}
.fr-pill-btn.decline{background:none;color:var(--red);border-color:var(--red)}
.fr-pill-btn.decline:hover{background:var(--red-light)}
.fr-section-hd{font-family:'Space Grotesk',sans-serif;font-size:.65rem;font-weight:900;color:var(--text-3);text-transform:uppercase;letter-spacing:.07em;margin:.875rem 0 .5rem;display:flex;align-items:center;gap:.5rem}
.fr-section-hd::after{content:'';flex:1;height:1.5px;background:var(--border);border-radius:2px}
.fr-empty{text-align:center;padding:1.75rem 1rem;color:var(--text-3)}
.fr-empty .fr-empty-icon{font-size:1.75rem;margin-bottom:.5rem}
.fr-empty p{font-size:.8rem;font-weight:600;line-height:1.5}
.fr-results{border:2px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;margin-bottom:.875rem}
.fr-result-row{display:flex;align-items:center;gap:.625rem;padding:.6rem .875rem;border-bottom:1.5px solid var(--border);transition:background .1s}
.fr-result-row:last-child{border-bottom:none}
.fr-result-row:hover{background:var(--surface-2)}
.fr-result-name{font-family:'Space Grotesk',sans-serif;font-size:.825rem;font-weight:800;flex:1;color:var(--text)}
.fr-result-xp{font-size:.7rem;color:var(--text-3);font-weight:600;margin-right:.375rem}




/* ═══════════════════════════════════════════════════════════════════
   QUACKCODE — UI POLISH PACK
   Drop this <style> block in right before </head>, AFTER your existing
   stylesheet. It only adds/overrides — nothing here needs your markup
   to change, and it reuses your existing CSS variables (--pond-deep,
   --duck-yellow, --surface, --border, etc.) so light & dark mode both
   keep working automatically.
════════════════════════════════════════════════════════════════════ */

/* ── 1. Depth system: softer, longer, more directional shadows ─────── */
:root{
  --shadow-xs:0 1px 2px rgba(26,22,56,.06), 0 1px 1px rgba(26,22,56,.05);
  --shadow-sm:0 3px 8px rgba(26,22,56,.08), 0 1px 3px rgba(26,22,56,.06);
  --shadow-md:0 8px 24px rgba(26,22,56,.11), 0 2px 6px rgba(26,22,56,.07);
  --shadow-lg:0 20px 48px rgba(26,22,56,.16), 0 6px 16px rgba(26,22,56,.09);
  --glow-yellow:0 0 0 1px rgba(255,200,69,.4), 0 6px 20px rgba(255,138,101,.25);
}
body.dark{
  --shadow-xs:0 1px 2px rgba(0,0,0,.35);
  --shadow-sm:0 3px 10px rgba(0,0,0,.45);
  --shadow-md:0 10px 28px rgba(0,0,0,.55);
  --shadow-lg:0 24px 56px rgba(0,0,0,.65);
}

/* ── 2. Ambient background — subtle depth instead of flat color ────── */
body{
  background:
    radial-gradient(ellipse 900px 500px at 8% -8%, rgba(165,180,252,.16), transparent 60%),
    radial-gradient(ellipse 700px 500px at 108% 10%, rgba(245,158,11,.12), transparent 55%),
    radial-gradient(ellipse 800px 600px at 50% 115%, rgba(67,56,202,.10), transparent 60%),
    var(--bg);
  background-attachment:fixed;
}
body.dark{
  background:
    radial-gradient(ellipse 900px 500px at 8% -8%, rgba(67,56,202,.14), transparent 60%),
    radial-gradient(ellipse 700px 500px at 108% 10%, rgba(245,158,11,.06), transparent 55%),
    var(--bg);
  background-attachment:fixed;
}

/* ── 3. Typography rhythm — tighter tracking on display, gradient hero text */
.home-greeting h2,
.ch-info h2,
.complete-screen h2,
.profile-hero-info h2{
  background:linear-gradient(135deg, var(--pond-deep) 20%, var(--pond-teal) 100%);
  -webkit-background-clip:text;
  background-clip:text;
  -webkit-text-fill-color:transparent;
}
body.dark .home-greeting h2,
body.dark .ch-info h2,
body.dark .complete-screen h2{
  background:linear-gradient(135deg, var(--duck-yellow) 10%, var(--pond-lily) 100%);
  -webkit-background-clip:text;
  background-clip:text;
  -webkit-text-fill-color:transparent;
}
.profile-hero-info h2{ -webkit-text-fill-color:white; background:none; } /* keep white on colored hero */

/* ── 4. Buttons — glossy top-highlight + snappier press feel ───────── */
.btn.primary,.btn.success,.btn.review-btn,.btn.golden,.sb-run-btn{
  position:relative;overflow:hidden;
  background-image:linear-gradient(180deg, rgba(255,255,255,.22), rgba(255,255,255,0) 55%);
  background-blend-mode:overlay;
}
.btn.primary,.btn.success{ box-shadow:var(--shadow-sm), inset 0 1px 0 rgba(255,255,255,.25); }
.btn:active{ filter:brightness(.97); }
.btn.primary:hover,.btn.success:hover,.btn.review-btn:hover{
  filter:brightness(1.04);
}

/* ── 5. Cards — course tiles, node tiles, stat cards get real lift ─── */
.cc,.node-card,.stat-card,.profile-stat,.badge-card,.mastery-egg-card,.sb-card,.friend-row,.fr-card,.lb-row{
  transition:transform .28s cubic-bezier(.22,1,.36,1), box-shadow .28s cubic-bezier(.22,1,.36,1), border-color .2s;
}
.cc:hover{ box-shadow:var(--shadow-md), 0 0 0 1px rgba(45,122,90,.06); }
.node-card:hover:not(.node-locked){ box-shadow:var(--shadow-md); }
.stat-card,.profile-stat{ box-shadow:var(--shadow-xs); }
.stat-card:hover,.profile-stat:hover{ box-shadow:var(--shadow-sm); }

/* Course icon chips — inner sheen for a less flat, more "tile" feel */
.cc-icon,.profile-course-icon{
  background-image:linear-gradient(160deg, rgba(255,255,255,.55), rgba(255,255,255,0) 60%), var(--cc-icon-bg, none);
  box-shadow:inset 0 -3px 0 rgba(0,0,0,.10), inset 0 1px 0 rgba(255,255,255,.35);
}

/* ── 6. Topbar — frosted glass, sticks nicer over the ambient bg ───── */
.topbar,.course-header,.lesson-topbar,.profile-topbar,.social-topbar,.shop-topbar{
  backdrop-filter:blur(14px) saturate(1.4);
  -webkit-backdrop-filter:blur(14px) saturate(1.4);
  background:color-mix(in srgb, var(--surface) 88%, transparent);
}

/* ── 7. Progress bars — animated gradient fill instead of flat color ─ */
.pbar,.sb-prog-fill,.profile-course-fill,.mastery-egg-progress-fill{
  background-size:200% 100%;
  background-image:linear-gradient(90deg, var(--pond-teal), var(--pond-lily), var(--pond-teal));
  animation:pbarShimmer 3.5s linear infinite;
}
@keyframes pbarShimmer{ from{background-position:0% 0} to{background-position:200% 0} }
.lesson-progress-fill{
  background-image:linear-gradient(90deg, var(--pond-teal), var(--duck-yellow));
}

/* ── 8. Streak flame & stat numbers — a touch of warmth ─────────────── */
.stat-card:first-child .stat-val{
  background:linear-gradient(135deg,#F07B39,#F5C842);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
}

/* ── 9. Node grid — quiz & project nodes get a slightly richer frame ─ */
.node-card.node-quiz:not(.node-locked){ box-shadow:0 4px 0 rgba(0,0,0,.15), 0 0 0 3px rgba(124,58,237,.08); }
.node-card.node-project:not(.node-locked){ box-shadow:0 4px 0 rgba(0,0,0,.15), 0 0 0 3px rgba(124,58,237,.10); }

/* ── 10. Mascot / hero flourishes ────────────────────────────────────── */
.auth-logo .duck{ filter:drop-shadow(0 10px 18px rgba(234,88,12,.35)); }
.profile-hero{ box-shadow:var(--shadow-lg), inset 0 1px 0 rgba(255,255,255,.15); }

/* ── 11. Modals — softer entrance, frosted overlay ───────────────────── */
.modal-overlay{ backdrop-filter:blur(6px) saturate(1.1); -webkit-backdrop-filter:blur(6px) saturate(1.1); }
.modal-box,.golden-modal-box{ box-shadow:var(--shadow-lg), inset 0 1px 0 rgba(255,255,255,.25); }

/* ── 12. Word chips / mcq options — livelier feedback state ─────────── */
.mcq-opt.correct{ box-shadow:0 4px 0 var(--pond-deep), 0 0 0 3px rgba(67,56,202,.18); }
.mcq-opt.wrong{ box-shadow:0 4px 0 var(--red-dk), 0 0 0 3px rgba(224,82,82,.18); }
.word-chip:hover{ background:var(--accent-light); }

/* ── 13. Golden Egg / premium touches — a soft pulsing glow ─────────── */
.golden-egg-topbar-btn:not(.is-premium){
  animation:goldenPulse 2.6s ease-in-out infinite;
}
@keyframes goldenPulse{
  0%,100%{ box-shadow:0 3px 0 #A03A10; }
  50%{ box-shadow:0 3px 0 #A03A10, var(--glow-yellow); }
}

/* ── 14. Scrollbars — thin, theme-colored, less jarring ──────────────── */
::-webkit-scrollbar-thumb{ background:linear-gradient(var(--border-strong), var(--border)); }

/* ── 15. Accessibility — clear, on-brand focus rings everywhere ─────── */
button:focus-visible, input:focus-visible, textarea:focus-visible, .cc:focus-visible,
.node-card:focus-visible, .mcq-opt:focus-visible, [onclick]:focus-visible{
  outline:none;
  box-shadow:0 0 0 3px var(--surface), 0 0 0 5px var(--pond-teal);
}

/* ── 16. Motion respect ──────────────────────────────────────────────── */
@media (prefers-reduced-motion: reduce){
  .pbar,.sb-prog-fill,.profile-course-fill,.mastery-egg-progress-fill,
  .golden-egg-topbar-btn,.auth-logo .duck,.topbar-logo .duck-sm{ animation:none !important; }
}




/* ── Social page shell ── */
#page-social{background:var(--bg)}
.social-topbar{background:var(--surface);border-bottom:2.5px solid var(--border);padding:.875rem 1.5rem;display:flex;align-items:center;gap:.875rem;position:sticky;top:0;z-index:100;box-shadow:var(--shadow-xs)}
.social-topbar span{font-family:'Space Grotesk',sans-serif;font-size:1.05rem;font-weight:900;flex:1;color:var(--heading-ink)}
body.dark .social-topbar span{color:var(--duck-yellow)}
.social-content{padding:1.5rem 1.5rem 4rem;max-width:680px;margin:0 auto;width:100%}
.social-tabs{display:flex;flex-wrap:wrap;background:var(--surface-2);border-radius:var(--radius-md);padding:4px;gap:4px;margin-bottom:1.25rem}
.social-tab{flex:1 1 auto;min-width:5.5rem;padding:.6rem;border:none;background:transparent;border-radius:10px;font-family:'Space Grotesk',sans-serif;font-size:.85rem;font-weight:800;color:var(--text-3);cursor:pointer;transition:all .18s;white-space:nowrap}
.social-tab.active{background:var(--surface);color:var(--heading-ink);box-shadow:var(--shadow-xs)}
body.dark .social-tab.active{color:var(--duck-yellow)}
.social-pane{display:none}
.social-pane.active{display:block}

/* ── Leaderboard header ── */
.lb-banner{border-radius:var(--radius-xl);padding:1.5rem 1.5rem 1.25rem;margin-bottom:1.25rem;color:white;position:relative;overflow:hidden;box-shadow:var(--shadow-md)}
.lb-banner::after{content:'🦆';position:absolute;bottom:-14px;right:8px;font-size:4rem;opacity:.18}
.lb-banner h2{font-family:'Space Grotesk',sans-serif;font-size:1.3rem;font-weight:900;letter-spacing:-.02em}
.lb-banner p{font-size:.8rem;opacity:.85;margin-top:.35rem;font-weight:600;line-height:1.5}

/* ── Nearby flock list ── */
.lb-nearby-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:.75rem}
.lb-nearby-hd h3{font-family:'Space Grotesk',sans-serif;font-size:.85rem;font-weight:900;color:var(--text)}
.lb-toggle-btn{background:none;border:none;color:var(--accent-ink);font-family:'Space Grotesk',sans-serif;font-size:.75rem;font-weight:800;cursor:pointer;padding:.2rem .4rem}
body.dark .lb-toggle-btn{color:var(--duck-yellow)}

/* ── Podium (top-3 leaderboard display) ── */
.podium-wrap{background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-xl);padding:1.5rem 1rem .75rem;margin-bottom:1.25rem;box-shadow:0 3px 0 var(--border);overflow:hidden;position:relative}
.podium-wrap::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 70% 50% at 50% 0%,rgba(245,158,11,.10),transparent 70%);pointer-events:none}
.podium-row{display:flex;align-items:flex-end;justify-content:center;gap:.625rem;position:relative;z-index:1}
.podium-slot{display:flex;flex-direction:column;align-items:center;gap:.4rem;flex:1;max-width:130px;cursor:default}
.podium-crown{font-size:1.1rem;line-height:1;margin-bottom:-.15rem}
.podium-avatar-wrap{position:relative}
.podium-avatar{border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:'Space Grotesk',sans-serif;font-weight:900;color:white;box-shadow:0 3px 8px rgba(0,0,0,.2);border:3px solid var(--surface)}
.podium-slot.place-1 .podium-avatar{width:64px;height:64px;font-size:1.4rem;border-color:var(--duck-yellow);box-shadow:0 0 0 3px rgba(245,158,11,.35),0 4px 10px rgba(0,0,0,.22)}
.podium-slot.place-2 .podium-avatar{width:52px;height:52px;font-size:1.15rem;border-color:#C8D0D8}
.podium-slot.place-3 .podium-avatar{width:52px;height:52px;font-size:1.15rem;border-color:#D9A05B}
.podium-medal-badge{position:absolute;bottom:-4px;right:-4px;width:22px;height:22px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.7rem;background:var(--surface);border:2px solid var(--border);box-shadow:var(--shadow-xs)}
.podium-name{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:.78rem;color:var(--text);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}
.podium-name.is-me-name{color:var(--heading-ink)}
body.dark .podium-name.is-me-name{color:var(--duck-yellow)}
.podium-xp{font-family:'Space Grotesk',sans-serif;font-weight:900;font-size:.72rem;color:var(--accent-ink);margin-top:-.15rem}
body.dark .podium-xp{color:var(--duck-yellow)}
.podium-block{width:100%;border-radius:10px 10px 0 0;display:flex;align-items:flex-start;justify-content:center;padding-top:.4rem;font-family:'Space Grotesk',sans-serif;font-weight:900;color:white;text-shadow:0 1px 2px rgba(0,0,0,.2);box-shadow:inset 0 -3px 0 rgba(0,0,0,.12)}
.podium-slot.place-1 .podium-block{height:76px;background:linear-gradient(180deg,var(--duck-yellow),var(--duck-orange));font-size:1.4rem}
.podium-slot.place-2 .podium-block{height:52px;background:linear-gradient(180deg,#E4E9ED,#B7C1CA);font-size:1.15rem}
.podium-slot.place-3 .podium-block{height:38px;background:linear-gradient(180deg,#E8B37E,#C1793D);font-size:1.15rem}
.podium-slot.is-me .podium-block{outline:3px solid var(--duck-yellow);outline-offset:2px}
.podium-empty-note{text-align:center;font-size:.75rem;color:var(--text-3);font-weight:600;padding:1rem}

/* ── Leaderboard list (shared: leaderboard / friends / duels) ── */
.lb-list-hd{font-family:'Space Grotesk',sans-serif;font-size:.68rem;font-weight:900;color:var(--text-3);text-transform:uppercase;letter-spacing:.07em;margin:0 0 .625rem}
.lb-row{display:flex;align-items:center;gap:.875rem;background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-lg);padding:.75rem 1rem;margin-bottom:.5rem;transition:all .18s;box-shadow:0 2px 0 var(--border)}
.lb-row.lb-me{border-color:var(--duck-yellow);background:var(--yellow-light);box-shadow:0 3px 0 var(--duck-orange)}
.lb-rank{width:28px;text-align:center;font-family:'Space Grotesk',sans-serif;font-weight:900;font-size:.95rem;color:var(--text-3);flex-shrink:0}
.lb-rank.medal{font-size:1.25rem}
.lb-avatar{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:.8rem;color:white;flex-shrink:0}
.lb-name{flex:1;min-width:0}
.lb-name strong{display:block;font-family:'Space Grotesk',sans-serif;font-size:.875rem;font-weight:800;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lb-name span{font-size:.68rem;color:var(--text-3);font-weight:600}
.lb-xp{font-family:'Space Grotesk',sans-serif;font-weight:900;font-size:.9rem;color:var(--accent-ink);flex-shrink:0}
body.dark .lb-xp{color:var(--duck-yellow)}
.lb-divider{display:flex;align-items:center;gap:.6rem;margin:.625rem 0;color:var(--text-3);font-size:.68rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em}
.lb-divider::before,.lb-divider::after{content:'';flex:1;height:1.5px;background:var(--border)}

/* ── Friends ── */
.add-friend-row{display:flex;gap:.5rem;margin-bottom:1.25rem}
.add-friend-row input{flex:1;padding:.7rem 1rem;border:2px solid var(--border);border-radius:var(--radius-sm);font-size:.875rem;outline:none;background:var(--surface);color:var(--text)}
.add-friend-row input:focus{border-color:var(--pond-teal)}
.add-friend-row button{flex-shrink:0;width:auto;padding:.7rem 1.25rem;margin-top:0}
.friend-row{display:flex;align-items:center;gap:.875rem;background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-lg);padding:.75rem 1rem;margin-bottom:.5rem;box-shadow:0 2px 0 var(--border)}
.friend-stats{font-size:.7rem;color:var(--text-3);font-weight:600;margin-top:.1rem}
.friend-actions{display:flex;gap:.4rem;flex-shrink:0}
.fbtn{border:none;border-radius:var(--radius-sm);padding:.4rem .75rem;font-family:'Space Grotesk',sans-serif;font-size:.72rem;font-weight:800;cursor:pointer;transition:all .15s}
.fbtn.duel{background:var(--pond-mid);color:white}
.fbtn.duel:hover{background:var(--pond-deep)}
.fbtn.remove{background:var(--surface-2);color:var(--text-3);border:1.5px solid var(--border)}
.fbtn.remove:hover{background:var(--red-light);color:var(--red);border-color:var(--red)}
.empty-state{text-align:center;padding:2.5rem 1rem;color:var(--text-3)}
.empty-state .es-icon{font-size:2.5rem;margin-bottom:.5rem}
.empty-state p{font-size:.85rem;font-weight:600}

/* ── Duels ── */
.duel-pick-grid{display:flex;flex-direction:column;gap:.5rem}
.duel-pick-row{display:flex;align-items:center;gap:.875rem;background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-lg);padding:.875rem 1rem;cursor:pointer;transition:all .2s;box-shadow:0 3px 0 var(--border)}
.duel-pick-row:hover{transform:translateY(-2px);box-shadow:0 5px 0 var(--border-strong);border-color:var(--border-strong)}
.duel-arena{display:flex;flex-direction:column;align-items:center;text-align:center;padding:1rem}
.duel-vs-row{display:flex;align-items:center;justify-content:center;gap:1.5rem;margin:1.25rem 0}
.duel-side{display:flex;flex-direction:column;align-items:center;gap:.5rem}
.duel-side .lb-avatar{width:58px;height:58px;font-size:1.3rem}
.duel-side-name{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:.85rem}
.duel-score{font-family:'Space Grotesk',sans-serif;font-size:1.6rem;font-weight:900;color:var(--accent-ink)}
body.dark .duel-score{color:var(--duck-yellow)}
.duel-vs-label{font-family:'Space Grotesk',sans-serif;font-weight:900;color:var(--text-3);font-size:1rem}
.duel-progress-dots{display:flex;gap:.4rem;justify-content:center;margin:.5rem 0 1.25rem}
.duel-dot{width:10px;height:10px;border-radius:50%;background:var(--border)}
.duel-dot.d-correct{background:var(--pond-teal)}
.duel-dot.d-wrong{background:var(--red)}
.duel-dot.d-pending{background:var(--surface-2);border:1.5px solid var(--border)}
.duel-q-card{background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-lg);padding:1.25rem;width:100%;box-shadow:var(--shadow-sm);text-align:left}
.duel-q-text{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:1rem;margin-bottom:.875rem}
.duel-opt{background:var(--surface-2);border:2px solid var(--border);border-radius:var(--radius-md);padding:.75rem 1rem;margin-bottom:.5rem;cursor:pointer;font-size:.875rem;font-weight:600;transition:all .15s}
.duel-opt:hover:not(.locked){border-color:var(--pond-teal);background:var(--accent-light)}
.duel-opt.locked{cursor:default}
.duel-opt.d-correct{border-color:var(--pond-teal);background:var(--green-light)}
.duel-opt.d-wrong{border-color:var(--red);background:var(--red-light)}
.duel-result-banner{font-family:'Space Grotesk',sans-serif;font-weight:900;font-size:1.4rem;margin:.5rem 0;color:var(--heading-ink)}
body.dark .duel-result-banner{color:var(--duck-yellow)}
.duel-opp-thinking{font-size:.75rem;color:var(--text-3);font-weight:700;margin-top:.5rem;min-height:1.2em}



.golden-egg-topbar-btn{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange))!important;color:#5A3300!important;border-color:transparent!important;box-shadow:0 3px 0 #A03A10}
.golden-egg-topbar-btn:hover{transform:translateY(-1px);box-shadow:0 4px 0 #A03A10}
.golden-egg-topbar-btn.is-premium{background:linear-gradient(135deg,var(--pond-teal),var(--pond-mid))!important;color:white!important;box-shadow:0 3px 0 var(--pond-deep)}

.golden-modal-box{background:var(--surface);border:2.5px solid var(--duck-yellow);border-radius:var(--radius-xl);padding:2.125rem;width:100%;max-width:440px;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg),0 0 0 6px rgba(245,158,11,.12);position:relative}

/* ── Onboarding flow (shown once, right after signup) ──────────────── */
.onboarding-box{background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-xl);padding:2.25rem;width:100%;max-width:460px;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg);position:relative;text-align:center}
.onboarding-dots{display:flex;justify-content:center;gap:.4rem;margin-bottom:1.5rem}
.onboarding-dot{width:8px;height:8px;border-radius:50%;background:var(--border);transition:all .2s}
.onboarding-dot.active{background:var(--pond-mid);width:20px;border-radius:5px}
.onboarding-icon{font-size:3rem;margin-bottom:.75rem;line-height:1}
.onboarding-box h2{font-family:'Space Grotesk',sans-serif;font-size:1.375rem;font-weight:900;letter-spacing:-.02em;color:var(--heading-ink);margin-bottom:.5rem}
body.dark .onboarding-box h2{color:var(--duck-yellow)}
.onboarding-box p.ob-sub{font-size:.875rem;color:var(--text-3);font-weight:600;margin-bottom:1.5rem;line-height:1.5}
.ob-course-grid{display:grid;grid-template-columns:1fr 1fr;gap:.75rem;margin-bottom:1.5rem;text-align:left}
.ob-course-card{background:var(--surface-2);border:2px solid var(--border);border-radius:var(--radius-md);padding:.875rem;cursor:pointer;display:flex;align-items:center;gap:.625rem;transition:all .15s}
.ob-course-card:hover{border-color:var(--border-strong);transform:translateY(-2px)}
.ob-course-card.picked{border-color:var(--pond-teal);background:var(--accent-light);box-shadow:0 0 0 2px var(--pond-teal)}
.ob-course-card .occ-icon{width:34px;height:34px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:900;flex-shrink:0}
.ob-course-card .occ-name{font-family:'Space Grotesk',sans-serif;font-size:.85rem;font-weight:800}
.ob-fact-row{display:flex;align-items:flex-start;gap:.75rem;text-align:left;background:var(--surface-2);border-radius:var(--radius-md);padding:.875rem 1rem;margin-bottom:.75rem}
.ob-fact-row .ob-fact-icon{font-size:1.375rem;flex-shrink:0}
.ob-fact-row .ob-fact-text strong{display:block;font-family:'Space Grotesk',sans-serif;font-size:.85rem;font-weight:800;margin-bottom:.15rem}
.ob-fact-row .ob-fact-text span{font-size:.78rem;color:var(--text-3);font-weight:500;line-height:1.5}
.golden-modal-icon{width:72px;height:72px;border-radius:50%;background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));display:flex;align-items:center;justify-content:center;font-size:2.25rem;margin-bottom:1.125rem;box-shadow:0 4px 16px rgba(234,88,12,.35)}
.golden-modal-box h2{font-family:'Space Grotesk',sans-serif;font-size:1.375rem;font-weight:900;letter-spacing:-.02em;margin-bottom:.375rem;color:var(--heading-ink)}
body.dark .golden-modal-box h2{color:var(--duck-yellow)}
.golden-modal-box .golden-price{font-family:'Space Grotesk',sans-serif;font-size:1.75rem;font-weight:900;color:var(--duck-orange);margin:.5rem 0 1rem}
.golden-modal-box .golden-price span{font-size:.9rem;font-weight:700;color:var(--text-3)}
.golden-feature-list{list-style:none;margin-bottom:1.5rem;display:flex;flex-direction:column;gap:.625rem}
.golden-feature-list li{display:flex;align-items:flex-start;gap:.625rem;font-size:.875rem;color:var(--text-2);font-weight:500;line-height:1.5}
.golden-feature-list li::before{content:'✓';flex-shrink:0;width:20px;height:20px;border-radius:50%;background:var(--green-light);color:var(--accent-ink);display:flex;align-items:center;justify-content:center;font-size:.7rem;font-weight:900;margin-top:.1rem}
.golden-free-note{background:var(--green-light);border:1.5px solid var(--pond-teal);border-radius:var(--radius-md);padding:.75rem 1rem;font-size:.78rem;color:var(--heading-ink);font-weight:600;margin-bottom:1.25rem;line-height:1.55}
body.dark .golden-free-note{color:var(--text-2)}
.btn.golden{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));color:#5A3300;box-shadow:0 5px 0 #A03A10}
.btn.golden:hover{transform:translateY(-2px);box-shadow:0 7px 0 #A03A10}
.btn.golden:active{transform:translateY(3px);box-shadow:0 2px 0 #A03A10}
.btn.golden:disabled{opacity:.6}

#page-ai-chat{background:var(--bg)}
.ai-topbar{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));padding:.875rem 1.5rem;display:flex;align-items:center;gap:.875rem;position:sticky;top:0;z-index:100;box-shadow:var(--shadow-sm)}
.ai-topbar .back-btn{border-color:rgba(90,51,0,.3);color:#5A3300}
.ai-topbar .back-btn:hover{background:rgba(255,255,255,.25)}
.ai-topbar-title{font-family:'Space Grotesk',sans-serif;font-size:1.05rem;font-weight:900;color:#5A3300;flex:1}
.ai-topbar-sub{font-size:.7rem;font-weight:700;color:#6A4400;opacity:.8}
.ai-chat-body{flex:1;overflow-y:auto;padding:1.5rem 1.5rem 1rem;max-width:680px;margin:0 auto;width:100%;display:flex;flex-direction:column;gap:1rem}
.ai-msg-row{display:flex;gap:.75rem;max-width:85%}
.ai-msg-row.user{align-self:flex-end;flex-direction:row-reverse}
.ai-msg-avatar{width:32px;height:32px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:1rem}
.ai-msg-row.assistant .ai-msg-avatar{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange))}
.ai-msg-row.user .ai-msg-avatar{background:linear-gradient(135deg,var(--pond-teal),var(--pond-mid))}
.ai-msg-bubble{padding:.75rem 1rem;border-radius:var(--radius-lg);font-size:.875rem;line-height:1.6;white-space:pre-wrap;word-break:break-word}
.ai-msg-row.assistant .ai-msg-bubble{background:var(--surface);border:2px solid var(--border);color:var(--text);border-top-left-radius:4px}
.ai-msg-row.user .ai-msg-bubble{background:var(--pond-mid);color:white;border-top-right-radius:4px}
.ai-msg-bubble code{font-family:'JetBrains Mono',monospace;background:rgba(0,0,0,.08);padding:.1rem .35rem;border-radius:5px;font-size:.8rem}
.ai-msg-row.user .ai-msg-bubble code{background:rgba(255,255,255,.2)}
.ai-typing{display:flex;gap:.3rem;padding:.5rem 0}
.ai-typing span{width:7px;height:7px;border-radius:50%;background:var(--duck-orange);animation:aiTypingBounce 1.2s infinite ease-in-out}
.ai-typing span:nth-child(2){animation-delay:.15s}
.ai-typing span:nth-child(3){animation-delay:.3s}
@keyframes aiTypingBounce{0%,60%,100%{transform:translateY(0);opacity:.5}30%{transform:translateY(-5px);opacity:1}}
.ai-empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:var(--text-3);padding:2rem}
.ai-empty-state .ai-empty-icon{font-size:3rem;margin-bottom:.75rem}
.ai-empty-state p{font-size:.85rem;font-weight:600;max-width:320px;line-height:1.6}
.ai-input-area{padding:1rem 1.5rem 1.5rem;background:var(--surface);border-top:2.5px solid var(--border);max-width:680px;margin:0 auto;width:100%;box-sizing:border-box}
.ai-input-row{display:flex;gap:.625rem;align-items:flex-end}
.ai-input-row textarea{flex:1;padding:.75rem 1rem;border:2.5px solid var(--border);border-radius:var(--radius-lg);font-family:'Inter',sans-serif;font-size:.875rem;background:var(--bg);color:var(--text);outline:none;resize:none;min-height:46px;max-height:120px;transition:border-color .18s}
.ai-input-row textarea:focus{border-color:var(--duck-yellow)}
.ai-send-btn{flex-shrink:0;width:46px;height:46px;border-radius:50%;background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));border:none;color:#5A3300;font-size:1.1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 3px 0 #A03A10;transition:all .15s}
.ai-send-btn:hover:not(:disabled){transform:translateY(-1px)}
.ai-send-btn:disabled{opacity:.5;cursor:default}
.ai-limit-note{font-size:.7rem;color:var(--text-3);font-weight:600;text-align:center;margin-top:.625rem}



/* ── Shop page shell ────────────────────────────────────────────── */
#page-shop{background:var(--bg)}
.shop-topbar{background:var(--surface);border-bottom:2.5px solid var(--border);padding:.875rem 1.5rem;display:flex;align-items:center;gap:.875rem;position:sticky;top:0;z-index:100;box-shadow:var(--shadow-xs)}
.shop-topbar .shop-title{font-family:'Space Grotesk',sans-serif;font-size:1.05rem;font-weight:900;flex:1;color:var(--heading-ink)}
body.dark .shop-topbar .shop-title{color:var(--duck-yellow)}
.shop-balance-pill{display:flex;align-items:center;gap:.375rem;background:var(--yellow-light);border:2px solid var(--duck-yellow);border-radius:20px;padding:.35rem .875rem;font-family:'Space Grotesk',sans-serif;font-size:.85rem;font-weight:900;color:#6A4400;flex-shrink:0;transition:background .2s}
body.dark .shop-balance-pill{color:#F5C842}
.shop-content{padding:1.5rem 1.5rem 4rem;max-width:720px;margin:0 auto;width:100%}
.shop-welcome{background:linear-gradient(135deg,var(--pond-deep),var(--pond-mid));border-radius:var(--radius-xl);padding:1.25rem 1.5rem;margin-bottom:1.25rem;color:white;display:flex;align-items:center;gap:1rem;position:relative;overflow:hidden}
.shop-welcome::after{content:'🛒';position:absolute;right:1rem;bottom:-8px;font-size:3.5rem;opacity:.2;pointer-events:none}
.shop-welcome-info h3{font-family:'Space Grotesk',sans-serif;font-size:1rem;font-weight:900;margin-bottom:.2rem}
.shop-welcome-info p{font-size:.78rem;opacity:.8;font-weight:600;max-width:360px;line-height:1.5}
.shop-broke-banner{background:var(--red-light);border:2px solid var(--red);border-radius:var(--radius-md);padding:.625rem 1rem;font-size:.78rem;color:var(--red-dk);font-weight:700;margin-bottom:1rem;display:none;align-items:center;gap:.5rem}
.shop-broke-banner.visible{display:flex}
.shop-tabs{display:flex;background:var(--surface-2);border-radius:var(--radius-md);padding:4px;gap:4px;margin-bottom:1.25rem}
.shop-tab{flex:1;padding:.6rem;border:none;background:transparent;border-radius:10px;font-family:'Space Grotesk',sans-serif;font-size:.875rem;font-weight:800;color:var(--text-3);cursor:pointer;transition:all .18s}
.shop-tab.active{background:var(--surface);color:var(--heading-ink);box-shadow:var(--shadow-xs)}
body.dark .shop-tab.active{color:var(--duck-yellow)}
.shop-pane{display:none}
.shop-pane.active{display:block}
.shop-section-hd{font-family:'Space Grotesk',sans-serif;font-size:.68rem;font-weight:900;color:var(--text-3);text-transform:uppercase;letter-spacing:.08em;margin:0 0 .875rem;display:flex;align-items:center;gap:.5rem}
.shop-section-hd::after{content:'';flex:1;height:2px;background:var(--border);border-radius:2px}

/* ── Item grid ──────────────────────────────────────────────────── */
.shop-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:.875rem;margin-bottom:2rem}
.shop-item{background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;display:flex;flex-direction:column;transition:transform .22s cubic-bezier(.34,1.56,.64,1),box-shadow .2s,border-color .2s;box-shadow:0 3px 0 var(--border);position:relative}
.shop-item:hover{transform:translateY(-3px);box-shadow:0 6px 0 var(--border-strong);border-color:var(--border-strong)}
.shop-item.is-owned{border-color:var(--pond-teal);box-shadow:0 3px 0 var(--pond-mid)}
.shop-item.is-equipped{border-color:var(--duck-yellow);box-shadow:0 3px 0 var(--duck-orange)}

/* ── Previews ───────────────────────────────────────────────────── */
.banner-preview{height:74px;width:100%;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;flex-shrink:0}
.banner-preview-emoji{font-size:1.6rem;z-index:1;filter:drop-shadow(0 2px 6px rgba(0,0,0,.25))}
.banner-preview-emoji img{width:1.6rem;height:1.6rem;object-fit:contain;display:block;filter:drop-shadow(0 2px 6px rgba(0,0,0,.25))}
.icon-preview{height:82px;display:flex;align-items:center;justify-content:center;font-size:2.75rem;background:var(--surface-2);position:relative;flex-shrink:0}
.icon-preview::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 60% 60% at 50% 70%,rgba(245,158,11,.14),transparent)}
.icon-preview img{width:2.75rem;height:2.75rem;object-fit:contain;position:relative;z-index:1}

/* ── Item info ──────────────────────────────────────────────────── */
.shop-item-body{padding:.75rem .875rem .875rem;flex:1;display:flex;flex-direction:column;gap:.3rem}
.shop-item-name{font-family:'Space Grotesk',sans-serif;font-size:.85rem;font-weight:800;color:var(--text);line-height:1.2}
.shop-item-desc{font-size:.65rem;color:var(--text-3);font-weight:600;line-height:1.4;flex:1}
.shop-item-price{font-family:'Space Grotesk',sans-serif;font-size:.8rem;font-weight:900;color:var(--duck-orange);margin-top:.2rem}
.shop-item-price.is-free{color:var(--teal-ink)}
.shop-item-price.cant-afford{color:var(--text-3)}

/* ── Action buttons ─────────────────────────────────────────────── */
.shop-btn{width:100%;border:none;border-radius:var(--radius-sm);padding:.55rem;font-family:'Space Grotesk',sans-serif;font-size:.75rem;font-weight:800;cursor:pointer;transition:all .15s;margin-top:.375rem;letter-spacing:.01em}
.shop-btn.buy{background:var(--duck-orange);color:white;box-shadow:0 3px 0 #A03A10}
.shop-btn.buy:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 0 #A03A10}
.shop-btn.buy:active:not(:disabled){transform:translateY(2px);box-shadow:0 1px 0 #A03A10}
.shop-btn.buy:disabled{opacity:.4;cursor:not-allowed;transform:none;box-shadow:none}
.shop-btn.equip{background:var(--pond-mid);color:white;box-shadow:0 3px 0 var(--pond-deep)}
.shop-btn.equip:hover{transform:translateY(-1px);box-shadow:0 4px 0 var(--pond-deep)}
.shop-btn.equipped-lbl{background:var(--duck-yellow);color:#6A4400;box-shadow:0 3px 0 var(--duck-orange);cursor:default}

/* ── Tags (OWNED / EQUIPPED) ────────────────────────────────────── */
.shop-tag{position:absolute;top:.5rem;right:.5rem;border-radius:20px;padding:.18rem .5rem;font-family:'Space Grotesk',sans-serif;font-size:.52rem;font-weight:900;letter-spacing:.04em;text-transform:uppercase}
.shop-tag.owned-tag{background:var(--pond-teal);color:white}
.shop-tag.equipped-tag{background:var(--duck-yellow);color:#6A4400}

/* ── Profile hero icon overlay (image-based) ──────────────────────── */

@media(max-width:500px){
  .shop-grid{grid-template-columns:repeat(2,1fr);gap:.625rem}
  .shop-welcome{display:none} /* collapsed on tiny phones */
}



/* ── Sandbox: AI Code Review button ─────────────────────────────── */
.sb-review-btn{display:flex;align-items:center;gap:.375rem;padding:.4rem .875rem;background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));color:#5A3300;border:none;border-radius:var(--radius-sm);font-family:'Space Grotesk',sans-serif;font-size:.75rem;font-weight:800;cursor:pointer;transition:all .18s;flex-shrink:0;box-shadow:0 3px 0 #A03A10}
.sb-review-btn:hover{transform:translateY(-1px);box-shadow:0 4px 0 #A03A10}
.sb-review-btn.locked{background:rgba(245,158,11,.14);color:rgba(245,158,11,.85);box-shadow:none;border:1.5px solid rgba(245,158,11,.3)}

/* ── AI chat: quick-prompt suggestion chips ─────────────────────── */
.qcg-chip-row{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:.75rem}
.qcg-chip{background:var(--yellow-light);border:1.5px solid var(--duck-yellow);color:#6A4400;border-radius:20px;padding:.4rem .8rem;font-size:.72rem;font-weight:800;cursor:pointer;font-family:'Space Grotesk',sans-serif;transition:all .15s;white-space:nowrap}
body.dark .qcg-chip{color:#F5C842}
body.dark .qcg-chip{color:var(--duck-yellow)}
.qcg-chip:hover{background:var(--duck-yellow);color:#5A3300;transform:translateY(-1px)}

/* ── Shop: Golden Egg exclusive items ───────────────────────────── */
.shop-tag.pro-tag{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));color:#5A3300}
.shop-tag.pro-locked-tag{background:var(--surface-2);color:var(--text-3);border:1.5px solid var(--border)}
.shop-item.pro-item{border-color:rgba(245,158,11,.55)}
.shop-item.pro-item.is-locked{opacity:.72;filter:saturate(.75)}
.shop-btn.pro-buy{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));color:#5A3300;box-shadow:0 3px 0 #A03A10}
.shop-btn.pro-buy:hover{transform:translateY(-1px);box-shadow:0 4px 0 #A03A10}

/* ── Profile: Premium Perks summary card ────────────────────────── */
.qcg-perks-card{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));border-radius:var(--radius-xl);padding:1.25rem 1.375rem;color:#5A3300;margin-bottom:1.375rem;box-shadow:0 5px 0 #A03A10;position:relative;overflow:hidden}
.qcg-perks-card::after{content:'👑';position:absolute;right:.75rem;bottom:-10px;font-size:3rem;opacity:.22;pointer-events:none}
.qcg-perks-card h3{font-family:'Space Grotesk',sans-serif;font-size:1rem;font-weight:900;margin-bottom:.625rem;position:relative;z-index:1}
.qcg-perks-list{list-style:none;display:flex;flex-direction:column;gap:.4rem;position:relative;z-index:1}
.qcg-perks-list li{font-size:.78rem;font-weight:700;display:flex;align-items:center;gap:.5rem}

/* ── Home: status / upsell banner ───────────────────────────────── */
.qcg-home-banner{border-radius:var(--radius-lg);padding:1rem 1.125rem;margin-bottom:1.125rem;display:flex;align-items:center;gap:.875rem;cursor:pointer;transition:transform .2s,box-shadow .2s}
.qcg-home-banner.is-free{background:linear-gradient(135deg,rgba(245,158,11,.16),rgba(234,88,12,.12));border:2.5px solid rgba(245,158,11,.45);box-shadow:0 3px 0 rgba(245,158,11,.22)}
.qcg-home-banner.is-free:hover{transform:translateY(-2px);box-shadow:0 6px 0 rgba(245,158,11,.25)}
.qcg-home-banner.is-pro{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));border:2.5px solid transparent;box-shadow:0 3px 0 #A03A10;color:#5A3300;cursor:default}
.qcg-home-banner-icon{font-size:1.625rem;flex-shrink:0}
.qcg-home-banner-text strong{display:block;font-family:'Space Grotesk',sans-serif;font-size:.9rem;font-weight:900}
.qcg-home-banner.is-free .qcg-home-banner-text strong{color:var(--duck-orange)}
.qcg-home-banner-text span{font-size:.75rem;font-weight:600;opacity:.85}
.qcg-home-banner-arrow{margin-left:auto;font-size:1.2rem;font-weight:800;flex-shrink:0;opacity:.7}

/* ── Golden Egg topbar button, premium state ────────────────────── */
.golden-egg-topbar-btn.is-premium{position:relative}



/* ── Sandbox: Snippet Vault button ──────────────────────────────── */
.sb-vault-btn{display:flex;align-items:center;gap:.375rem;padding:.4rem .875rem;background:linear-gradient(135deg,#7ECCD4,#2D7A5A);color:white;border:none;border-radius:var(--radius-sm);font-family:'Space Grotesk',sans-serif;font-size:.75rem;font-weight:800;cursor:pointer;transition:all .18s;flex-shrink:0;box-shadow:0 3px 0 #1B4D3E}
.sb-vault-btn:hover{transform:translateY(-1px);box-shadow:0 4px 0 #1B4D3E}
.sb-vault-btn.locked{background:rgba(199,210,254,.16);color:rgba(76,111,255,.9);box-shadow:none;border:1.5px solid rgba(199,210,254,.4)}

/* ── Profile: XP activity heatmap ───────────────────────────────── */
.qcg-heatmap{display:flex;flex-wrap:wrap;gap:3px;margin-top:.5rem}
.qcg-heat-cell{width:11px;height:11px;border-radius:3px;background:var(--surface-2);border:1px solid var(--border)}
.qcg-heat-cell.active{background:var(--duck-yellow);border-color:var(--duck-orange)}

/* ── Lesson: contextual "Ask AI" button ─────────────────────────── */
.qcg-ask-ai-btn{margin-top:1.5rem;display:inline-flex;align-items:center;gap:.4rem;background:var(--yellow-light);border:1.5px solid var(--duck-yellow);color:#6A4400;padding:.55rem 1.125rem;border-radius:20px;font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:.8rem;cursor:pointer;transition:all .15s;box-shadow:0 3px 0 rgba(234,88,12,.25)}
body.dark .qcg-ask-ai-btn{color:#F5C842}
body.dark .qcg-ask-ai-btn{color:var(--duck-yellow)}
.qcg-ask-ai-btn:hover{transform:translateY(-1px);background:var(--duck-yellow);color:#5A3300}

/* ── Home banner: claimable state ───────────────────────────────── */
.qcg-home-banner.is-pro.claimable{animation:qcgPulseGlow 1.8s ease-in-out infinite}
@keyframes qcgPulseGlow{0%,100%{box-shadow:0 3px 0 #A03A10}50%{box-shadow:0 3px 0 #A03A10,0 0 0 5px rgba(255,255,255,.25)}}



/* ── Duels: topic picker ────────────────────────────────────────── */
.qcg-duel-picker{background:var(--yellow-light);border:2px solid var(--duck-yellow);border-radius:var(--radius-lg);padding:.875rem 1rem;margin-bottom:1.125rem}
.qcg-duel-picker-label{font-family:'Space Grotesk',sans-serif;font-size:.72rem;font-weight:900;color:#6A4400;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.5rem}
body.dark .qcg-duel-picker-label{color:#F5C842}
body.dark .qcg-duel-picker-label{color:var(--duck-yellow)}
.qcg-duel-select{width:100%;padding:.6rem .75rem;border:2px solid var(--duck-yellow);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);font-family:'Space Grotesk',sans-serif;font-size:.8rem;font-weight:700;outline:none}

/* ── Home: Focus Mode card ──────────────────────────────────────── */
/* ── Unified "Golden Hub" card ──────────────────────────────────────
   Consolidates what used to be 4 separate stacked cards (Daily Bonus/
   Golden Egg banner, Focus Mode, Weekly Recap) into ONE
   card with internal rows, so the home screen isn't a long scroll of
   near-identical boxes — especially important on small screens. ── */
.qcg-hub-card{background:var(--surface);border:2.5px solid var(--border);border-radius:var(--radius-lg);margin-bottom:1.125rem;overflow:hidden;box-shadow:var(--shadow-sm)}
.qcg-hub-row{display:flex;align-items:center;gap:.875rem;padding:.875rem 1.125rem;cursor:pointer;transition:background .15s}
.qcg-hub-row:hover{background:var(--surface-2)}
.qcg-hub-row + .qcg-hub-row{border-top:1.5px solid var(--border)}
.qcg-hub-row-icon{font-size:1.375rem;flex-shrink:0;width:1.75rem;text-align:center}
.qcg-hub-row-text{flex:1;min-width:0}
.qcg-hub-row-text strong{display:block;font-family:'Space Grotesk',sans-serif;font-size:.85rem;font-weight:800}
.qcg-hub-row-text span{font-size:.7rem;color:var(--text-3);font-weight:600;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qcg-hub-row-arrow{margin-left:auto;font-size:1.1rem;font-weight:800;opacity:.6;flex-shrink:0}
.qcg-hub-row.is-pro-banner{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));color:#5A3300;cursor:default}
.qcg-hub-row.is-pro-banner:hover{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange))}
.qcg-hub-row.is-pro-banner.claimable{cursor:pointer;animation:qcgPulseGlow 1.8s ease-in-out infinite}
.qcg-hub-row.is-free-banner{background:linear-gradient(135deg,rgba(245,158,11,.14),rgba(234,88,12,.10))}
.qcg-hub-row-progress{height:5px;background:var(--surface-2);border-radius:6px;overflow:hidden;margin-top:.4rem}
.qcg-hub-row-progress-fill{height:100%;border-radius:6px;background:linear-gradient(135deg,#FF8A65,#FFC845);transition:width .5s cubic-bezier(.4,0,.2,1)}
.qcg-event-greeting-pill{display:inline-flex;align-items:center;gap:.3rem;font-size:.68rem;font-weight:800;font-family:'Space Grotesk',sans-serif;background:linear-gradient(135deg,#FF8A65,#FFC845);color:#fff;-webkit-text-fill-color:#fff;padding:.2rem .6rem;border-radius:20px;margin-left:.6rem;cursor:pointer;vertical-align:middle;white-space:nowrap;box-shadow:0 2px 6px rgba(255,138,101,.35)}
.qcg-event-greeting-pill:hover{filter:brightness(1.08)}
.qcg-hub-recap-inline{display:flex;align-items:center;gap:.875rem;flex:1;min-width:0}
.qcg-hub-recap-dots{display:flex;gap:3px;flex-shrink:0}
.qcg-hub-recap-dots .qcg-recap-dot{width:7px;height:7px;border-radius:50%;background:var(--border-strong)}
.qcg-hub-recap-dots .qcg-recap-dot.active{background:var(--duck-orange)}
.qcg-hub-recap-stats{display:flex;gap:.75rem;font-size:.7rem;color:var(--text-3);font-weight:700;flex-shrink:0}
@media (max-width:480px){
  .qcg-hub-row{padding:.75rem .875rem;gap:.625rem}
  .qcg-hub-row-icon{font-size:1.2rem;width:1.5rem}
  .qcg-hub-row-text strong{font-size:.8rem}
  .qcg-hub-row-text span{font-size:.65rem}
  .qcg-hub-recap-stats{display:none} /* too cramped on small phones — dots alone still tell the story */
}

.qcg-focus-card{display:flex;align-items:center;gap:.875rem;background:#4C6FFF;border-radius:var(--radius-lg);padding:1rem 1.125rem;margin-bottom:1.125rem;color:white;cursor:pointer;transition:transform .2s,box-shadow .2s;box-shadow:0 3px 0 #1B2A4A}
.qcg-focus-card:hover{transform:translateY(-2px);box-shadow:0 6px 0 #1B2A4A}
.qcg-focus-icon{font-size:1.625rem;flex-shrink:0}
.qcg-focus-text strong{display:block;font-family:'Space Grotesk',sans-serif;font-size:.9rem;font-weight:900}
.qcg-focus-text span{font-size:.75rem;font-weight:600;opacity:.88}
.qcg-focus-arrow{margin-left:auto;font-size:1.2rem;font-weight:800;opacity:.8}

/* ── Profile: certificate download button ───────────────────────── */
.qcg-cert-btn{flex-shrink:0;width:32px;height:32px;border-radius:50%;border:2px solid var(--duck-yellow);background:var(--yellow-light);cursor:pointer;font-size:.95rem;display:flex;align-items:center;justify-content:center;transition:all .15s;margin-left:.5rem}
.qcg-cert-btn:hover{background:var(--duck-yellow);transform:scale(1.08)}

/* ── Golden Theme — an exclusive warm color skin for members ───────── */
body.golden-theme{
  --pond-deep:#7C4A03;--pond-mid:#B8790A;--pond-teal:#F0A83B;--pond-sky:#FCE7B8;--pond-lily:#F5C842;
  --accent:#B8790A;--accent-dk:#7C4A03;--accent-light:#FEF3D6;
  --bg:#FFFBF0;--surface:#FFFFFF;--surface-2:#FFF6E0;--border:#F0DBA0;--border-strong:#E0BE5C;
  --text:#4A3400;--text-2:#7C5A10;--text-3:#B8935A;
}
body.dark.golden-theme{
  --bg:#1F1706;--surface:#2B2109;--surface-2:#3A2C0D;--border:#5A4415;--border-strong:#7C5E1E;
  --text:#FCE7B8;--text-2:#E0BE5C;--text-3:#A98230;
  --accent:#F5C842;--accent-dk:#B8790A;--accent-light:#3A2C0D;
  --pond-mid:#F5C842;--pond-deep:#E0AC2E;--pond-teal:#F0A83B;
}
#qcg-theme-btn.active-theme{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange))!important;color:#5A3300!important}



/* ── Editorial headline accent — swaps the biggest "brand moment"
     headings to a quirky serif so the type system reads as its own
     thing rather than a generic rounded UI font used everywhere ──── */
.auth-logo h1, .home-greeting h2, .complete-screen h2, .profile-hero-info h2,
.ch-info h2, .lesson-question, .duel-result-banner {
  font-family:'Space Grotesk',sans-serif !important;
  font-weight:600 !important;
  letter-spacing:-0.01em !important;
}

/* ── Flatten the "candy button" 3D press effect into a modern,
     soft-shadow hover-lift interaction model ─────────────────────── */
.btn, .cc, .node-card, .stat-card, .badge-card, .word-chip, .mcq-opt, .profile-stat,
.review-banner, .duel-pick-row, .fr-card, .lb-row, .friend-row, .badge-chip,
.modal-box, .golden-modal-box {
  box-shadow: var(--shadow-sm) !important;
  transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease !important;
}
.btn:hover:not(:disabled), .cc:hover, .node-card:hover:not(.node-locked),
.stat-card:hover, .mcq-opt:hover:not(.disabled), .badge-card:hover, .duel-pick-row:hover {
  box-shadow: var(--shadow-md) !important;
  transform: translateY(-2px) !important;
}
.btn:active:not(:disabled), .cc:active, .mcq-opt:active {
  transform: translateY(0) !important;
  box-shadow: var(--shadow-xs) !important;
}

/* ── Lesson path: rounded-square nodes instead of circular "skill
     bubbles", and a calmer active-state glow ──────────────────────── */
.node-icon-wrap{ border-radius: 14px !important; }
.node-card{ border-radius: 18px !important; }
.node-card.node-quiz{ border-radius: 20px !important; }
.node-card.node-quiz .node-icon-wrap, .node-card.node-project .node-icon-wrap{ border-radius: 16px !important; }
.node-card.node-active .node-icon-wrap::before{ opacity:.3 !important; border-radius:14px !important; }
.avatar, .profile-avatar-big{ border-radius: 10px !important; }

/* ── Topbar: compact overflow menu ──────────────────────────────── */
.qcg-more-wrap{ position:relative; display:flex; align-items:center; }
.qcg-more-btn{
  width:38px; height:38px; border-radius:10px; border:2px solid var(--border);
  background:var(--surface); color:var(--text-2); font-size:1.1rem; font-weight:900;
  cursor:pointer; display:flex; align-items:center; justify-content:center;
  transition:all .15s; letter-spacing:2px;
}
.qcg-more-btn:hover{ background:var(--surface-2); border-color:var(--border-strong); }
.qcg-more-panel{
  position:absolute; top:calc(100% + 8px); right:0; min-width:220px;
  background:var(--surface); border:2px solid var(--border); border-radius:var(--radius-lg);
  box-shadow:var(--shadow-lg); padding:.5rem; display:flex; flex-direction:column; gap:.25rem;
  opacity:0; visibility:hidden; transform:translateY(-6px);
  transition:opacity .16s ease, transform .16s ease, visibility .16s;
  z-index:200;
}
.qcg-more-panel.open{ opacity:1; visibility:visible; transform:translateY(0); }
.qcg-more-panel .btn.ghost{
  width:100% !important; box-shadow:none !important; border:none !important;
  justify-content:flex-start !important; text-align:left !important;
  padding:.6rem .75rem !important; border-radius:10px !important; margin:0 !important;
  transform:none !important;
}
.qcg-more-panel .btn.ghost:hover{ background:var(--surface-2) !important; transform:none !important; }



/* ── Home: Weekly Recap card ────────────────────────────────────── */
.qcg-recap-card{background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-lg);padding:1rem 1.125rem;margin-bottom:1.125rem}
.qcg-recap-hd{font-family:'Space Grotesk',sans-serif;font-size:.8rem;font-weight:900;color:var(--text-2);margin-bottom:.7rem}
.qcg-recap-days{display:flex;gap:.375rem;margin-bottom:.85rem}
.qcg-recap-dot{width:100%;height:8px;border-radius:6px;background:var(--surface-2);border:1.5px solid var(--border)}
.qcg-recap-dot.active{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));border-color:transparent}
.qcg-recap-stats{display:flex;gap:1.25rem}
.qcg-recap-stats div{display:flex;flex-direction:column}
.qcg-recap-stats strong{font-family:'Space Grotesk',sans-serif;font-size:1.15rem;font-weight:900;color:var(--text);letter-spacing:-.02em}
.qcg-recap-stats span{font-size:.68rem;font-weight:700;color:var(--text-3);text-transform:uppercase;letter-spacing:.04em}

/* ── AI chat: persona picker ────────────────────────────────────── */
.qcg-persona-row{display:flex;gap:.4rem;padding:.75rem 1rem 0;flex-wrap:wrap}
.qcg-persona-chip{border:1.5px solid var(--border);background:var(--surface);color:var(--text-2);border-radius:20px;padding:.3rem .75rem;font-size:.7rem;font-weight:800;cursor:pointer;font-family:'Space Grotesk',sans-serif;transition:all .15s}
.qcg-persona-chip.active{background:linear-gradient(135deg,var(--duck-yellow),var(--duck-orange));color:#5A3300;border-color:transparent}



/* ── Moderator title tag (see section 28 above) — a small pill reading
     "Moderator" placed right after the name on the Profile page. */
.mod-title-badge{
  display:inline-flex;
  align-items:center;
  margin-left:.5rem;
  padding:.15rem .6rem;
  border-radius:20px;
  font-family:'Space Grotesk',sans-serif;
  font-size:.6rem;
  font-weight:900;
  letter-spacing:.04em;
  text-transform:uppercase;
  color:#fff;
  background:linear-gradient(135deg,#14B8A6,#0F766E);
  box-shadow:0 2px 0 rgba(0,0,0,.2);
  vertical-align:middle;
}



@media (prefers-reduced-motion: no-preference) {
  /* ── Home hero: ripples spawned dynamically at random spots (see
       script below) instead of a fixed emitter point ──────────────── */
  #page-home .home-greeting{ position:relative; z-index:1; }
  #page-home .topbar + div, #page-home > div:first-of-type{ position:relative; overflow:visible; }
  .qcg-ripple-field{
    position:absolute; inset:-40px -20px auto -20px; height:220px;
    pointer-events:none; z-index:0; overflow:hidden;
  }
  .qcg-ripple-field span{
    position:absolute; border-radius:50%; transform:translate(-50%,-50%);
    border:1.5px solid var(--pond-teal); opacity:0;
    animation:qcg-ripple 3.4s ease-out forwards;
  }
  @keyframes qcg-ripple{
    0%   { width:16px; height:16px; opacity:.5; }
    100% { width:220px; height:220px; opacity:0; }
  }
}

/* ── Click ripple: tapping anywhere sends out a ring, like touching
     the surface of the pond ─────────────────────────────────────── */
.qcg-click-ripple{
  position:fixed; left:0; top:0; z-index:9999; pointer-events:none;
  border-radius:50%; border:1.5px solid var(--pond-teal);
  background:radial-gradient(circle, color-mix(in srgb, var(--pond-teal) 18%, transparent) 0%, transparent 70%);
  transform:translate(-50%,-50%);
  animation:qcg-click-ripple .8s ease-out forwards;
}
@keyframes qcg-click-ripple{
  0%   { width:6px; height:6px; opacity:.55; }
  100% { width:130px; height:130px; opacity:0; }
}

/* ── Topbar: glass over water, thin ripple-line seam at the bottom ── */
.topbar{
  position:sticky; top:0; z-index:100;
  background:color-mix(in srgb, var(--surface) 88%, transparent) !important;
  backdrop-filter:blur(10px) saturate(1.4);
  -webkit-backdrop-filter:blur(10px) saturate(1.4);
  border-bottom:1px solid var(--border) !important;
  transition:box-shadow .25s ease, border-color .25s ease;
}
.topbar.qcg-scrolled{ box-shadow:var(--shadow-sm) !important; }

/* ── Golden Egg surfaces: a warm glint instead of a flat shimmer ──── */
.btn.golden, .golden-egg-topbar-btn.is-premium, .qcg-home-banner.is-pro,
#qcg-theme-btn.active-theme{
  position:relative; overflow:hidden;
}
.btn.golden::before, .qcg-home-banner.is-pro::before{
  content:''; position:absolute; top:0; left:-60%; width:40%; height:100%;
  background:linear-gradient(115deg, transparent, rgba(255,255,255,.55), transparent);
  transform:skewX(-18deg);
}
@media (prefers-reduced-motion: no-preference){
  .btn.golden::before, .qcg-home-banner.is-pro::before{
    animation:qcg-glint 4.5s ease-in-out infinite;
  }
  @keyframes qcg-glint{
    0%, 60% { left:-60%; }
    85%, 100% { left:130%; }
  }
}

/* ── Golden modal: the egg gets a small idle bob, sparkle accents ── */
.golden-modal-icon{ display:inline-block; }
@media (prefers-reduced-motion: no-preference){
  .golden-modal-icon{ animation:qcg-bob 2.6s ease-in-out infinite; }
  @keyframes qcg-bob{ 0%,100%{ transform:translateY(0) rotate(-2deg); } 50%{ transform:translateY(-6px) rotate(2deg); } }
}

/* ── Accessible focus states everywhere (skill floor: never skip this) ── */
a:focus-visible, button:focus-visible, input:focus-visible, textarea:focus-visible,
select:focus-visible, [tabindex]:focus-visible{
  outline:2.5px solid var(--pond-teal) !important;
  outline-offset:2px !important;
}

/* ── Slightly warmer, more intentional card depth than a flat border ── */
.stat-card, .cc, .node-card, .badge-card, .sb-card, .qcg-recap-card{
  background-image:linear-gradient(180deg, color-mix(in srgb, var(--surface) 100%, white 3%) 0%, var(--surface) 100%);
}

/* ── Ambient wave texture: a very faint current running behind every
     page. Ties the whole app back to water even where nothing else
     is animated — the signature carries through, not just the hero ── */
body::before{
  content:''; position:fixed; inset:0; z-index:0; pointer-events:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='84' height='28'%3E%3Cpath d='M0 14 Q21 2 42 14 T84 14' stroke='%234338CA' stroke-width='1' fill='none'/%3E%3C/svg%3E");
  background-repeat:repeat;
  opacity:.04;
}
body.dark::before{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='84' height='28'%3E%3Cpath d='M0 14 Q21 2 42 14 T84 14' stroke='%238B7FF0' stroke-width='1' fill='none'/%3E%3C/svg%3E");
  opacity:.05;
}

/* ── Golden modal: a soft warm glow pooling behind the box, like
     sunlight coming up through the water ────────────────────────── */
#golden-egg-modal .golden-modal-box{ position:relative; z-index:1; }
#golden-egg-modal .golden-modal-box::before{
  content:''; position:absolute; z-index:-1; inset:-30px;
  background:radial-gradient(closest-side, color-mix(in srgb, var(--duck-yellow) 30%, transparent), transparent 75%);
  pointer-events:none;
}



@media (prefers-reduced-motion: no-preference) {
  /* ── 1. Drifting leaves in the home hero ──────────────────────── */
  .qcg-lily-field{
    position:absolute; inset:-10px -10px auto -10px; height:200px;
    pointer-events:none; z-index:0; overflow:hidden;
  }
  .qcg-lily-field span{
    position:absolute; left:-8%; opacity:.3; filter:drop-shadow(0 2px 3px rgba(0,0,0,.15));
    animation:qcg-lily-drift linear infinite;
  }
  .qcg-lily-field span:nth-child(1){ top:24%; font-size:1rem;   animation-duration:26s; animation-delay:0s; }
  .qcg-lily-field span:nth-child(2){ top:58%; font-size:1.4rem; animation-duration:34s; animation-delay:9s; }
  .qcg-lily-field span:nth-child(3){ top:40%; font-size:.85rem; animation-duration:30s; animation-delay:19s; }
  @keyframes qcg-lily-drift{
    0%   { transform:translateX(0) translateY(0) rotate(0deg); }
    50%  { transform:translateX(65vw) translateY(-8px) rotate(8deg); }
    100% { transform:translateX(130vw) translateY(0) rotate(-4deg); }
  }

  /* ── 2. A duck glides across the bottom of the screen ─────────── */
  .qcg-duck-swim{
    position:fixed; bottom:8vh; left:-48px; z-index:5; pointer-events:none;
    width:34px; height:34px; filter:drop-shadow(0 3px 4px rgba(0,0,0,.25));
    animation:qcg-duck-glide 10s linear forwards;
  }
  .qcg-duck-swim img{ width:100%; height:100%; display:block; object-fit:contain; }
  @keyframes qcg-duck-glide{
    0%   { left:-48px; transform:translateY(0); }
    48%  { transform:translateY(-4px); }
    52%  { transform:translateY(-4px); }
    100% { left:calc(100% + 48px); transform:translateY(0); }
  }
}

/* ── 3. Fireflies over the pond at night (dark mode only) ────────── */
.qcg-firefly-field{ position:fixed; inset:0; z-index:0; pointer-events:none; overflow:hidden; display:none; }
body.dark .qcg-firefly-field{ display:block; }
.qcg-firefly-field span{
  position:absolute; bottom:-10px; width:4px; height:4px; border-radius:50%;
  background:var(--duck-yellow); box-shadow:0 0 6px 2px rgba(245,158,11,.7);
  opacity:0;
}
@media (prefers-reduced-motion: no-preference) {
  .qcg-firefly-field span{ animation:qcg-firefly-rise linear infinite; }
  @keyframes qcg-firefly-rise{
    0%   { opacity:0; transform:translate(0,0); }
    12%  { opacity:.75; }
    50%  { transform:translate(14px,-45vh); }
    88%  { opacity:.4; }
    100% { opacity:0; transform:translate(-12px,-95vh); }
  }
}



/* ═══════════════════════════════════════════════════════════════════
   QUACKCODE — PROFESSIONAL POLISH PASS v2
   Loaded last so it wins the cascade over every earlier stylesheet
   (including the per-feature blocks scattered through the body).
   Goal: tighten the type/space/elevation system, calm the "cartoon"
   3D buttons into something a design team would ship, and make every
   card family (course tiles, node tiles, stat cards, friend rows,
   leaderboard rows, badge cards) read as one coherent system.
════════════════════════════════════════════════════════════════════ */

/* ── 0. Design tokens: a real 4px spacing scale + tightened radii ── */
:root{
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:20px; --sp-6:24px; --sp-8:32px; --sp-10:40px;
  --r-sm:10px; --r-md:14px; --r-lg:18px; --r-xl:24px;
  --ink:#1B2233;
}
body.dark{ --ink:#EDEFFA; }

/* ── 1. Type system: Fraunces for display/editorial headings gives
   the app a premium, considered voice instead of all-caps geometric
   sans everywhere. Space Grotesk stays for UI chrome, Inter for body. */
h1, .auth-logo h1{
  font-family:'Space Grotesk',sans-serif !important;
  font-weight:600 !important; letter-spacing:-.01em !important;
}
.home-greeting h2, .ch-info h2, .profile-hero-info h2, .modal-box h2,
.golden-modal-box h2, .badge-card-desc, .lb-banner h2{
  font-family:'Space Grotesk',sans-serif !important;
  font-weight:600 !important; letter-spacing:-.01em !important;
}
.section-label{ letter-spacing:.06em !important; font-weight:700 !important; }
body{ letter-spacing:-.005em; }
p, .cc-info p, .node-label, .stat-lbl{ letter-spacing:0; }

/* ── 2. Buttons: replace the thick 4-6px "gummy" 3D shadow with a
   single refined 2px offset + soft ambient shadow. Reads as elevation,
   not a toy. Press state still gives tactile feedback. ─────────────── */
.btn{
  border-radius:var(--r-md) !important;
  font-weight:700 !important;
  letter-spacing:-.005em;
  transition:transform .15s cubic-bezier(.2,.8,.2,1), box-shadow .15s, filter .15s, background-color .15s !important;
}
.btn.primary, .btn.success, .btn.review-btn, .btn.danger, .btn.golden{
  box-shadow:0 1px 2px rgba(20,16,50,.06), 0 2px 0 rgba(0,0,0,.16), inset 0 1px 0 rgba(255,255,255,.22) !important;
}
.btn.primary:hover, .btn.success:hover, .btn.review-btn:hover, .btn.danger:hover{
  transform:translateY(-1px) !important;
  box-shadow:0 4px 12px rgba(20,16,50,.16), 0 2px 0 rgba(0,0,0,.16), inset 0 1px 0 rgba(255,255,255,.25) !important;
}
.btn.primary:active, .btn.success:active, .btn.review-btn:active, .btn.danger:active{
  transform:translateY(1px) !important;
  box-shadow:0 1px 2px rgba(20,16,50,.10), 0 1px 0 rgba(0,0,0,.14) !important;
}
.btn.ghost{ border-width:1.5px !important; font-weight:700 !important; }
.btn.ghost:hover{ transform:translateY(-1px); }

/* ── 3. Cards, unified: one elevation language across every tile
   family in the app (course tiles, lesson nodes, stat cards, friend
   rows, leaderboard rows, badge cards, mastery egg). ────────────────── */
.cc, .stat-card, .profile-stat, .badge-card, .fr-card, .friend-row,
.lb-row, .mastery-egg-card, .sb-card, .modal-box, .golden-modal-box{
  border-radius:var(--r-lg) !important;
  border-width:1.5px !important;
  box-shadow:0 1px 2px rgba(20,16,50,.05), 0 1px 0 var(--border) !important;
}
.cc:hover{
  transform:translateY(-2px) !important;
  box-shadow:0 10px 24px rgba(20,16,50,.10), 0 1px 0 var(--border) !important;
  border-color:var(--border-strong) !important;
}
.cc:active{ transform:translateY(0) !important; }
.node-card{
  border-radius:var(--r-lg) !important;
  border-width:1.5px !important;
  box-shadow:0 1px 2px rgba(20,16,50,.06) !important;
}
.node-card.node-done, .node-card.node-active{
  box-shadow:0 4px 14px rgba(20,16,50,.14) !important;
}
.node-card:hover:not(.node-locked){
  transform:translateY(-3px) !important;
  box-shadow:0 10px 22px rgba(20,16,50,.16) !important;
}

/* Icon chips: one consistent rounded-square treatment everywhere,
   replacing mismatched circle/square/dashed styles. ─────────────────── */
.cc-icon, .profile-course-icon{
  border-radius:var(--r-sm) !important;
  box-shadow:inset 0 -2px 0 rgba(0,0,0,.10), inset 0 1px 0 rgba(255,255,255,.30) !important;
}
.node-icon-wrap{ box-shadow:0 1px 3px rgba(0,0,0,.12) !important; }

/* ── 4. Topbar / header chrome — calmer, more evenly spaced ─────────── */
.topbar, .course-header, .lesson-topbar, .profile-topbar, .social-topbar, .shop-topbar{
  padding-top:.7rem !important; padding-bottom:.7rem !important;
  border-bottom-width:1.5px !important;
}
.topbar-logo span{ letter-spacing:-.02em !important; }
.user-pill{ font-weight:700 !important; }
.xp-pill{ font-weight:800 !important; letter-spacing:-.01em; }

/* ── 5. Auth screen — quieter, more centered, less carnival ─────────── */
.auth-box{
  border-radius:var(--r-xl) !important;
  border-width:1.5px !important;
  box-shadow:0 24px 64px rgba(20,16,50,.18), 0 2px 8px rgba(20,16,50,.08) !important;
}
.auth-logo .duck{ width:64px !important; height:64px !important; }
.auth-logo h1{ font-size:1.9rem !important; }
.auth-tabs{ border-radius:var(--r-sm) !important; }
.auth-tab{ border-radius:8px !important; }
.field input{
  border-radius:var(--r-sm) !important;
  border-width:1.5px !important;
  padding:.7rem .9rem !important;
}
.field label{ font-size:.7rem !important; letter-spacing:.06em !important; }

/* ── 6. Section labels — a real rule instead of a busy dashed line ──── */
.section-label{ margin-top:2rem !important; }
.section-label::after{ height:1.5px !important; background:var(--border) !important; }

/* ── 7. Badge chips / pills — consistent pill treatment ──────────────── */
.badge-chip, .fr-pill, .friend-badge{
  border-radius:999px !important;
  font-weight:700 !important;
}
.badge-chip.earned{ box-shadow:0 1px 3px rgba(245,158,11,.25); }

/* ── 8. Progress bars — thinner, calmer, no runaway shimmer ─────────── */
.pbar-wrap, .fr-xp-bar, .lesson-progress-bar, .mastery-egg-progress-track,
.profile-course-pbar{
  border-radius:999px !important;
}
.pbar, .sb-prog-fill, .profile-course-fill, .fr-xp-fill, .lesson-progress-fill{
  border-radius:999px !important;
  animation-duration:5s !important;
}

/* ── 9. Modals — calmer entrance surface, consistent radius/padding ── */
.modal-box, .golden-modal-box{
  border-width:1.5px !important;
  padding:2rem !important;
}
.modal-close{
  border-radius:50% !important;
  transition:background .15s, transform .15s;
}
.modal-close:hover{ transform:rotate(90deg); }

/* ── 10. Leaderboard / friends rows — quieter dividers, no visual noise */
.lb-row, .friend-row, .fr-card{
  border-width:1.5px !important;
}
.lb-me{
  box-shadow:0 0 0 2px var(--pond-teal), 0 4px 14px rgba(67,56,202,.18) !important;
}

/* ── 11. Node grid rhythm — a touch more breathing room ──────────────── */
.node-grid{ gap:1rem !important; }
.unit-block{ margin-bottom:2.75rem !important; }
.course-path-col{ padding-top:2.25rem !important; }

/* ── 12. Links & interactive text — a real hover affordance ─────────── */
a, [onclick]{ -webkit-tap-highlight-color:transparent; }

/* ── 13. Consistent disabled state ───────────────────────────────────── */
button:disabled{ filter:grayscale(.15) !important; }

/* ── 14. Fine print — calmer letter-spacing on tiny labels app-wide ─── */
.node-xp, .xp-badge, .unit-tag, .profile-stat-lbl, .stat-lbl{
  letter-spacing:.03em !important;
}

/* ── 15. Motion respect, extended to the new elements ─────────────────── */
@media (prefers-reduced-motion: reduce){
  .cc, .node-card, .btn, .modal-close{ transition:none !important; }
}

/* ── 16. Small screens — tighten padding so nothing feels cramped-but-huge */
@media (max-width:480px){
  .home-content{ padding-left:1.1rem !important; padding-right:1.1rem !important; }
  .auth-box{ padding:1.85rem !important; }
}



/* ═══════════════════════════════════════════════════════════════════
   PROFESSIONAL POLISH PASS v3 — extends v2 to the pieces it missed.
   v2 unified course tiles, node tiles, stat cards, and modals onto one
   soft-elevation language, but never reached the MCQ question cards,
   the fill-in-blank UI, or the check/feedback bar — which together are
   the single most-viewed surface in the whole app (every question,
   every lesson). This closes that gap using the exact same tokens and
   shadow recipe v2 already established, so it reads as one system
   instead of two competing ones.
════════════════════════════════════════════════════════════════════ */

/* MCQ option cards — same soft elevation as .cc / .node-card, with the
   state color (selected/correct/wrong) carried by the shadow tint
   instead of a heavy flat "gummy" 3D bar. */
.mcq-opt{
  border-radius:var(--r-lg) !important;
  border-width:1.5px !important;
  box-shadow:0 1px 2px rgba(20,16,50,.05), 0 1px 0 var(--border) !important;
}
.mcq-opt:hover:not(.disabled){
  transform:translateY(-2px) !important;
  box-shadow:0 8px 20px rgba(20,16,50,.10), 0 1px 0 var(--border) !important;
}
.mcq-opt.selected{ box-shadow:0 4px 14px rgba(67,56,202,.20) !important; }
.mcq-opt.correct{ box-shadow:0 4px 14px rgba(15,122,61,.20) !important; }
.mcq-opt.wrong{ box-shadow:0 4px 14px rgba(225,29,46,.20) !important; }
.mcq-opt.disabled:hover{ transform:none !important; }

/* Fill-in-the-blank: word chips and the blank slot itself get the same
   pill/radius language as badge-chip and the same soft depth as .btn. */
.word-chip{
  border-radius:999px !important;
  font-weight:700 !important;
  box-shadow:0 1px 2px rgba(20,16,50,.06) !important;
}
.word-chip:not(.used):hover{ transform:translateY(-1px) !important; }
.code-blank{ border-radius:var(--r-sm) !important; }

/* Check button + feedback bar — consistent radius/elevation with the
   rest of the button system instead of a plain flat strip. */
.check-area{ border-top-width:1.5px !important; }
.feedback-bar.correct-fb, .feedback-bar.wrong-fb{ border-top-width:3px !important; }
.fb-btn{ border-radius:var(--r-md) !important; }

/* Hint card — same soft border-radius scale as everything above (the
   warm "tip" color treatment itself was already reworked separately). */
.hint-box{ border-radius:var(--r-md) !important; }
.hint-toggle-btn{ border-radius:999px !important; }



/* ═══════════════════════════════════════════════════════════════════
   QUACKCODE — LESSON COLOR RETHEME
   Two things the person asked for:
   1) Code example blocks: replace the harsh neon-green-on-black
      terminal look with a softer palette pulled from the app's own
      pond/duck colors (deep indigo bg, periwinkle keywords, warm
      gold functions, soft coral strings, muted lavender comments).
   2) "Correct answer" green: the old --green tokens were a generic
      bright mint that clashed with the indigo/lavender surfaces.
      Redefining the CSS custom properties here cascades the fix into
      every correct-state indicator in the app automatically (mcq
      options, fill-in blanks, feedback banners, duel mode, golden
      egg checklist, vault) — not just lesson quizzes.
════════════════════════════════════════════════════════════════════ */

/* ── 1. "Correct" tokens — retheme once, fixes it everywhere ───────── */
:root{
  --green:#2E9E44;
  --green-light:#DCF3DE;
  --green-dk:#1F6E30;
}
body.dark{
  --green:#5FCB6E;
  --green-light:#1B3320;
  --green-dk:#3FA34D;
}

/* Correct state gets a touch more warmth so it doesn't feel clinical */
.mcq-opt.correct{
  box-shadow:0 4px 0 var(--pond-deep), 0 0 0 3px rgba(13,148,136,.16) !important;
}
.mcq-opt.correct .mcq-letter{ background:var(--green) !important; }

/* ── 2. Code example blocks — pond-deep bg, calmer syntax colors ───── */
.lesson-explain pre{
  background:#1B2140 !important;
  color:#EDEFFA !important;
  border:1px solid #333C63 !important;
}
.lesson-explain pre .kw{ color:#A9B8FF !important; }   /* keywords — soft periwinkle, matches brand blue */
.lesson-explain pre .fn{ color:#FFC845 !important; }   /* functions/methods — bright gold */
.lesson-explain pre .str{ color:#FF9BB3 !important; }  /* strings — soft coral-pink */
.lesson-explain pre .num{ color:#6EE7B7 !important; }  /* numbers/literals — mint green, distinct pop */
.lesson-explain pre .cm{ color:#7A84AC !important; }   /* comments — muted blue-gray, still legible */

@media (prefers-reduced-motion: reduce){
  .mcq-opt.correct{ transition:none !important; }
}



.qcg-egg-icon{
  display:inline-block; vertical-align:-3px; width:1.1em; height:1.1em;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cdefs%3E%3ClinearGradient id='qeg' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%23F5C842'/%3E%3Cstop offset='1' stop-color='%23EA580C'/%3E%3C/linearGradient%3E%3ClinearGradient id='qeb' x1='0' y1='0' x2='0' y2='1'%3E%3Cstop offset='0' stop-color='%23FBF6E8'/%3E%3Cstop offset='1' stop-color='%23E8C88A'/%3E%3C/linearGradient%3E%3C/defs%3E%3Ccircle cx='32' cy='32' r='31' fill='url(%23qeg)'/%3E%3Cellipse cx='30' cy='34' rx='13' ry='17' fill='url(%23qeb)' transform='rotate(-14 30 34)'/%3E%3Cellipse cx='25' cy='24' rx='4' ry='6' fill='%23FFFFFF' opacity='.55' transform='rotate(-14 25 24)'/%3E%3C/svg%3E");
  background-size:contain; background-repeat:no-repeat; background-position:center;
}
.qcg-egg-icon.lg{ width:2.5rem; height:2.5rem; }
.qcg-egg-icon.xl{ width:4.25rem; height:4.25rem; }



.combo-badge{font-family:'Space Grotesk',sans-serif;font-size:.7rem;font-weight:900;color:var(--duck-orange);background:var(--yellow-light);border:1.5px solid var(--duck-yellow);border-radius:20px;padding:.15rem .55rem;margin-left:.4rem;display:inline-block;animation:comboPop .25s cubic-bezier(.34,1.56,.64,1)}
@keyframes comboPop{from{transform:scale(.7)}to{transform:scale(1)}}



.qcg-hub-dots{display:flex;gap:.25rem;margin:.35rem 0 .3rem}
.qcg-hub-dot{width:1.3rem;height:1.3rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.68rem;background:var(--surface-2);color:var(--text-3);border:1px solid var(--border)}
.qcg-hub-dot.is-owned{background:var(--yellow-light);border-color:var(--duck-yellow)}

.qcg-collect-toast{position:fixed;left:50%;bottom:1.25rem;transform:translate(-50%,140%);display:flex;align-items:center;gap:.75rem;background:var(--surface);border:2px solid var(--duck-yellow);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);padding:.75rem 1.1rem;z-index:9999;max-width:min(92vw,22rem);transition:transform .35s cubic-bezier(.34,1.56,.64,1);cursor:pointer}
.qcg-collect-toast.show{transform:translate(-50%,0)}
.qcg-collect-toast-emoji{font-size:2rem;flex-shrink:0;animation:qcgCollectPop .4s cubic-bezier(.34,1.56,.64,1)}
@keyframes qcgCollectPop{from{transform:scale(.4) rotate(-15deg);opacity:0}to{transform:scale(1) rotate(0);opacity:1}}
.qcg-collect-toast-title{font-family:'Space Grotesk',sans-serif;font-size:.72rem;color:var(--duck-orange);font-weight:900;text-transform:uppercase;letter-spacing:.03em}
.qcg-collect-toast-name{font-size:.95rem;font-weight:800;color:var(--text-1)}
.qcg-collect-toast-count{font-size:.7rem;color:var(--text-3);font-weight:700;margin-top:.1rem}

.qcg-event-hero{border-radius:var(--radius-xl);padding:1.375rem 1.5rem;margin-bottom:1.25rem;color:#fff;position:relative;overflow:hidden;box-shadow:var(--shadow-md)}
.qcg-event-hero::after{content:attr(data-icon);position:absolute;bottom:-22px;right:0;font-size:5.5rem;opacity:.18;line-height:1}
.qcg-event-hero-top{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;position:relative}
.qcg-event-hero-name{font-family:'Space Grotesk',sans-serif;font-size:1.3rem;font-weight:900;letter-spacing:-.02em}
.qcg-event-hero-days{font-size:.65rem;font-weight:800;background:rgba(255,255,255,.22);padding:.25rem .6rem;border-radius:20px;white-space:nowrap;flex-shrink:0}
.qcg-event-hero-tagline{font-size:.8rem;opacity:.92;margin:.35rem 0 1.125rem;font-weight:600;position:relative;max-width:34rem}
.qcg-event-progress-track{height:12px;background:rgba(255,255,255,.25);border-radius:8px;position:relative;margin-bottom:1.75rem}
.qcg-event-progress-fill{height:100%;border-radius:8px;background:#fff;transition:width .6s cubic-bezier(.4,0,.2,1)}
.qcg-event-milestone-pip{position:absolute;top:50%;transform:translate(-50%,-50%);width:18px;height:18px;border-radius:50%;background:var(--surface);border:3px solid rgba(255,255,255,.6);display:flex;align-items:center;justify-content:center;font-size:.6rem}
.qcg-event-milestone-pip.is-reached{border-color:#fff;background:#fff}
.qcg-event-milestone-pip-label{position:absolute;top:16px;left:50%;transform:translateX(-50%);font-size:.6rem;font-weight:800;white-space:nowrap;opacity:.9}
.qcg-event-progress-label{font-size:.72rem;font-weight:700;opacity:.9;position:relative;margin-top:-1rem}

.qcg-collect-album{display:grid;grid-template-columns:repeat(auto-fill,minmax(4.6rem,1fr));gap:.6rem;margin-bottom:1.5rem}
.qcg-collect-slot{aspect-ratio:1;border-radius:var(--radius-lg);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.2rem;background:var(--surface);border:2px solid var(--border);box-shadow:0 2px 0 var(--border);transition:transform .15s}
.qcg-collect-slot.is-owned{border-color:var(--duck-yellow);box-shadow:0 3px 0 var(--duck-orange);animation:qcgSlotPop .3s cubic-bezier(.34,1.56,.64,1)}
@keyframes qcgSlotPop{from{transform:scale(.75)}to{transform:scale(1)}}
.qcg-collect-slot.is-missing{opacity:.55}
.qcg-collect-slot.is-missing .qcg-collect-slot-emoji{filter:grayscale(1) opacity(.5)}
.qcg-collect-slot-emoji{font-size:1.6rem;line-height:1}
.qcg-collect-slot-name{font-size:.58rem;font-weight:700;color:var(--text-3);text-align:center;padding:0 .2rem;line-height:1.1}

.qcg-event-tier-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;margin-bottom:1.5rem}
@media (max-width:560px){.qcg-event-tier-grid{grid-template-columns:1fr}}
.qcg-event-tier-card{background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-lg);padding:1rem .875rem;text-align:center;box-shadow:0 2px 0 var(--border);transition:transform .15s}
.qcg-event-tier-card.is-unlocked{border-color:var(--duck-yellow);box-shadow:0 3px 0 var(--duck-orange)}
.qcg-event-tier-card.is-locked{opacity:.6}
.qcg-event-tier-label{font-family:'Space Grotesk',sans-serif;font-weight:900;font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;color:var(--text-3);margin-bottom:.5rem}
.qcg-event-tier-preview{font-size:2rem;margin-bottom:.4rem}
.qcg-event-tier-reward-name{font-size:.78rem;font-weight:800;font-family:'Space Grotesk',sans-serif;margin-bottom:.2rem}
.qcg-event-tier-goal{font-size:.68rem;color:var(--text-3);font-weight:700;margin-bottom:.5rem}
.qcg-event-tier-status{font-size:.68rem;font-weight:800;padding:.3rem .5rem;border-radius:var(--radius-sm);display:inline-block}
.qcg-event-tier-status.unlocked{background:var(--green-light);color:var(--green)}
.qcg-event-tier-status.locked{background:var(--surface-2);color:var(--text-3)}
.qcg-event-upcoming-card,.qcg-event-past-card{display:flex;align-items:center;gap:.75rem;padding:.75rem .9rem;border:2px solid var(--border);border-radius:var(--radius-lg);margin-bottom:.5rem;background:var(--surface)}
.qcg-event-upcoming-icon,.qcg-event-past-icon{font-size:1.375rem;flex-shrink:0;width:2rem;text-align:center}
.qcg-event-upcoming-name,.qcg-event-past-name{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:.85rem}
.qcg-event-upcoming-sub,.qcg-event-past-sub{font-size:.72rem;color:var(--text-3);font-weight:600}
.qcg-event-empty{text-align:center;padding:2.5rem 1rem;color:var(--text-3)}
.qcg-event-empty-icon{font-size:2.5rem;margin-bottom:.75rem}



.qcg-ch-filter-row{display:flex;flex-wrap:wrap;gap:.625rem;margin-bottom:1.125rem}
.qcg-ch-filter-row .friend-search-input{flex:1;min-width:160px}
.qcg-ch-select{padding:.6rem .75rem;border:2px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);font-size:.8rem;font-weight:700;font-family:'Space Grotesk',sans-serif;outline:none}
.qcg-sub-opt-row{display:flex;align-items:center;gap:.6rem;margin-bottom:.5rem}
.qcg-sub-opt-row input[type="radio"]{width:auto;flex-shrink:0}
.qcg-sub-opt-row input[type="text"]{flex:1;padding:.65rem .875rem;border:2px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);outline:none;font-family:'Inter',sans-serif}
.qcg-ch-card{border:2px solid var(--border);border-radius:var(--radius-lg);padding:.9rem 1rem;margin-bottom:.75rem;background:var(--surface);box-shadow:0 2px 0 var(--border)}
.qcg-ch-card.is-solved{border-color:var(--pond-teal)}
.qcg-ch-card-top{display:flex;align-items:flex-start;gap:.75rem}
.qcg-ch-card-q{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:.875rem;flex:1}
.qcg-ch-tag-pill{font-size:.62rem;font-weight:800;background:var(--accent-light);color:var(--heading-ink);padding:.2rem .55rem;border-radius:20px;white-space:nowrap;font-family:'Space Grotesk',sans-serif}
body.dark .qcg-ch-tag-pill{color:var(--duck-yellow)}
.qcg-ch-meta-row{font-size:.7rem;color:var(--text-3);font-weight:600;margin:.35rem 0 .7rem}
.qcg-ch-stats-row{display:flex;gap:.5rem;align-items:center;flex-wrap:wrap}
.qcg-ch-solved-check{color:var(--teal-ink);font-weight:900;font-size:.85rem;margin-left:.35rem}



.qcg-kata-progress-card{background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-lg);padding:.9rem 1.125rem;margin-bottom:1rem;box-shadow:0 2px 0 var(--border)}
.qcg-kata-progress-top{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:.5rem;font-family:'Space Grotesk',sans-serif}
.qcg-kata-progress-top strong{font-size:.85rem}
.qcg-kata-progress-top span{font-size:.75rem;color:var(--text-3);font-weight:700}
.qcg-kata-progress-bar{height:10px;background:var(--surface-2);border-radius:8px;overflow:hidden;border:1.5px solid var(--border)}
.qcg-kata-progress-fill{height:100%;border-radius:8px;background:linear-gradient(135deg,#2D7A5A,#4C6FFF);transition:width .5s cubic-bezier(.4,0,.2,1)}
.qcg-kata-filter-row{display:flex;flex-direction:column;gap:.625rem;margin-bottom:1.125rem}
.qcg-kata-tabs{display:flex;gap:.4rem;flex-wrap:wrap}
.qcg-kata-tab{padding:.4rem .8rem;border-radius:20px;border:2px solid var(--border);background:var(--surface);color:var(--text-2);font-size:.75rem;font-weight:800;font-family:'Space Grotesk',sans-serif;cursor:pointer;transition:all .15s}
.qcg-kata-tab.active{background:var(--pond-teal);border-color:var(--pond-deep);color:#fff}
.qcg-kata-tab:hover:not(.active){border-color:var(--pond-teal)}
.qcg-kata-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:.875rem}
.qcg-kata-card{background:var(--surface);border:2px solid var(--border);border-radius:var(--radius-lg);padding:1rem;box-shadow:0 2px 0 var(--border);display:flex;flex-direction:column;gap:.5rem;position:relative}
.qcg-kata-card.is-solved{border-color:var(--pond-teal)}
.qcg-kata-card-top{display:flex;align-items:center;justify-content:space-between}
.qcg-kata-card-diff{font-size:.68rem;font-weight:800;padding:.2rem .55rem;border-radius:20px;font-family:'Space Grotesk',sans-serif}
.qcg-kata-card-diff.diff-easy{background:var(--green-light);color:var(--green)}
.qcg-kata-card-diff.diff-medium{background:rgba(245,158,11,.16);color:#B45309}
body.dark .qcg-kata-card-diff.diff-medium{color:#FBBF24}
.qcg-kata-card-diff.diff-hard{background:var(--red-light);color:var(--red)}
.qcg-kata-card-check{color:var(--teal-ink);font-weight:900;font-size:1.1rem}
.qcg-kata-card-title{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:.9rem}
.qcg-kata-card-meta{font-size:.72rem;color:var(--text-3);font-weight:600}
.qcg-kata-example-box{background:var(--surface-2);border:1.5px solid var(--border);border-radius:var(--radius-md);padding:.75rem .9rem;margin-bottom:.875rem;font-family:'JetBrains Mono',monospace;font-size:.75rem;color:var(--text-2);line-height:1.6}
.qcg-kata-example-box strong{display:block;font-family:'Space Grotesk',sans-serif;font-size:.7rem;text-transform:uppercase;letter-spacing:.04em;color:var(--text-3);margin-bottom:.35rem}
.qcg-kata-hint-box{background:var(--accent-light);border:1.5px solid var(--pond-teal);border-radius:var(--radius-md);padding:.75rem .9rem;margin-bottom:.875rem;font-size:.8rem;color:var(--text-2)}
.qcg-kata-toolbar{display:flex;gap:.625rem;margin-top:.875rem;flex-wrap:wrap}
.qcg-kata-next-btn{margin-top:1rem;width:100%}



#qcg-xp-ring-wrap{position:relative;width:56px;height:56px;margin:0 auto .4rem}
#qcg-xp-ring-num{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-family:'Space Grotesk',sans-serif;font-weight:900;font-size:.68rem;color:var(--text-1,inherit)}



.qcg-more-panel{
  width:280px !important; min-width:280px !important; max-width:280px !important;
  display:grid !important; grid-template-columns:1fr 1fr !important; gap:.4rem !important;
  padding:.65rem !important; max-height:75vh; overflow-y:auto;
}
.qcg-more-panel .btn.ghost{
  width:auto !important; box-shadow:none !important; border:1.5px solid var(--border) !important;
  background:var(--surface-2) !important; justify-content:flex-start !important; text-align:left !important;
  padding:.55rem .6rem !important; border-radius:10px !important; margin:0 !important; transform:none !important;
  font-size:.72rem !important; line-height:1.25 !important;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  display:flex !important; align-items:center; gap:.35rem;
}
.qcg-more-panel .btn.ghost:hover{ background:var(--surface) !important; border-color:var(--pond-teal) !important; transform:none !important; }
.qcg-menu-divider{ grid-column:1/-1; height:1px; background:var(--border); margin:.2rem 0; opacity:.6; }
.qcg-more-panel .qcg-menu-logout{
  grid-column:1/-1; justify-content:center !important;
  background:var(--red-light) !important; color:var(--red) !important; border-color:var(--red-light) !important;
}
.qcg-more-panel .qcg-menu-logout:hover{ background:var(--red) !important; color:#fff !important; border-color:var(--red) !important; }
.qcg-more-panel.open{ transition:opacity .18s ease, transform .18s cubic-bezier(.34,1.4,.64,1), visibility .18s; }



/* ── 1) THE MOBILE FIX ─────────────────────────────────────────────
   The lily-field/ripple-field decorative layers deliberately bleed a
   few px past their own container (that's by design — they're meant
   to feel like they extend past the edge). Their own overflow:hidden
   only clips their children, not themselves relative to the page, so
   nothing was stopping them from widening the whole document. This is
   the standard, safe fix: clip at the root, once, instead of trying
   to constrain every full-bleed decorative element individually. */
html, body { overflow-x: hidden; }

/* ── 2) SMOOTHER PAGE TRANSITIONS ─────────────────────────────────
   Gives the outgoing page a brief fade+lift-out instead of vanishing
   instantly, so switching pages reads as one continuous motion
   instead of "new page snaps in over a page that just disappeared." */
@keyframes qcgPageLeave{ from{ opacity:1; transform:translateY(0); } to{ opacity:0; transform:translateY(-6px); } }
.page.qcg-leaving{
  display:flex !important; position:fixed !important; inset:0 !important;
  z-index:5 !important; pointer-events:none !important;
  animation:qcgPageLeave .18s cubic-bezier(.4,0,.2,1) forwards;
}
@media (prefers-reduced-motion: reduce){
  .page.qcg-leaving{ animation:none !important; opacity:0 !important; }
}

/* ── 3) A BOUNCE/JUICE LAYER on top of the existing hover-lift system
   The existing press state (translateY(0) + smaller shadow) reads as
   "correct" but not particularly fun. Adding a slight scale-down with
   a snappier easing on top gives actual tactile "press" feedback —
   the single highest-value, lowest-risk way to make the whole site
   feel more alive, since it's the same handful of selectors already
   used everywhere for buttons/cards. */
.btn:active:not(:disabled), .cc:active, .mcq-opt:active:not(.disabled),
.node-card:active:not(.node-locked), .shop-item:active, .duel-pick-row:active,
.badge-card:active, .fr-card:active, .lb-row:active {
  transform: scale(.965) !important;
  transition: transform .1s cubic-bezier(.4,0,.6,1) !important;
}
@media (prefers-reduced-motion: reduce){
  .btn:active:not(:disabled), .cc:active, .mcq-opt:active:not(.disabled),
  .node-card:active:not(.node-locked), .shop-item:active, .duel-pick-row:active,
  .badge-card:active, .fr-card:active, .lb-row:active { transform:none !important; }
}

/* ── 4) A couple of small, on-theme "fun" touches (interactive only —
   nothing idle/looping, so it never feels like it's nagging for
   attention) ──────────────────────────────────────────────────────── */
@keyframes qcgWiggle{ 0%,100%{ transform:rotate(0deg) scale(1); } 30%{ transform:rotate(-10deg) scale(1.08); } 60%{ transform:rotate(8deg) scale(1.08); } }
.stat-card:hover .stat-lbl{ display:inline-block; }
.stat-card:hover #streak-num + .stat-lbl,
.qcg-egg-icon:hover, .golden-egg-topbar-btn:hover .qcg-egg-icon {
  animation: qcgWiggle .5s ease;
}
@media (prefers-reduced-motion: reduce){ .stat-card:hover #streak-num + .stat-lbl, .qcg-egg-icon:hover { animation:none !important; } }

/* ── 5) MOBILE-SPECIFIC FIXES ──────────────────────────────────────
   Comfortable touch targets, and the "⋯" menu drops to one column
   on very narrow screens instead of staying pinned at 280px. */
@media (max-width: 600px){
  .btn{ min-height:40px; }
}
@media (max-width: 420px){
  .qcg-more-panel{
    grid-template-columns: 1fr !important;
    width: min(280px, 88vw) !important; min-width:0 !important; max-width:88vw !important;
    right: 4px !important;
  }
  .qcg-more-panel .btn.ghost{ white-space:normal !important; }
}



.qcg-notif-toast{
  position:fixed; right:16px; z-index:9997;
  display:flex; align-items:center; gap:.6rem;
  background:var(--surface); border:2px solid var(--pond-teal); border-radius:var(--radius-lg);
  box-shadow:var(--shadow-lg); padding:.75rem 1rem; max-width:320px;
  transform:translateX(130%); opacity:0;
  transition:transform .32s cubic-bezier(.34,1.4,.64,1), opacity .32s;
  cursor:pointer;
}
.qcg-notif-toast-show{ transform:translateX(0); opacity:1; }
.qcg-notif-toast-icon{ font-size:1.25rem; flex-shrink:0; }
.qcg-notif-toast-text{ font-size:.78rem; font-weight:700; color:var(--text); line-height:1.3; }
@media (prefers-reduced-motion: reduce){ .qcg-notif-toast{ transition:opacity .2s; transform:none !important; } }

#qcg-mailbox-badge{ pointer-events:none; }
.duel-opt.d-picked{ border-color:var(--pond-teal) !important; background:var(--accent-light) !important; }

@media (max-width: 480px){
  .qcg-notif-toast{ left:12px; right:12px; max-width:none; }
}



.qcg-feed-card{display:flex;align-items:center;gap:.75rem;padding:.75rem .9rem;border:2px solid var(--border);border-radius:var(--radius-lg);margin-bottom:.5rem;background:var(--surface);box-shadow:0 2px 0 var(--border)}
.qcg-feed-icon{font-size:1.2rem;flex-shrink:0;width:1.75rem;text-align:center}
.qcg-feed-text{flex:1;min-width:0;font-size:.8rem;font-weight:600;color:var(--text-2)}
.qcg-feed-text strong{font-family:'Space Grotesk',sans-serif;font-weight:800;color:var(--text)}
.qcg-feed-time{font-size:.68rem;color:var(--text-3);font-weight:600;white-space:nowrap;flex-shrink:0}



h1, h2, h3,
.auth-logo h1, .topbar-logo span, .home-greeting h2, .section-label,
.cc-info h3, .review-banner-text strong, .ch-info h2, .unit-title-text,
.sb-card-title, .sb-topbar-title, .complete-screen h2, .course-celebration h1,
.profile-hero-info h2, .profile-section-title, .profile-course-name,
.modal-box h2, .modal-box h3, .lb-banner h2, .lb-nearby-hd h3,
.duel-result-banner, .onboarding-box h2, .golden-modal-box h2,
.ai-topbar-title, .shop-topbar .shop-title, .shop-welcome-info h3,
.qcg-perks-card h3, .qcg-home-banner-text strong, .qcg-hub-row-text strong,
.duel-side-name, .fr-name, .lb-name strong{
  font-family:'Inter','Inter',sans-serif !important;
  font-weight:600 !important;
}



@media (min-width:640px){
  .node-path-item:nth-child(4n+2){ margin-left:2.25rem; }
  .node-path-item:nth-child(4n+3){ margin-left:3.5rem; }
  .node-path-item:nth-child(4n){ margin-left:1.25rem; }
  .node-path-item:not(:last-child)::after{ left:50% !important; }
}
.course-sidebar{
  position:sticky !important; top:1rem;
  align-self:flex-start;
  border:2px solid var(--border) !important;
  border-radius:var(--radius-lg) !important;
  box-shadow:0 4px 0 var(--border), 0 10px 20px rgba(26,22,56,.12) !important;
  margin:1rem 1rem 1rem 0;
  height:fit-content;
}



img.emoji{ height:1.15em; width:1.15em; margin:0 .05em 0 .1em; vertical-align:-0.2em; }



/* ═══════════════════════════════════════════════════════════════════
   TOTAL REDESIGN v4 — a full visual reskin, loaded last so it wins
   the cascade over every earlier stylesheet (v1/v2/v3 polish passes
   included). Nothing here changes markup, IDs, or classes — only how
   they look — so no JS or HTML behavior is touched.

   What changed, at a glance:
   • Palette: the cool indigo "pond" theme → a deep plum/violet +
     magenta theme — deliberately NOT green (green reads as a direct
     Duolingo reference), keeping the signature duck yellow/orange as
     the sole warm accent against it.
   • Type: 'Space Grotesk' everywhere → 'Space Grotesk' for UI chrome
     (buttons, tabs, pills, stats) and 'Fraunces' (an editorial serif)
     reserved for a handful of true "hero" moments — the auth logo,
     course-complete celebration, lesson-complete XP award. Both fonts
     were already loaded by an earlier, unfinished attempt at this
     exact change (see the <link> in <head>) — this finishes it.
   • Shape: much rounder corners, softer/glowier tinted shadows
     instead of flat gray "3D press bars", replacing the previous
     shadow system end-to-end (safe to do because every component
     already reads its radius/shadow from these same CSS variables).
   • All contrast work from earlier passes (--heading-ink / --accent-ink
     / --teal-ink for dark-mode-safe text) is preserved and re-tuned
     for the new palette — verified with the same luminance-ratio
     check used before shipping the visibility fixes.
════════════════════════════════════════════════════════════════════ */

/* ── 1. Core palette — replaces every value, keeps every variable
   NAME the same, so the hundred+ components already reading
   var(--pond-mid) etc. update automatically with zero markup risk ── */
:root{
  --pond-deep:#1B2A4A; --pond-mid:#4C6FFF; --pond-teal:#FF6F91; --pond-sky:#C7D2FE;
  --duck-yellow:#FFC845; --duck-orange:#FF8A65; --duck-brown:#8B5E34;
  --reed:#C9A15B; --mud:#3D3527; --foam:#EEF1FF; --ripple:#DCE3FF;

  --bg:#F7F8FC; --surface:#FFFFFF; --surface-2:#EEF1FC; --border:#E2E6F5;
  --border-strong:#C7CEEE; --text:#1B2233; --text-2:#4B5470; --text-3:#8890A8;

  --accent:var(--pond-mid); --accent-dk:var(--pond-deep); --accent-light:#E4E9FF;
  --green:#22B37A; --green-light:#DFF6EA; --green-dk:#187A52;
  --red:#FF5470; --red-light:#FFE3E8; --red-dk:#B7263F;
  --yellow:var(--duck-yellow); --yellow-light:#FFF3D9;

  --radius-sm:12px; --radius-md:18px; --radius-lg:24px; --radius-xl:32px;

  --shadow-xs:0 1px 3px rgba(27,42,74,.06);
  --shadow-sm:0 4px 16px rgba(27,42,74,.08);
  --shadow-md:0 10px 32px rgba(27,42,74,.12);
  --shadow-lg:0 20px 48px rgba(27,42,74,.16);

  --heading-ink:#1B2A4A; --accent-ink:#3552D6; --teal-ink:#D6486B;
}
body.dark{
  --bg:#12172B; --surface:#1B2140; --surface-2:#232B4D; --border:#333C63;
  --border-strong:#454F80; --text:#EDEFFA; --text-2:#C3C9E8; --text-3:#8E96BE;
  --accent:#7C93FF; --accent-dk:#4C6FFF; --accent-light:#232B4D;
  --green:#4ADE94; --green-light:#173327; --green-dk:#22B37A;
  --red:#FF7A90; --red-light:#3A1620; --red-dk:#FF5470; --yellow-light:#332708;

  --shadow-xs:0 1px 3px rgba(0,0,0,.35);
  --shadow-sm:0 4px 16px rgba(0,0,0,.4);
  --shadow-md:0 10px 32px rgba(0,0,0,.48);
  --shadow-lg:0 20px 48px rgba(0,0,0,.56);

  --heading-ink:#A9B8FF; --accent-ink:#8FA3FF; --teal-ink:#FF9BB3;
}

/* ── 2. Typography system — finishes the font-loading that was already
   set up (Space Grotesk / Fraunces / Inter loaded in <head>, unused) ── */
body{ font-family:'Inter','Inter',sans-serif !important; }

#qcg-xp-ring-num,
.ai-topbar-title,
.auth-tab,
.avatar,
.back-btn,
.badge-card-desc,
.badge-chip,
.badge-earned-tag,
.badge-name,
.badge-unlock-text strong,
.btn,
.cc-icon,
.cc-info h3,
.cc-pct,
.cc-stat-val,
.ch-info h2,
.combo-badge,
.duel-q-text,
.duel-result-banner,
.duel-score,
.duel-side-name,
.duel-vs-label,
.egg-sidebar-label,
.egg-sidebar-stage,
.fb-text strong,
.fbtn,
.field label,
.fr-avatar,
.fr-name,
.fr-pill,
.fr-pill-btn,
.fr-result-name,
.fr-section-hd,
.friend-tab,
.golden-modal-box .golden-price,
.golden-modal-box h2,
.hint-toggle-btn,
.home-greeting h2,
.lang-tab,
.lb-avatar,
.lb-name strong,
.lb-nearby-hd h3,
.lb-rank,
.lb-toggle-btn,
.lb-xp,
.lesson-question,
.mastery-egg-stagelabel,
.mastery-egg-sublabel,
.mcq-letter,
.modal-box h2,
.next-up-name,
.next-up-xp,
.node-label,
.node-project-tag,
.node-quiz-tag,
.node-time,
.node-xp,
.ob-course-card .occ-name,
.ob-fact-row .ob-fact-text strong,
.podium-avatar,
.podium-block,
.podium-name,
.podium-xp,
.profile-avatar-big,
.profile-course-icon,
.profile-course-name,
.profile-course-pct,
.profile-hero-info h2,
.profile-section-title,
.profile-stat-val,
.profile-topbar span,
.qcg-ch-card-q,
.qcg-ch-select,
.qcg-ch-tag-pill,
.qcg-chip,
.qcg-duel-picker-label,
.qcg-duel-select,
.qcg-event-greeting-pill,
.qcg-event-hero-name,
.qcg-event-past-name,
.qcg-event-tier-label,
.qcg-event-tier-reward-name,
.qcg-event-upcoming-name,
.qcg-feed-text strong,
.qcg-focus-text strong,
.qcg-home-banner-text strong,
.qcg-hub-row-text strong,
.qcg-kata-card-diff,
.qcg-kata-card-title,
.qcg-kata-example-box strong,
.qcg-kata-progress-top,
.qcg-kata-tab,
.qcg-perks-card h3,
.qcg-persona-chip,
.qcg-recap-hd,
.qcg-recap-stats strong,
.review-banner-text strong,
.sb-back,
.sb-card-title,
.sb-file-tab,
.sb-lang-btn,
.sb-open-btn,
.sb-preview-label,
.sb-run-btn,
.sb-stat-value,
.sb-topbar-title,
.section-label,
.shop-balance-pill,
.shop-item-name,
.shop-item-price,
.shop-section-hd,
.shop-tab,
.shop-topbar .shop-title,
.shop-welcome-info h3,
.social-tab,
.social-topbar span,
.stat-card .stat-val,
.step-badge,
.step-counter-text,
.streak-milestone-badge,
.toast,
.topbar-logo span,
.unit-index,
.unit-progress-text,
.unit-tag,
.unit-title-text,
.user-pill,
.wb-label,
.xp-badge,
.xp-pill,
.xp-pop{
  font-family:'Space Grotesk',sans-serif !important;
}

.auth-logo h1,
.complete-screen h2,
.course-celebration h1,
.lb-banner h2,
.onboarding-box h2,
.xp-award{
  font-family:'Fraunces',serif !important;
  font-weight:600 !important;
  font-style:normal;
}

/* ── 3. Buttons ──────────────────────────────────────────────────── */
.btn{
  border-radius:var(--radius-md) !important;
  border-width:0 !important;
  font-weight:700 !important;
  transition:transform .18s cubic-bezier(.2,.8,.2,1), box-shadow .18s !important;
}
.btn.primary{
  background:var(--pond-mid) !important;
  color:#fff !important;
  box-shadow:0 4px 0 var(--pond-deep), var(--shadow-sm) !important;
}
.btn.success{
  background:var(--green) !important;
  color:#fff !important;
  box-shadow:0 4px 0 var(--green-dk), var(--shadow-sm) !important;
}
.btn.golden{
  background:var(--duck-yellow) !important;
  color:var(--pond-deep) !important;
  box-shadow:0 4px 0 #C99A2E, var(--shadow-sm) !important;
}
.btn.danger{
  background:var(--red) !important;
  color:#fff !important;
  box-shadow:0 4px 0 var(--red-dk), var(--shadow-sm) !important;
}
.btn.primary:hover, .btn.success:hover, .btn.golden:hover, .btn.danger:hover{
  transform:translateY(-2px) !important;
  filter:brightness(1.04);
}
.btn.primary:active, .btn.success:active, .btn.golden:active, .btn.danger:active{
  transform:translateY(2px) !important;
  filter:brightness(.98);
}
.btn.ghost{
  border:1.5px solid var(--border) !important;
  background:var(--surface) !important;
  color:var(--text-2) !important;
  box-shadow:none !important;
}
.btn.ghost:hover{ border-color:var(--border-strong) !important; background:var(--surface-2) !important; }

/* ── 4. Cards ────────────────────────────────────────────────────── */
.cc, .node-card, .stat-card, .profile-stat, .badge-card, .fr-card,
.friend-row, .lb-row, .mastery-egg-card, .sb-card, .modal-box,
.golden-modal-box, .mcq-opt{
  border-radius:var(--radius-lg) !important;
  border-width:1.5px !important;
  border-style:solid !important;
  border-color:var(--border) !important;
  box-shadow:var(--shadow-sm) !important;
}
.cc:hover, .node-card:hover:not(.node-locked){
  transform:translateY(-3px) !important;
  box-shadow:var(--shadow-md) !important;
  border-color:var(--border-strong) !important;
}
.mcq-opt:hover:not(.disabled){
  transform:translateY(-2px) !important;
  box-shadow:var(--shadow-md) !important;
}
.mcq-opt.selected{ box-shadow:0 0 0 2px var(--pond-mid), var(--shadow-sm) !important; border-color:var(--pond-mid) !important; }
.mcq-opt.correct{ box-shadow:0 0 0 2px var(--green), var(--shadow-sm) !important; border-color:var(--green) !important; }
.mcq-opt.wrong{ box-shadow:0 0 0 2px var(--red), var(--shadow-sm) !important; border-color:var(--red) !important; }

.cc-icon, .profile-course-icon, .node-icon-wrap{
  border-radius:var(--radius-sm) !important;
}

/* ── 5. Pills / chips / badges ───────────────────────────────────── */
.badge-chip, .fr-pill, .friend-badge, .xp-pill, .xp-badge, .word-chip,
.qcg-chip, .shop-tag, .social-tab.active, .lang-tab.active-tab{
  border-radius:999px !important;
}

/* ── 6. Topbars ──────────────────────────────────────────────────── */
.topbar, .course-header, .lesson-topbar, .profile-topbar, .social-topbar,
.shop-topbar, .ai-topbar{
  border-bottom:1.5px solid var(--border) !important;
  box-shadow:none !important;
}

/* ── 7. Auth screen ──────────────────────────────────────────────── */
.auth-box{
  border-radius:var(--radius-xl) !important;
  border-width:1.5px !important;
  border-style:solid !important;
  border-color:var(--border) !important;
  box-shadow:var(--shadow-lg) !important;
}
.auth-logo h1{ font-size:2.1rem !important; }

/* ── 8. Progress bars ────────────────────────────────────────────── */
.lesson-progress-fill, .pbar, .sb-prog-fill, .profile-course-fill,
.fr-xp-fill{
  background:linear-gradient(90deg,var(--pond-mid),var(--green)) !important;
  border-radius:999px !important;
}

/* ── 9. Ambient page background — clean and calm, no pattern ──────── */
body{
  background:var(--bg) !important;
}
body.dark{
  background:var(--bg) !important;
}

/* ═══════════════════════════════════════════════════════════════════
   "POND INK" — canonical brand pass. This is the authoritative layer
   for color/shape/motion: it supersedes choices from the numbered
   passes above via normal CSS source order (same convention the rest
   of this file already uses — later blocks win — so nothing above is
   deleted, just superseded where it conflicts).

   The idea: own two things the way Duolingo owns green + an owl —
   (1) duck-yellow as the ONE accent used for XP/progress/primary
   actions, not competing with the indigo/violet structural color, and
   (2) a deliberate deep-indigo "night pond" dark mode, not a dark-mode
   afterthought. Plus one consistent asymmetric "lily-pad" corner
   treatment on primary cards, and one motion signature (the existing
   ripple) instead of several competing hover effects.
   ═══════════════════════════════════════════════════════════════════ */

/* 1. Duck-yellow as the accent signal on primary actions + the "done"/
   mastery state. --pond-mid/--pond-deep remain the structural chrome
   color (topbar, secondary buttons) rather than a second accent. */
:root{
  --node-done-bg: linear-gradient(135deg, var(--duck-yellow), var(--duck-orange));
}
.btn.primary{
  background:var(--duck-yellow) !important;
  color:var(--pond-deep) !important;
  box-shadow:0 5px 0 var(--duck-orange) !important;
}
.btn.primary:hover{ box-shadow:0 7px 0 var(--duck-orange) !important; filter:none !important; }
.btn.primary:active{ box-shadow:0 2px 0 var(--duck-orange) !important; }
.node-card.node-done{
  background:var(--node-done-bg) !important;
  box-shadow:0 2px 8px rgba(232,98,44,.28) !important;
}
.node-card.node-done .node-label,
.node-card.node-done .node-desc{ color:var(--pond-deep) !important; }
.lesson-progress-fill{
  background:linear-gradient(90deg, var(--duck-orange), var(--duck-yellow)) !important;
}

/* 2. Lesson-content view — the highest-traffic screen gets real brand
   treatment instead of a generic blue pill on a plain white card. Body
   text itself is untouched: readability there is non-negotiable. */
.step-badge.learn, .step-badge.question, .step-badge.type, .step-badge.fill{
  background:linear-gradient(135deg, var(--duck-yellow), var(--duck-orange)) !important;
  color:var(--pond-deep) !important;
}
.lesson-explain{
  border-radius:26px 14px 26px 14px !important;
  border-color:var(--border-strong) !important;
}

/* 3. "Lily-pad" asymmetric corner — one small, consistent shape signal
   applied to the primary card surfaces across the app (kept off small
   elements like avatars/pills/buttons, where it would just look like a
   bug rather than a signature). */
.stat-card, .node-card, .node-card.node-quiz, .shop-item, .fr-card,
.duel-pick-row, .lb-row{
  border-radius:22px 14px 22px 14px !important;
}

/* 4. Motion cleanup — the click-ripple effect (below, pre-existing) is
   the one signature interaction; standardize the hover lift instead of
   layering several different lift/glow/brightness effects on the same
   elements. */
.btn:hover:not(:disabled), .stat-card:hover, .node-card:hover:not(.node-locked),
.shop-item:hover, .fr-card:hover{
  transform:translateY(-2px) !important;
  filter:none !important;
}

/* 5. "Night pond" — a deliberately polished dark mode, not an
   afterthought. Slightly richer ambient current + a touch more depth
   on the primary surfaces than the base dark tokens above. */
body.dark::before{ opacity:.07 !important; }
body.dark .stat-card, body.dark .node-card, body.dark .shop-item, body.dark .fr-card{
  box-shadow:0 2px 12px rgba(0,0,0,.45) !important;
}
body.dark .btn.primary{ color:var(--pond-deep) !important; }

/* 6. Mascot moments — the empty-state and course-completion duck
   illustrations added in app.js get a little life without being
   distracting. */
.fr-empty-icon img{ width:56px; height:56px; }
.cc-mascot{
  position:relative; z-index:1; margin-bottom:.5rem;
  animation:pop .6s cubic-bezier(.34,1.56,.64,1);
}

/* 7. Typography, carried further — several major section headings
   (Home greeting, Shop title, modal titles, profile headers) were
   still falling through to a generic Inter-everywhere pass from an
   earlier redesign and never picked up the Fraunces/Space Grotesk
   pairing that already exists on login/course-complete/leaderboard.
   Small UI labels and list-row text (fr-name, duel-side-name, etc.)
   are deliberately left off this list — serif reads as a *heading*
   voice, not a compact-row voice. */
.home-greeting h2, .shop-topbar .shop-title, .modal-box h2, .modal-box h3,
.profile-hero-info h2, .profile-section-title, .golden-modal-box h2,
.duel-result-banner, .qcg-perks-card h3{
  font-family:'Fraunces',serif !important;
  font-weight:600 !important;
}

/* 8. The Home course-list rows ("JavaScript", "Debugging", ...) were
   the last plain symmetric-corner rectangles left on the highest-
   traffic page after the lesson/social/shop treatment above — bring
   them into the same lily-pad shape language. */
.cc{
  border-radius:22px 14px 22px 14px !important;
}
