:root{
  --ink:#15181d; --soft:#525a66; --faint:#8b939f;
  --paper:#faf9f6; --panel:#fff; --rule:#dcdad2; --rule2:#b8b5aa;
  --done:#0b7a41; --done-t:#e2f2e8;
  --wait:#a8701c; --wait-t:#f8efdd;
  --live:#1f3fd6; --stop:#b03030; --stop-t:#fdeeee;
  --nav:#1b1f27;
}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--paper);color:var(--ink);
  font-family:'Gothic A1','Malgun Gothic',system-ui,sans-serif;font-size:16px;line-height:1.6}
.mono{font-family:'IBM Plex Mono',ui-monospace,Menlo,monospace;font-variant-numeric:tabular-nums}
a{color:inherit}

/* ── 골격 ── */
.shell{display:flex;min-height:100vh}
.side{width:190px;flex-shrink:0;background:var(--nav);color:#a8aeb8}
.brand{padding:18px 16px;font-family:'Black Han Sans',sans-serif;font-size:18px;
  color:#fff;border-bottom:1px solid #2c313b}
.navgrp{padding:16px 16px 6px;font-size:12px;color:#6b7280;letter-spacing:.1em}
.navitem{display:block;padding:11px 16px;font-size:14.5px;text-decoration:none;color:#a8aeb8}
.navitem:hover{background:#242932;color:#fff}
.navitem.on{background:var(--done);color:#fff;font-weight:700}
.main{flex:1;min-width:0;display:flex;flex-direction:column}
.top{background:#fff;border-bottom:1px solid var(--rule);padding:11px 22px;
  display:flex;align-items:center;gap:14px}
.top .time{font-size:13px;color:var(--faint)}
.top .who{margin-left:auto;font-size:14px;color:var(--soft)}
.top .who a{color:var(--live)}
.body{padding:22px;flex:1}

/* ── 제목 ── */
.h{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:4px}
.h h1{font-size:24px;font-weight:800}
.h .sub{font-size:14px;color:var(--faint)}
.lead{color:var(--soft);font-size:15px;margin-bottom:18px;max-width:70ch}

/* ── 카드 ── */
.card{background:var(--panel);border:1px solid var(--rule);padding:18px 20px;margin-bottom:14px}
.card h2{font-size:16px;font-weight:800;margin-bottom:13px}
.card h2 span{font-weight:400;color:var(--faint);font-size:13.5px;margin-left:8px}

/* ── 통계 ── */
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:18px}
.stat{background:var(--panel);border:1px solid var(--rule);padding:15px 17px}
.stat b{display:block;font-family:'IBM Plex Mono',monospace;font-size:30px;font-weight:600}
.stat span{font-size:13.5px;color:var(--soft)}
.stat.ok b{color:var(--done)} .stat.no b{color:var(--stop)} .stat.wt b{color:var(--wait)}

/* ── 입력 ── */
label.f{display:block;font-size:13.5px;font-weight:700;color:var(--soft);margin-bottom:5px}
label.f em{font-style:normal;font-weight:400;color:var(--faint)}
input[type=text],input[type=password],input[type=number],select,textarea{
  width:100%;padding:9px 11px;font:inherit;font-size:15px;border:1px solid var(--rule2);
  background:#fff;color:var(--ink);border-radius:0}
textarea{min-height:70px;resize:vertical;line-height:1.6}
input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:2px solid var(--live);outline-offset:1px;border-color:var(--live)}
.grid{display:grid;gap:12px}
.g2{grid-template-columns:repeat(2,1fr)} .g3{grid-template-columns:repeat(3,1fr)}
.g4{grid-template-columns:repeat(4,1fr)}

/* ── 버튼 ── */
.btn{font:inherit;font-weight:800;font-size:15px;padding:10px 20px;cursor:pointer;
  border:2px solid var(--ink);background:var(--ink);color:var(--paper);border-radius:0;
  text-decoration:none;display:inline-block}
.btn:hover:not(:disabled){background:var(--done);border-color:var(--done)}
.btn:focus-visible{outline:3px solid var(--live);outline-offset:2px}
.btn:disabled{opacity:.35;cursor:not-allowed}
.btn.ghost{background:transparent;color:var(--ink)}
.btn.ghost:hover:not(:disabled){background:var(--ink);color:var(--paper)}
.btn.danger{background:transparent;color:var(--stop);border-color:var(--stop)}
.btn.danger:hover:not(:disabled){background:var(--stop);color:var(--paper)}
.btn.sm{font-size:13.5px;padding:7px 14px;border-width:1px}
.row{display:flex;gap:9px;flex-wrap:wrap;align-items:center}

/* ── 표 ── */
.tw{overflow-x:auto;border:1px solid var(--rule);background:#fff}
table{width:100%;border-collapse:collapse;font-size:14px}
th{background:var(--ink);color:var(--paper);font-size:13px;font-weight:700;
  text-align:left;padding:9px 11px;white-space:nowrap}
td{border-bottom:1px solid #eeece6;padding:9px 11px;vertical-align:middle}
tr:last-child td{border-bottom:0}
tbody tr:hover td{background:#fbfaf7}

/* ── 배지 ── */
.pill{display:inline-block;font-family:'IBM Plex Mono',monospace;font-size:12px;
  font-weight:600;padding:2px 7px;white-space:nowrap}
.pill.ok{background:var(--done-t);color:var(--done)}
.pill.no{background:var(--stop-t);color:var(--stop)}
.pill.wt{background:var(--wait-t);color:var(--wait)}
.pill.off{background:#f1efe8;color:var(--faint)}

/* ── 알림 ── */
.note{border-left:3px solid var(--rule2);padding:11px 15px;font-size:14.5px;
  color:var(--soft);background:var(--panel);margin-bottom:14px}
.note.bad{border-color:var(--stop);background:var(--stop-t);color:var(--stop)}
.note.warn{border-color:var(--wait);background:var(--wait-t);color:#7a5215}
.empty{border:1px dashed var(--rule2);padding:44px 20px;text-align:center;
  color:var(--faint);background:var(--panel)}
.empty b{display:block;color:var(--ink);font-size:17px;margin-bottom:6px}
.toast{position:fixed;left:50%;bottom:24px;transform:translate(-50%,90px);z-index:60;
  background:var(--ink);color:var(--paper);padding:11px 20px;font-size:13px;
  font-weight:700;font-size:15px;transition:transform .25s}
.toast.on{transform:translate(-50%,0)}

/* ── 로그인 ── */
.login{min-height:100vh;display:flex;align-items:center;justify-content:center;
  background:var(--paper)}
.login .box{width:320px}
.login .logo{font-family:'Black Han Sans',sans-serif;font-size:32px;text-align:center}
.login .cap{text-align:center;font-size:14px;color:var(--faint);margin-bottom:26px}
.login input{margin-bottom:10px}
.login .btn{width:100%;text-align:center;padding:11px}

@media (max-width:900px){ .g3,.g4{grid-template-columns:repeat(2,1fr)} }
@media (max-width:600px){
  .side{display:none}
  .g2,.g3,.g4{grid-template-columns:1fr}
}


/* ── 이미지 업로드 ── */
.up{border:1px solid var(--rule2);background:#fff;padding:11px 13px}
.up .row{margin-bottom:9px}
.up .list{display:flex;flex-direction:column;gap:6px}
.up .item{display:flex;align-items:center;gap:9px;padding:6px 9px;background:var(--paper);
  border:1px solid var(--rule);font-size:13px}
.up .item a{flex:1;color:var(--live);word-break:break-all;font-family:'IBM Plex Mono',monospace;
  font-size:12.5px;text-decoration:none}
.up .item a:hover{text-decoration:underline}
.up .item .x{cursor:pointer;color:var(--stop);font-weight:800;padding:0 4px}
.up .thumb{width:34px;height:34px;object-fit:cover;border:1px solid var(--rule);background:#fff}
.up .none{font-size:13px;color:var(--faint);padding:5px 0}

/* ── 섹션 제목 ── */
h3.sec{font-size:15.5px;font-weight:800;color:var(--ink);margin:0 0 12px;
  padding-bottom:8px;border-bottom:1px solid var(--rule);display:flex;
  align-items:center;gap:8px}
h3.sec::before{content:'';width:5px;height:15px;background:var(--done);flex-shrink:0}
h3.sec.off{color:var(--faint)}
h3.sec.off::before{background:var(--rule2)}
h3.sec span{font-size:12.5px;font-weight:400;color:var(--faint)}
