/* ============================================================
   MOPS · Components (vanilla CSS)
   ------------------------------------------------------------
   tokens.css 뒤에 로드하세요.
   모든 값은 var(--*) 토큰만 참조 → 테마·밀도가 코드 수정 없이 적용.
   여백은 calc(px * var(--u)), 글자는 calc(px * var(--f)) 로 밀도 반응.
   클래스명이 충돌하면 프로젝트에서 `mops-` 접두어를 붙여 쓰세요.
   ============================================================ */

/* ── Base ── */
.mops, body.mops {
  font-family:var(--font-sans);
  background:var(--bg);
  color:var(--fg);
  -webkit-font-smoothing:antialiased;
  letter-spacing:var(--tracking-body);
}
.mops *, .mops *::before, .mops *::after { box-sizing:border-box; }
.prose { line-height:1.65; word-break:keep-all; }

/* ── Eyebrow · mono 라벨 ── */
.eyebrow {
  font-family:var(--font-mono);
  font-size:calc(11px * var(--f));
  letter-spacing:0.08em;
  color:var(--fg-subtle);
}

/* ── Card ── */
.card {
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--r-lg);
  padding:calc(20px * var(--u));
  box-shadow:var(--shadow-sm);
}
.card--hover { transition:transform var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out); }
.card--hover:hover { transform:translateY(-2px); box-shadow:var(--shadow-md); }

/* ── Glass surface ── (배경 있는 영역용; data-bg="off" 조상이면 solid) */
.glass {
  background:var(--surface-glass);
  -webkit-backdrop-filter:blur(var(--blur-glass));
  backdrop-filter:blur(var(--blur-glass));
  border:1px solid var(--surface-glass-border);
  border-radius:var(--r-lg);
  padding:calc(16px * var(--u));
}

/* ── Button ── */
.btn {
  font-family:var(--font-sans);
  font-size:calc(14px * var(--f));
  font-weight:600;
  letter-spacing:-0.01em;
  white-space:nowrap;
  padding:calc(9px * var(--u)) calc(16px * var(--u));
  border-radius:var(--r-md);
  border:1px solid transparent;
  cursor:pointer;
  display:inline-flex;
  align-items:center;
  gap:7px;
  transition:background var(--dur) var(--ease-out), border-color var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out);
}
.btn:focus-visible { outline:2px solid var(--accent); outline-offset:2px; }
.btn--primary   { color:var(--accent-fg); background:var(--accent-strong); border-color:var(--accent-strong); box-shadow:var(--shadow-sm); }
.btn--primary:hover { background:var(--accent-hover); border-color:var(--accent-hover); }
.btn--secondary { color:var(--fg); background:var(--surface-2); border-color:var(--border-strong); }
.btn--secondary:hover { border-color:var(--fg-subtle); }
.btn--ghost     { color:var(--fg-muted); background:transparent; border-color:var(--border); }
.btn--ghost:hover { color:var(--fg); border-color:var(--border-strong); }
.btn--danger    { color:var(--error); background:color-mix(in srgb, var(--error) 10%, transparent); border-color:color-mix(in srgb, var(--error) 35%, transparent); }
.btn--danger:hover { background:color-mix(in srgb, var(--error) 16%, transparent); }
.btn--sm   { font-size:calc(13px * var(--f)); padding:calc(7px * var(--u)) calc(13px * var(--u)); }
.btn--icon { padding:calc(8px * var(--u)); color:var(--fg-muted); background:var(--surface-2); border-color:var(--border); }
.btn[disabled], .btn:disabled { opacity:0.55; cursor:not-allowed; color:var(--fg-subtle); background:var(--surface-2); border-color:var(--border); box-shadow:none; }

/* ── Input ── */
.input {
  width:100%;
  font-family:var(--font-sans);
  font-size:calc(14px * var(--f));
  color:var(--fg);
  background:var(--surface-2);
  border:1px solid var(--border-strong);
  border-radius:var(--r-md);
  padding:calc(10px * var(--u)) calc(12px * var(--u));
  outline:none;
  transition:border-color var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out);
}
.input::placeholder { color:var(--fg-subtle); }
.input:focus { border-color:var(--accent); box-shadow:0 0 0 3px var(--accent-soft); }
.input-group { position:relative; }
.input-group > .input { padding-left:36px; }
.input-group > .input-icon {
  position:absolute; left:12px; top:50%; transform:translateY(-50%);
  width:16px; height:16px; color:var(--fg-subtle); pointer-events:none;
}

