:root{
  --bg:#0f1220; --panel:#181c2e; --panel2:#20243a; --line:#2c3150;
  --text:#e8eaf2; --muted:#9aa0bd; --accent:#5b8cff; --accent2:#7c5bff;
  --ok:#34d399; --bad:#f87171; --warn:#fbbf24; --radius:14px;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{background:radial-gradient(1200px 600px at 70% -10%, #1b2140 0%, var(--bg) 60%);
  color:var(--text);font-family:"Pretendard","Apple SD Gothic Neo","Segoe UI",system-ui,sans-serif;min-height:100vh}
h1,h2,h3{margin:0 0 .4em}
small{font-size:.8em}.muted{color:var(--muted)}.hint{display:block;color:var(--muted);margin-top:4px}
.hidden{display:none !important}

.topbar{display:flex;align-items:center;justify-content:space-between;padding:14px 24px;
  border-bottom:1px solid var(--line);background:rgba(15,18,32,.7);backdrop-filter:blur(8px);position:sticky;top:0;z-index:50}
.topbar h1{font-size:1.15rem;cursor:pointer;user-select:none}
.topbar nav{display:flex;align-items:center;gap:8px}
.nav-btn{background:transparent;border:1px solid var(--line);color:var(--text);padding:8px 16px;border-radius:10px;cursor:pointer;font-size:.9rem}
.nav-btn.active{background:var(--accent);border-color:var(--accent)}
.ai-badge{font-size:.74rem;color:var(--ok);border:1px solid #234;padding:4px 10px;border-radius:20px;background:#0d1a14}
.ai-badge.off{color:var(--warn);background:#1a160d}

.view{max-width:1100px;margin:0 auto;padding:24px}
/* 대시보드(점수 흐름 차트 + 시험 기록표)는 넓은 화면 공간을 채우도록 더 넓게 */
#view-dashboard{max-width:1500px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:22px;margin-bottom:22px}
.row{display:flex;align-items:center}.row.gap{gap:12px}.row.center{justify-content:center}
.row.end{justify-content:flex-end}.row.between{justify-content:space-between}.wrap{flex-wrap:wrap}

button{font-family:inherit;font-size:.92rem}
.primary{background:var(--accent);color:#fff;border:none;padding:10px 20px;border-radius:10px;cursor:pointer;font-weight:600}
.primary:hover{filter:brightness(1.08)}.primary.big{padding:14px 28px;font-size:1.05rem}
.ghost{background:transparent;border:1px solid var(--line);color:var(--text);padding:9px 16px;border-radius:10px;cursor:pointer}
.ghost:hover{border-color:var(--accent)}.ghost.small{padding:6px 12px;font-size:.82rem}
.ghost.danger{color:var(--bad);border-color:#5b2330}.block{display:block;width:100%;margin-top:10px}

.form-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-bottom:8px}
.upload-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px;margin:8px 0 18px}
label{display:flex;flex-direction:column;gap:6px;font-size:.86rem;color:var(--muted)}
input[type=text],input[type=number],select{background:var(--panel2);border:1px solid var(--line);color:var(--text);padding:10px 12px;border-radius:10px;font-size:.95rem}
.checkline{flex-direction:row;align-items:center;gap:8px;color:var(--text)}
.file-drop{background:var(--panel2);border:1px dashed var(--line);border-radius:12px;padding:14px;cursor:pointer;gap:8px}
.file-drop:hover{border-color:var(--accent)}.file-drop .ft{color:var(--text);font-weight:600}
.file-drop .ft em{color:var(--muted);font-weight:400;font-style:normal;font-size:.8em}
.file-drop input[type=file]{font-size:.8rem;color:var(--muted)}.file-drop .fname{color:var(--accent);font-size:.8rem}
.filters{display:flex;gap:12px}

.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:14px;margin:8px 0 20px}
.stat{background:var(--panel2);border:1px solid var(--line);border-radius:12px;padding:16px;text-align:center}
.stat .v{font-size:1.7rem;font-weight:700}.stat .l{color:var(--muted);font-size:.8rem;margin-top:4px}
.chart-wrap{background:var(--panel2);border-radius:12px;padding:14px}
.chart-scroll{overflow-x:auto;overflow-y:hidden}           /* 기록이 많으면 최근 1주일만 보이고 좌우 스크롤 */
.chart-scroll canvas{display:block}

.history{overflow-x:auto}                                   /* 칸이 좁아지면 눌러 겹치지 말고 가로 스크롤 */
.history table{width:100%;border-collapse:collapse;font-size:.9rem}
.history th,.history td{padding:10px 10px;border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
.history td.exam-name{white-space:normal;min-width:160px}    /* 시험명만 줄바꿈 허용 */
.history th{color:var(--muted);font-weight:600}
.score-pill{padding:3px 10px;border-radius:20px;font-weight:700}
.del-btn{background:transparent;border:none;color:var(--bad);cursor:pointer;font-size:1rem}

.key-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:10px;margin-top:12px}
.key-cell{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:8px;display:flex;gap:6px;align-items:center}
.key-cell .qn{color:var(--muted);width:24px;font-weight:700}
.key-cell select{padding:6px;font-size:.78rem}.key-cell input{width:100%;padding:6px 8px}.key-cell .pts{width:44px;flex:0 0 44px}

/* ---- 시험 진행 (한 문제씩) ---- */
.exam-top{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.timer-box{display:flex;align-items:center;gap:12px;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:10px 18px}
.timer-label{color:var(--muted);font-size:.78rem}
.timer{font-size:2rem;font-weight:800;letter-spacing:2px;font-variant-numeric:tabular-nums}
.timer-box.warn .timer{color:var(--warn)}
.timer-box.danger .timer{color:var(--bad);animation:pulse 1s infinite}
@keyframes pulse{50%{opacity:.5}}
.exam-actions{display:flex;gap:8px;flex-wrap:wrap}

.qnav{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px}
.qchip{width:34px;height:34px;border-radius:9px;border:1px solid var(--line);background:var(--panel2);color:var(--text);cursor:pointer;font-size:.82rem}
.qchip.done{border-color:var(--ok);color:var(--ok)}
.qchip.cur{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:700}

.qstage{display:grid;grid-template-columns:1fr 340px;gap:18px;align-items:start}
.qimage{background:#0b0d18;border:1px solid var(--line);border-radius:12px;padding:12px;text-align:center;min-height:300px;max-height:72vh;overflow:auto}
.qimage canvas{max-width:100%;border-radius:6px;background:#fff}
.qimage .loading,.qimage .nocrop,.nocrop{color:var(--muted);padding:30px;font-size:.9rem}
.qanswer{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px;position:sticky;top:90px}
.qhead{font-weight:700;margin-bottom:12px}
.qtype{font-size:.75rem;color:var(--accent2);border:1px solid var(--line);padding:2px 8px;border-radius:20px;margin-left:6px}
.qnav-btns{display:flex;gap:8px;margin-top:14px}.qnav-btns button{flex:1}

.mc-row{display:flex;gap:10px;justify-content:center}
.opt{width:48px;height:48px;border-radius:50%;border:1px solid var(--line);background:var(--panel2);color:var(--text);cursor:pointer;font-size:1.2rem}
.opt.sel{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:700}
.mc-hint{margin:10px 0 0;text-align:center;font-size:.85rem;color:var(--muted)}
.inline-edit{background:var(--panel2);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:4px 6px;font-size:.9rem;max-width:9rem}
.inline-edit:focus{outline:2px solid var(--accent)}

.omr{display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;padding:8px 0}
.omr .fixed{font-size:1.6rem;font-weight:700;color:var(--muted)}.omr .unit{font-size:1.1rem}
.omr .fixed.sign{font-size:2.8rem;font-weight:900;color:var(--text);line-height:1;margin:0 2px}
.boxline{display:flex;gap:6px;justify-content:center}
.dbox{width:42px;height:52px;text-align:center;font-size:1.5rem;border:2px solid var(--line);border-radius:8px;background:var(--panel2);color:var(--text)}
.dbox:focus{border-color:var(--accent);outline:none}
.frac{display:flex;flex-direction:column;align-items:center;gap:4px}
.fbar{height:2px;width:100%;background:var(--text);margin:2px 0}
.short-free{width:100%;padding:12px;font-size:1.1rem;text-align:center}
.keypad{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;margin-top:14px}
.keypad button{padding:12px 0;border:1px solid var(--line);background:var(--panel2);color:var(--text);border-radius:8px;cursor:pointer;font-size:1.05rem}
.keypad button:active{background:var(--accent)}.keypad .bk{grid-column:span 1;color:var(--bad)}

.result-summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:18px}
.result-detail{display:grid;grid-template-columns:repeat(auto-fill,minmax(74px,1fr));gap:8px}
.rd-cell{background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:8px;text-align:center;font-size:.78rem}
.rd-cell.ok{border-color:var(--ok)}.rd-cell.bad{border-color:var(--bad)}
.rd-cell .qn{color:var(--muted);font-size:.72rem}.rd-cell .mark{font-weight:700;font-size:1.1rem}
.rd-cell.ok .mark{color:var(--ok)}.rd-cell.bad .mark{color:var(--bad)}
.exam-pdf canvas.pdfpage{max-width:100%;display:block;margin:0 auto 12px;border-radius:6px}
.loading{color:var(--muted);padding:20px}

/* ---- 모달 ---- */
.modal{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:100;padding:20px}
.modal-box{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:22px;max-width:560px;width:100%;max-height:88vh;overflow:auto}
.photo-preview{display:flex;gap:8px;flex-wrap:wrap;margin:12px 0}
.photo-preview img{max-width:160px;max-height:200px;border-radius:8px;border:1px solid var(--line)}

/* ---- 사용자 배지 / 로그인 ---- */
#userBadge{color:var(--accent)}
input[type=password]{background:var(--panel2);border:1px solid var(--line);color:var(--text);padding:10px 12px;border-radius:10px;font-size:.95rem}

/* ---- 시험 보관함 ---- */
.lib-folders{margin-top:14px;display:flex;flex-direction:column;gap:12px}
.lib-folder{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:8px 14px 14px}
.lib-folder>summary{cursor:pointer;font-weight:700;font-size:1.05rem;padding:8px 4px;list-style:none;user-select:none}
.lib-folder>summary::-webkit-details-marker{display:none}
.lib-folder>summary::before{content:"▸";display:inline-block;margin-right:8px;color:var(--muted);transition:transform .15s}
.lib-folder[open]>summary::before{transform:rotate(90deg)}
.lib-folder>summary .muted{font-weight:400}
/* 보관함: 1행 1시험 리스트 */
.lib-list{display:flex;flex-direction:column;gap:8px;margin-top:14px}
.lib-row{display:flex;align-items:center;gap:12px;background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:10px 14px}
.lib-row[draggable=true]{cursor:grab}
.lib-row.dragging{opacity:.45}
.lib-row.drag-top{box-shadow:inset 0 3px 0 0 var(--accent)}
.lib-row.drag-bot{box-shadow:inset 0 -3px 0 0 var(--accent)}
.drag-grip{flex:0 0 auto;color:var(--muted);font-size:1.1rem;line-height:1;cursor:grab;user-select:none}
.lib-row .lib-acts button,.lib-row .ord-btn{cursor:pointer}
.lib-seq{flex:0 0 auto;min-width:44px;text-align:center;font-weight:700;font-size:.85rem;color:var(--accent);background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:6px 8px}
.lib-move{flex:0 0 auto;display:flex;flex-direction:column;gap:3px}
.ord-btn{width:26px;height:18px;line-height:1;padding:0;font-size:.68rem;background:var(--panel);border:1px solid var(--line);color:var(--text);border-radius:6px;cursor:pointer}
.ord-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}
.ord-btn:disabled{opacity:.3;cursor:default}
.lib-main{flex:1 1 auto;min-width:0}
.lib-main .lib-name{font-weight:700;font-size:1.02rem;margin-bottom:2px}
.lib-meta{font-size:.82rem;display:flex;align-items:center;flex-wrap:wrap;gap:8px}
.lib-acts{flex:0 0 auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
@media(max-width:640px){
  .lib-row{flex-wrap:wrap}
  .lib-acts{width:100%;justify-content:flex-start;margin-top:6px}
}

.lib-badge{display:inline-block;font-size:.72rem;padding:2px 8px;border-radius:20px;margin-top:6px}
.lib-meta .lib-badge{margin-top:0}
.lib-badge.done{color:var(--ok);background:#0d1a14;border:1px solid #234}
.lib-badge.todo{color:var(--warn);background:#1a160d;border:1px solid #5b4a23}

/* ---- 노션 공유 ---- */
#shareUrl{background:var(--panel2);border:1px solid var(--line);color:var(--accent);padding:10px 12px;border-radius:10px;font-size:.85rem}

/* ---- 재단 에디터 ---- */
#view-editor{max-width:1200px}
.editor-bar{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:10px 12px;margin-bottom:8px}
.editor-bar input[type=number]{padding:6px 8px}
.ed-sep{width:1px;height:20px;background:var(--line)}
.ed-typetoggle{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.ed-typetoggle .ghost{border:none;border-radius:0}
.ed-typetoggle .ghost.active{background:var(--accent);color:#fff}
.ed-help{font-size:.8rem;margin:0 0 12px}
.editor-body{display:grid;grid-template-columns:1fr 320px;gap:16px;align-items:start}
.editor-pages{display:flex;flex-direction:column;gap:12px}
.ed-page{position:relative;user-select:none;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fff;line-height:0}
.ed-page img{width:100%;display:block;cursor:crosshair}
.ed-box{position:absolute;border:2px solid var(--accent);background:rgba(91,140,255,.15);cursor:move}
.ed-box.sel{border-color:#f87171;background:rgba(248,113,113,.15);box-shadow:0 0 0 2px rgba(248,113,113,.4)}
.ed-qn{position:absolute;top:0;left:0;background:var(--accent);color:#fff;font-size:10px;padding:0 4px;border-radius:0 0 4px 0}
.ed-box.sel .ed-qn{background:#f87171}
.ed-handle{position:absolute;right:-7px;bottom:-7px;width:14px;height:14px;background:#fff;border:2px solid #f87171;border-radius:3px;cursor:se-resize}
.ed-temp{position:absolute;border:2px dashed var(--accent);background:rgba(91,140,255,.1);pointer-events:none}
.editor-panel{position:sticky;top:64px}
.ed-panel-head{font-weight:600;margin-bottom:8px;font-size:.9rem}
.ed-list{display:flex;flex-direction:column;gap:6px;max-height:75vh;overflow:auto}
.ed-row{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:8px;padding:6px;background:var(--panel2);cursor:pointer}
.ed-row.sel{border-color:#f87171}
.ed-row canvas{border-radius:4px;border:1px solid var(--line);flex:0 0 auto}
.primary.small{padding:6px 12px;font-size:.82rem}
.code-pill{font-family:ui-monospace,monospace;font-weight:700;letter-spacing:1px;background:var(--panel2);border:1px solid var(--line);color:var(--accent);padding:2px 8px;border-radius:6px}
.wpill{display:inline-block;background:var(--panel2);border:1px solid var(--line);border-radius:20px;padding:3px 12px;margin:3px 4px 0 0;font-size:.84rem}
.wpill b{color:var(--bad)}
.wq{display:inline-block;background:#3a1d24;color:#fda4af;border:1px solid #5b2330;border-radius:5px;padding:1px 7px;margin:1px;font-size:.82rem}
.stu-rescard{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:12px;margin-bottom:8px}
.ed-row-meta{flex:1;min-width:0;font-size:.82rem}
.ed-qnum{font-weight:700;font-size:.8rem;width:28px;flex:0 0 auto;text-align:center;color:var(--muted)}
.ed-mini{flex:0 0 auto;padding:4px;font-size:.78rem}
.ed-ans{flex:1;min-width:0;padding:5px 8px;font-size:.85rem}
.ed-docs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:4px}

@media(max-width:820px){
  .form-grid,.upload-grid,.stat-grid,.result-summary{grid-template-columns:1fr 1fr}
  .qstage{grid-template-columns:1fr}.qanswer{position:static}
  .editor-body{grid-template-columns:1fr}.editor-panel{position:static}
}

/* 학생·반 다중 배정 — 배정된 반 칩 + '＋ 반' 드롭다운 (반이 많아도 컬럼 안 넘침) */
.cls-cell{display:flex;flex-wrap:wrap;align-items:center;gap:5px}
.cls-chip{display:inline-flex;align-items:center;gap:4px;font-size:.82rem;background:var(--panel2);border:1px solid var(--line);border-radius:999px;padding:2px 4px 2px 9px;white-space:nowrap}
.cls-chip .cls-x{background:transparent;border:none;color:var(--muted);cursor:pointer;font-size:.78rem;line-height:1;padding:0 3px;border-radius:50%}
.cls-chip .cls-x:hover{color:var(--bad);background:rgba(255,255,255,.06)}
.cls-add{background:var(--panel2);color:var(--muted);border:1px dashed var(--line);border-radius:999px;padding:2px 6px;font-size:.8rem;cursor:pointer;max-width:7rem}
.cls-add:hover{border-color:var(--accent)}
/* 반별 노션 링크: 주소가 표에 항상 보이는 읽기전용 칸 + 복사/폐기 */
.cls-link{display:flex;align-items:center;gap:5px}
.cls-link-url{flex:1;min-width:180px;font-size:.78rem;color:var(--muted);background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;font-family:ui-monospace,Menlo,Consolas,monospace}
.cls-link-url:focus{color:var(--text);border-color:var(--accent);outline:none}
