:root{
  --bg:#f6f8fa; --panel:#ffffff; --panel2:#f0f2f5; --line:#d0d7de;
  --txt:#24292f; --muted:#57606a; --accent:#0969da;
  --safe:#1a7f37; --notice:#1a7f37; --warning:#9a6700; --danger:#bc4c00;
  --urgent:#cf222e; --expired:#a40e26; --mismatch:#8250df; --fail:#6e7681;
  --radius:8px;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--txt);
  font-family:"IBM Plex Sans KR",system-ui,sans-serif;font-size:14px;
  background-image:radial-gradient(circle at 1px 1px,rgba(0,0,0,.05) 1px,transparent 0);
  background-size:28px 28px}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-track{background:var(--bg)}
::-webkit-scrollbar-thumb{background:var(--line);border-radius:4px}
::-webkit-scrollbar-thumb:hover{background:var(--muted)}
.hidden{display:none !important}
button{cursor:pointer;font-family:inherit}
input,select,textarea{font-family:inherit}

/* ── 로그인 ── */
.login-wrap{min-height:100vh;display:grid;place-items:center;
  background:radial-gradient(900px 500px at 60% -5%,rgba(9,105,218,.07),transparent),
             radial-gradient(600px 400px at 10% 80%,rgba(26,127,55,.05),transparent),var(--bg);
  background-size:cover;background-position:center}
.login-center{display:flex;flex-direction:column;align-items:center;gap:12px}
.login-warning{background:rgba(209,36,47,.08);border:1px solid rgba(209,36,47,.3);
  color:#d1242f;padding:12px 18px;border-radius:8px;font-size:13px;
  max-width:320px;text-align:center;white-space:pre-wrap}
.login-card{background:var(--panel);border:1px solid var(--line);border-radius:14px;
  padding:34px 30px;width:320px;display:flex;flex-direction:column;gap:12px;
  box-shadow:0 8px 32px rgba(0,0,0,.1),0 0 0 1px rgba(9,105,218,.06)}
.login-card h1{font-size:24px;margin:0 0 8px;letter-spacing:-.5px;text-align:center}
.login-card h1 span{color:var(--accent)}
.login-card input{background:var(--bg);border:1px solid var(--line);color:var(--txt);
  padding:11px 12px;border-radius:8px;font-size:14px}
.login-card input:focus{outline:none;border-color:var(--accent)}
.login-card button{background:var(--accent);border:0;color:#fff;padding:11px;
  border-radius:8px;font-weight:600;margin-top:4px}
.err{color:var(--urgent);font-size:12px;min-height:14px;margin:0}

/* ── 상단바 ── */
.topbar{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;
  padding:0 20px;height:54px;
  background:linear-gradient(to right,var(--panel),rgba(9,105,218,.02),var(--panel));
  border-top:1px solid rgba(9,105,218,.18);border-bottom:1px solid var(--line);
  position:sticky;top:0;z-index:10}
.brand{font-size:16px;letter-spacing:-.3px;white-space:nowrap}
.brand b{color:var(--accent);text-shadow:0 0 14px rgba(9,105,218,.25)}
.live-dot{display:inline-block;width:7px;height:7px;border-radius:50%;
  background:var(--safe);box-shadow:0 0 8px var(--safe);
  margin-left:6px;vertical-align:middle;animation:livePulse 2.5s ease-in-out infinite}
@keyframes livePulse{
  0%,100%{opacity:1;box-shadow:0 0 4px var(--safe)}
  50%{opacity:.5;box-shadow:0 0 14px var(--safe)}
}
.topnav{display:flex;gap:3px;justify-content:center;overflow-x:auto;scrollbar-width:none}
.topnav::-webkit-scrollbar{display:none}
.topbar-right{display:flex;align-items:center;gap:8px;justify-content:flex-end}
.nav-tab{background:transparent;border:0;color:var(--muted);padding:7px 13px;
  border-radius:7px;font-size:13px;font-weight:500;white-space:nowrap}
.nav-tab:hover{color:var(--txt);background:var(--panel2)}
.topbar-settings{border:1px solid var(--line);background:var(--panel2);color:var(--txt)}
.topbar-settings:hover{border-color:var(--muted);background:var(--panel)}
.topbar-settings.active{border-color:var(--accent);background:var(--panel2);color:var(--accent)}
.nav-tab.active{color:var(--txt);background:var(--panel2)}
.spacer{flex:1}
.ghost{background:transparent;border:1px solid var(--line);color:var(--muted);
  padding:6px 11px;border-radius:7px;font-size:13px}
.ghost:hover{color:var(--txt);border-color:var(--muted)}
.btn-sec{background:var(--panel);border:1px solid var(--line);color:var(--txt);
  padding:7px 14px;border-radius:7px;font-size:13px;font-weight:500}
.btn-sec:hover{background:var(--panel2);border-color:var(--muted)}
.version{font-family:"IBM Plex Mono",monospace;font-size:11px;color:var(--muted)}
/* 새로고침 버튼 */
.refresh-btn{background:var(--panel2);border:1px solid var(--line);color:var(--txt);
  padding:6px 12px;border-radius:7px;font-size:13px;cursor:pointer;font-family:inherit}
.refresh-btn:hover{border-color:var(--accent);color:var(--accent)}
/* 설정 아이콘 버튼 */
.nav-icon{padding:0;width:34px;height:34px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;font-size:17px;
  border:1.5px solid var(--line)}
.nav-icon:hover,.nav-icon.active{background:var(--panel2);border-color:var(--accent);color:var(--accent)}

.page{padding:20px;max-width:1400px;margin:0 auto}
.page-title{margin:0 0 20px;font-size:18px}

