/* ============================================================
 * KDCA 공통 컴포넌트 (components.css) — 2026-05-31
 * 페이지별 CSS 이전에 로드되는 공통 디자인 레이어.
 * 토큰(base/tokens.css)만 사용. 페이지별 CSS가 차이만 오버라이드.
 * kp- 프리픽스 컴포넌트의 정본(canonical) 정의.
 * 기존 page CSS 가 동일 셀렉터를 뒤에서 재정의하면 그쪽이 우선(무회귀).
 * ============================================================ */

/* ---- 페이지 헤더 ---- */
.kp-page-header{
  display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:12px;
  margin-bottom:20px; padding-bottom:14px;
  border-bottom:1px solid var(--kdca-border, #e8eaed);
}
.kp-page-header h1, .kp-page-title{
  margin:0; font-size:var(--kdca-text-2xl, 24px); font-weight:var(--kdca-fw-extra, 800);
  color:var(--kdca-text, #20242a);
}
.kp-page-sub{ color:var(--kdca-text-muted, #6c7177); font-size:var(--kdca-text-sm, 13px); margin:4px 0 0; }
.kp-hero{
  border-radius:var(--kdca-radius, 12px); padding:22px 24px; margin-bottom:20px; color:#fff;
  background:var(--kdca-grad-brand, linear-gradient(135deg,#e41b45,#b8163a));
  box-shadow:var(--kdca-shadow-md, 0 4px 16px rgba(0,0,0,.08));
}

/* ---- 카드 ---- */
.kp-card{
  background:var(--kdca-surface, #fff); border:1px solid var(--kdca-border, #e8eaed);
  border-radius:var(--kdca-radius, 12px); padding:18px 20px; margin-bottom:14px;
  box-shadow:var(--kdca-shadow-md, 0 2px 8px rgba(0,0,0,.05));
}
.kp-card-title{ font-size:var(--kdca-text-lg, 16px); font-weight:var(--kdca-fw-bold, 700); color:var(--kdca-text,#20242a); margin:0 0 12px; }

/* ---- 통계 칩 ---- */
.kp-stat-grid{ display:grid; grid-template-columns:repeat(auto-fit, minmax(120px,1fr)); gap:12px; margin-bottom:16px; }
.kp-stat{
  background:var(--kdca-surface,#fff); border:1px solid var(--kdca-border,#e8eaed);
  border-radius:var(--kdca-radius-sm, 8px); padding:14px 16px; text-align:center;
}
.kp-stat .num{ font-size:var(--kdca-text-2xl, 24px); font-weight:var(--kdca-fw-extra, 800); color:var(--kdca-red, #e41b45); line-height:1.1; }
.kp-stat .lbl{ font-size:var(--kdca-text-xs, 12px); color:var(--kdca-text-muted, #6c7177); margin-top:5px; }

/* ---- 리스트 ---- */
.kp-list{ list-style:none; margin:0; padding:0; }
.kp-list-item{
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  padding:13px 4px; border-bottom:1px solid var(--kdca-border, #eef0f3);
}
.kp-list-item:last-child{ border-bottom:0; }

/* ---- 테이블 ---- */
.kp-table{ width:100%; border-collapse:collapse; font-size:var(--kdca-text-sm, 13px); background:var(--kdca-surface,#fff); }
.kp-table th, .kp-table td{ border-bottom:1px solid var(--kdca-border, #eef0f3); padding:10px 12px; text-align:left; }
.kp-table th{ background:var(--kdca-bg, #f7f8fa); font-weight:var(--kdca-fw-bold, 700); color:var(--kdca-text,#20242a); }

/* ---- 폼 ---- */
.kp-field{ margin-bottom:14px; }
.kp-label{ display:block; font-size:var(--kdca-text-xs, 12px); color:var(--kdca-text-muted, #6c7177); margin-bottom:6px; font-weight:var(--kdca-fw-medium, 500); }
.kp-input, .kp-select, .kp-textarea{
  width:100%; padding:11px 13px; border:1px solid var(--kdca-border, #e8eaed);
  border-radius:var(--kdca-radius-sm, 6px); font-size:var(--kdca-text-base, 14px); color:var(--kdca-text, #20242a);
  background:var(--kdca-surface,#fff); transition:border-color .15s, box-shadow .15s;
}
.kp-input:focus, .kp-select:focus, .kp-textarea:focus{
  outline:0; border-color:var(--kdca-red, #e41b45); box-shadow:0 0 0 3px rgba(228,27,69,.12);
}

/* ---- 버튼 ---- */
.kp-btn{
  display:inline-flex; align-items:center; justify-content:center; gap:6px;
  padding:11px 18px; border:1px solid transparent; border-radius:var(--kdca-radius-sm, 6px);
  font-size:var(--kdca-text-base, 14px); font-weight:var(--kdca-fw-bold, 700); cursor:pointer;
  text-decoration:none; transition:background .15s, box-shadow .15s, opacity .15s; line-height:1.2;
}
.kp-btn-primary{ background:var(--kdca-grad-brand, linear-gradient(135deg,#e41b45,#b8163a)); color:#fff; box-shadow:0 4px 12px rgba(228,27,69,.28); }
.kp-btn-primary:hover{ opacity:.93; color:#fff; }
.kp-btn-outline{ background:transparent; border-color:var(--kdca-border, #d6dae0); color:var(--kdca-text, #20242a); }
.kp-btn-outline:hover{ border-color:var(--kdca-red, #e41b45); color:var(--kdca-red, #e41b45); }
.kp-btn-sm{ padding:7px 13px; font-size:var(--kdca-text-sm, 13px); }
.kp-btn-block{ width:100%; }

/* ---- 배지 ---- */
.kp-badge{ display:inline-block; border-radius:var(--kdca-radius-pill, 30px); padding:2px 10px; font-size:var(--kdca-text-xs, 12px); font-weight:var(--kdca-fw-bold, 700); }
.kp-badge-ok{ background:#e7f5ec; color:#1e7d4f; }
.kp-badge-warn{ background:#fff5e6; color:#9a6700; }
.kp-badge-danger{ background:#fdecef; color:#b00020; }
.kp-badge-info{ background:#eef2fb; color:#2c54a0; }
.kp-badge-muted{ background:#f1f3f5; color:#868e96; }

/* ---- 메시지/알림 ---- */
.kp-msg{ border-radius:var(--kdca-radius-sm, 6px); padding:12px 16px; font-size:var(--kdca-text-sm, 13px); margin-bottom:14px; border:1px solid transparent; }
.kp-msg-ok{ background:#f0fbf5; color:#0b6e3a; border-color:#cdeedd; }
.kp-msg-warn{ background:#fff8e6; color:#8a6100; border-color:#ffe6a8; }
.kp-msg-danger{ background:#fdecef; color:#b00020; border-color:#f8c6cf; }
.kp-msg-info{ background:#eef2fb; color:#234a8a; border-color:#cdd9f0; }

/* ---- 툴바 ---- */
.kp-toolbar{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:14px; }
.kp-toolbar .spacer{ flex:1; }

/* ---- 빈 상태 ---- */
.kp-empty{ text-align:center; padding:40px 20px; color:var(--kdca-text-muted, #9aa0a6); font-size:var(--kdca-text-sm, 13px); }
.kp-empty i{ font-size:32px; display:block; margin-bottom:10px; opacity:.5; }