/* ── Chip / filter ── */
.chip {
  font-family:var(--font-mono);
  font-size:calc(12px * var(--f));
  font-weight:500;
  white-space:nowrap;
  padding:4px 11px;
  border-radius:var(--r-pill);
  cursor:pointer;
  color:var(--fg-muted);
  background:var(--surface-2);
  border:1px solid var(--border);
}
.chip--active { color:var(--accent-fg); background:var(--accent-strong); border-color:var(--accent-strong); }

/* ── Badge · 상태색 ──
   상태 컬러는 --c 로 주입; up/warning/down/unknown 매핑 */
.badge {
  --c:var(--fg-subtle);
  display:inline-flex;
  align-items:center;
  gap:6px;
  padding:3px 10px;
  border-radius:var(--r-pill);
  font-family:var(--font-mono);
  font-size:calc(12px * var(--f));
  font-weight:600;
  letter-spacing:0.02em;
  white-space:nowrap;
  color:var(--c);
  background:color-mix(in srgb, var(--c) 14%, transparent);
  border:1px solid color-mix(in srgb, var(--c) 30%, transparent);
}
.badge::before { content:""; width:6px; height:6px; border-radius:50%; background:var(--c); flex:0 0 auto; }
.badge--up,      .badge--success { --c:var(--success); }
.badge--warning                  { --c:var(--warning); }
.badge--down,    .badge--error   { --c:var(--error); }
.badge--info                     { --c:var(--info); }
.badge--unknown                  { --c:var(--fg-subtle); }

/* ── KPI tile ── (.card 와 함께 사용) */
.kpi__label { display:flex; align-items:center; justify-content:space-between; }
.kpi__label .eyebrow { letter-spacing:0.06em; }
.kpi__value { font-size:calc(30px * var(--f)); font-weight:600; letter-spacing:var(--tracking-tight); color:var(--fg); margin-top:8px; }
.kpi__meta  { display:flex; align-items:center; gap:5px; margin-top:6px; }
.kpi__delta {
  --c:var(--success);
  display:inline-flex; align-items:center; gap:2px;
  font-family:var(--font-mono); font-size:calc(12px * var(--f)); font-weight:600;
  color:var(--c); background:color-mix(in srgb, var(--c) 12%, transparent);
  padding:1px 7px; border-radius:var(--r-pill);
}
.kpi__delta--bad { --c:var(--error); }
.kpi__foot { font-size:calc(11px * var(--f)); color:var(--fg-subtle); }

/* ── Data table ── */
.data-table { background:var(--surface); border:1px solid var(--border); border-radius:var(--r-lg); box-shadow:var(--shadow-sm); overflow-x:auto; }
.data-table__inner { min-width:600px; }
.dt-head, .dt-row { display:flex; align-items:center; gap:12px; }
.dt-head {
  padding:calc(11px * var(--u)) 20px;
  font-family:var(--font-mono); font-size:calc(11px * var(--f)); letter-spacing:0.06em;
  color:var(--fg-subtle); background:var(--surface-2); border-bottom:1px solid var(--border);
}
.dt-row { padding:calc(13px * var(--u)) 20px; border-top:1px solid var(--border); }
.dt-row:first-child { border-top:none; }
.dt-row--hover { transition:background var(--dur) var(--ease-out); cursor:pointer; }
.dt-row--hover:hover { background:var(--surface-2); }
.dt-cell { font-size:calc(13px * var(--f)); color:var(--fg-muted); min-width:0; }
.dt-cell--mono { font-family:var(--font-mono); font-size:calc(12px * var(--f)); }
.dt-cell--strong { color:var(--fg); }
.dt-cell--right { text-align:right; }