/* ── 대시보드 레이아웃 ── */
.dash-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:18px}
.dash-layout{display:grid;grid-template-columns:232px 1fr;gap:14px;align-items:start;
  height:calc(100vh - 54px - 40px)}
.dash-charts{display:flex;flex-direction:column;gap:8px}

/* compact 모드: 도넛·분포바 숨김으로 높이 대폭 감소 */
.dash-charts.charts-compact .dash-mini-body{display:none}
.dash-charts.charts-compact .dash-mini-bar-wrap{display:none}

/* ── 미니 차트 카드 ── */
.dash-mini-card{background:var(--panel);border:1px solid var(--line);border-radius:10px;
  overflow:hidden;cursor:pointer;position:relative;
  transition:transform .2s,box-shadow .2s,border-color .2s;
  box-shadow:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04)}
.dash-mini-card::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;
  background:var(--safe);opacity:.7}
.dash-mini-card.card-warn::before{background:var(--warning);opacity:1}
.dash-mini-card.card-urgent::before{background:var(--urgent);opacity:1}
.dash-mini-card:hover{transform:translateY(-2px);
  box-shadow:0 6px 20px rgba(0,0,0,.1),0 2px 6px rgba(0,0,0,.06)}
.dash-mini-card.card-warn{border-color:rgba(154,103,0,.35);
  box-shadow:0 2px 12px rgba(154,103,0,.12)}
.dash-mini-card.card-urgent{border-color:rgba(207,34,46,.4);
  box-shadow:0 2px 14px rgba(207,34,46,.15)}
.dash-mini-head{display:flex;align-items:center;gap:7px;
  padding:6px 10px;border-bottom:1px solid var(--line);
  font-size:12px;font-weight:600;border-left:3px solid var(--safe);
  background:linear-gradient(to right,rgba(26,127,55,.05),transparent)}
.dash-mini-head.head-warn{border-left-color:var(--warning);
  background:linear-gradient(to right,rgba(154,103,0,.08),transparent)}
.dash-mini-head.head-urgent{border-left-color:var(--urgent);
  background:linear-gradient(to right,rgba(207,34,46,.08),transparent)}
.dash-mini-icon{width:22px;height:22px;border-radius:5px;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;font-size:12px}
.dash-mini-icon.icon-ssl{background:linear-gradient(135deg,rgba(9,105,218,.2),rgba(9,105,218,.08))}
.dash-mini-icon.icon-srt{background:linear-gradient(135deg,rgba(120,80,220,.22),rgba(120,80,220,.08))}
.dash-mini-icon.icon-url{background:linear-gradient(135deg,rgba(26,127,55,.2),rgba(26,127,55,.08))}
.dash-mini-title{flex:1;font-size:12px}
.dash-mini-cnt{font-size:10px;color:var(--muted);font-weight:600;
  font-family:"IBM Plex Mono",monospace;
  background:var(--panel2);border:1px solid var(--line);
  border-radius:10px;padding:1px 7px;line-height:1.5}
.dash-mini-body{padding:8px 10px 6px;display:flex;align-items:center;gap:10px}

/* 작은 도넛 */
.donut-sm{width:62px;height:62px;border-radius:50%;position:relative;flex-shrink:0;
  box-shadow:0 0 0 2px var(--panel),0 1px 6px rgba(0,0,0,.1)}
.donut-sm-hole{position:absolute;inset:11px;background:var(--panel);border-radius:50%;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px}
.donut-sm-n{font-size:11px;font-weight:700;font-family:"IBM Plex Mono",monospace;line-height:1}
.donut-sm-l{font-size:8px;color:var(--muted)}
.donut-sm-n.donut-n-urgent{color:var(--urgent)}
.donut-sm-n.donut-n-warn{color:var(--warning)}

/* 통계 */
.dash-mini-stats{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}
.dash-mini-stat{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--muted);
  padding:2px 5px;border-radius:5px;
  background:linear-gradient(to right,var(--stat-fill,transparent) var(--stat-pct,0%),transparent var(--stat-pct,0%));
  transition:background .6s ease}
.dash-mini-pip{width:6px;height:6px;border-radius:50%;flex-shrink:0}
.pip-safe{background:var(--safe)} .pip-warn{background:var(--warning)} .pip-urgent{background:var(--urgent)}
.dash-mini-sn{font-family:"IBM Plex Mono",monospace;font-size:13px;font-weight:700;
  width:28px;text-align:right;line-height:1}
.safe-c{color:var(--safe)} .warn-c{color:var(--warning)} .urgent-c{color:var(--urgent)}

/* 분포 바 */
.dash-mini-bar-wrap{padding:0 10px 7px}
.dash-mini-bar{height:4px;border-radius:2px;overflow:hidden;display:flex;
  background:var(--line)}
.dash-mini-bar-seg{height:100%;transition:width .6s ease}
.seg-safe{background:var(--safe)} .seg-warn{background:var(--warning)} .seg-urgent{background:var(--urgent)}

.dash-mini-last{font-size:10px;color:var(--muted);text-align:center;
  padding:3px 10px 5px;border-top:1px solid var(--line);background:var(--panel2)}

/* ── 오른쪽 상태 패널 ── */
.dash-status-panel{background:var(--panel);border:1px solid var(--line);border-radius:10px;
  display:flex;flex-direction:column;overflow:auto;align-self:stretch;
  box-shadow:0 1px 3px rgba(0,0,0,.06)}

/* 전체 정상 */
.dash-status-ok{display:flex;flex-direction:column;align-items:center;justify-content:center;
  flex:1;gap:14px;padding:48px 32px;
  background:radial-gradient(ellipse 60% 50% at 50% 45%,rgba(26,127,55,.07) 0%,transparent 70%)}
