:root {
  --accent:#4A90E2; --accent2:#2171C7;
  --emerald:#27AE60; --red:#E74C3C; --gold:#FFD700; --gold2:#FF8C00;
  --purple:#8E44AD; --orange:#E67E22;
  --bg:#0E1621; --bg2:#1A2535; --bg3:#243048; --bg4:#1F2D40;
  --card:#1E2E42; --card2:#243348;
  --txt:#E2EAF4; --txt2:#8EA8C8; --txt3:#4A6080;
  --border:rgba(74,144,226,.2); --border2:rgba(255,255,255,.06);
  --r:12px; --r2:8px;
}
*{margin:0;padding:0;box-sizing:border-box;}
@keyframes ldBar{0%{transform:translateX(-100%)}100%{transform:translateX(350%)}}
html,body{height:100%;font-family:'Noto Sans KR',sans-serif;background:var(--bg);color:var(--txt);overflow-x:hidden;}

/* ── LAYOUT ── */
.app{display:grid;grid-template-columns:220px 1fr;height:100vh;overflow:hidden;}
/* 좁은 화면에서는 1열. 사이드바 숨김·서랍 처리는 파일 맨 아래 [NARROW-1] 블록에 있다
   — 여기에 .sidebar{display:none} 을 두면 바로 아래 .sidebar{display:flex} 에 밀린다. */
@media(max-width:768px){.app{grid-template-columns:1fr;}}

/* ── SIDEBAR ── */
.sidebar{background:var(--bg2);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow-y:auto;}
.sidebar-logo{padding:1.4rem 1.2rem;border-bottom:1px solid var(--border2);}
.logo-title{font-size:1rem;font-weight:900;color:var(--accent);}
.logo-sub{font-size:.7rem;color:var(--txt3);margin-top:.15rem;}
.nav-section{padding:.7rem .8rem .2rem;font-size:.65rem;color:var(--txt3);letter-spacing:.12em;text-transform:uppercase;}
.nav-item{display:flex;align-items:center;gap:.7rem;padding:.65rem 1.2rem;
  font-size:.85rem;color:var(--txt2);cursor:pointer;transition:all .18s;border-left:3px solid transparent;}
.nav-item:hover{background:rgba(74,144,226,.07);color:var(--txt);}
.nav-item.active{background:rgba(74,144,226,.12);color:var(--accent);border-left-color:var(--accent);}
.nav-icon{font-size:1rem;width:20px;text-align:center;}
.sidebar-bottom{margin-top:auto;padding:1rem;border-top:1px solid var(--border2);}
.sidebar-student-count{font-size:.75rem;color:var(--txt3);}

/* ── MAIN ── */
.main{overflow-y:auto;background:var(--bg);scrollbar-gutter:stable;
  scrollbar-width:auto;scrollbar-color:rgba(255,255,255,.28) rgba(255,255,255,.04);}
/* 스크롤바가 5px·8% 투명이라 "스크롤이 없다"고 보였음 → 잡을 수 있는 굵기와 대비로 */
.main::-webkit-scrollbar{width:14px;}
.main::-webkit-scrollbar-track{background:rgba(255,255,255,.04);}
.main::-webkit-scrollbar-thumb{background:rgba(255,255,255,.28);border-radius:7px;border:3px solid var(--bg);}
.main::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.45);}

/* ── TOPBAR ── */
.topbar{position:sticky;top:0;z-index:50;background:rgba(14,22,33,.96);border-bottom:1px solid var(--border2);
  backdrop-filter:blur(10px);padding:.8rem 1.5rem;display:flex;align-items:center;justify-content:space-between;}
.topbar-title{font-size:1.05rem;font-weight:700;color:var(--txt);}
.topbar-right{display:flex;gap:.6rem;align-items:center;}
.btn-sm{background:var(--accent);color:#fff;font-family:'Noto Sans KR',sans-serif;
  font-size:.78rem;font-weight:700;padding:.4rem .9rem;border:none;border-radius:6px;cursor:pointer;transition:all .18s;}
