:root{--bg:#f6f8fb;--surface:#fff;--surface-soft:#f0f6ff;--text:#0f1e2e;--text-muted:#5f7288;--line:#d8e2ef;--primary:#0ea5a4;--primary-2:#2f80ed;--accent:#f6c84f;--success:#20b36b;--danger:#e75a5a;--cat-grammar:#5b8def;--cat-vocab:#20b36b;--cat-dialogue:#9b6bff;--cat-listening:#ff8f4d;--shadow-1:0 4px 14px #0e1b2d14;--shadow-2:0 8px 24px #0e1b2d1f;--r-8:8px;--r-12:12px;--r-16:16px;--r-24:24px;--s-4:4px;--s-8:8px;--s-12:12px;--s-16:16px;--s-24:24px;--s-32:32px}*{box-sizing:border-box}html,body{background:radial-gradient(120% 120% at 0% 0%,#eef7ff 0%,var(--bg)44%,#f9fbff 100%);color:var(--text);margin:0;padding:0;font-family:SF Pro Text,Segoe UI,Inter,system-ui,-apple-system,sans-serif}a{color:inherit;text-decoration:none}button,input,textarea{font:inherit}.app-shell{max-width:460px;min-height:100dvh;padding:calc(env(safe-area-inset-top) + 16px)16px calc(env(safe-area-inset-bottom) + 88px);margin:0 auto;animation:.26s ease-out page-enter}.app-shell *{min-width:0}.app-shell p,.app-shell a,.app-shell span,.app-shell strong{overflow-wrap:anywhere}.page-title{margin:0 0 var(--s-16);letter-spacing:-.02em;font-size:30px;line-height:1.1}.page-subtitle{color:var(--text-muted);margin:0}.row{justify-content:space-between;align-items:center;gap:12px;display:flex}.stack{gap:12px;display:grid}.column{gap:10px;display:grid}.muted{color:var(--text-muted)}.badge-dot{border-radius:999px;width:8px;height:8px;display:inline-block}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@keyframes page-enter{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes skeleton{0%{background-position:100% 0}to{background-position:-100% 0}}@keyframes loader-bounce{0%,80%,to{opacity:.35;transform:translateY(0)}40%{opacity:1;transform:translateY(-5px)}}.loader-dots{gap:6px;display:inline-flex}.loader-dots span{background:var(--primary-2);border-radius:999px;width:8px;height:8px;animation:1.1s ease-in-out infinite loader-bounce}.loader-dots span:nth-child(2){animation-delay:.12s}.loader-dots span:nth-child(3){animation-delay:.24s}@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