.dash-ok-ring{position:relative;width:88px;height:88px;
  display:flex;align-items:center;justify-content:center}
.dash-ok-ring::before{content:'';position:absolute;inset:0;border-radius:50%;
  background:rgba(26,127,55,.1);animation:okPulse 3s ease-in-out infinite}
.dash-ok-ring::after{content:'';position:absolute;inset:8px;border-radius:50%;
  border:2px solid rgba(26,127,55,.2);animation:okPulse 3s ease-in-out infinite .3s}
@keyframes okPulse{0%,100%{transform:scale(1);opacity:.8}50%{transform:scale(1.12);opacity:.35}}
.dash-ok-check{font-size:44px;line-height:1;position:relative;z-index:1}
.dash-ok-label{font-size:21px;font-weight:700;color:var(--txt);letter-spacing:-.4px}
.dash-ok-sub{font-size:12px;color:var(--muted);margin-top:-6px}
.dash-health-pills{display:flex;gap:8px;flex-wrap:wrap;justify-content:center;margin-top:2px}
.dash-health-pill{display:flex;align-items:center;gap:5px;
  background:var(--panel2);border:1px solid var(--line);border-radius:20px;
  padding:4px 12px;font-size:11px;color:var(--muted);white-space:nowrap}
.dash-health-pill .pill-dot{width:6px;height:6px;border-radius:50%;background:var(--safe)}
.dash-health-pill b{color:var(--safe);font-family:"IBM Plex Mono",monospace;font-size:12px}

/* 이상 감지 패널 */
.dash-alert-strip{display:flex;align-items:center;gap:8px;padding:11px 14px;
  border-bottom:1px solid var(--line);background:var(--panel2);border-radius:10px 10px 0 0}
.dash-alert-strip-title{font-size:12px;font-weight:600;color:var(--txt);flex:1}
.dash-alert-strip-badge{font-size:11px;font-family:"IBM Plex Mono",monospace;
  padding:2px 8px;border-radius:20px}
.das-badge-fail{background:rgba(207,34,46,.1);color:var(--urgent);border:1px solid rgba(207,34,46,.2)}
.das-badge-warn{background:rgba(154,103,0,.09);color:var(--warning);border:1px solid rgba(154,103,0,.18)}
.dash-alert-blocks{display:flex;flex-direction:column;gap:10px;padding:12px}
.dash-alert-block{border-radius:8px;border:1px solid;overflow:hidden}
.dash-alert-block.block-fail{background:rgba(207,34,46,.04);border-color:rgba(207,34,46,.2)}
.dash-alert-block.block-warn{background:rgba(154,103,0,.04);border-color:rgba(154,103,0,.16)}
.dash-block-head{display:flex;align-items:center;gap:7px;padding:8px 12px;border-bottom:1px solid}
.block-fail .dash-block-head{background:rgba(207,34,46,.08);border-color:rgba(207,34,46,.14)}
.block-warn .dash-block-head{background:rgba(154,103,0,.07);border-color:rgba(154,103,0,.12)}
.dash-block-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}
.block-fail .dash-block-dot{background:var(--urgent)}
.block-warn .dash-block-dot{background:var(--warning)}
.dash-block-svc{font-size:12px;font-weight:600;flex:1}
.block-fail .dash-block-svc{color:var(--urgent)}
.block-warn .dash-block-svc{color:var(--warning)}
.dash-block-cnt{font-size:10px;font-family:"IBM Plex Mono",monospace;
  padding:1px 7px;border-radius:20px}
.block-fail .dash-block-cnt{background:rgba(207,34,46,.1);color:var(--urgent)}
.block-warn .dash-block-cnt{background:rgba(154,103,0,.09);color:var(--warning)}
.dash-block-items{padding:5px 10px 8px;display:flex;flex-direction:column;gap:2px}
.dash-block-item{display:flex;align-items:center;gap:7px;font-size:12px;
  padding:5px 6px;border-radius:6px;transition:background .12s;cursor:default;flex-wrap:wrap}
.dash-block-item:hover{background:rgba(0,0,0,.04)}
.dbi-dot{width:5px;height:5px;border-radius:50%;flex-shrink:0;opacity:.8}
.block-fail .dbi-dot{background:var(--urgent)}
.block-warn .dbi-dot{background:var(--warning)}
.dbi-alias{font-weight:600;font-family:"IBM Plex Mono",monospace;color:var(--txt)}
.dbi-sep{color:var(--line);font-size:10px}
.dbi-ip{font-family:"IBM Plex Mono",monospace;color:var(--muted);font-size:11px}
.dbi-svc{font-size:10px;padding:1px 5px;border-radius:3px;background:rgba(0,0,0,.06);color:var(--muted);flex-shrink:0}
.dbi-svc-at{font-weight:400;color:var(--muted);font-size:11px}
.dbi-checking{font-size:10px;padding:1px 6px;border-radius:3px;
  background:rgba(9,105,218,.1);color:var(--accent);animation:blink-check 1.2s ease-in-out infinite}
@keyframes blink-check{0%,100%{opacity:1}50%{opacity:.4}}
.dbi-badge{font-size:10px;padding:1px 6px;border-radius:3px;
  font-weight:600;font-family:"IBM Plex Mono",monospace;margin-left:auto}
.block-fail-badge{background:rgba(207,34,46,.12);color:var(--urgent)}
.block-warn-badge{background:rgba(154,103,0,.1);color:var(--warning)}
.dbi-detail{font-size:10px;color:var(--muted);width:100%;padding-left:12px;opacity:.85;line-height:1.5}
.dbi-play{font-size:10px;padding:1px 7px;border-radius:3px;
  border:1px solid rgba(9,105,218,.3);color:var(--accent);
  background:transparent;cursor:pointer;flex-shrink:0}