/* ── Tabs ── */
.tabs { display:flex; gap:4px; border-bottom:1px solid var(--border); }
.tab {
  padding:calc(9px * var(--u)) calc(16px * var(--u));
  font-family:var(--font-sans); font-size:calc(14px * var(--f)); font-weight:500;
  border:none; border-bottom:2px solid transparent; margin-bottom:-1px;
  background:transparent; color:var(--fg-subtle); cursor:pointer;
  transition:color var(--dur) var(--ease-out);
}
.tab:hover { color:var(--fg-muted); }
.tab--active { color:var(--fg); border-bottom-color:var(--accent); }

/* ── Sidebar nav ── */
.nav { display:flex; flex-direction:column; gap:2px; }
.nav__item {
  display:flex; align-items:center; gap:11px;
  padding:calc(10px * var(--u)) calc(12px * var(--u));
  border-radius:var(--r-md);
  font-size:calc(14px * var(--f)); font-weight:500;
  color:var(--fg-muted); background:transparent; cursor:pointer;
  transition:background var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.nav__item:hover { background:var(--surface-2); color:var(--fg); }
.nav__item--active { color:var(--accent); background:var(--accent-soft); font-weight:600; }
.nav__item > .nav__label { flex:1; }
.nav__count {
  font-family:var(--font-mono); font-size:calc(11px * var(--f)); color:var(--fg-subtle);
  background:var(--surface-2); border:1px solid var(--border);
  padding:1px 7px; border-radius:var(--r-pill);
}

/* ── Toast / alert ── */
.toast {
  --c:var(--accent);
  display:flex; align-items:center; gap:12px;
  padding:calc(12px * var(--u)) calc(14px * var(--u));
  background:var(--surface-2);
  border:1px solid color-mix(in srgb, var(--c) 30%, transparent);
  border-radius:var(--r-lg);
  box-shadow:var(--shadow-md);
  animation:mops-fade-up var(--dur) var(--ease-out);
}
.toast--success { --c:var(--success); }
.toast--warning { --c:var(--warning); }
.toast--error   { --c:var(--error); }
.toast__icon {
  width:30px; height:30px; border-radius:8px; flex:0 0 auto;
  display:flex; align-items:center; justify-content:center;
  color:var(--c); background:color-mix(in srgb, var(--c) 16%, transparent);
}
.toast__body { flex:1; min-width:0; }
.toast__title { font-size:calc(13px * var(--f)); font-weight:600; color:var(--fg); }
.toast__desc  { font-size:calc(12px * var(--f)); color:var(--fg-muted); margin-top:2px; }
.toast__close { padding:4px; background:transparent; border:none; color:var(--fg-subtle); cursor:pointer; display:inline-flex; }

/* ── Modal ── */
.modal-scrim {
  position:fixed; inset:0; z-index:60;
  background:rgba(2,6,20,0.6);
  -webkit-backdrop-filter:blur(4px); backdrop-filter:blur(4px);
  display:flex; align-items:center; justify-content:center; padding:24px;
  animation:mops-fade-up var(--dur) var(--ease-out);
}
.modal {
  width:100%; max-width:440px;
  background:var(--surface); border:1px solid var(--border);
  border-radius:var(--r-xl); box-shadow:var(--shadow-lg);
  padding:calc(24px * var(--u));
}
.modal__header { display:flex; gap:calc(14px * var(--u)); align-items:flex-start; }
.modal__title { margin:0; font-size:18px; font-weight:600; color:var(--fg); letter-spacing:var(--tracking-tight); }
.modal__desc  { margin:8px 0 0; font-size:14px; color:var(--fg-muted); line-height:1.6; word-break:keep-all; }
.modal__foot  { display:flex; gap:calc(10px * var(--u)); justify-content:flex-end; margin-top:calc(24px * var(--u)); }

/* ── Sticky top bar ── */
.topbar {
  position:sticky; top:0; z-index:20;
  height:56px; display:flex; align-items:center; gap:14px; padding:0 24px;
  background:var(--surface-glass);
  -webkit-backdrop-filter:blur(12px); backdrop-filter:blur(12px);
  border-bottom:1px solid var(--border);
}

/* ── Icon stroke (lucide) ── */
[data-lucide] { stroke-width:1.5; }