.btn-sm:hover{background:var(--accent2);}
.btn-sm.danger{background:var(--red);}
.btn-sm.success{background:var(--emerald);}
.btn-sm.outline{background:transparent;border:1px solid var(--border);color:var(--txt2);}
.btn-sm.outline:hover{background:rgba(255,255,255,.05);}
.btn-sm.gold{background:linear-gradient(135deg,var(--gold),var(--gold2));color:#1a1a1a;}
/* [KIOSK-LINK-1] topbar의 <a>를 btn-sm과 같은 모양으로 (버튼용 규칙엔 없는 것만 보탬) */
a.btn-sm{display:inline-block;text-decoration:none;line-height:1.4;}
.admin-badge{font-size:.72rem;color:var(--txt3);background:rgba(255,255,255,.04);
  border:1px solid var(--border2);border-radius:20px;padding:.25rem .7rem;}

/* ── PAGE SECTIONS ── */
.page{display:none;padding:1.4rem;}
.page.active{display:block;}

/* ── STAT CARDS ── */
.stat-row{display:grid;grid-template-columns:repeat(4,1fr);gap:.8rem;margin-bottom:1.4rem;}
@media(max-width:900px){.stat-row{grid-template-columns:repeat(2,1fr);}}
.stat-card{background:var(--card);border:1px solid var(--border2);border-radius:var(--r);
  padding:1rem 1.1rem;position:relative;overflow:hidden;}
.stat-card::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;}
.stat-card.blue::before{background:linear-gradient(90deg,var(--accent),#5BA8F5);}
.stat-card.green::before{background:linear-gradient(90deg,var(--emerald),#2ECC71);}
.stat-card.gold::before{background:linear-gradient(90deg,var(--gold),var(--gold2));}
.stat-card.purple::before{background:linear-gradient(90deg,var(--purple),#9B59B6);}
.sc-label{font-size:.7rem;color:var(--txt3);text-transform:uppercase;letter-spacing:.1em;}
.sc-value{font-size:1.8rem;font-weight:900;margin:.3rem 0 .15rem;}
.sc-sub{font-size:.72rem;color:var(--txt2);}
.sc-value.blue{color:var(--accent);}
.sc-value.green{color:var(--emerald);}
.sc-value.gold{color:var(--gold);}
.sc-value.purple{color:var(--purple);}

/* ── TABLE CARD ── */
.table-card{background:var(--card);border:1px solid var(--border2);border-radius:var(--r);
  overflow:hidden;margin-bottom:1.2rem;}
.tc-header{padding:.9rem 1.2rem;border-bottom:1px solid var(--border2);
  display:flex;align-items:center;justify-content:space-between;}
.tc-title{font-size:.9rem;font-weight:700;}
.tc-actions{display:flex;gap:.5rem;}
table{width:100%;border-collapse:collapse;}
thead{background:rgba(255,255,255,.03);}
th{padding:.65rem 1rem;text-align:left;font-size:.72rem;color:var(--txt3);
  font-weight:600;letter-spacing:.08em;text-transform:uppercase;border-bottom:1px solid var(--border2);}
td{padding:.7rem 1rem;font-size:.82rem;border-bottom:1px solid rgba(255,255,255,.04);}
tr:last-child td{border-bottom:none;}
tr:hover td{background:rgba(255,255,255,.02);}
.td-avatar{font-size:1.2rem;width:32px;}
.td-name{font-weight:600;}
.td-level{color:var(--accent);font-weight:700;}
.td-gold{color:var(--gold);font-weight:700;}
.progress-mini{width:80px;height:5px;background:rgba(255,255,255,.07);border-radius:3px;overflow:hidden;}
.pm-fill{height:100%;border-radius:3px;background:linear-gradient(90deg,var(--emerald),#2ECC71);}
.tag{display:inline-block;padding:.15rem .5rem;border-radius:20px;font-size:.68rem;font-weight:700;}
.tag.active{background:rgba(39,174,96,.2);color:var(--emerald);}
.tag.wait{background:rgba(255,255,255,.06);color:var(--txt3);}
.tag.approved{background:rgba(39,174,96,.2);color:var(--emerald);}
.tag.pending{background:rgba(230,126,34,.2);color:var(--orange);}
.tag.rejected{background:rgba(231,76,60,.15);color:var(--red);}
.td-actions{display:flex;gap:.4rem;flex-wrap:wrap;}

/* ── FORM GRID ── */
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:.8rem;margin-bottom:1rem;}
@media(max-width:600px){.form-grid{grid-template-columns:1fr;}}
.form-group{display:flex;flex-direction:column;gap:.4rem;}
.form-label{font-size:.75rem;color:var(--txt2);}
.form-input,.form-select{background:rgba(255,255,255,.04);border:1px solid var(--border2);
  border-radius:var(--r2);padding:.55rem .8rem;color:var(--txt);font-size:.88rem;
  font-family:'Noto Sans KR',sans-serif;outline:none;width:100%;transition:border-color .2s;}
.form-input:focus,.form-select:focus{border-color:var(--accent);}
.form-select option{background:#1a2535;color:var(--txt);}

/* ── APPROVE CARD ── */
.approve-card{background:var(--card);border:1px solid var(--border2);border-radius:var(--r);
  padding:1.1rem;margin-bottom:.7rem;display:flex;align-items:center;gap:1rem;}
.ac-left{flex:1;}
.ac-student{font-weight:700;font-size:.9rem;display:flex;align-items:center;gap:.5rem;}
.ac-quest{font-size:.78rem;color:var(--txt2);margin-top:.2rem;}
.ac-rewards{display:flex;gap:.4rem;margin-top:.5rem;flex-wrap:wrap;}
.ac-tag{background:rgba(255,215,0,.1);border:1px solid rgba(255,215,0,.2);
  border-radius:20px;padding:.12rem .45rem;font-size:.7rem;color:var(--gold);}
.ac-right{display:flex;gap:.5rem;flex-shrink:0;}

/* ── STUDENT DETAIL MODAL ── */
.overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.72);z-index:200;
  align-items:center;justify-content:center;padding:1rem;backdrop-filter:blur(6px);}
.overlay.open{display:flex;}
.modal{background:linear-gradient(145deg,#1A2535,#243048);border:1px solid var(--border);
  border-radius:16px;padding:1.8rem;width:min(580px,100%);max-height:90vh;overflow-y:auto;
  box-shadow:0 30px 80px rgba(0,0,0,.6);animation:modalIn .25s ease;}
.modal::-webkit-scrollbar{width:4px;}
.modal::-webkit-scrollbar-thumb{background:rgba(255,255,255,.1);border-radius:2px;}
@keyframes modalIn{from{opacity:0;transform:scale(.95) translateY(8px)}to{opacity:1;transform:none}}
.modal-hd{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.4rem;}
.modal-title{font-size:1.1rem;font-weight:700;color:var(--accent);}
.modal-close{background:none;border:none;color:var(--txt3);font-size:1.4rem;cursor:pointer;}
.modal-section{margin-bottom:1.2rem;}
.ms-label{font-size:.72rem;color:var(--txt3);letter-spacing:.1em;text-transform:uppercase;
  margin-bottom:.6rem;padding-bottom:.4rem;border-bottom:1px solid var(--border2);}

/* ── ABILITY BARS (ADMIN) ── */
.ab-grid{display:grid;grid-template-columns:1fr 1fr;gap:.5rem;}
.ab-admin-row{display:flex;align-items:center;gap:.5rem;background:rgba(255,255,255,.03);
  border-radius:8px;padding:.5rem .7rem;}
.ab-admin-name{font-size:.75rem;width:35px;color:var(--txt2);}
.ab-admin-val{font-size:.8rem;font-weight:700;color:var(--accent);width:25px;text-align:right;}
.ab-admin-bar{flex:1;height:5px;background:rgba(255,255,255,.07);border-radius:3px;overflow:hidden;}
.ab-admin-fill{height:100%;border-radius:3px;background:linear-gradient(90deg,var(--accent),#5BA8F5);}
.ab-admin-input{width:50px;background:rgba(255,255,255,.06);border:1px solid var(--border);
  border-radius:6px;padding:.25rem .4rem;color:var(--txt);font-size:.8rem;text-align:center;
  font-family:'Noto Sans KR',sans-serif;}

/* ── QUEST BUILDER ── */
.qb-card{background:var(--card2);border:1px solid var(--border2);border-radius:var(--r);
  padding:1.2rem;margin-bottom:1rem;}
.qb-title{font-size:.9rem;font-weight:700;margin-bottom:.8rem;color:var(--accent);}

/* ── TOGGLE ── */
.toggle{position:relative;width:42px;height:22px;flex-shrink:0;}
.toggle input{opacity:0;width:0;height:0;}
.toggle-slider{position:absolute;inset:0;background:rgba(255,255,255,.1);border-radius:11px;cursor:pointer;transition:.3s;}
.toggle-slider::before{content:'';position:absolute;width:18px;height:18px;left:2px;bottom:2px;
  background:#fff;border-radius:50%;transition:.3s;}
.toggle input:checked + .toggle-slider{background:var(--emerald);}
.toggle input:checked + .toggle-slider::before{transform:translateX(20px);}

/* ── MONSTER MANAGER ── */
.mon-manage-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.6rem;}
@media(max-width:700px){.mon-manage-grid{grid-template-columns:repeat(2,1fr);}}
.mon-manage-card{background:var(--card2);border:1px solid var(--border2);border-radius:var(--r2);
  padding:.8rem;display:flex;align-items:center;gap:.6rem;}
.mmc-icon{font-size:1.5rem;}
.mmc-name{font-size:.8rem;font-weight:700;}
.mmc-lv{font-size:.68rem;color:var(--txt3);}
.mmc-right{margin-left:auto;font-size:.75rem;color:var(--gold);font-weight:700;}

/* ── NOTIFICATIONS ── */
.notif{position:fixed;top:1.2rem;right:1.2rem;z-index:9999;display:flex;flex-direction:column;gap:.5rem;}
.notif-item{background:#1E2E42;border-left:4px solid var(--emerald);border-radius:8px;
  padding:.7rem 1rem;font-size:.82rem;max-width:300px;
  animation:notifIn .3s ease,notifOut .3s 2.5s ease forwards;
  box-shadow:0 8px 30px rgba(0,0,0,.4);}
.notif-item.error{border-left-color:var(--red);}
.notif-item.gold{border-left-color:var(--gold);}
@keyframes notifIn{from{opacity:0;transform:translateX(20px)}to{opacity:1;transform:none}}
@keyframes notifOut{to{opacity:0;transform:translateX(20px)}}

/* ── SETTINGS ── */
.settings-grid{display:grid;grid-template-columns:1fr 1fr;gap:1rem;}
@media(max-width:600px){.settings-grid{grid-template-columns:1fr;}}
.settings-card{background:var(--card);border:1px solid var(--border2);border-radius:var(--r);padding:1.2rem;}
.sc-head{font-size:.88rem;font-weight:700;margin-bottom:1rem;color:var(--accent);}
.setting-row{display:flex;align-items:center;justify-content:space-between;
  padding:.6rem 0;border-bottom:1px solid var(--border2);}
.setting-row:last-child{border-bottom:none;}
.sr-label{font-size:.82rem;}
.sr-sub{font-size:.7rem;color:var(--txt3);margin-top:.1rem;}

/* BULK APPROVE */
.bulk-bar{background:rgba(255,215,0,.08);border:1px solid rgba(255,215,0,.2);
  border-radius:var(--r);padding:.8rem 1.2rem;margin-bottom:1rem;
  display:flex;align-items:center;gap:.8rem;}
.bulk-txt{flex:1;font-size:.82rem;color:var(--gold);}

/* RANK TABLE */
.rank-medal{font-size:1.1rem;}

.section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem;}
.sh-title{font-size:1rem;font-weight:700;}
.sh-sub{font-size:.75rem;color:var(--txt2);}

.text-muted-sm {
  font-size: 0.72rem;
  color: var(--txt3);
}

.text-muted-xs {
  font-size: 0.68rem;
  color: var(--txt3);
}

.text-muted-base {
  font-size: 0.75rem;
  color: var(--txt3);
}

.flex-1 {
  flex: 1;
}

.text-center {
  text-align: center;
}

.mb-1 {
  margin-bottom: 1rem;
}

.mb-08 {
  margin-bottom: 0.8rem;
}

.py-05 {
  padding: 0.5rem 0;
}

.text-muted-tiny {
  font-size: 0.7rem;
  color: var(--txt3);
}

.w-80 {
  width: 80px;
}

.fs-72 {
  font-size: 0.72rem;
}

.nowrap {
  white-space: nowrap;
}

/* ══ [NARROW-1] 좁은 화면: 사이드바를 서랍으로 ═══════════════════
   문제였던 것: admin.css 위쪽 @media 안의 `.sidebar{display:none}` 이
   바로 뒤에 오는 `.sidebar{display:flex}` 에 밀려 안 먹었다.
   미디어쿼리는 특수성을 올려주지 않는다 — 선택자 급이 같으면 **뒤에 오는 쪽이 이긴다**.
   그래서 1열로 접히기는 하는데 사이드바가 맨 위 한 칸을 통째로 차지해
   본문이 아래로 밀렸다(480px 에서 본문 시작 y=501px, 첫 화면에 한 줄도 안 보임).
   → 이 블록을 **파일 맨 끝**에 두어 순서로 이기게 한다. 새 규칙은 전부
     @media(max-width:768px) 안에만 둔다 — 넓은 화면 동작은 한 픽셀도 안 바뀐다.
   ══════════════════════════════════════════════════════════════ */
.nav-toggle{
  display:none;                       /* 넓은 화면에서는 없음 */
  align-items:center;justify-content:center;
  width:44px;height:44px;flex-shrink:0;      /* 터치 영역 44px */
  margin-right:.6rem;
  background:transparent;border:1px solid var(--border);border-radius:var(--r2);
  color:var(--txt);font-size:1.15rem;line-height:1;cursor:pointer;
  font-family:inherit;
}
.nav-toggle:hover{background:rgba(74,144,226,.08);}
.topbar-left{display:flex;align-items:center;min-width:0;}
.nav-backdrop{display:none;position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:999;}

@media(max-width:768px){
  .nav-toggle{display:flex;}
  /* 기본은 숨김. 햄버거를 누르면 .is-open 으로 왼쪽에서 나온다. */
  .sidebar{
    display:none;
    position:fixed;top:0;left:0;bottom:0;
    width:min(280px,86vw);
    z-index:1000;
    box-shadow:4px 0 24px rgba(0,0,0,.55);
  }
  .sidebar.is-open{display:flex;}
  .nav-backdrop.is-open{display:block;}
  /* 손가락으로 누를 수 있게 (P1 터치 영역 44px) */
  .nav-item{padding:.8rem 1.2rem;min-height:44px;}
  .sidebar-bottom .btn-sm{min-height:44px;}
}

/* ══ [TOUCH-44] 손가락으로 누를 때만 버튼을 키운다 ════════════════
   기준 44×44px. 교사는 노트북 마우스로도 쓰므로 전부 키우면 데스크톱이 뭉툭해진다.
   → @media (pointer: coarse) 안에서만 키운다. 마우스 환경은 한 픽셀도 안 바뀐다.
   ⚠️ 이 버튼들은 admin.js 에서 **인라인 style 로 padding 이 박혀 있어**
      CSS 의 padding 은 안 먹는다(예: admin.js 승급 카드의 승인·거절 버튼).
      min-height/min-width 는 인라인 padding 과 충돌하지 않으므로 그것만 쓴다.
   선례: 위쪽 [NARROW-1] 의 .sidebar-bottom .btn-sm{min-height:44px}
   ══════════════════════════════════════════════════════════════ */
@media (pointer: coarse){
  .btn-sm{min-height:44px;}
  /* ✕ 거절은 29×26 으로 가장 작은데, 누르면 되돌리기 어려워 오클릭 비용이 크다 */
  .btn-sm.danger{min-width:44px;}
  /* 사이드바 아래 "← 학생 화면으로" — 세로 17px 이라 padding 으로 키운다(인라인 padding 없음) */
  /* padding 만으로는 39px 에 그쳐 min-height 로 확실히 잡는다 */
  .sidebar-bottom a{display:block;padding:.7rem 0;min-height:44px;}
}