.dbi-play:hover{background:rgba(9,105,218,.08)}
.dbi-retry-btn{font-size:11px;padding:1px 7px;border-radius:3px;
  border:1px solid var(--line);background:transparent;cursor:pointer;
  color:var(--muted);margin-left:auto;flex-shrink:0;transition:all .15s}
.dbi-retry-btn:hover{background:rgba(0,0,0,.05);color:var(--txt)}
.dbi-retry-btn:disabled{opacity:.35;cursor:not-allowed}
.dash-col{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;
  box-shadow:0 2px 12px rgba(0,0,0,.07),0 1px 3px rgba(0,0,0,.04);
  transition:transform .15s,box-shadow .15s,border-color .3s}
.dash-col:hover{transform:translateY(-2px);box-shadow:0 6px 24px rgba(0,0,0,.12),0 2px 6px rgba(0,0,0,.06)}
.dash-col.col-urgent{border-color:rgba(248,81,73,.5);box-shadow:0 4px 24px rgba(248,81,73,.18),0 0 0 1px rgba(248,81,73,.15) inset}
.dash-col.col-warn{border-color:rgba(210,153,34,.4);box-shadow:0 4px 24px rgba(210,153,34,.12),0 0 0 1px rgba(210,153,34,.1) inset}
.dash-col-head{display:flex;align-items:center;justify-content:space-between;
  padding:12px 16px;background:var(--panel2);border-bottom:1px solid var(--line);
  border-left:3px solid var(--accent)}
.dash-head-left{display:flex;align-items:center;gap:9px}
.dash-col-icon{width:30px;height:30px;border-radius:8px;display:flex;align-items:center;
  justify-content:center;font-size:15px;flex-shrink:0}
.dash-col-icon.icon-ssl{background:rgba(9,105,218,.1)}
.dash-col-icon.icon-url{background:rgba(63,185,80,.12)}
.dash-col-title{font-size:14px;font-weight:600}
.ch-count{font-family:"IBM Plex Mono",monospace;font-size:11px;color:var(--muted);white-space:nowrap;
  background:var(--bg);border:1px solid var(--line);padding:2px 8px;border-radius:20px}
.dash-col-body{padding:16px}
.dash-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:48px 24px;gap:10px;color:var(--muted);min-height:200px}
.dash-placeholder-icon{font-size:32px;opacity:.4}

/* ── 도넛 차트 ── */
.donut-wrap{display:flex;flex-direction:column;align-items:center;padding:8px 0 4px}
.donut{width:130px;height:130px;border-radius:50%;position:relative;
  box-shadow:0 0 0 3px var(--panel)}
.donut-hole{position:absolute;inset:22px;background:var(--panel);border-radius:50%;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px}
.donut-n{font-size:26px;font-weight:700;font-family:"IBM Plex Mono",monospace;line-height:1}
.donut-l{font-size:10px;color:var(--muted)}
@keyframes donutPulse {
  0%,100%{box-shadow:0 0 0 3px var(--panel),0 0 0 5px rgba(248,81,73,.2),0 0 18px rgba(248,81,73,.1)}
  50%    {box-shadow:0 0 0 3px var(--panel),0 0 0 10px rgba(248,81,73,.5),0 0 32px rgba(248,81,73,.25)}
}
@keyframes donutPulseWarn {
  0%,100%{box-shadow:0 0 0 3px var(--panel),0 0 0 5px rgba(210,153,34,.2),0 0 18px rgba(210,153,34,.1)}
  50%    {box-shadow:0 0 0 3px var(--panel),0 0 0 10px rgba(210,153,34,.5),0 0 32px rgba(210,153,34,.25)}
}
.donut.donut-urgent,.donut-sm.donut-urgent{animation:donutPulse 2.4s ease-in-out infinite}
.donut.donut-warn,.donut-sm.donut-warn{animation:donutPulseWarn 2.4s ease-in-out infinite}
.donut-n.donut-n-urgent{color:var(--urgent);text-shadow:0 0 12px rgba(248,81,73,.6)}
.donut-n.donut-n-warn{color:var(--warning);text-shadow:0 0 10px rgba(210,153,34,.5)}

/* 도넛 아래 숫자 카드 */
.dash-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:14px 0 4px}
.dash-stat{border:1px solid var(--line);border-radius:8px;padding:10px 12px;
  display:flex;flex-direction:column;gap:3px;border-top:3px solid;
  transition:box-shadow .2s}
.dash-stat.ds-safe{border-top-color:var(--safe);box-shadow:0 0 14px rgba(63,185,80,.07)}
.dash-stat.ds-warning{border-top-color:var(--warning);box-shadow:0 0 14px rgba(210,153,34,.07)}
.dash-stat.ds-urgent{border-top-color:var(--urgent);box-shadow:0 0 14px rgba(248,81,73,.09)}
.dash-stat-n{font-size:20px;font-weight:700;font-family:"IBM Plex Mono",monospace;line-height:1.1}
.dash-stat.ds-safe .dash-stat-n{color:var(--safe)}
.dash-stat.ds-warning .dash-stat-n{color:var(--warning)}
.dash-stat.ds-urgent .dash-stat-n{color:var(--urgent)}
.dash-stat-l{font-size:11px;color:var(--muted)}

/* 대시보드 섹션 구분 */
.dash-section-label{font-size:11px;font-weight:600;color:var(--muted);letter-spacing:.4px;
  display:flex;align-items:center;gap:6px;padding:10px 0 6px;
  border-top:1px solid var(--line);margin-top:8px}
