:root{--bg:#f6f7f9;--card:#fff;--fg:#1d2330;--muted:#6b7385;--line:#dfe3ea;--pri:#2557d6;--pri-fg:#fff;--danger:#c93434;--ok:#1f8a4c;--warn:#b7791f}
:root.dark{color-scheme:dark;--bg:#141820;--card:#1d232e;--fg:#e8ebf2;--muted:#9aa3b5;--line:#313a4a;--pri:#5b8cff;--pri-fg:#0b1020;--danger:#ff7676;--ok:#4cc88a;--warn:#e5b25d}
*{box-sizing:border-box}
:root.theme-anim *:not(.theme-pill):not(.theme-pill *){transition:background-color .3s,color .3s,border-color .3s}
body{margin:0;background:linear-gradient(var(--q-tint,transparent),var(--q-tint,transparent)),var(--bg);color:var(--fg);font:15px/1.6 -apple-system,"Apple SD Gothic Neo","Malgun Gothic",sans-serif}
a{color:var(--pri)}
header.top{background:var(--card);border-bottom:1px solid var(--line);padding:10px 16px;display:flex;gap:16px;align-items:center;flex-wrap:nowrap}  /* 폭을 줄여도 한 줄 유지 */
header.top .brand{display:flex;flex-direction:column;line-height:1.2;color:var(--fg);text-decoration:none;flex:0 3 auto;min-width:64px}
header.top .brand-title{font-size:25.5px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}   /* 기존 15px 의 1.7배 */
header.top .brand-sub{font-size:10.8px;font-weight:400;color:var(--sub);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}     /* 13.5px 의 80%, 일반체, 연한 회색 */
header.top nav{display:flex;gap:4px;flex:1 1 auto;min-width:0;flex-wrap:nowrap;align-items:center;padding:3px 2px;
  overflow-x:auto;scrollbar-width:none}   /* 매우 좁으면 줄바꿈 대신 가로 스크롤 */
header.top nav::-webkit-scrollbar{display:none}
.topnav a{flex:0 0 auto;white-space:nowrap;display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:999px;color:var(--muted);font-size:14px;font-weight:600;
  text-decoration:none;border:1px solid transparent;transition:background .15s,color .15s,border-color .15s}
.topnav a .ni{font-size:15px;line-height:1}
.topnav a:hover{background:var(--bg);color:var(--fg);border-color:var(--line)}
.topnav a:focus-visible{outline:2px solid var(--pri);outline-offset:2px}
.topnav a.on{background:var(--pri);color:var(--pri-fg);border-color:var(--pri)}
.topnav .nav-sep{width:1px;height:20px;background:var(--line);margin:0 8px}
@media(prefers-reduced-motion:reduce){.topnav a{transition:none}}
@media(max-width:640px){
  header.top{gap:10px;padding:8px 10px}
  header.top nav{flex:1 0 auto}   /* 좁을 때 메뉴(아이콘)는 줄이지 않고 제목·사용자 이름이 먼저 줄어든다 */
  .topnav a{padding:7px 10px}.topnav .nav-sep{margin:0 2px}
  /* 좁은 화면: 메뉴는 아이콘만 (글자는 스크린 리더용으로 남기고 마우스 오버 시 title 로 표시) */
  .topnav a .nl{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  .topnav a{position:relative}
  .topnav a .ni{font-size:18px}
}
header.top form{display:inline;margin:0}
header.top .spacer{flex:1}
header.top .logout{flex:0 0 auto}
/* 로그인한 사용자 정보: 창 하단 중앙에 작게. 하단에 고정되는 다른 요소(도화선, 채점 저장 바)는 이 줄 위에 놓는다 */
body.has-viewer{padding-bottom:26px}
footer.viewer{position:fixed;left:0;right:0;bottom:0;height:26px;z-index:8;display:flex;align-items:center;justify-content:center;
  padding:0 12px;font-size:12px;line-height:1;color:var(--muted);background:var(--card);border-top:1px solid var(--line);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
body.has-viewer #fuse{bottom:26px}
body.has-viewer .stickybar{bottom:26px}
main{max-width:1000px;margin:0 auto;padding:20px 16px 60px}
h1{font-size:22px;margin:0 0 16px}h2{font-size:17px;margin:24px 0 10px}
.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:16px;margin-bottom:16px}
table{width:100%;border-collapse:collapse;background:var(--card);border:1px solid var(--line);border-radius:8px}
th,td{padding:8px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
th{font-size:13px;color:var(--muted);font-weight:600}
.table-wrap{overflow-x:auto}
input[type=text],input[type=search],input[type=email],input[type=number],input[type=password],input[type=datetime-local],select,textarea{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:6px;background:var(--bg);color:var(--fg);font:inherit}
textarea{resize:vertical}
label{display:block;font-weight:600;margin:12px 0 4px}
.help,.muted{color:var(--muted);font-size:13px}
.btn,button{display:inline-block;padding:8px 14px;border-radius:6px;border:1px solid var(--line);background:var(--card);color:var(--fg);font:inherit;cursor:pointer;text-decoration:none}
.btn.pri,button.pri{background:var(--pri);color:var(--pri-fg);border-color:var(--pri)}
.btn.danger,button.danger{color:var(--danger);border-color:var(--danger)}
.btn.sm,button.sm{padding:3px 9px;font-size:13px}
.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}
.stat{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:12px}
.stat b{display:block;font-size:22px}
.msg{padding:10px 14px;border-radius:8px;margin-bottom:10px;border:1px solid var(--line);background:var(--card)}
.msg.error{border-color:var(--danger);color:var(--danger)}.msg.success{border-color:var(--ok);color:var(--ok)}.msg.warning{border-color:var(--warn);color:var(--warn)}
.tag{display:inline-block;padding:1px 8px;border-radius:99px;font-size:12px;border:1px solid var(--line);color:var(--muted)}
.tag.ok{color:var(--ok);border-color:var(--ok)}.tag.bad{color:var(--danger);border-color:var(--danger)}.tag.warn{color:var(--warn);border-color:var(--warn)}
.q{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:16px;margin-bottom:14px}
.q .qtext{white-space:pre-wrap;font-weight:600;margin-bottom:10px}
.opt{display:flex;gap:8px;align-items:flex-start;padding:6px 4px;font-weight:400;margin:0}
.opt input{margin-top:5px}
.opt.right{color:var(--ok);font-weight:600}.opt.wrong{color:var(--danger)}
.me{background:rgba(37,87,214,.12)}
.sticky{position:sticky;top:0;z-index:5;background:var(--card);border-bottom:1px solid var(--line);padding:10px 16px;display:flex;gap:14px;align-items:center;flex-wrap:wrap}
#timer{display:inline-block;text-align:left;font-weight:700;font-variant-numeric:tabular-nums}
#timer.low{color:var(--danger)}
.pre{white-space:pre-wrap}

/* 응시 화면: 한 번에 한 문제, 좌우 이전/다음 버튼, 문제 입력란은 항상 가운데 */
.stage{display:grid;grid-template-columns:96px minmax(0,1fr) 96px;gap:12px;align-items:center;min-height:calc(100vh - 190px)}
.deck .q{margin:0}
.deck .q[hidden]{display:none}
.nav{height:64px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:0;padding:6px}
.nav .arrow{font-size:26px;line-height:1}.nav .lbl{font-size:13px}
@media(max-width:640px){.stage{grid-template-columns:44px minmax(0,1fr) 44px;gap:6px}.nav .lbl{display:none}}

/* 도화선: 남은 시간 60초 미만일 때 화면 아래에 표시 */
body.fuse-on main{padding-bottom:90px}
#fuse{position:fixed;left:0;right:0;bottom:0;height:56px;background:var(--card);border-top:1px solid var(--line);z-index:9}
#fuse[hidden]{display:none}
#fuse .bomb{position:absolute;left:12px;top:50%;transform:translateY(-52%);font-size:26px;line-height:1}
#fuse .track{position:absolute;left:52px;right:24px;top:50%;height:0;border-top:2px dashed var(--line);transform:translateY(-1px)}
#fuse .rope{position:absolute;left:0;top:-3px;height:6px;border-radius:3px;
  background:repeating-linear-gradient(115deg,#8a6a3b 0 5px,#5e4524 5px 9px);box-shadow:0 1px 0 rgba(0,0,0,.25)}
#fuse .spark{position:absolute;top:0;width:20px;height:20px;margin:-10px 0 0 -10px;border-radius:50%;
  background:radial-gradient(circle,#fff 0 18%,#ffe27a 38%,#ff8a1e 62%,rgba(255,80,0,0) 72%);
  box-shadow:0 0 12px 5px rgba(255,140,0,.75),0 0 26px 10px rgba(255,70,0,.35);animation:flicker .11s ease-in-out infinite alternate}
#fuse .spark::before,#fuse .spark::after{content:"";position:absolute;left:50%;top:50%;width:4px;height:4px;border-radius:50%;background:#ffd24a;
  animation:fly .5s ease-out infinite}
#fuse .spark::after{background:#ff9a2e;animation-duration:.37s;animation-delay:.15s}
@keyframes flicker{from{transform:scale(.8) rotate(0);opacity:.85}to{transform:scale(1.25) rotate(25deg);opacity:1}}
@keyframes fly{0%{transform:translate(0,0);opacity:1}100%{transform:translate(14px,-26px);opacity:0}}
@media(prefers-reduced-motion:reduce){#fuse .spark,#fuse .spark::before,#fuse .spark::after{animation:none}}

/* ===== 통계·결과 시각화 (한 가지 파랑 계열 막대 + 아이콘/글자로 상태 표기) ===== */
:root{--viz-1:#2a78d6;--viz-track:#cde2fb;--viz-range:#9ec5f4;--viz-me:#eb6834;
  --st-full:#0ca30c;--st-partial:#fab219;--st-zero:#d03b3b;--st-pending:#8a93a6}
:root.dark{--viz-1:#3987e5;--viz-track:#104281;--viz-range:#1c5cab;--viz-me:#d95926}
.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:16px}
.tile{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px 16px}
.tile .lbl{color:var(--muted);font-size:13px}
.tile .val{font-size:26px;font-weight:700;line-height:1.25}
.tile .val small{font-size:15px;font-weight:500;color:var(--muted)}
.tile .sub{font-size:13px;color:var(--muted)}
.tile.hero{grid-column:span 2}
.tile.hero .val{font-size:48px;line-height:1.1}
@media(max-width:520px){.tile.hero{grid-column:1/-1}}
.tile .val{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:8px}.tile .val small{white-space:nowrap}
.panel{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:16px 18px;margin-bottom:16px}
.panel h3{margin:0 0 4px;font-size:16px}
.panel .desc{color:var(--muted);font-size:13px;margin:0 0 14px}
/* 점수 분포 스케일 */
.scale{position:relative;height:16px;margin:10px 8px 6px;background:var(--viz-track);border-radius:8px}
.scale-range{position:absolute;top:0;bottom:0;background:var(--viz-range);border-radius:4px}
.scale-avg{position:absolute;top:-6px;bottom:-6px;width:2px;margin-left:-1px;background:var(--fg)}
.scale-me{position:absolute;top:50%;width:20px;height:20px;margin:-10px 0 0 -10px;border-radius:50%;background:var(--viz-me);box-shadow:0 0 0 3px var(--card)}
.scale-axis{display:flex;justify-content:space-between;margin:0 8px;color:var(--muted);font-size:12px;font-variant-numeric:tabular-nums}
.legend{display:flex;gap:18px;flex-wrap:wrap;font-size:13px;color:var(--muted);margin-top:12px}
.legend .k{display:inline-block;vertical-align:middle;margin-right:6px}
.k.range{width:22px;height:10px;background:var(--viz-range);border-radius:3px}
.k.avg{width:2px;height:16px;background:var(--fg)}
.k.me{width:12px;height:12px;border-radius:50%;background:var(--viz-me)}
/* 득점률 막대 목록 */
.topq{list-style:none;margin:0;padding:0;display:grid;gap:16px}
.topq li{display:grid;grid-template-columns:46px minmax(0,1fr);gap:12px;align-items:start}
.qno{font-weight:700;font-size:13px;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:2px 0;text-align:center}
.qtext2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-weight:500;line-height:1.45}
.bar-row{display:flex;align-items:center;gap:10px;margin-top:6px}
.bar-track{flex:1;height:12px;background:var(--viz-track);border-radius:0 4px 4px 0;overflow:hidden}
.bar-fill{height:100%;background:var(--viz-1);border-radius:0 4px 4px 0}
.bar-val{min-width:56px;text-align:right;font-weight:700;font-variant-numeric:tabular-nums}
.mine{font-size:13px;color:var(--muted);margin-top:2px}
/* 순위표 */
table.rank td.num,table.rank th.num{width:64px;text-align:center;font-variant-numeric:tabular-nums}
table.rank td.rank-top{font-weight:800;color:var(--viz-1)}
table.rank td a.name-link{color:inherit;text-decoration:none}
table.rank .bar-row{margin:0}table.rank .bar-track{height:10px}
table.rank td.sc{min-width:220px}
/* 내 답안 카드 */
.q.st{border-left:5px solid var(--st)}
.st-full{--st:var(--st-full)}.st-partial{--st:var(--st-partial)}.st-zero{--st:var(--st-zero)}.st-pending{--st:var(--st-pending)}
.ans-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;margin-bottom:10px}
.ans-head .qtext{margin:0}
.pill{white-space:nowrap;font-size:13px;font-weight:600;border:1px solid var(--line);border-radius:99px;padding:2px 12px;background:var(--bg)}
.pill .ic{color:var(--st);font-weight:800;margin-right:4px}
.opt2{display:flex;gap:8px;align-items:baseline;padding:6px 10px;border-radius:6px;margin-bottom:4px;border:1px solid transparent}
.opt2.picked{background:var(--bg);border-color:var(--line)}
.opt2 .note{margin-left:auto;font-size:12px;font-weight:600;white-space:nowrap;color:var(--muted)}
.opt2 .note .ic{margin-right:3px;font-weight:800}
.opt2.ok .note .ic{color:var(--st-full)}.opt2.no .note .ic{color:var(--st-zero)}

/* ===== 채점 화면 ===== */
.tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin:0 0 18px}
.tabs a{padding:9px 16px;text-decoration:none;color:var(--muted);border:1px solid transparent;border-bottom:0;border-radius:8px 8px 0 0;font-weight:600}
.tabs a.on{color:var(--fg);background:var(--card);border-color:var(--line);margin-bottom:-1px}
.gcard{background:var(--card);border:1px solid var(--line);border-left:5px solid var(--st-pending);border-radius:10px;padding:14px 16px;margin-bottom:12px}
.gcard.done{border-left-color:var(--st-full)}
.gcard .who{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.gcard .ans{white-space:pre-wrap;background:var(--bg);border:1px solid var(--line);border-radius:8px;padding:10px 12px;margin-bottom:10px;max-height:340px;overflow:auto}
.gcard .inputs{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.gcard .inputs input[type=number]{width:96px}
.gcard .inputs input[type=text]{flex:1;min-width:160px}
.stickybar{position:sticky;bottom:0;background:var(--card);border-top:1px solid var(--line);padding:10px 0;margin-top:8px;display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.progress{height:10px;background:var(--viz-track);border-radius:0 5px 5px 0;overflow:hidden;min-width:120px}
.progress>i{display:block;height:100%;background:var(--viz-1)}

/* ===== 시험 관리 홈: 5개 이동 카드 ===== */
.navcards{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px;margin:18px 0}
.navcard{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:18px 16px 16px;background:var(--card);
  border:1px solid var(--line);border-radius:14px;text-decoration:none;color:var(--fg);transition:transform .15s,box-shadow .15s,border-color .15s}
.navcard:hover,.navcard:focus-visible{border-color:var(--pri);transform:translateY(-3px);box-shadow:0 8px 20px rgba(0,0,0,.10);outline:none}
.navcard .ico{font-size:30px;line-height:1;margin-bottom:8px}
.navcard .title{font-size:19px;font-weight:800;letter-spacing:-.01em}
.navcard .sub{font-size:12.5px;color:var(--muted);line-height:1.4}
.navcard .badge{margin-top:8px;font-size:12px;font-weight:700;padding:2px 10px;border-radius:99px;border:1px solid var(--danger);color:var(--danger)}
@media(prefers-reduced-motion:reduce){.navcard{transition:none}.navcard:hover{transform:none}}
.navcard .sub .nw{white-space:nowrap}.navcard .sub b{color:var(--fg);font-weight:600}

[hidden]{display:none!important}

/* 사이트 부제목용 연한 회색 */
:root{--sub:#8f97a6}
:root.dark{--sub:#7f889b}

/* 목록 하단 중앙의 동작 버튼 (예: 시험 생성) */
.list-actions{display:flex;justify-content:center;margin:24px 0 8px}

/* 제목 오른쪽에 바로 붙는 동작 버튼 (예: 시험개요 수정) */
.title-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:16px}
.title-row h1{margin:0}

/* ===== 문제 이미지 ===== */
.qimgs{display:flex;flex-direction:column;align-items:flex-start;gap:12px;margin:10px 0 14px}
.qimg{margin:0;max-width:100%}
.qimg img{display:block;max-width:100%;max-height:50vh;width:auto;height:auto;object-fit:contain;background:#fff;border:1px solid var(--line);border-radius:8px;cursor:zoom-in}
.qimg figcaption{margin-top:4px;font-size:13px;color:var(--muted)}
.qimgs.thumb{flex-direction:row;flex-wrap:wrap}
.qimgs.thumb img{max-height:96px;max-width:170px}
.lightbox{position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,.82);display:flex;align-items:center;justify-content:center;padding:24px;cursor:zoom-out}
.lightbox img{max-width:96vw;max-height:92vh;object-fit:contain;background:#fff;border-radius:6px;cursor:default}
.lightbox-close{position:fixed;top:14px;right:14px;background:rgba(255,255,255,.95);color:#111;border-color:transparent;font-weight:600}
/* 문제 편집: 이미지 올리기 */
.dropzone{border:2px dashed var(--line);border-radius:10px;padding:16px;text-align:center;color:var(--muted);margin:8px 0}
.dropzone.over,.dropzone:focus-visible{border-color:var(--pri);background:var(--bg);outline:none}
.img-existing{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:12px;margin:8px 0}
.img-card{border:1px solid var(--line);border-radius:10px;padding:8px;display:flex;flex-direction:column;gap:6px;background:var(--bg)}
.img-card img{width:100%;height:120px;object-fit:contain;background:#fff;border-radius:6px}
.img-card input[type=text]{font-size:13px;padding:5px 8px}

/* 문제 관리 목록: 이미지가 있는 문제 카드. 이미지는 카드 왼쪽, 객관식 보기·정답은 이미지 오른쪽 */
.qimgs.thumb.big img{max-height:240px;max-width:425px}   /* 기본 썸네일(96×170px)의 2.5배 */
.qimgs.big{flex-direction:column;align-items:flex-start}
.qmedia{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:24px;margin:8px 0}
.qmedia-img{grid-column:1;display:flex;justify-content:flex-start}
.qmedia-img .qimgs{margin:0}
.qmedia-choices{grid-column:2;min-width:0}
@media(max-width:760px){
  .qmedia{grid-template-columns:1fr}
  .qmedia-img,.qmedia-choices{grid-column:1}
}
/* 응시자 화면(응시·제출 확인·결과): 이미지는 문제 카드의 가로 가운데 */
.qimgs.center{align-items:center}
.qimgs.center.thumb{justify-content:center}
.qimgs.center figcaption{text-align:center}
.qimgs.center .qimg{display:flex;flex-direction:column;align-items:center}

/* 복수 정답 안내: 마지막으로 고른 보기 오른쪽 */
.need-more{margin-left:12px;font-size:13px;font-weight:600;color:var(--warn);white-space:nowrap}
.opt.has-tip{flex-wrap:wrap}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.drop-note{margin-top:10px;padding:8px 12px;border:1px solid var(--warn);border-radius:8px;font-size:13px;color:var(--warn)}
.drop-note[hidden]{display:none}

/* 응시 화면 상단 안내 문구: 가로 가운데 정렬 */
.take-notice{text-align:center}

/* 응시 화면: 문제 카드 하단 중앙의 '현재 문제 / 전체 문제' */
.qcount{margin-top:18px;text-align:center;font-size:13px;color:var(--muted);font-variant-numeric:tabular-nums}

/* 토스트 팝업 (응시 화면): 상단 바 아래 가운데에 잠깐 표시 */
.toast{position:fixed;top:78px;left:50%;transform:translateX(-50%);z-index:60;width:max-content;max-width:min(92vw,620px);word-break:keep-all;padding:11px 18px;
  border-radius:10px;background:var(--fg);color:var(--card);font-size:14px;line-height:1.45;text-align:center;
  box-shadow:0 10px 28px rgba(0,0,0,.28);animation:toast-in .16s ease-out}
@keyframes toast-in{from{opacity:0;transform:translate(-50%,-6px)}to{opacity:1;transform:translate(-50%,0)}}
@media(prefers-reduced-motion:reduce){.toast{animation:none}}

/* 글자수 제한이 있는 주관식: 글자수 표시는 입력상자 안쪽 우측 하단에 겹쳐서 표시 */
.ta-wrap{position:relative}
.ta-wrap textarea{display:block}   /* 인라인이면 아래에 글줄 여백이 생겨 글자수 표시가 상자 테두리에 붙는다 */
.ta-wrap.has-counter textarea{padding-bottom:32px}
.ta-wrap .counter{position:absolute;right:15px;bottom:9px;padding:1px 8px;border-radius:6px;background:var(--bg);
  font-size:12px;line-height:1.5;color:var(--muted);font-variant-numeric:tabular-nums;pointer-events:none;white-space:nowrap}

/* 응시 화면 상단 바의 시험명: 누르면 시험 안내(입장) 화면으로 */
.sticky .sticky-title{color:var(--fg);text-decoration:none}
.sticky .sticky-title:hover,.sticky .sticky-title:focus-visible{text-decoration:underline}

/* ===== 시험 안내(입장) 화면 ===== */
.exam-info{display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:12px;margin:16px 0 10px}
.exam-info .tile .lbl{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.kv{display:grid;grid-template-columns:auto 1fr;gap:4px 14px;margin:0}
.kv dt{color:var(--muted);font-size:13px;align-self:center}
.kv dd{margin:0;font-weight:700;font-variant-numeric:tabular-nums}
/* 카드형 버튼: 시험 관리의 이동 카드와 같은 스타일. <button> 도 같은 모양으로 */
button.navcard{width:100%;text-align:left;font:inherit;color:var(--fg);cursor:pointer}
.landing-cards{grid-template-columns:repeat(auto-fit,minmax(230px,1fr))}   /* 카드가 2~3개면 오른쪽 여백 없이 폭을 균등하게 나눈다 */
.landing-cards.cards-1{grid-template-columns:minmax(230px,300px)}          /* 카드가 하나뿐이면 전체 폭으로 늘어나지 않게 */
.landing-cards .navcard .sub{white-space:nowrap}
.navcard .sub .rt{display:inline-block;text-align:left;font-weight:700;font-variant-numeric:tabular-nums;color:var(--fg)}
.kv-first{margin-top:12px;padding-top:10px;border-top:1px solid var(--line)}
.landing-cards .navcard .sub.unanswered{color:var(--warn);font-weight:600}

/* 제출한 답안 확인: 답하지 않은 문항 카드는 테두리 색을 강조 (두께는 그대로 두고 안쪽 링으로 굵게 보이게 해서 레이아웃이 밀리지 않는다) */
.q.unanswered{border-color:var(--warn);box-shadow:0 0 0 1px var(--warn)}

/* 응시 기간 카드의 시작/마감: 기본 크기(항목 이름 13px, 일시 15px)의 1.5배 */
.kv-period{gap:8px 16px}
.kv-period dt{font-size:19.5px}
.kv-period dd{font-size:22.5px;word-break:keep-all}

/* '응시 완료' 카드: 누르는 버튼이 아니라 상태 표시 */
.navcard.done{cursor:default}
.navcard.done:hover{transform:none;box-shadow:none;border-color:var(--line)}

/* 결과 화면: 내가 얻은 기회 */
.kv-chance{grid-template-columns:auto 1fr;gap:6px 18px}
.kv-chance dt{font-size:14px}
.kv-chance dd{font-size:15px}
.chance-list{list-style:none;margin:12px 0 0;padding:10px 0 0;border-top:1px solid var(--line);display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:4px 16px;font-size:13px;color:var(--muted)}
.chance-list .when{font-variant-numeric:tabular-nums;display:inline-block;min-width:88px}
.chance-list .amt{font-weight:700;font-variant-numeric:tabular-nums;display:inline-block;min-width:52px}
.chance-list .amt.plus{color:var(--ok)}
.chance-list .amt.minus{color:var(--danger)}

/* 객관식 채점: 정답자/오답자 수 + 명단 말풍선 */
.who{display:inline-block;padding:2px 6px;border-radius:6px;position:relative}
.who[tabindex]{cursor:default;outline-offset:2px}
.who[tabindex]:hover,.who[tabindex]:focus{background:var(--bg)}
.who.right b{color:var(--ok)}.who.wrong b{color:var(--danger)}
.who-pop{position:fixed;z-index:50;min-width:180px;max-width:min(360px,calc(100vw - 16px));max-height:260px;overflow:auto;background:var(--card);color:var(--fg);border:1px solid var(--line);border-radius:10px;box-shadow:0 6px 24px rgba(0,0,0,.18);padding:10px 12px;font-size:13px;font-weight:400}
.who-pop[hidden]{display:none}
.who-head{display:block;font-weight:700;margin-bottom:6px}
.who-pop ul{list-style:none;margin:0;padding:0;display:grid;gap:3px}

/* 객관식 채점 상세: 보기별 선택 현황 */
table.choice-stat td.mark{width:28px;text-align:center}
table.choice-stat td.mark .ok{color:var(--ok);font-weight:800}
table.choice-stat td.num{white-space:nowrap;font-variant-numeric:tabular-nums}
table.choice-stat tr.is-right td{background:color-mix(in srgb,var(--ok) 8%,transparent)}
table.choice-stat .bar-fill.ok{background:var(--ok)}
table.choice-stat .bar-fill.no{background:var(--danger)}
table.choice-stat .bar-val{min-width:48px;text-align:right;font-variant-numeric:tabular-nums}
.people{display:flex;flex-wrap:wrap;gap:2px 10px;margin-top:6px;font-size:13px}
.people .person .muted{margin-left:2px}
.people details{flex-basis:100%}
.people details summary{cursor:pointer;color:var(--muted)}
.tabs.sub-tabs{margin-top:8px}

/* 응시자 관리: 사용자 불러오기 모달 */
dialog.modal{width:min(760px,calc(100vw - 24px));max-height:calc(100vh - 32px);padding:0;border:1px solid var(--line);border-radius:14px;background:var(--card);color:var(--fg);box-shadow:0 12px 48px rgba(0,0,0,.3)}
dialog.modal::backdrop{background:rgba(10,14,24,.55)}
dialog.modal form{display:flex;flex-direction:column;max-height:calc(100vh - 32px)}
.modal-head,.modal-tools,.modal-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px}
.modal-head{border-bottom:1px solid var(--line)}
.modal-tools{flex-wrap:wrap;border-bottom:1px solid var(--line)}
.modal-tools input[type=search]{flex:1;min-width:200px;margin:0}
.modal-body{overflow:auto;padding:0 16px;flex:1;min-height:120px}
.modal-foot{border-top:1px solid var(--line)}
.import-table{width:100%}
.import-table th{position:sticky;top:0;background:var(--card);z-index:1}
.import-table tr[hidden]{display:none}
.import-table tr:not(.off):not(:first-child){cursor:pointer}
.import-table tr:not(.off):not(:first-child):hover td{background:var(--bg)}
.import-table tr.off td{opacity:.55}
.import-table td:first-child,.import-table th:first-child{width:36px}

/* 응시자 등록: [사용자 불러오기] 카드 + [신규 추가] 카드 */
.reg-grid{display:grid;grid-template-columns:minmax(220px,1fr) minmax(300px,2fr);gap:12px;align-items:stretch;margin:12px 0 22px}
.reg-grid>.navcard{height:100%}
.reg-grid>.card{margin:0}
.reg-title{font-size:19px;font-weight:800;letter-spacing:-.01em}
.toast[hidden]{display:none}
#new-email[aria-invalid=true]{border-color:var(--danger)}
dialog.modal.modal-sm{width:min(560px,calc(100vw - 24px))}
@media(max-width:640px){.reg-grid{grid-template-columns:1fr}}

/* 비활성 버튼: 회색, 누를 수 없음 (조건이 맞으면 원래 색으로 바뀐다) */
button:disabled,button.pri:disabled{background:var(--line);color:var(--muted);border-color:var(--line);cursor:not-allowed;box-shadow:none}

/* 신규 추가 카드: 사용자 관리의 '사용자 추가' 카드와 같은 한 줄 입력 + 버튼 */
.reg-new .reg-row{margin-top:10px}
.reg-new .reg-row{flex-wrap:nowrap}
.reg-new .reg-row input{flex:1 1 90px;min-width:0;width:auto;margin:0}
.reg-new .reg-row input[type=email]{flex:2 1 150px}
.reg-new .reg-row button{flex:none;white-space:nowrap}
@media(max-width:560px){.reg-new .reg-row{flex-wrap:wrap}.reg-new .reg-row input{flex-basis:140px}}

/* 일괄등록 결과 안내 */
.bulk-tiles{grid-template-columns:repeat(2,1fr);margin:0}
.bulk-tiles .ok-text{color:var(--ok)}.bulk-tiles .bad-text{color:var(--danger)}
table.bulk-fail{width:100%;font-size:14px}
table.bulk-fail td.num,table.bulk-fail th:first-child{width:48px;text-align:center;font-variant-numeric:tabular-nums}
table.bulk-fail td:last-child{color:var(--danger)}

/* 응시자 목록 선택 */
.select-bar{margin:0 0 8px;gap:8px}
label.chk{display:inline-flex;align-items:center;gap:8px;margin:0;font-weight:inherit;cursor:pointer}
label.chk input{margin:0}
#participant-table tr.picked td{background:color-mix(in srgb,var(--pri) 8%,transparent)}

/* 메일 발송 이력 */
.mail-history{padding:6px 14px}
.mail-list{display:grid}
.mail-row{display:grid;grid-template-columns:96px auto 56px 1fr;gap:10px;align-items:center;width:100%;text-align:left;font:inherit;color:var(--fg);background:transparent;border:0;border-bottom:1px solid var(--line);border-radius:0;padding:10px 4px;cursor:pointer}
.mail-row:last-child{border-bottom:0}
.mail-row:hover,.mail-row:focus-visible{background:var(--bg)}
.mail-row .mr-at{font-variant-numeric:tabular-nums;color:var(--muted)}
.mail-row .mr-n{font-variant-numeric:tabular-nums}
.mail-row .mr-state{text-align:right;font-variant-numeric:tabular-nums}
.mr-kind.invite{color:var(--pri);border-color:var(--pri)}.mr-kind.reminder{color:var(--danger);border-color:var(--danger)}.mr-kind.result{color:var(--ok);border-color:var(--ok)}
.ok-text{color:var(--ok)}.bad-text{color:var(--danger)}
.mail-note{background:var(--bg);border-radius:8px;padding:10px 12px;margin:0 0 12px;white-space:pre-line;font-size:14px}
table.md-table{width:100%;font-size:14px}
dialog.modal #md-meta{margin:0 0 12px}
.ctl-label{display:block;font-size:12.5px;font-weight:700;color:var(--muted);margin-bottom:6px}
@media(max-width:560px){.mail-row{grid-template-columns:auto 1fr;grid-template-areas:"at state" "kind n"}.mail-row .mr-at{grid-area:at}.mail-row .mr-state{grid-area:state}.mail-row .mr-kind{grid-area:kind;justify-self:start}.mail-row .mr-n{grid-area:n;text-align:right}}
#mail-send-dialog label.chk{display:flex;margin:0 0 6px}

/* 시험 관리 목록 */
.list-filter{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 12px}
.list-filter input[type=search]{flex:1 1 220px;max-width:340px}
.list-filter select{width:auto}
.state-tabs{margin-bottom:12px}
.tag.state-running{color:var(--ok);border-color:var(--ok)}.tag.state-upcoming{color:var(--pri);border-color:var(--pri)}

/* 응시현황 실시간 요약 */
.live{margin:6px 0 22px}
.live-tiles{grid-template-columns:repeat(auto-fit,minmax(130px,1fr));margin:10px 0}
.live-table td.num{font-variant-numeric:tabular-nums}

/* 예약 발송 */
.schedule-box{margin:0 0 4px;padding:8px 12px;border:1px solid var(--line);border-radius:8px;background:var(--bg)}
.schedule-box input[type=datetime-local]{max-width:260px}
.mail-schedules{border-top:1px solid var(--line);margin-top:6px}
.sched-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:6px 4px;font-size:14px}
.sched-row .mr-at{color:var(--muted);font-variant-numeric:tabular-nums;min-width:86px}
.sched-row .sched-state{flex:1;min-width:140px}
.sched-row.cancelled,.sched-row.skipped{color:var(--muted)}
.sched-row.skipped .sched-state{color:var(--warn)}
.sched-row.sent .sched-state{color:var(--ok)}
.sched-row form{margin:0}

/* ===== 라이트/다크 테마 토글 (해·달 스위치) ===== */
.theme-pill{display:inline-flex;cursor:pointer;margin:0;vertical-align:middle;-webkit-tap-highlight-color:transparent;flex:0 0 auto;position:relative}
header.top .theme-pill:not(.after-nav){margin-left:auto}
.theme-pill input{position:absolute;opacity:0;width:0;height:0}
.theme-pill input:focus-visible~.tp-track{outline:2px solid var(--pri);outline-offset:2px}
.tp-track{position:relative;width:56px;height:28px;border-radius:999px;background:linear-gradient(135deg,#7ec8e3 0%,#a8d8ea 40%,#cce6f4 100%);border:2px solid rgba(255,255,255,.45);box-shadow:inset 0 2px 6px rgba(0,0,0,.08),0 1px 3px rgba(0,0,0,.1);overflow:hidden;transition:background .5s,border-color .5s,box-shadow .5s}
.tp-thumb{position:absolute;top:2px;left:2px;width:24px;height:24px;border-radius:50%;background:linear-gradient(145deg,#ffd93d,#f6c90e);box-shadow:0 0 6px rgba(246,201,14,.5),0 2px 4px rgba(0,0,0,.15);transition:transform .5s cubic-bezier(.4,.2,.2,1),background .5s,box-shadow .5s;z-index:3}
.tp-sun-face{position:absolute;inset:3px;border-radius:50%;background:radial-gradient(circle at 40% 35%,#ffe066,#ffd93d 60%,#f0b800);transition:opacity .4s;opacity:1}
.tp-crater{position:absolute;border-radius:50%;background:rgba(120,140,155,.35);opacity:0;transition:opacity .4s}
.tp-cr1{width:8px;height:8px;top:5px;right:5px}.tp-cr2{width:6px;height:6px;bottom:4px;left:6px}.tp-cr3{width:4px;height:4px;bottom:8px;right:8px}
.tp-cloud{position:absolute;border-radius:999px;background:rgba(255,255,255,.7);transition:opacity .4s,transform .4s;z-index:2}
.tp-c1{width:22px;height:10px;bottom:2px;right:4px}.tp-c2{width:16px;height:8px;bottom:6px;right:14px}.tp-c3{width:12px;height:6px;bottom:1px;right:22px}
.tp-star{position:absolute;color:#fff;font-size:8px;opacity:0;transition:opacity .4s;z-index:2;line-height:1}
.tp-s1{top:4px;left:6px;font-size:10px}.tp-s2{top:14px;left:14px;font-size:5px}.tp-s3{top:8px;left:24px;font-size:7px}.tp-s4{bottom:5px;left:8px;font-size:5px}.tp-s5{bottom:4px;left:20px;font-size:8px}
.theme-pill input:checked~.tp-track{background:linear-gradient(135deg,#1a1a2e 0%,#2d2d44 40%,#3a3a55 100%);border-color:rgba(160,170,190,.2);box-shadow:inset 0 2px 6px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.2)}
.theme-pill input:checked~.tp-track .tp-thumb{transform:translateX(28px);background:linear-gradient(145deg,#e0e0e8,#c8c8d4);box-shadow:0 0 8px rgba(200,200,220,.3),0 2px 4px rgba(0,0,0,.2)}
.theme-pill input:checked~.tp-track .tp-sun-face{opacity:0}
.theme-pill input:checked~.tp-track .tp-crater{opacity:1}
.theme-pill input:checked~.tp-track .tp-cloud{opacity:0;transform:translateY(6px)}
.theme-pill input:checked~.tp-track .tp-star{opacity:1}
@keyframes tp-twinkle{0%,100%{opacity:.4}50%{opacity:1}}
.theme-pill input:checked~.tp-track .tp-s2,.theme-pill input:checked~.tp-track .tp-s4{animation:tp-twinkle 2s infinite}
.theme-pill input:checked~.tp-track .tp-s1,.theme-pill input:checked~.tp-track .tp-s5{animation:tp-twinkle 2.6s .4s infinite}
@media(prefers-reduced-motion:reduce){.tp-track,.tp-thumb,.tp-sun-face,.tp-crater,.tp-cloud,.tp-star{transition:none}.theme-pill input:checked~.tp-track .tp-star{animation:none!important}}
.sticky .theme-pill{margin-left:0}

/* ===== 홈: 시험 상태 카드 ===== */
.exam-card .exam-extra{font-size:13.5px;margin-top:2px;color:var(--fg)}
.exam-card .exam-extra.urgent{color:var(--danger);font-weight:700}
.tag.est-in_progress{color:var(--pri);border-color:var(--pri)}.tag.est-available{color:var(--ok);border-color:var(--ok)}
.tag.est-retake{color:var(--warn);border-color:var(--warn)}.tag.est-result{color:var(--ok);border-color:var(--ok)}
.tag.est-missed{color:var(--danger);border-color:var(--danger)}
.small{font-size:12px}
.todo-chips{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
details.past-list{margin:14px 0}
details.past-list>summary{cursor:pointer;color:var(--muted);font-size:14px;font-weight:600;margin-bottom:10px}

/* 시험 생성/수정: 응시 시작·응시 마감을 한 행에 좌우로 */
.date-pair{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.date-pair .date-col{min-width:0}
@media(max-width:520px){.date-pair{grid-template-columns:1fr}}

/* 입력 오류: 원인이 되는 입력칸 바로 아래에 강조 색으로 표시한다 */
.field-error{color:var(--danger);font-weight:700;font-size:13.5px;margin:5px 0 10px;line-height:1.4}
input[aria-invalid="true"],select[aria-invalid="true"],textarea[aria-invalid="true"]{border-color:var(--danger);box-shadow:0 0 0 2px color-mix(in srgb,var(--danger) 25%,transparent)}
ul.errorlist{list-style:none;margin:0 0 12px;padding:10px 14px;border:1px solid var(--danger);border-radius:8px;color:var(--danger);font-weight:700;background:color-mix(in srgb,var(--danger) 8%,transparent)}

/* ===== 간격 보정: 필터·버튼 줄과 표, 표와 도움말, 인접한 버튼 사이가 붙어 보이지 않게 ===== */
.row+.table-wrap,.row+table,.tabs+.table-wrap{margin-top:14px}
.table-wrap+.help,.table-wrap+p,table+.help{margin-top:12px}
.panel h3+.desc,h3+p.desc{margin-top:8px}
.list-actions{gap:10px;flex-wrap:wrap}
p>button+.btn,p>.btn+button,p>.btn+.btn,p>button+button{margin-left:6px}
.audit-bar{margin-bottom:14px;gap:12px}

/* ===== 설정 > 업데이트 ===== */
.version-badge{display:inline-block;padding:2px 12px;border-radius:99px;background:var(--pri);color:var(--pri-fg);font-weight:800;font-size:15px}
table.kv{border:0;background:transparent}table.kv th{width:110px;text-align:left;color:var(--muted);font-weight:600;vertical-align:top;padding:8px 8px 8px 0}table.kv td{padding:8px 0}
ul.checklist{list-style:none;margin:0;padding:0}ul.checklist li{padding:8px 0;border-top:1px solid var(--line)}ul.checklist li:first-child{border-top:0}
ul.checklist li.ok b{color:var(--ok)}ul.checklist li.bad b{color:var(--danger)}
.pre{white-space:pre-wrap;word-break:break-word}
