
:root{
  --bg:#0a0a12;
  --bg2:#0f0f1a;
  --bg3:#141422;
  --bg4:#1a1a2e;
  --surface:rgba(255,255,255,.03);
  --surface2:rgba(255,255,255,.06);
  --border:rgba(255,255,255,.07);
  --border2:rgba(255,255,255,.12);
  --text:#c8cad8;
  --text2:#8890a6;
  --text3:#555a70;
  --cyan:#00d2ff;
  --cyan-soft:rgba(0,210,255,.12);
  --cyan-glow:rgba(0,210,255,.25);
  --lime:#a3ff12;
  --green:#00ff88;
  --yellow:#f5c518;
  --yellow-soft:rgba(245,197,24,.12);
  --red:#ff4757;
  --violet:#a78bfa;
  --pink:#f472b6;
  --angular:#ff4081;
  --angular-bg:rgba(221,0,49,.12);
  --angular-border:rgba(221,0,49,.25);
  --ts-blue:#3178c6;
  --ts-bg:rgba(49,120,198,.12);
  --ts-border:rgba(49,120,198,.25);
  --editor-bg:#0d0d18;
  --font:'Outfit',sans-serif;
  --mono:'JetBrains Mono','Consolas',monospace;
  --topbar-h:52px;
  --sidebar-w:270px;
  --radius:10px;
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{
  background:var(--bg);
  transition:background-color .25s ease;
}
body{
  font-family:var(--font);
  background:var(--bg);
  color:var(--text);
  line-height:1.6;
  overflow:hidden;
  height:100vh;
  height:100dvh;
  transition:background-color .25s ease,color .25s ease;
}
::selection{background:var(--ts-blue);color:#fff}
::-webkit-scrollbar{width:5px;height:5px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:rgba(255,255,255,.1);border-radius:3px}

html.light{
  --bg:#f5f6fa;
  --bg2:#fff;
  --bg3:#eef0f6;
  --bg4:#e2e5f0;
  --surface:rgba(0,0,0,.02);
  --surface2:rgba(0,0,0,.04);
  --border:rgba(0,0,0,.08);
  --border2:rgba(0,0,0,.12);
  --text:#1a1d2e;
  --text2:#4a5068;
  --text3:#7a7f96;
  --cyan:#0091b3;
  --cyan-soft:rgba(0,145,179,.1);
  --angular:#d50032;
  --angular-bg:rgba(213,0,50,.08);
  --angular-border:rgba(213,0,50,.18);
  --ts-blue:#235a9e;
  --ts-bg:rgba(35,90,158,.08);
  --ts-border:rgba(35,90,158,.18);
  --lime:#2e7d00;
  --yellow:#b38f00;
  --red:#d32f2f;
  --editor-bg:#f8f9fc;
}
html.light .topbar{background:rgba(255,255,255,.92)}
html.light .topbar-logo{color:var(--text)}
html.light .topbar-logo:hover{color:var(--cyan)}
html.light .exercise-title{color:var(--text)}
html.light .console-line.log{color:var(--text)}
html.light .free-mode-info h2{color:var(--text)}
html.light .sidebar-mobile-title{color:var(--text)}

.topbar{
  position:fixed;
  top:0;left:0;right:0;
  z-index:100;
  display:flex;
  align-items:center;
  justify-content:space-between;
  padding:0 24px;
  height:var(--topbar-h);
  background:rgba(10,10,18,.88);
  backdrop-filter:blur(16px);
  border-bottom:1px solid var(--border);
}
.topbar-left{display:flex;align-items:center;gap:14px}
.topbar-logo{
  font-family:Syne,sans-serif;
  font-size:1rem;
  font-weight:800;
  color:#fff;
  text-decoration:none;
  display:flex;
  align-items:center;
  gap:8px;
  transition:color .2s;
}
.topbar-logo:hover{color:var(--cyan)}
.topbar-logo .dot{
  width:8px;
  height:8px;
  border-radius:50%;
  background:var(--ts-blue);
  box-shadow:0 0 8px var(--ts-border);
}
.topbar-sep{width:1px;height:18px;background:var(--border2)}
.topbar-page{font-size:.74rem;font-weight:600;color:var(--ts-blue);letter-spacing:.04em}
.topbar-right{display:flex;align-items:center;gap:10px}
.theme-toggle{
  width:34px;height:34px;border-radius:50%;
  border:1px solid var(--border);
  background:var(--surface2);
  color:var(--text2);
  font-size:.95rem;
  cursor:pointer;
  display:grid;
  place-items:center;
  transition:all .2s;
  padding:0
}
.theme-toggle:hover{border-color:var(--border2);color:var(--text)}
.back-link{
  font-size:.72rem;
  font-weight:500;
  color:var(--text2);
  text-decoration:none;
  padding:5px 14px;
  border-radius:8px;
  border:1px solid var(--border);
  transition:all .2s
}
.back-link:hover{color:var(--cyan);border-color:rgba(0,210,255,.25);background:rgba(0,210,255,.04)}
.kbd{display:inline-block;padding:2px 6px;font-size:.6rem;font-family:var(--mono);background:var(--surface2);border:1px solid var(--border2);border-radius:4px;color:var(--text3)}
.ts-badge{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;border-radius:6px;background:var(--ts-bg);border:1px solid var(--ts-border);font-size:.62rem;font-weight:700;color:var(--ts-blue);font-family:var(--mono);letter-spacing:.04em}
.ts-status{font-size:.6rem;color:var(--text3);font-family:var(--mono)}
.ts-status.ready{color:var(--lime)}
.ts-status.loading{color:var(--yellow)}
.ts-status.error{color:var(--red)}

.page-layout{display:grid;grid-template-columns:var(--sidebar-w) 1fr;height:100vh;height:100dvh;padding-top:var(--topbar-h)}

.sidebar{background:var(--bg2);border-right:1px solid var(--border);padding:14px 0 30px;overflow-y:auto;scrollbar-width:thin}
.mode-toggle{display:flex;padding:0 14px;margin:0 0 10px;gap:3px}
.mode-btn{flex:1;font-family:var(--font);font-size:.7rem;font-weight:600;padding:7px 0;border-radius:8px;border:1px solid var(--border);background:transparent;color:var(--text3);cursor:pointer;transition:all .15s}
.mode-btn:hover{color:var(--text2)}
.mode-btn.active{background:var(--ts-bg);color:var(--ts-blue);border-color:var(--ts-border)}
.sidebar-title{font-size:.58rem;font-weight:700;text-transform:uppercase;letter-spacing:.12em;color:var(--text3);padding:10px 18px 6px}
.exercise-category{margin-bottom:4px}
.category-header{display:flex;align-items:center;gap:8px;padding:7px 18px;font-size:.76rem;font-weight:600;color:var(--text2);cursor:pointer;user-select:none}
.category-header:hover{color:#fff}
.category-header .chevron{font-size:.55rem;margin-left:auto;transition:transform .2s}
.exercise-category.open .chevron{transform:rotate(90deg)}
.exercise-list{display:none;padding:0 10px 0 18px}
.exercise-category.open .exercise-list{display:block}
.exercise-item{display:flex;align-items:center;gap:8px;padding:6px 10px;font-size:.74rem;color:var(--text2);border-radius:8px;cursor:pointer;transition:all .12s;margin-bottom:2px;border:1px solid transparent}
.exercise-item:hover{background:var(--surface2);color:var(--text)}
.exercise-item.active{background:var(--ts-bg);color:var(--ts-blue);border-color:var(--ts-border)}
.exercise-item.completed .check{color:var(--lime)}
.exercise-item .check{font-size:.68rem;color:var(--text3);width:16px;flex-shrink:0}
.difficulty{margin-left:auto;font-size:.56rem;font-weight:700;padding:1px 6px;border-radius:4px;flex-shrink:0}
.difficulty.easy{background:rgba(163,255,18,.1);color:var(--lime)}
.difficulty.medium{background:var(--yellow-soft);color:var(--yellow)}
.difficulty.hard{background:rgba(244,114,182,.1);color:var(--pink)}
.sidebar-stats{margin:16px 12px 0;padding:14px;background:var(--bg3);border-radius:var(--radius);border:1px solid var(--border)}
.sidebar-stats h4{font-size:.58rem;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.1em;margin-bottom:8px}
.stat-row{display:flex;justify-content:space-between;font-size:.76rem;margin-bottom:4px}
.stat-row .val{font-weight:700;color:var(--ts-blue);font-family:var(--mono);font-size:.72rem}
.progress-track{height:4px;background:var(--bg4);border-radius:2px;margin-top:10px;overflow:hidden}
.progress-fill{height:100%;background:linear-gradient(90deg,var(--ts-blue),var(--cyan));border-radius:2px;transition:width .5s ease}
.sidebar-mobile-header{display:none;justify-content:space-between;align-items:center;padding:14px 16px;border-bottom:1px solid var(--border)}
.sidebar-mobile-title{font-family:Syne,sans-serif;font-size:.95rem;font-weight:800;color:#fff}
.sidebar-mobile-close{background:none;border:1px solid var(--border);color:var(--text2);padding:5px 12px;border-radius:6px;font-family:var(--font);font-size:.74rem;cursor:pointer}

.main-area{display:flex;flex-direction:column;overflow:hidden}
.exercise-header{padding:16px 24px 12px;border-bottom:1px solid var(--border);background:var(--bg);flex-shrink:0}
.exercise-meta{display:flex;align-items:center;gap:10px;margin-bottom:6px}
.exercise-badge{font-family:var(--mono);font-size:.6rem;font-weight:700;text-transform:uppercase;padding:3px 8px;border-radius:5px}
.exercise-badge.ts{background:var(--ts-bg);color:var(--ts-blue)}
.exercise-badge.ng{background:var(--angular-bg);color:var(--angular)}
.exercise-title{font-family:Syne,sans-serif;font-size:1.15rem;font-weight:800;color:#fff;line-height:1.3}
.exercise-desc{font-size:.82rem;color:var(--text2);margin-top:5px;line-height:1.5}
.exercise-desc code{background:var(--ts-bg);color:var(--ts-blue);padding:1px 5px;border-radius:4px;font-family:var(--mono);font-size:.76rem}
.exercise-hints{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.hint-tag{font-size:.64rem;padding:2px 7px;border-radius:5px;background:var(--surface2);color:var(--text3);border:1px solid var(--border)}
.free-mode-info{display:none;padding:16px 24px 12px;border-bottom:1px solid var(--border);background:var(--bg);flex-shrink:0}
.free-mode-info h2{font-family:Syne,sans-serif;font-size:1.1rem;font-weight:800;color:#fff}
.free-mode-info p{font-size:.82rem;color:var(--text2);margin-top:2px}

.panel-tabs{display:none;flex-shrink:0;background:var(--bg2);border-bottom:1px solid var(--border)}
.panel-tab{flex:1;font-family:var(--font);font-size:.72rem;font-weight:600;padding:9px 0;border:none;background:transparent;color:var(--text3);cursor:pointer;border-bottom:2px solid transparent;text-align:center}
.panel-tab.active{color:var(--ts-blue);border-bottom-color:var(--ts-blue)}

.editor-console-split{flex:1;display:grid;grid-template-columns:1fr 1fr;overflow:hidden}
.panel{display:flex;flex-direction:column;overflow:hidden}
.panel:first-child{border-right:1px solid var(--border)}
.panel-header{display:flex;align-items:center;justify-content:space-between;padding:7px 14px;background:var(--bg2);border-bottom:1px solid var(--border);flex-shrink:0}
.panel-label{font-size:.65rem;font-weight:700;color:var(--text3);text-transform:uppercase;display:flex;align-items:center;gap:6px}
.panel-label .icon{font-size:.78rem}
.panel-actions{display:flex;gap:5px}
.action-btn{font-family:var(--font);font-size:.68rem;font-weight:600;padding:5px 11px;border-radius:6px;border:1px solid var(--border);background:var(--surface);color:var(--text2);cursor:pointer;transition:all .15s}
.action-btn:hover{background:var(--surface2);color:var(--text)}
.action-btn.primary{background:linear-gradient(135deg,var(--ts-blue),#5b9bd5);color:#fff;border:none;font-weight:700}
.action-btn.primary:hover{box-shadow:0 0 16px var(--ts-border);transform:translateY(-1px)}
.action-btn.success{background:rgba(163,255,18,.08);color:var(--lime);border-color:rgba(163,255,18,.2)}
.action-btn.ghost{color:var(--text3);background:transparent;border-color:transparent}
.code-editor{flex:1;display:flex;overflow:hidden;background:var(--editor-bg)}
.line-numbers{padding:14px 0;width:38px;text-align:right;padding-right:8px;font-family:var(--mono);font-size:.7rem;color:var(--text3);line-height:1.65;user-select:none;border-right:1px solid var(--border);overflow:hidden;flex-shrink:0}
.code-textarea{flex:1;resize:none;border:none;outline:none;background:transparent;color:var(--text);font-family:var(--mono);font-size:.8rem;line-height:1.65;padding:14px;tab-size:2;white-space:pre;overflow:auto}
.code-textarea::placeholder{color:var(--text3)}
.console-body{flex:1;overflow-y:auto;padding:14px;font-family:var(--mono);font-size:.76rem;background:var(--editor-bg)}
.console-line{padding:3px 0;line-height:1.5;border-bottom:1px solid rgba(255,255,255,.02);display:flex;align-items:flex-start;gap:8px;animation:cfade .15s ease}
@keyframes cfade{from{opacity:0;transform:translateY(3px)}to{opacity:1;transform:translateY(0)}}
.console-line .prefix{flex-shrink:0;font-size:.65rem;opacity:.5}
.console-line.log{color:var(--text)}
.console-line.error{color:var(--red);background:rgba(255,71,87,.04);margin:2px -14px;padding:3px 14px}
.console-line.warn{color:var(--yellow)}
.console-line.success{color:var(--lime)}
.console-line.info{color:var(--ts-blue)}
.console-welcome{color:var(--text3);font-size:.72rem}
.result-banner{padding:9px 14px;font-size:.76rem;font-weight:600;display:none;align-items:center;gap:8px;border-top:1px solid var(--border);flex-shrink:0}
.result-banner.pass{display:flex;background:rgba(163,255,18,.05);color:var(--lime)}
.result-banner.fail{display:flex;background:rgba(255,71,87,.05);color:var(--red)}

.sidebar-overlay{display:none;position:fixed;inset:0;z-index:149;background:rgba(0,0,0,.55);backdrop-filter:blur(3px)}
.sidebar-overlay.open{display:block}
.mobile-fab{display:none;position:fixed;z-index:120;bottom:20px;left:16px;background:var(--ts-blue);color:#fff;border:none;border-radius:50px;padding:10px 16px;font-family:var(--font);font-size:.76rem;font-weight:700;cursor:pointer;box-shadow:0 4px 20px var(--ts-border);align-items:center;gap:6px}

@media(max-width:1024px){:root{--sidebar-w:240px}}
@media(max-width:768px){
  :root{--topbar-h:46px}
  .topbar{padding:0 12px}
  .topbar-logo{font-size:.88rem}
  .topbar-logo-text{display:none}
  .topbar-sep,.kbd,.kbd-label,.ts-badge{display:none}
  .back-link{font-size:.68rem;padding:4px 10px}
  .page-layout{grid-template-columns:1fr}
  .sidebar{position:fixed;top:0;left:0;width:82vw;max-width:320px;height:100vh;height:100dvh;z-index:150;transform:translateX(-100%);transition:transform .3s cubic-bezier(.4,0,.2,1);padding-top:0}
  .sidebar.mobile-open{transform:translateX(0)}
  .sidebar-mobile-header{display:flex}
  .mobile-fab{display:flex}
  .exercise-header{padding:10px 14px 8px}
  .exercise-title{font-size:1rem}
  .exercise-desc{font-size:.76rem}
  .panel-tabs{display:flex}
  .editor-console-split{grid-template-columns:1fr}
  .panel{display:none}
  .panel.visible{display:flex;flex:1}
  .panel:first-child{border-right:none}
  .panel-header{padding:6px 10px}
  .action-btn{font-size:.64rem;padding:5px 9px}
  .line-numbers{width:30px;font-size:.62rem}
  .code-textarea{font-size:.74rem;padding:10px}
  .console-body{padding:10px;font-size:.72rem}
}
@media(max-width:480px){
  .back-link{display:none}
  .exercise-title{font-size:.92rem}
  .action-btn{font-size:.6rem;padding:4px 7px}
  .code-textarea{font-size:.7rem;padding:8px}
  .line-numbers{width:26px;font-size:.58rem}
  .console-body{font-size:.68rem;padding:8px}
  .mobile-fab{bottom:14px;left:10px;font-size:.72rem;padding:8px 14px}
  .sidebar{width:90vw}
}