.dash-list-header{display:flex;align-items:center;justify-content:space-between;
  padding:10px 0 6px;border-top:1px solid var(--line);margin-top:8px}
.dash-list-title{font-size:11px;font-weight:600;color:var(--muted);letter-spacing:.4px}
.dash-list-count{font-size:11px;color:var(--muted);background:var(--panel2);
  padding:2px 7px;border-radius:20px;border:1px solid var(--line);font-family:"IBM Plex Mono",monospace}

/* 대시보드 긴급 목록 */
.dash-urgent-list{display:flex;flex-direction:column;gap:0}
.dash-urgent-row{display:grid;grid-template-columns:1fr auto auto;gap:8px;
  align-items:center;padding:8px 0;border-bottom:1px solid var(--line);font-size:12px}
.dash-urgent-row.has-play{grid-template-columns:1fr auto auto auto}
.dash-urgent-row:last-child{border-bottom:0}
.dash-domain{font-family:"IBM Plex Mono",monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dash-telco{color:var(--muted);white-space:nowrap}
.dash-more{text-align:center;padding:8px 0;color:var(--muted);font-size:12px}
.badge.sm{padding:2px 6px;font-size:10px}
.dash-stat[data-filter]{cursor:pointer;transition:border-color .15s,background .15s}
.dash-stat[data-filter]:hover{background:var(--panel2)}
.dash-stat.ds-safe[data-filter]:hover{border-color:var(--safe)}
.dash-stat.ds-warning[data-filter]:hover{border-color:var(--warning)}
.dash-stat.ds-urgent[data-filter]:hover{border-color:var(--urgent)}
.dash-filter-chip{display:inline-flex;align-items:center;gap:5px;
  background:var(--accent);color:#fff;padding:4px 10px 4px 12px;
  border-radius:20px;font-size:12px;font-weight:500;white-space:nowrap}
.dash-filter-chip button{background:transparent;border:0;color:rgba(255,255,255,.8);
  cursor:pointer;font-size:14px;line-height:1;padding:0;margin-left:2px}
.dash-filter-chip button:hover{color:#fff}

/* ── 대시보드 요약 스트립 ── */
.dash-summary-strip{display:flex;align-items:center;flex-wrap:wrap;gap:0;margin-bottom:16px;
  background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  padding:9px 16px;row-gap:6px}
.dss-item{display:flex;align-items:center;gap:5px;padding:0 14px;font-size:13px;white-space:nowrap}
.dss-item:first-child{padding-left:0}
.dss-item + .dss-item{border-left:1px solid var(--line)}
.dss-item b{font-family:"IBM Plex Mono",monospace;font-size:14px;font-weight:700}
.dss-safe b{color:var(--safe)}
.dss-warn b{color:var(--warning)}
.dss-urgent b{color:var(--urgent)}
.dss-muted b{color:var(--muted)}
.dss-right{margin-left:auto;font-size:11px;color:var(--muted);padding-left:14px;
  border-left:1px solid var(--line);white-space:nowrap}
/* 카드 헤더 상태 컬러 */
.dash-col-head.head-ok{border-left-color:var(--safe);box-shadow:inset 3px 0 16px rgba(63,185,80,.08)}
.dash-col-head.head-warn{border-left-color:var(--warning);box-shadow:inset 3px 0 16px rgba(210,153,34,.08)}
.dash-col-head.head-urgent{border-left-color:var(--urgent);background:rgba(248,81,73,.06);box-shadow:inset 3px 0 16px rgba(248,81,73,.12)}
/* 카드 헤더 우측 */
.dash-head-right{display:flex;align-items:center;gap:8px}
.dash-last-check{font-size:10px;color:var(--muted)}
/* 위험 목록 행 좌측 컬러 바 */
.dash-urgent-row.row-urgent{border-left:3px solid var(--urgent);padding-left:9px;margin-left:-3px}
.dash-urgent-row.row-warning{border-left:3px solid var(--warning);padding-left:9px;margin-left:-3px}

/* ── SSL 대시보드 카드 ── */
.dash-col-ssl{cursor:pointer}
.ssl-inner{display:grid;grid-template-columns:130px 1fr;gap:14px;align-items:center;padding:4px 0 10px}
.ssl-stats-r{display:flex;flex-direction:column;gap:2px}
.ssl-srow{display:grid;grid-template-columns:46px 1fr;gap:10px;align-items:center;
  padding:7px 8px;border-radius:8px;cursor:pointer;transition:background .15s}
.ssl-srow:hover{background:var(--panel2)}
.ssl-sn{font-size:28px;font-weight:700;font-family:"IBM Plex Mono",monospace;
  line-height:1;text-align:right}
.ssl-sn.safe-c{color:var(--safe)}
.ssl-sn.warn-c{color:var(--warning)}
.ssl-sn.urgent-c{color:var(--urgent)}
.ssl-sd{min-width:0}
.ssl-sl{font-size:11px;color:var(--muted);display:block;margin-bottom:5px}
.ssl-bar{height:4px;background:rgba(0,0,0,.08);border-radius:2px;overflow:hidden}
.ssl-bf{height:100%;border-radius:2px;transition:width .6s ease}
.ssl-bf.safe-f{background:var(--safe);box-shadow:0 0 6px rgba(63,185,80,.5)}
.ssl-bf.warn-f{background:var(--warning);box-shadow:0 0 6px rgba(210,153,34,.5)}
.ssl-bf.urgent-f{background:var(--urgent);box-shadow:0 0 6px rgba(248,81,73,.5)}
.ssl-extra{display:flex;gap:5px;flex-wrap:wrap;padding:8px 0 2px;
  border-top:1px solid var(--line);margin-top:4px}
.ssl-etag{font-size:10px;color:var(--muted);background:var(--panel2);
  border:1px solid var(--line);border-radius:4px;padding:2px 7px;white-space:nowrap}
.ssl-ok{display:flex;align-items:center;gap:8px;
  padding:12px 4px;color:var(--muted);font-size:12px}
.ssl-ok-icon{font-size:15px;color:var(--safe);font-weight:700}
/* 요약 스트립 SSL 레이블 */
.dss-label{font-size:11px;font-weight:600;color:var(--muted);letter-spacing:.4px;
  padding-right:10px;white-space:nowrap}
.dss-total{font-size:11px;color:var(--muted);padding-left:14px;border-left:1px solid var(--line);
  white-space:nowrap;padding-right:10px}
.dss-divider{width:1px;height:16px;background:var(--line);margin:0 14px;flex-shrink:0}

/* ── SSL Check 툴바 ── */
.ssl-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;
  margin-bottom:14px;flex-wrap:wrap}
.ssl-toolbar-left,.ssl-toolbar-right{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.ssl-toolbar select,.ssl-toolbar input{background:var(--panel);border:1px solid var(--line);
  color:var(--txt);padding:7px 10px;border-radius:7px;font-size:13px;height:34px}
.ssl-toolbar input#f-text{min-width:180px}
.ssl-toolbar select:focus,.ssl-toolbar input:focus{outline:none;border-color:var(--accent)}
.ssl-toolbar-right button,.ssl-toolbar-right .filebtn{background:var(--accent);border:0;color:#fff;
  padding:0 14px;border-radius:7px;font-weight:600;font-size:13px;height:34px;
  display:inline-flex;align-items:center}
.ssl-toolbar-right select{background:var(--panel2)}
#add-btn{white-space:nowrap}

/* (기존 toolbar — 다른 페이지 호환) */
.toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;
  margin-bottom:14px;flex-wrap:wrap}
.filters,.add-inline{display:flex;gap:8px;flex-wrap:wrap}
.toolbar select,.toolbar input{background:var(--panel);border:1px solid var(--line);
  color:var(--txt);padding:8px 10px;border-radius:7px;font-size:13px}
.toolbar select:focus,.toolbar input:focus{outline:none;border-color:var(--accent)}
.add-inline button,#telco-add-btn,.filebtn{background:var(--accent);border:0;color:#fff;
  padding:8px 14px;border-radius:7px;font-weight:600;font-size:13px}
.filebtn{display:inline-flex;align-items:center}

/* ── 테이블 ── */
.grid{width:100%;border-collapse:collapse;background:var(--panel);
  border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
.grid th{text-align:left;font-size:12px;color:var(--muted);font-weight:500;
  padding:10px 12px;background:var(--panel2);border-bottom:1px solid var(--line)}
.grid td{padding:9px 12px;border-bottom:1px solid var(--line);font-size:13px;vertical-align:middle}
.grid tr:last-child td{border-bottom:0}
.grid tbody tr:hover{background:var(--panel2)}
.grid.sub{margin:0}
.mono{font-family:"IBM Plex Mono",monospace}

/* telco 구분행 */
.telco-sep td{background:var(--panel2);padding:6px 12px;border-top:2px solid var(--line);cursor:pointer;user-select:none}
.telco-sep td:hover{background:var(--line)}
.tsep-name{font-weight:600;font-size:13px;margin-right:8px}
.tsep-count{font-family:"IBM Plex Mono",monospace;font-size:11px;color:var(--muted);margin-left:6px}
.tsep-toggle{float:right;color:var(--muted);font-size:12px}

/* ── SSL 테이블 고정 컬럼 너비 ──
   table-layout:fixed → 모든 col에 width 지정 시 브라우저가 비율대로 스케일
   합계 970px 기준: 1360px 화면에서 약 1.4배 스케일 적용됨               */
.ssl-grid{table-layout:fixed;min-width:900px}
.ssl-grid th,.ssl-grid td{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}
.col-sev  {width:76px}
.col-cust {width:115px}
.col-domain{width:230px}   /* 명시적 너비 — 비율 고정 */
.col-exp  {width:88px}
.col-days {width:58px}
.col-ip   {width:80px}
.col-chk  {width:108px}    /* MM/DD HH:MM 충분히 표시 */
.col-ops  {width:215px}

/* ── 페이지네이션 ── */
.ssl-pager{display:flex;align-items:center;justify-content:center;gap:6px;padding:16px 0}
.ssl-pager-btn{background:var(--panel);border:1px solid var(--line);color:var(--txt);
  padding:5px 12px;border-radius:7px;font-size:13px;cursor:pointer;font-family:inherit}
.ssl-pager-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}
.ssl-pager-btn:disabled{opacity:.35;cursor:default}
.ssl-pager-btn.active{background:var(--accent);border-color:var(--accent);color:#fff}
.ssl-pager-info{font-size:12px;color:var(--muted);padding:0 8px;white-space:nowrap}

/* ── 배지 ── */
.badge{display:inline-block;padding:3px 8px;border-radius:20px;font-size:11px;font-weight:600;
  font-family:"IBM Plex Mono",monospace;white-space:nowrap}
.b-expired{background:rgba(164,14,38,.1);color:#a40e26}
.b-urgent{background:rgba(207,34,46,.1);color:#cf222e}
.b-danger{background:rgba(188,76,0,.1);color:#bc4c00}
.b-warning{background:rgba(154,103,0,.1);color:#9a6700}
.b-notice{background:rgba(26,127,55,.1);color:#1a7f37}
.b-safe{background:rgba(26,127,55,.1);color:#1a7f37}
.b-mismatch{background:rgba(130,80,223,.1);color:#8250df}
.b-fail{background:rgba(110,118,129,.12);color:#57606a}
.b-unknown{background:rgba(110,118,129,.12);color:#57606a}
.pill{font-size:11px;padding:2px 7px;border-radius:5px;border:1px solid var(--line);color:var(--muted)}
.pill.paused{color:#9a6700;border-color:rgba(154,103,0,.35)}
.pill.excluded{color:#8250df;border-color:rgba(130,80,223,.3)}
.anomaly-dot{color:var(--urgent);font-weight:700;cursor:pointer}
.ipcount{cursor:pointer;text-decoration:underline dotted;text-underline-offset:3px}

/* ── 행 버튼 ── */
.ops{display:flex;gap:4px;flex-wrap:nowrap;justify-content:flex-end;white-space:nowrap}
.ops button{background:transparent;border:1px solid var(--line);color:var(--muted);
  padding:3px 9px;border-radius:6px;font-size:12px;white-space:nowrap}
.ops button:hover{color:var(--txt);border-color:var(--muted)}
.ops .danger-btn{color:var(--urgent)}
.ops .danger-btn:hover{border-color:rgba(207,34,46,.4)}

/* ── URL Check ── */
.url-toolbar{display:flex;align-items:center;gap:8px;margin-bottom:12px}
.row-disabled{opacity:.45}
.btn-primary{background:var(--accent);color:#fff;border:0;border-radius:6px;
  padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;font-family:inherit}
.btn-primary:hover{filter:brightness(1.12)}
.btn-primary:disabled{opacity:.5;cursor:default}
.b-ok{background:rgba(0,200,81,.15);color:var(--safe);border-color:rgba(0,200,81,.25)}
.b-muted{background:var(--panel2);color:var(--muted);border-color:var(--line)}
/* URL 테이블 버튼 셀 — flex가 행 높이 뒤트는 것 방지 */
.url-act{display:flex;gap:4px;justify-content:flex-end;white-space:nowrap}

/* ── 모달 ── */
.modal,.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.72);display:grid;place-items:center;z-index:20;backdrop-filter:blur(3px)}
.modal-box{background:var(--panel);border:1px solid var(--line);border-radius:12px;
  width:min(860px,92vw);max-height:88vh;display:flex;flex-direction:column}
.modal-box.sm{width:min(420px,88vw)}
.modal-head{display:flex;justify-content:space-between;align-items:center;flex-shrink:0;
  padding:14px 18px;border-bottom:1px solid var(--line)}
.modal-head h3,.modal-head .modal-title{margin:0;font-size:15px;font-weight:600;color:var(--txt)}
.modal-head button,.modal-close{background:transparent;border:0;color:var(--muted);font-size:18px;
  cursor:pointer;line-height:1;padding:2px 4px;border-radius:4px}
.modal-head button:hover,.modal-close:hover{color:var(--txt);background:var(--panel2)}
.modal-body{padding:18px;overflow-y:auto;flex:1;min-height:0}
.form{display:flex;flex-direction:column;gap:12px;padding:18px}
.form label{display:block;font-size:12px;font-weight:500;color:var(--muted)}
.form label.row{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--txt)}
.form input:not([type=checkbox]):not([type=radio]),.form select,.form textarea{display:block;margin-top:5px;background:var(--bg);border:1px solid var(--line);color:var(--txt);
  padding:8px 10px;border-radius:7px;width:100%;box-sizing:border-box;font-size:13px;font-family:inherit}
.form input:not([type=checkbox]):not([type=radio]):focus,.form select:focus,.form textarea:focus{outline:none;border-color:var(--accent)}
.form button{background:var(--accent);border:0;color:#fff;padding:10px;border-radius:7px;font-weight:600}
.form-2col{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.form-row-inline{display:flex;align-items:center;gap:8px}
.form-row-inline input{flex:0 0 auto}
.form-footer{display:flex;justify-content:flex-end;gap:8px;padding:14px 18px;
  border-top:1px solid var(--line);flex-shrink:0}
/* ── fld: label-above-input 필드 (label 안 flex 버그 없는 안전한 구조) ── */
.fld{display:flex;flex-direction:column;gap:5px}
.fld-label{font-size:12px;font-weight:500;color:var(--muted);display:flex;align-items:center;gap:4px}
.fld-hint{font-size:11px;font-weight:400;color:var(--muted)}
.fld-req{color:var(--urgent);font-size:12px}
.fld input,.fld select,.fld textarea{background:var(--bg);border:1px solid var(--line);color:var(--txt);
  padding:8px 10px;border-radius:7px;width:100%;box-sizing:border-box;font-size:13px;font-family:inherit}
.fld textarea{resize:vertical;min-height:60px;line-height:1.5}
.fld input:focus,.fld select:focus,.fld textarea:focus{outline:none;border-color:var(--accent)}
.fld-2col{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.fld-inline{display:flex;align-items:center;gap:6px}
.fld-inline input{flex:0 0 auto}
.fld-sep{border:0;border-top:1px solid var(--line);margin:4px 0}
.fld-check{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--txt);cursor:pointer}
.fld-check input[type=checkbox]{width:auto;accent-color:var(--accent)}
.modal .grid{border-radius:0;border:0}

/* ── 대시보드 심각도 요약 ── */
.sev-summary{display:flex;flex-wrap:wrap;gap:5px;padding:6px 0 2px}

/* ── 알림 단계 박스 ── */
.alert-level-box{border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;
  display:flex;flex-direction:column;gap:8px}
.alert-level-box.warn-box{border-color:rgba(154,103,0,.3);background:rgba(154,103,0,.04)}
.alert-level-box.urgent-box{border-color:rgba(209,36,47,.25);background:rgba(209,36,47,.04)}
.alert-level-title{font-size:12px;font-weight:600;color:var(--muted)}

/* ── 설정 ── */
.settings-layout{display:grid;grid-template-columns:160px 1fr;gap:16px;align-items:start}
.settings-sidebar{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
.settings-tab{display:block;width:100%;padding:10px 14px;background:transparent;border:0;
  border-bottom:1px solid var(--line);text-align:left;color:var(--muted);font-size:13px;font-family:inherit;cursor:pointer}
.settings-tab:last-child{border-bottom:0}
.settings-tab:hover{color:var(--txt);background:var(--panel2)}
.settings-tab.active{color:var(--txt);background:var(--panel2);font-weight:600}
.settings-content{display:flex;flex-direction:column;gap:0}
.settings-section{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  padding:20px;display:flex;flex-direction:column;gap:12px}
.settings-section.wide{width:100%}
.settings-section h3{margin:0;font-size:15px}
.settings-sub-h{margin:4px 0 0;font-size:13px;font-weight:600;color:var(--txt)}
.settings-divider{border:0;border-top:1px solid var(--line);margin:4px 0}
.settings-desc{font-size:12px;color:var(--muted);margin:0}
.s-label{display:flex;flex-direction:column;gap:5px;font-size:13px;color:var(--muted)}
.settings-section > label{display:flex;flex-direction:column;gap:5px;font-size:13px;color:var(--muted)}
.settings-section textarea,.settings-section input[type=file]{
  background:var(--bg);border:1px solid var(--line);color:var(--txt);
  padding:9px 10px;border-radius:7px;font-size:13px;width:100%;resize:vertical}
.settings-section > label input{background:var(--bg);border:1px solid var(--line);color:var(--txt);
  padding:9px 10px;border-radius:7px;font-size:13px}
.settings-section textarea:focus,
.settings-section > label input:focus{outline:none;border-color:var(--accent)}
.settings-section > button{background:var(--accent);border:0;color:#fff;
  padding:9px 18px;border-radius:7px;font-weight:600;align-self:flex-start}

/* ── Solrtmp 서브탭 ── */
.sub-tabs{display:flex;gap:3px;margin-bottom:16px;
  border-bottom:1px solid var(--line);padding-bottom:0}
.sub-tab{background:transparent;border:0;border-bottom:2px solid transparent;
  color:var(--muted);padding:8px 14px;font-size:13px;font-weight:500;
  cursor:pointer;font-family:inherit;margin-bottom:-1px}
.sub-tab:hover{color:var(--txt)}
.sub-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}
.stab-pane{}

/* ── Solrtmp 상태 테이블 ── */
.solrtmp-grid{min-width:720px}
.col-st-svc  {width:72px;word-break:break-word}
.col-st-alias{width:170px}
.col-st-srv  {width:140px}
.col-st-chk  {width:140px}
.col-st-time {width:80px}
.solrtmp-grid td,.solrtmp-grid th{padding:8px 10px;font-size:12px;vertical-align:middle}
.sdm-cell:hover{background:var(--panel2)}

/* 상세 모달 내부 */
.sdm-item{border:1px solid var(--line);border-radius:8px;padding:12px 14px;margin-bottom:10px}
.sdm-item-head{display:flex;align-items:center;gap:4px;margin-bottom:8px;flex-wrap:wrap}
.sdm-row{display:grid;grid-template-columns:110px 1fr;gap:6px;margin-bottom:5px;font-size:12px;align-items:start}
.sdm-row b{color:var(--muted);font-weight:500}
.sdm-row code{font-family:"IBM Plex Mono",monospace;font-size:11px;word-break:break-all;
  background:var(--bg);padding:2px 5px;border-radius:4px;border:1px solid var(--line)}

/* ── 플레이스홀더 ── */
.placeholder-page{display:flex;flex-direction:column;align-items:center;justify-content:center;
  min-height:60vh;gap:14px;color:var(--muted)}
.placeholder-icon{font-size:48px;opacity:.3}
.placeholder-page h2{margin:0;font-size:20px;color:var(--txt)}
.placeholder-page p{margin:0;font-size:14px}

.empty{text-align:center;color:var(--muted);padding:32px}

/* 도메인 행 고객사/메모 */
.row-sub{font-size:11px;margin-top:3px;display:flex;gap:5px;flex-wrap:wrap;align-items:center}
.row-customer{color:var(--accent);font-weight:500}
.row-note{color:var(--muted)}
.ch-count{font-family:"IBM Plex Mono",monospace;font-size:12px;color:var(--muted);white-space:nowrap}

/* ── 배경 경보 오버레이 ── */
#bg-alert-overlay{position:fixed;inset:0;pointer-events:none;opacity:0}
@keyframes bgAlertUrgent{
  0%,100%{opacity:0}
  50%{opacity:.18}
}
@keyframes bgAlertWarn{
  0%,100%{opacity:0}
  50%{opacity:.14}
}
body.alert-urgent #bg-alert-overlay{background:var(--urgent);animation:bgAlertUrgent 2s ease-in-out infinite}
body.alert-warn   #bg-alert-overlay{background:var(--warning);animation:bgAlertWarn  3s ease-in-out infinite}

/* ── 토스트 ── */
.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);
  background:var(--txt);color:var(--panel);
  padding:10px 18px;border-radius:8px;z-index:30;box-shadow:0 10px 30px rgba(0,0,0,.15)}
