/* ============================================================
   Staffing — 사무소 관리자 웹
   ------------------------------------------------------------
   지면은 회색, 카드는 흰색. 그레이는 푸른기가 있는 게 정상이다.
   목표는 "한 화면에 최대한 많은 정보" — 여백으로 고급스럽게 만들지 않는다.
   줄이는 것은 여백이지 글자가 아니다.

   ※ 회원용(근로자 앱·업체 포털)과는 다른 디자인 시스템이다.
      한쪽 규칙을 다른 쪽에 적용하지 않는다.
   ※ --primary 4색은 사무소가 「기본색깔설정」에서 바꾼다. head 에서 덮어쓴다.
   ============================================================ */

/* 글꼴 — 전에는 이름(Pretendard)만 적고 파일을 안 불러와 PC마다 맑은 고딕·Noto 로 달리 보였다.
   외부 CDN 에 기대지 않고 직접 둔다(SIL OFL). 한 벌 2MB 대신 글자 구간별 조각이라
   브라우저는 화면에 실제 나온 글자 구간만 받는다. */
@import url("../fonts/pretendard.css");

:root{
  /* 브랜드 — 사무소가 바꾸는 값 */
  --primary:#1B54C7; --primary-dark:#123F9C; --primary-tint:#EEF3FD; --navy:#16233A;

  /* 상태 — 브랜드와 무관하게 고정 */
  --ok:#0E8A59; --ok-bg:#12A56A; --ok-tint:#E4F5EC;
  --warn:#B0700B; --warn-tint:#FEF5E3;
  --danger:#DC3B32; --danger-tint:#FCEBEA;

  /* 미수 연령 — 연체 다섯 단계는 한 색상군의 농도 변화. 무지개가 되면 안 된다.
     '기한 전'(--age-nd)만 색상군 밖의 중립 회색이다 — 문제가 아니라 정상 채권이므로
     빨강 계열에 섞이면 안 된다. 밝은 트랙(#F6F8FA) 위에 얹히므로 첫 단계도 눈에 보여야 한다. */
  --age-nd:#9AA6B2;
  --age-0:#EFC2BB; --age-1:#E4A199; --age-2:#D9726A; --age-3:#C4483D; --age-4:#A32B20;

  --bg:#EEF1F4; --surface:#FFF; --surface-2:#F6F8FA;
  --line:#E3E7EB; --line-strong:#D3D9DF;
  --ink:#1B2733; --ink-2:#3C4956; --muted:#697682; --subtle:#98A2AD;

  /* 폭은 넣을 내용의 길이다 — 이 규칙은 폼 입력에만 있는 게 아니다.
     가장 긴 라벨이 「입금 · 미수금」·「통계 · 리포트」로 14px 기준 약 97px 이고,
     여백 14 + 라벨 97 + 간격 11 + 배지 34 + 여백 14 + 활성바 3 = 173px 이다.
     224px 은 그만큼을 매 화면에서 비워 두고 있었다 — 표가 열 하나를 더 못 쓰는 값이다. */
  --sbw:180px; --tbh:56px; --pvh:34px; --r:8px; --r-sm:6px;
  --shadow:0 1px 3px rgba(16,32,48,.08);
  --sans:'Pretendard','Apple SD Gothic Neo','Noto Sans KR',system-ui,-apple-system,sans-serif;
}

*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:13px;line-height:1.5;
  -webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%}
a{color:inherit;text-decoration:none}
button{font-family:inherit}
h1,h2,h3,h4{margin:0}
p{margin:0}
table{border-collapse:collapse}
img{max-width:100%}
[hidden]{display:none!important}

/* ── 본사 대리 열람 배너 ──────────────────────────
   본사 직원이 남의 사무소 화면을 보고 있다는 사실을 숨기지 않는다.
   이 줄이 없으면 본인의 본사 콘솔로 착각한 채 조작하게 된다.
   빨강은 이 제품에서 「지금 잘못되고 있다」는 뜻이라 여기 쓴다. */
.pv-bar{position:fixed;top:0;left:0;right:0;height:var(--pvh);z-index:40;
  display:flex;align-items:center;gap:12px;padding:0 20px;
  background:var(--danger);color:#fff;font-size:12.5px;font-weight:700}
.pv-bar b{font-weight:900;letter-spacing:-.2px}
.pv-bar .pv-why{opacity:.85;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pv-bar form{margin-left:auto}
.pv-bar button{background:rgba(255,255,255,.16);color:#fff;border:1px solid rgba(255,255,255,.45);
  border-radius:var(--r-sm);padding:3px 11px;font-size:12px;font-weight:800;cursor:pointer}
.pv-bar button:hover{background:rgba(255,255,255,.28)}
body.pv-on .topbar{top:var(--pvh)}
body.pv-on .sidebar{top:calc(var(--tbh) + var(--pvh))}
body.pv-on .main{padding-top:calc(var(--tbh) + var(--pvh))}

/* ── 날씨 ─────────────────────────────────────────
   시간대 다섯 칸. 「나쁜」 칸만 색이 들어온다 —
   다섯 개가 다 빨가면 아무것도 경고하지 않는 것과 같다. */
.wx{display:grid;grid-template-columns:repeat(6,1fr);gap:1px;background:var(--line);
  border-top:1px solid var(--line)}
.wxs{background:#fff;padding:11px 14px;display:flex;flex-direction:column;gap:2px}
.wxs.bad{background:var(--danger-tint)}
.wxl{font-size:11.5px;font-weight:800;color:var(--subtle);letter-spacing:.3px}
.wxl .wxd{font-weight:700;color:var(--subtle);opacity:.75;margin-left:2px}
.wxs.bad .wxl{color:var(--danger)}
.wxi{font-size:22px;line-height:1.15}
.wxt{font-size:13px;font-weight:800;color:var(--ink)}
.wxm{display:flex;gap:9px;font-size:12.5px;font-weight:700;color:var(--ink-2);
  font-variant-numeric:tabular-nums}
.wxf{font-size:11.5px;color:var(--muted);font-variant-numeric:tabular-nums}
@media (max-width:1100px){.wx{grid-template-columns:repeat(2,1fr)}}

/* ── 상단바 : 전체 너비 고정 ─────────────────────── */
.topbar{position:fixed;top:0;left:0;right:0;height:var(--tbh);background:#fff;
  border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;
  padding:0 20px;z-index:30}
.tb-left{display:flex;align-items:center;gap:12px;min-width:0}
.logo{font-weight:900;font-size:19px;letter-spacing:-.6px;white-space:nowrap}
.logo b{color:var(--primary)}
.role-badge{font-size:11.5px;font-weight:800;background:var(--navy);color:#fff;padding:3px 9px;border-radius:5px;white-space:nowrap}
.tenant-badge{font-size:11.5px;font-weight:800;background:var(--primary-tint);color:var(--primary);
  padding:3px 9px;border-radius:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tb-right{display:flex;align-items:center;gap:14px;font-size:13px;color:var(--muted);white-space:nowrap}
.tb-right a:hover{color:var(--primary)}
.tb-right .user{font-weight:700;color:var(--ink)}
.tb-burger{display:none;width:36px;height:36px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:#fff;align-items:center;justify-content:center;font-size:17px;cursor:pointer;color:var(--ink-2)}

/* ── 사이드바 : 흰 배경, 활성 항목 오른쪽 3px 바 ──── */
.sidebar{position:fixed;top:var(--tbh);left:0;bottom:0;width:var(--sbw);background:#fff;
  border-right:1px solid var(--line);overflow-y:auto;padding:8px 0;z-index:20;
  scrollbar-width:thin;scrollbar-color:var(--line-strong) transparent}
.sidebar::-webkit-scrollbar{width:6px}
.sidebar::-webkit-scrollbar-track{background:transparent}
.sidebar::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:3px}
.nav-sec{font-size:11px;font-weight:800;letter-spacing:.6px;color:var(--subtle);
  padding:9px 14px 5px;margin-top:4px;border-top:1px solid var(--line)}
.nav-sec:first-child{border-top:0;margin-top:0}
/* 「본사가 관리하는 것」과 「본사가 지켜보는 것」을 가르는 굵은 선 */
.nav-rule{height:1px;background:var(--line-strong);margin:12px 16px 2px}
.nav-sec.strong{color:var(--ink-2);font-weight:900;border-top:0;margin-top:0}
/* 라벨은 줄바꿈하지 않는다 — 두 줄로 꺾인 메뉴는 목록이 아니라 문단이 된다.
   그래서 메뉴 이름은 여섯 자를 넘기지 않는다(지금 전부 그 안에 있다). */
.nav-item{display:flex;align-items:center;gap:11px;padding:7px 14px;color:var(--ink-2);
  font-size:14px;font-weight:600;border-right:3px solid transparent;white-space:nowrap}
.nav-item:hover{background:var(--surface-2);color:var(--primary)}
.nav-item.active{background:var(--primary-tint);color:var(--primary);border-right-color:var(--primary);font-weight:700}
.nav-item .cnt{margin-left:auto;font-size:11px;font-weight:800;background:var(--danger);color:#fff;
  padding:1px 7px;border-radius:999px;min-width:20px;text-align:center}
.nav-item .cnt.quiet{background:var(--line-strong);color:var(--ink-2)}

/* ── 본문 ──────────────────────────────────────── */
.main{margin-left:var(--sbw);padding-top:var(--tbh)}
.content{padding:20px 24px 60px;max-width:1760px}

.page-head{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.page-head h1{font-size:22px;font-weight:900;letter-spacing:-.7px}
.page-head .sub{font-size:12.5px;color:var(--muted);font-weight:600}
.page-head .right{margin-left:auto;display:flex;gap:8px;align-items:center}

/* ── 통계 타일 : 아이콘칩 + 숫자 / 라벨 + 우측 힌트 ── */
.stats{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-bottom:16px}
.stats.c7{grid-template-columns:repeat(7,1fr)}
.stats.c4{grid-template-columns:repeat(4,1fr)}
.stats.c3{grid-template-columns:repeat(3,1fr)}
.stat{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:14px 15px;box-shadow:var(--shadow);display:block}
a.stat:hover{border-color:var(--primary)}
.stat .row{display:flex;align-items:center;gap:10px}
.stat .chip{width:30px;height:30px;border-radius:999px;display:grid;place-items:center;flex:0 0 auto;
  background:var(--primary-tint);color:var(--primary);font-size:13px;font-weight:900}
.stat .chip.g{background:var(--ok-tint);color:var(--ok)}
.stat .chip.r{background:var(--danger-tint);color:var(--danger)}
.stat .chip.w{background:var(--warn-tint);color:var(--warn)}
.stat .chip.n{background:var(--bg);color:var(--muted)}
.stat .val{font-size:26px;font-weight:900;letter-spacing:-.8px;line-height:1;font-variant-numeric:tabular-nums}
.stat .val small{font-size:13px;font-weight:700;color:var(--muted);margin-left:2px;letter-spacing:0}
.stat .row2{display:flex;align-items:baseline;justify-content:space-between;margin-top:8px;gap:8px}
.stat .lbl{font-size:12.5px;color:var(--muted);font-weight:600}
.stat .hint{font-size:12px;font-weight:800;white-space:nowrap}
.stat .hint.p{color:var(--primary)} .stat .hint.r{color:var(--danger)}
.stat .hint.g{color:var(--ok)} .stat .hint.n{color:var(--subtle);font-weight:600}
.stat.on{border-color:var(--primary);background:var(--primary-tint)}
.stat.on .val{color:var(--primary)}
.stat.alert .val{color:var(--danger)}

/* ── 패널 ──────────────────────────────────────── */
.panel{background:#fff;border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);
  overflow:hidden;margin-bottom:14px}
.panel.fit{width:fit-content;max-width:100%}
.panel-head{display:flex;align-items:center;gap:14px;padding:13px 16px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.panel-head h2{font-size:15px;font-weight:800}
.panel-head .note{font-size:12px;color:var(--muted);font-weight:600}
.panel-head .mt{margin-left:auto;font-size:12px;color:var(--muted);font-weight:600;font-variant-numeric:tabular-nums}
.panel-body{padding:14px 16px}
.panel-body.tight{padding:6px 16px}

/* 탭 필터 — 기본은 전체 */
.tabs{display:flex;gap:13px;font-size:12.5px;font-weight:700;color:var(--muted);flex-wrap:wrap}
.tabs a:hover{color:var(--primary)}
.tabs .on{color:var(--primary);font-weight:800}

/* pill 필터 — 선택됨은 브랜드색 솔리드 */
.filters{display:flex;align-items:center;gap:8px;padding:11px 16px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.filters .fl{font-size:12px;color:var(--muted);font-weight:700;margin-right:2px}
/* 필터 줄의 드롭다운 — 긴 사무소·업체 이름이 줄 전체를 밀어내지 않게 상한을 둔다 */
.filters select{max-width:220px}
.fp{font-size:12px;font-weight:700;padding:5px 12px;border-radius:999px;background:var(--surface-2);
  color:var(--ink-2);border:1px solid var(--line);white-space:nowrap}
.fp:hover{border-color:var(--line-strong)}
.fp.on{background:var(--primary);color:#fff;border-color:transparent;font-weight:800}

/* 라벨 + 칩 나열 — 한 화면에 숫자를 최대한 많이 */
.crow{display:flex;align-items:center;gap:14px;padding:9px 0;border-bottom:1px solid var(--line)}
.crow:last-child{border-bottom:0}
.crow .cl{width:88px;flex:0 0 auto;font-size:12.5px;font-weight:700;color:var(--ink-2)}
.chips{display:flex;gap:8px;flex-wrap:wrap}
.chip-i{display:inline-flex;align-items:baseline;gap:6px;border:1px solid var(--line);border-radius:var(--r-sm);
  padding:5px 11px;background:#fff}
.chip-i:hover{border-color:var(--line-strong)}
.chip-i i{font-style:normal;font-size:12px;color:var(--muted);font-weight:600}
.chip-i b{font-size:14px;font-weight:900;font-variant-numeric:tabular-nums;letter-spacing:-.3px}
.chip-i.on{border-color:var(--primary);background:var(--primary-tint)}
.chip-i.on b{color:var(--primary)}
.chip-i.warn b{color:var(--danger)}
.chip-i.good b{color:var(--ok)}

/* ── 테이블 ────────────────────────────────────── */
.tbl{width:100%;font-size:12.5px}
.tbl th{text-align:left;font-size:11.5px;color:var(--muted);font-weight:700;padding:9px 13px;
  border-bottom:1px solid var(--line);background:var(--surface-2);white-space:nowrap}
.tbl td{padding:9px 13px;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}
.tbl tr:last-child td{border-bottom:none}
.tbl tbody tr:hover td{background:var(--surface-2)}
.tbl tr[data-href]{cursor:pointer}
.tbl tbody tr[data-href]:hover td{background:var(--primary-tint)}
.tbl .strong{font-weight:700;color:var(--ink)}
.tbl .lk{color:var(--primary);font-weight:700}
.tbl .num{text-align:right}
.tbl .nowrap{white-space:nowrap}
.tbl .dim{color:var(--muted)}
.tbl .neg{color:var(--danger);font-weight:700}
.tbl-fit th,.tbl-fit td{padding-right:26px}
.tbl-wrap{overflow-x:auto}

/* ── 소개 화면 : 확정 명단 | 구직자 고르기 ─────────
   세로로 쌓으면 「2명 부족」을 보고 고르러 가는 데 18줄을 지나가야 한다.
   왼쪽은 「이미 누가 들어갔나」(참조), 오른쪽은 「누구를 넣을까」(행동)다.
   행동하는 쪽에 폭을 몰아준다. 각 칸은 따로 스크롤되고 머리줄이 붙어 있다. */
.pickgrid{display:grid;grid-template-columns:minmax(300px,340px) minmax(0,1fr);
  gap:12px;align-items:start}
.pickcol{min-width:0;display:flex;flex-direction:column;gap:12px}
.pickgrid .panel{margin-bottom:0}
.pickbar{position:sticky;bottom:0;background:var(--bg);padding:12px 0;
  border-top:1px solid var(--line);display:flex;gap:10px;align-items:center;
  flex-wrap:wrap;z-index:10}
.pickbar .note{font-size:12.5px;color:var(--muted)}
.pickscroll{overflow:auto;max-height:calc(100vh - 300px)}
.pickscroll .tbl thead th{position:sticky;top:0;z-index:2}
@media (max-width:1279px){
  .pickgrid{grid-template-columns:1fr}
  .pickscroll{max-height:none}
}

.empty{padding:44px 16px;text-align:center;color:var(--muted);font-size:13.5px}
.empty b{display:block;font-size:15px;color:var(--ink-2);margin-bottom:6px;font-weight:700}

/* ── 배지 · 버튼 ───────────────────────────────── */
.pill{font-size:11px;font-weight:800;padding:3px 8px;border-radius:999px;display:inline-block;white-space:nowrap}
.pill.ok{background:var(--ok-tint);color:var(--ok)}
.pill.wait{background:var(--primary-tint);color:var(--primary)}
.pill.warn{background:var(--warn-tint);color:var(--warn)}
.pill.rej{background:var(--danger-tint);color:var(--danger)}
.pill.off{background:var(--surface-2);color:var(--muted);border:1px solid var(--line)}

.btn{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:700;padding:6px 12px;
  border-radius:var(--r-sm);border:1px solid var(--line-strong);background:#fff;color:var(--ink-2);
  cursor:pointer;white-space:nowrap}
.btn:hover{border-color:var(--muted)}
.btn.primary{background:var(--primary);color:#fff;border-color:transparent}
.btn.primary:hover{background:var(--primary-dark)}
.btn.danger:hover{border-color:var(--danger);color:var(--danger)}
.btn.lg{font-size:13px;padding:8px 15px}
.btn.sm{font-size:11.5px;padding:4px 10px}
.btn[disabled]{opacity:.45;cursor:default}
.acts{display:flex;gap:5px;flex-wrap:wrap}

/* ── 미수 연령 막대 ────────────────────────────── */
.agebar{display:flex;height:10px;border-radius:5px;overflow:hidden;margin-bottom:10px;background:var(--surface-2)}
.agebar i{display:block}
.agekey{display:flex;gap:14px;font-size:11.5px;color:var(--muted);flex-wrap:wrap;font-weight:600}
.agekey s{text-decoration:none;display:inline-flex;align-items:center;gap:5px;font-variant-numeric:tabular-nums}
.agekey s::before{content:"";width:8px;height:8px;border-radius:2px;background:var(--c)}

/* ── 알림 ─────────────────────────────────────── */
.flash{background:var(--ok-tint);color:var(--ok);border:1px solid rgba(18,165,106,.3);
  border-radius:var(--r);padding:12px 16px;margin-bottom:16px;font-weight:700;font-size:13.5px}
.flash.err{background:var(--danger-tint);color:var(--danger);border-color:rgba(220,59,50,.3)}
.flash.warn{background:var(--warn-tint);color:var(--warn);border-color:rgba(176,112,11,.3)}

.callout{border:1px solid var(--line);border-left:3px solid var(--primary);background:var(--surface-2);
  border-radius:var(--r-sm);padding:11px 14px;font-size:12.5px;color:var(--ink-2);margin-bottom:14px}
.callout.warn{border-left-color:var(--danger);background:var(--danger-tint);color:var(--danger)}
.callout b{color:var(--ink)}
.callout.warn b{color:var(--danger)}

/* ── 폼 ───────────────────────────────────────── */
.lform{max-width:780px}
.lform.sm{max-width:660px}
.lform.lg{max-width:1100px}
.fsec{border:1px solid var(--line);border-radius:var(--r);background:#fff;padding:16px 18px;margin-bottom:14px;box-shadow:var(--shadow)}
.fsec > h3{font-size:14px;font-weight:800;margin-bottom:12px;padding-bottom:10px;border-bottom:1px solid var(--line)}
/* ── 폼 입력 표준 ─────────────────────────────────
   1. 입력칸 폭은 「넣을 내용의 길이」다.
      우편번호칸과 주소칸이 같은 폭이면 무엇을 넣어야 하는지 알 수 없고,
      12자 넣을 칸이 화면 절반을 차지하면 한 화면에 들어갈 것이 안 들어간다.
      그래서 격자(1fr)가 아니라 내용 기준(ch)으로 잡고 남는 자리는 비운다.
   2. placeholder 는 형식의 예시다. 라벨을 되풀이하지 않는다.
      (「사무소명」 칸에 "사무소명을 입력하세요" 는 아무것도 안 알려준다.)
   3. 입력 방식은 목적에 맞춘다 — 날짜는 date, 전화는 tel,
      금액은 오른쪽 정렬 + 천단위, 숫자는 inputmode 로 모바일 키패드를 바꾼다. */
.fgrid{display:flex;flex-wrap:wrap;gap:13px 18px;align-items:flex-start}
.f{display:flex;flex-direction:column;gap:5px;flex:0 0 auto;min-width:0;--fw:20ch}
.f > label{font-size:12px;font-weight:700;color:var(--ink-2);white-space:nowrap}
.f > label .req{color:var(--danger);margin-left:2px}
.f .help{font-size:11.5px;color:var(--muted);max-width:44ch}
.f .err{font-size:11.5px;color:var(--danger);font-weight:700}
.f > input,.f > select,.f > textarea{width:var(--fw)}

/* 폭 등급 — 이름이 아니라 「몇 글자짜리인가」로 고른다 */
.f.w1{--fw:6ch}     /* 일수 · 개수 · 퍼센트 */
.f.w2{--fw:9ch}     /* 우편번호 · 짧은 코드 */
.f.w3{--fw:12ch}    /* 금액 · 날짜 · 사업자번호 */
.f.w4{--fw:15ch}    /* 전화번호 · 아이디 · 사람 이름 */
.f.w5{--fw:20ch}    /* 상호 · 현장명 (기본값) */
.f.w6{--fw:28ch}    /* 긴 상호 · 이메일 */
.f.w8{--fw:40ch}    /* 주소 · 프로젝트명 */
.f.wide{--fw:100%;flex:1 1 100%}
.f.wide .help{max-width:none}

/* 읽기 전용 값을 라벨과 함께 늘어놓는 격자.
   입력 폼이 아니므로 폭 규칙을 따르지 않는다 — 값은 길이가 제각각이고
   빈 칸을 남기는 것보다 줄을 맞추는 쪽이 읽기 좋다. */
.rgrid{display:grid;gap:12px}
.rgrid.g2{grid-template-columns:1fr 1fr}
.rgrid.g3{grid-template-columns:1fr 1fr 1fr}
.rgrid .f > label{font-size:12px;font-weight:700;color:var(--ink-2)}
@media (max-width:900px){.rgrid.g2,.rgrid.g3{grid-template-columns:1fr}}

input[type=text],input[type=number],input[type=password],input[type=email],input[type=tel],
input[type=search],input[type=date],input[type=time],select,textarea{
  font-family:inherit;font-size:13px;color:var(--ink);background:#fff;border:1px solid var(--line-strong);
  border-radius:var(--r-sm);padding:8px 10px;min-height:36px;max-width:100%}
input:focus,select:focus,textarea:focus{outline:2px solid var(--primary-tint);border-color:var(--primary)}
input[readonly]{background:var(--surface-2);color:var(--muted)}
input::placeholder,textarea::placeholder{color:var(--subtle)}
textarea{min-height:78px;resize:vertical}
/* 드롭다운은 내용만큼만 차지하고 왼쪽에 붙는다. */
select{width:auto;max-width:100%}
.money{text-align:right;font-variant-numeric:tabular-nums}
.tnum-in{font-variant-numeric:tabular-nums}
/* ── 세그먼티드 컨트롤 ────────────────────────────
   선택지가 적으면 드롭다운을 쓰지 않는다. 드롭다운은 「열고 → 찾고 → 고르기」 세 동작인데
   선택지가 넷뿐이면 그냥 한 번 누르면 끝날 일이다.
   게다가 접힌 채로는 무엇을 고를 수 있는지 보이지 않는다.
   라디오 대신 붙은 버튼으로 만드는 이유는 관리자 화면의 밀도 규칙 때문이다 —
   세로로 쌓는 라디오는 자리를 네 줄 먹는다. */
.seg{display:inline-flex;border:1px solid var(--line-strong);border-radius:var(--r-sm);
  overflow:hidden;background:#fff;width:max-content;max-width:100%;flex-wrap:wrap}
.seg label{padding:7px 13px;font-size:12.5px;font-weight:700;color:var(--ink-2);cursor:pointer;
  background:#fff;border-right:1px solid var(--line);white-space:nowrap;user-select:none;
  display:inline-flex;align-items:center;min-height:36px}
.seg label:last-child{border-right:0}
.seg label:hover{background:var(--surface-2)}
.seg input{position:absolute;opacity:0;width:0;height:0}
.seg label:has(input:checked){background:var(--primary);color:#fff}
.seg label:has(input:focus-visible){outline:2px solid var(--primary-tint);outline-offset:-2px}
.seg label:has(input:disabled){opacity:.5;cursor:not-allowed}

/* ── 라디오 목록 ──────────────────────────────────
   선택지가 적은데 「설명이 있어야 고를 수 있는」 경우다.
   세그먼티드는 낱말 하나로 끝나는 선택에 쓰고, 여기는 설정처럼
   각 선택지가 무슨 뜻인지 읽어야 하는 자리에 쓴다.
   드롭다운으로 접어 두면 설명이 통째로 사라져 고를 수가 없다. */
.radios{display:flex;flex-direction:column;gap:1px;background:var(--line);
  border:1px solid var(--line-strong);border-radius:var(--r-sm);overflow:hidden;width:max-content;max-width:100%}
.radios label{display:flex;align-items:flex-start;gap:9px;padding:9px 13px;background:#fff;cursor:pointer}
.radios label:hover{background:var(--surface-2)}
.radios label:has(input:checked){background:var(--primary-tint)}
.radios input{width:15px;height:15px;min-height:0;margin:2px 0 0;accent-color:var(--primary);flex:0 0 auto}
.radios b{font-size:13px;font-weight:700;color:var(--ink);display:block}
.radios small{font-size:11.5px;color:var(--muted);display:block;margin-top:1px}
.radios label:has(input:checked) b{color:var(--primary)}

/* ── 파일 선택 · 이미지 미리보기 ──────────────────
   자격증·신분증 사본을 올리는 자리다. 엉뚱한 파일을 올렸다는 걸
   저장 뒤가 아니라 고르는 순간 알아야 한다. */
.filepick{display:flex;flex-direction:column;gap:8px}
.filepick input[type=file]{font-size:12.5px;max-width:36ch}
.thumbs{display:flex;flex-wrap:wrap;gap:8px}
.thumb{position:relative;width:96px;height:96px;border:1px solid var(--line-strong);
  border-radius:var(--r-sm);overflow:hidden;background:var(--surface-2);cursor:zoom-in;flex:0 0 auto}
.thumb img{width:100%;height:100%;object-fit:cover;display:block}
.thumb .cap{position:absolute;left:0;right:0;bottom:0;padding:3px 5px;font-size:10.5px;
  background:rgba(12,21,36,.72);color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.thumb.doc{display:flex;align-items:center;justify-content:center;cursor:default;
  font-size:11.5px;font-weight:700;color:var(--muted);text-align:center;padding:6px}

/* 확대 — 라이브러리 없이. 새 탭이 아니라 제자리에서 봐야 폼을 잃지 않는다. */
.lightbox{position:fixed;inset:0;background:rgba(12,21,36,.82);z-index:100;
  display:flex;align-items:center;justify-content:center;padding:32px;cursor:zoom-out}
.lightbox img{max-width:100%;max-height:100%;object-fit:contain;
  border-radius:var(--r);box-shadow:0 18px 50px rgba(0,0,0,.45)}
.lightbox .cap{position:absolute;top:16px;left:0;right:0;text-align:center;
  color:#fff;font-size:12.5px;font-weight:700}
.lightbox .x{position:absolute;top:12px;right:16px;color:#fff;font-size:26px;
  font-weight:300;line-height:1;background:none;border:0;cursor:pointer;padding:6px 10px}

.form-actions{display:flex;gap:8px;padding-top:4px;flex:1 1 100%}

/* 체크박스 묶음 — 라벨을 세로로 쌓는다 */
.f.chk{gap:7px}
.f.chk > label{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:600;color:var(--ink);cursor:pointer}
.f.chk input[type=checkbox]{width:16px;height:16px;min-height:0;accent-color:var(--primary);margin:0}

/* 선택형 칩 — 필수 서류처럼 다중 선택하는 곳 */
.chip-c{display:inline-flex;align-items:center;border:1px solid var(--line-strong);border-radius:999px;
  padding:6px 13px;background:#fff;cursor:pointer;user-select:none}
.chip-c input{display:none}
.chip-c span{font-size:12.5px;font-weight:700;color:var(--ink-2)}
.chip-c:hover{border-color:var(--subtle)}
.chip-c:has(input:checked){background:var(--ink);border-color:var(--ink)}
.chip-c:has(input:checked) span{color:#fff}

/* ── 페이지네이션 ─────────────────────────────── */
.pager{display:flex;gap:4px;align-items:center;justify-content:center;padding:14px;flex-wrap:wrap}
.pager a,.pager span{min-width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;
  padding:0 9px;border:1px solid var(--line);border-radius:var(--r-sm);font-size:12.5px;font-weight:700;
  color:var(--ink-2);background:#fff}
.pager .on{background:var(--primary);color:#fff;border-color:transparent}
.pager .off{color:var(--subtle);background:var(--surface-2)}

/* ── 확인 모달 (네이티브 confirm 금지) ─────────── */
.modal-back{position:fixed;inset:0;background:rgba(16,24,32,.45);z-index:100;display:grid;place-items:center;padding:20px}
.modal{background:#fff;border-radius:var(--r);max-width:420px;width:100%;box-shadow:0 12px 40px rgba(16,24,32,.24);overflow:hidden}
.modal h3{font-size:16px;font-weight:800;padding:18px 20px 0}
.modal p{padding:10px 20px 18px;font-size:13.5px;color:var(--ink-2);line-height:1.6}
.modal .foot{display:flex;gap:8px;justify-content:flex-end;padding:14px 20px;background:var(--surface-2);border-top:1px solid var(--line)}

/* ══════════════════════════════════════════════════════════════
   일바로 공통 부품 — 단계 칸반 · 사람 카드 · 정보 칩
   --------------------------------------------------------------
   복귀 관리 · 신규자 관리 · 새벽 출근확인판이 같이 쓴다. 기준: 설계/일바로_디자인기준.md

   구조는 고객 시안에서 왔고 색은 뺐다. 고객 시안은 단계마다 파스텔 배경을 칠했지만
   **열은 전부 흰색**이다 — 단계는 제목과 숫자로 가른다. 넓은 면에 색을 칠하면
   정말 봐야 할 「6일 미출근」 빨간 글자가 묻힌다.
   이름은 전부 kb- · pcard · tag 로 시작한다. 짧은 이름(lg 등)이 다른 화면 이름과 겹쳐
   폼이 통째로 틀어진 적이 있다.
   ══════════════════════════════════════════════════════════════ */

/* 단계 칸반 — 열 순서가 곧 일의 순서(왼쪽 = 먼저 할 일) */
.kb{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(264px,1fr);gap:12px;
  overflow-x:auto;align-items:start;padding-bottom:4px}
.kb-col{background:#fff;border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);
  display:flex;flex-direction:column;min-height:120px}
.kb-hd{display:flex;align-items:baseline;gap:8px;padding:11px 13px 10px;border-bottom:1px solid var(--line)}
.kb-hd h3{font-size:14px;font-weight:800;letter-spacing:-.3px}
.kb-hd .n{font-size:14px;font-weight:900;color:var(--muted);font-variant-numeric:tabular-nums}
/* 할 일이 남은 열만 숫자를 주황으로 — 열 전체가 아니라 숫자 하나만 */
.kb-hd .n.todo{color:var(--warn)}
.kb-hd .note{margin-left:auto;font-size:11.5px;color:var(--subtle);font-weight:600}
.kb-body{display:flex;flex-direction:column;gap:8px;padding:9px}
.kb-empty{padding:18px 10px;text-align:center;font-size:12px;color:var(--subtle);font-weight:600}

/* 휴대폰 — 열을 옆으로 밀지 않고 단계별 숫자 버튼으로 하나씩 본다(고객 모바일 시안 구조).
   숫자를 누르면 그 단계만 남는다. 선택된 버튼은 검정. */
.kb-steps{display:none}
@media (max-width:900px){
  .kb-steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(0,1fr));gap:6px;margin-bottom:10px}
  .kb-steps button{border:1px solid var(--line-strong);background:#fff;border-radius:var(--r-sm);
    padding:8px 4px;display:flex;flex-direction:column;align-items:center;gap:1px;font-family:inherit;cursor:pointer}
  .kb-steps b{font-size:19px;font-weight:900;color:var(--ink);font-variant-numeric:tabular-nums}
  .kb-steps b.todo{color:var(--warn)}
  .kb-steps span{font-size:11.5px;font-weight:700;color:var(--muted)}
  .kb-steps button.on{background:var(--ink);border-color:var(--ink)}
  .kb-steps button.on b,.kb-steps button.on span{color:#fff}
  .kb{grid-auto-flow:row;grid-auto-columns:auto}
  .kb[data-step] .kb-col:not(.on){display:none}
  .kb[data-step] .kb-hd{display:none}
}

/* 사람 카드
   [이름] [전화]            [정보 칩]
   [직종 · 현장]
   [출근율 N% | N.N 공수]
   [상태 칩]          [행동 1~2] */
.pcard{border:1px solid var(--line);border-radius:var(--r-sm);background:#fff;padding:10px 12px 9px}
.pcard:hover{border-color:var(--line-strong)}
.pcard-top{display:flex;align-items:baseline;gap:8px;min-width:0}
.pcard-nm{font-size:15px;font-weight:800;letter-spacing:-.3px;white-space:nowrap}
.pcard-ph{font-size:13px;font-weight:700;color:var(--ink-2);font-variant-numeric:tabular-nums;white-space:nowrap}
a.pcard-ph:hover{color:var(--primary)}
.pcard-top .tag{margin-left:auto}
.pcard-sub{font-size:12.5px;color:var(--muted);font-weight:600;margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pcard-facts{font-size:12.5px;color:var(--ink-2);font-weight:700;margin-top:4px;
  font-variant-numeric:tabular-nums;display:flex;gap:8px;flex-wrap:wrap}
.pcard-facts span+span{padding-left:8px;border-left:1px solid var(--line)}
.pcard-note{font-size:12px;color:var(--ink-2);background:var(--surface-2);border-radius:5px;
  padding:5px 8px;margin-top:6px}
.pcard-foot{display:flex;align-items:center;gap:6px;margin-top:8px;flex-wrap:wrap}
.pcard-foot .acts{margin-left:auto;display:flex;gap:5px}

/* 정보 칩 — 상태가 아니라 정보(가입 경로 · 직종 · 지역). 색을 주지 않는다. */
.tag{display:inline-block;font-size:11px;font-weight:700;color:var(--muted);background:#fff;
  border:1px solid var(--line-strong);border-radius:999px;padding:1px 8px;white-space:nowrap}

/* ══════════════════════════════════════════════════════════════
   소개 편성 — 스크롤이 없는 화면
   --------------------------------------------------------------
   다른 관리자 화면은 위에서 아래로 읽는다. 이 화면만 다르다 —
   현장 전부와 아직 안 간 사람이 **동시에** 떠 있어야 하고,
   페이지가 스크롤되면 하단의 「확정 · 앱 발송」이 떠내려간다.
   그래서 본문이 화면 높이를 꽉 채우고, 스크롤은 안쪽 두 칸에서만 일어난다.

   **왼쪽 메뉴는 이 화면에서도 그대로 떠 있다.** 한때 이 화면만 메뉴를 숨겼는데,
   누르는 순간 틀이 달라져 다른 프로그램에 들어온 것처럼 보였고, 지금 어느 메뉴인지와
   메뉴의 빨간 숫자(미수 · 미서명)가 같이 사라졌다. 메뉴가 180px 이라 숨겨서 얻는 폭은
   현장 반 칸뿐이다 — 좁은 화면은 현장 칩 · 부족만으로 찾아간다.

   .main 은 border-box 이고 위쪽 여백(padding-top)으로 고정 바 자리를 이미 비운다.
   그래서 높이는 100vh 그대로다 — 여기서 바 높이를 또 빼면 화면 아래가 비어 버린다.
   ══════════════════════════════════════════════════════════════ */
body.board-mode .main{height:100vh;overflow:hidden}
body.board-mode .content{padding:0;max-width:none;height:100%}

.board-page{height:100%;display:grid;grid-template-rows:auto auto 1fr auto;min-height:0;background:var(--line)}

/* ── 머리 : 제목 · 날짜 · 모드 · 충원 요약 ──
   편성판 전용 상단바를 따로 두지 않는다. 층이 하나 늘면 명단이 두 줄 사라진다. */
.board-page .bd-head{background:#fff;display:flex;align-items:center;gap:12px;padding:7px 14px;
  border-bottom:1px solid var(--line);min-width:0}
.board-page .bd-head h1{font-size:16px;font-weight:900;letter-spacing:-.5px;white-space:nowrap}
.board-page .bd-head .d{font-size:12px;color:var(--muted);font-weight:700;white-space:nowrap}
.board-page .bd-modes{display:flex;background:var(--surface-2);border:1px solid var(--line-strong);
  border-radius:var(--r-sm);padding:2px;gap:2px}
.board-page .bd-modes a{border:0;background:transparent;color:var(--muted);font-size:12px;font-weight:800;
  padding:4px 11px;border-radius:4px;white-space:nowrap;letter-spacing:-.2px}
.board-page .bd-modes a.on{background:var(--ink);color:#fff}
.board-page .bd-sum{margin-left:auto;display:flex;align-items:center;gap:10px;white-space:nowrap}
.board-page .bd-k{display:flex;flex-direction:column;line-height:1.2;border-right:1px solid var(--line);padding-right:10px}
.board-page .bd-k i{font-style:normal;font-size:10px;font-weight:800;color:var(--subtle);letter-spacing:.2px}
.board-page .bd-k b{font-size:13.5px;font-weight:900;letter-spacing:-.3px;font-variant-numeric:tabular-nums}
.board-page .bd-k.good b{color:var(--ok)}
.board-page .bd-fill{font-size:17px;font-weight:900;letter-spacing:-.6px;font-variant-numeric:tabular-nums}
.board-page .bd-fill i{font-style:normal;color:var(--subtle);font-weight:800;font-size:13px}
.board-page .bd-bar{width:110px;height:6px;border-radius:4px;background:#E7EBEF;overflow:hidden}
.board-page .bd-bar i{display:block;height:100%;background:var(--ink);border-radius:4px;transition:width .35s ease}
.board-page .bd-pill{font-size:11.5px;font-weight:800;color:var(--danger);background:var(--danger-tint);
  border:1px solid #F3CFCC;padding:3px 9px;border-radius:20px;white-space:nowrap}
.board-page .bd-pill.done{color:var(--ok);background:var(--ok-tint);border-color:#C7E6D6}

/* ── 현장 줄 : 도구 + 칩 ──
   현장이 서른 곳을 넘으면 「전부 보여주는 것」 자체가 벽이 된다.
   찾고 · 부족한 곳만 남기고 · 급한 순서로 당기는 셋을 칩 왼쪽에 고정으로 붙인다.
   칩과 칸반이 같은 목록을 본다 — 갈라지면 칩을 눌렀는데 없는 현장으로 간다. */
.board-page .bd-sites{display:flex;background:#fff;border-bottom:1px solid var(--line);min-width:0}
.board-page .bd-tools{flex:none;display:flex;align-items:center;gap:5px;padding:6px 10px;
  border-right:1px solid var(--line)}
.board-page .bd-find{display:flex;align-items:center;gap:5px;background:var(--surface-2);
  border:1px solid var(--line-strong);border-radius:var(--r-sm);padding:3px 8px}
/* 공통 입력칸 규칙(min-height 36px · padding 8px)이 이 작은 검색칸까지 들어와
   옆 필터 버튼보다 두 배 두껍게 서 있었다. 테두리는 바깥 .bd-find 가 그리므로
   안쪽 칸은 높이·여백·테두리를 전부 내려놓는다. */
.board-page .bd-find input,.board-page .bd-find input:focus{border:0;background:transparent;font-family:inherit;font-size:12px;
  width:14ch;color:var(--ink);outline:none;min-height:0;padding:2px 0;border-radius:0}
.board-page .bd-find:focus-within{border-color:var(--primary)}
.board-page .bd-fil{font-size:11.5px;font-weight:800;border:1px solid var(--line-strong);background:#fff;
  color:var(--muted);padding:4px 9px;border-radius:20px;white-space:nowrap;flex:none;line-height:1.5;
  display:inline-flex;align-items:center;gap:5px}
.board-page .bd-fil:hover{border-color:var(--ink);color:var(--ink)}
.board-page .bd-fil.on{background:var(--ink);border-color:var(--ink);color:#fff}
.board-page .bd-fil b{font-variant-numeric:tabular-nums;color:var(--warn);font-weight:900}
.board-page .bd-fil.on b{color:#FFD97A}
.board-page .bd-chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:6px 12px;
  align-content:flex-start;max-height:22vh;overflow-y:auto;scrollbar-width:thin}
.board-page .bd-chips .none{font-size:11.5px;font-weight:700;color:var(--subtle);padding:3px 2px}
.board-page .sc{border:1px solid var(--line-strong);background:#fff;border-radius:20px;padding:3px 10px;
  font-size:11.5px;font-weight:800;color:var(--ink-2);white-space:nowrap;flex:none;
  display:flex;gap:5px;align-items:center}
.board-page .sc:hover{border-color:var(--ink);color:var(--ink)}
.board-page .sc b{font-variant-numeric:tabular-nums}
.board-page .sc.short b{color:var(--danger)}
.board-page .sc.ok b{color:var(--ok)}
.board-page .sc.on{background:var(--ink);border-color:var(--ink);color:#fff}
.board-page .sc.on b{color:#fff}

/* ── 본문 : 구직자 풀 + 현장 칸반 ── */
.board-page .bd-body{display:grid;grid-template-columns:262px 1fr;min-height:0;background:var(--line);gap:1px}

.board-page .bd-pool{background:#fff;display:flex;flex-direction:column;min-height:0}
.board-page .bd-pool-hd{padding:8px 11px;border-bottom:1px solid var(--line);display:flex;flex-direction:column;gap:7px}
.board-page .bd-pool-t{display:flex;align-items:baseline;justify-content:space-between;gap:6px;min-width:0}
.board-page .bd-pool-t h2{font-size:13px;font-weight:900;letter-spacing:-.3px;white-space:nowrap}
.board-page .bd-pool-t em{font-style:normal;font-size:11.5px;color:var(--muted);font-weight:700;
  min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.board-page .bd-on{background:var(--ink);color:#fff;border-radius:4px;padding:2px 7px;font-weight:900;font-size:11px}
.board-page .bd-list{flex:1;overflow-y:auto;min-height:0}
.board-page .pw{display:grid;grid-template-columns:1fr auto;gap:1px 8px;padding:6px 11px;width:100%;
  border:0;border-bottom:1px solid var(--surface-2);background:#fff;text-align:left;
  cursor:pointer;align-items:center;font-family:inherit}
.board-page .pw:hover{background:var(--primary-tint);box-shadow:inset 2px 0 0 var(--primary)}
.board-page .pw-nm{font-size:13px;font-weight:800;letter-spacing:-.2px;display:flex;align-items:center;gap:5px;min-width:0}
.board-page .pw-job{font-size:11px;font-weight:700;color:var(--subtle);white-space:nowrap}
.board-page .pw-meta{grid-column:1/-1;font-size:11.5px;color:var(--muted);font-weight:600;
  font-variant-numeric:tabular-nums;display:flex;align-items:center;gap:6px}
.board-page .pw-meta b{color:var(--ink-2);font-weight:800}
.board-page .pw:disabled{cursor:not-allowed;background:#FDF8F8;opacity:.72}
.board-page .pw:disabled .pw-nm{color:var(--muted);text-decoration:line-through;text-decoration-color:#D9B4B1}

/* 뱃지 — 점수를 합산하지 않는다. 사실만 붙인다. */
.board-page .tg{font-style:normal;font-size:10px;font-weight:900;padding:1px 5px;border-radius:3px;
  letter-spacing:-.1px;white-space:nowrap;line-height:1.5;flex:none}
.board-page .tg-prev{background:var(--ink);color:#fff}
.board-page .tg-pin{background:#FFF2C8;color:#8A6400}
.board-page .tg-block{background:var(--danger-tint);color:var(--danger);border:1px solid #F0CCC9}
.board-page .tg-warn{background:var(--warn-tint);color:var(--warn)}
.board-page .tg-app{background:var(--ok-tint);color:var(--ok);border:1px solid #C7E6D6}

/* 한 글자 칩 — 이모지보다 좁고 분명하다 */
.board-page .ch{font-style:normal;font-size:10px;font-weight:900;width:14px;height:14px;border-radius:3px;
  display:inline-flex;align-items:center;justify-content:center;flex:none;line-height:1}
.board-page .ch-f{background:#E9E2FB;color:#5B3FBF}
.board-page .ch-c{background:#DDF0FF;color:#0B5E96}
.board-page .ch-w{background:var(--danger-tint);color:var(--danger);border:1px solid #F0CCC9}

/* 현장 칸반 */
.board-page .bd-board{background:var(--bg);overflow-x:auto;overflow-y:hidden;display:flex;gap:1px;min-height:0}
.board-page .col{background:#fff;flex:0 0 330px;min-width:330px;display:flex;flex-direction:column;min-height:0}
.board-page .col.active{box-shadow:inset 3px 0 0 var(--ink),inset -1px 0 0 var(--ink)}
.board-page .col.cancelled .col-hd{background:var(--danger-tint)}
.board-page .col.cancelled .col-body{opacity:.45}
.board-page .col-hd{padding:7px 9px 6px;border-bottom:1px solid var(--line);display:flex;flex-direction:column;gap:3px}
.board-page .col.full .col-hd{box-shadow:inset 0 3px 0 var(--ok-bg)}
.board-page .col-top{display:flex;align-items:baseline;gap:5px}
.board-page .col-nm{font-size:12.5px;font-weight:900;letter-spacing:-.4px;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;flex:1;min-width:0}
.board-page .col-cnt{font-size:12.5px;font-weight:900;font-variant-numeric:tabular-nums;white-space:nowrap}
.board-page .col-cnt.short{color:var(--danger)} .board-page .col-cnt.ok{color:var(--ok)}
.board-page .col-sub{font-size:11px;color:var(--muted);font-weight:700;display:flex;align-items:center;gap:5px;
  white-space:nowrap;overflow:hidden}
.board-page .col-sub .docbtn{margin-left:auto}
.board-page .col-body{flex:1;overflow-y:auto;min-height:0;padding-bottom:6px}

/* 직종 줄 — 한 현장에 기공·조공이 섞인다. 정원도 단가도 줄마다 다르다. */
.board-page .rl{padding:5px 9px 4px;background:var(--surface-2);border-top:1px solid var(--line);
  border-bottom:1px solid var(--line);width:100%;text-align:left;border-left:0;border-right:0;
  font-family:inherit;cursor:pointer;display:block}
.board-page .rl:hover{background:var(--primary-tint)}
.board-page .rl.on{background:var(--ink)}
.board-page .rl.on .rl-j,.board-page .rl.on .rl-n{color:#fff}
.board-page .rl.on .rl-k{background:#fff;color:var(--ink)}
.board-page .rl.on .rt{color:#C6D2E2} .board-page .rl.on .rt i{color:#8FA1B8} .board-page .rl.on .rt .mg{color:#6FE0AC}
.board-page .rl-hd{display:flex;align-items:baseline;gap:5px}
.board-page .rl-k{font-size:9.5px;font-weight:900;background:var(--ink-2);color:#fff;border-radius:3px;
  padding:1px 4px;flex:none;letter-spacing:-.2px}
.board-page .rl.full .rl-k{background:var(--subtle)}
.board-page .rl-j{font-size:12px;font-weight:900;letter-spacing:-.3px;flex:1;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.board-page .rl-n{font-size:12px;font-weight:900;flex:none;font-variant-numeric:tabular-nums}
.board-page .rl-n.short{color:var(--danger)} .board-page .rl-n.ok{color:var(--ok)}
.board-page .rl-on{margin-top:3px;font-size:11px;font-weight:800;color:#FFD97A;letter-spacing:-.2px}
/* 지급 · 청구 · 마진 — 세 칸 격자로 고정해 현장끼리 자릿수가 맞는다 */
.board-page .rt{display:grid;grid-template-columns:1fr 1fr auto;gap:3px;font-size:11px;font-weight:800;
  color:var(--ink-2);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;margin-top:2px}
.board-page .rt i{font-style:normal;color:var(--subtle);font-weight:700;margin-right:2px}
.board-page .rt .mg{color:var(--ok);text-align:right}

/* 사람 줄 — 남는 폭은 「이름+뱃지」 덩어리가 혼자 먹는다.
   auto 마진이 둘이면 flex 가 남는 폭을 나눠 주어 이름 길이마다 오른쪽 칸이 밀린다. */
.board-page .mb{display:flex;align-items:center;gap:4px;padding:3px 9px;border-bottom:1px solid var(--surface-2);
  font-variant-numeric:tabular-nums;overflow:hidden}
.board-page .mb:hover{background:var(--primary-tint);box-shadow:inset 2px 0 0 var(--primary)}
.board-page .mb-id{display:flex;align-items:center;gap:4px;flex:1 1 auto;min-width:0;overflow:hidden}
.board-page .mb-nm{font-size:12.5px;font-weight:800;letter-spacing:-.2px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;flex:0 1 auto}
.board-page .mb-ex{display:flex;align-items:center;gap:6px;flex:none}
.board-page .mb-age{width:20px;text-align:right;font-size:10.5px;font-weight:800;color:var(--muted);flex:none}
.board-page .mb-chips{display:flex;gap:3px;justify-content:flex-end;width:54px;flex:none}
.board-page .mb-kpi{width:72px;text-align:right;font-size:10.5px;font-weight:800;color:var(--ink-2);
  white-space:nowrap;flex:none}
.board-page .mb-kpi s{text-decoration:none;color:var(--subtle)}
.board-page .mb-ph{font-size:10.5px;color:var(--subtle);font-weight:700;flex:none;text-align:right;letter-spacing:.2px}
/* 예약 / 확정 — 보냈는가, 안 보냈는가. 점 하나로 가른다. */
.board-page .st{width:6px;height:6px;border-radius:50%;flex:none;border:1px solid var(--line-strong);background:#fff}
.board-page .st.sent{background:var(--ok-bg);border-color:var(--ok)}
.board-page .mb-act{display:none;margin-left:4px;gap:2px;flex:none}
.board-page .mb:hover .mb-act{display:flex}
.board-page .mb-act button{border:1px solid var(--line-strong);background:#fff;color:var(--muted);
  font-size:10.5px;font-weight:800;padding:2px 6px;border-radius:4px;line-height:1.45}
.board-page .mb-act button:hover{border-color:var(--ink);color:var(--ink)}
.board-page .mb-act button.danger:hover{border-color:var(--danger);color:var(--danger);background:var(--danger-tint)}
.board-page .mb-act button.on{background:#FFF2C8;border-color:#E0BF5E;color:#8A6400}
/* 새벽 — 통화 결과가 줄 색이 된다 */
.board-page .mb.yes{background:var(--ok-tint);box-shadow:inset 2px 0 0 var(--ok-bg)}
.board-page .mb.yes .mb-nm{color:#0B6B46}
.board-page .mb.no{background:var(--danger-tint);box-shadow:inset 2px 0 0 var(--danger)}
.board-page .mb.no .mb-nm{text-decoration:line-through;text-decoration-color:#D9A19D;color:var(--muted)}
.board-page .mb.miss{background:var(--warn-tint);box-shadow:inset 2px 0 0 #D9A431}
/* 아직 확인 안 된 사람 = 지금 전화해야 할 사람. 표시가 없으면 빈 줄로 읽힌다. */
.board-page .mb.todo{box-shadow:inset 2px 0 0 var(--warn)}
.board-page .mb-todo{font-size:10.5px;font-weight:900;color:var(--warn);background:var(--warn-tint);
  border:1px solid #EFD9AE;border-radius:3px;padding:1px 5px;flex:none;margin-left:6px}
.board-page .mb-stamp{font-size:10.5px;font-weight:800;color:var(--muted);flex:none;margin-left:6px}

/* 빈자리 — 「문제」가 아니라 「할 일」이다. 그래서 빨강이 아니라 주황이다.
   전날 밤에 자리가 비어 있는 건 정상이고, 정상을 빨갛게 칠하면 빨강이 뜻을 잃는다.
   새벽까지 비어 있으면 그건 진짜 사고라 그때만 빨강으로 올라간다. */
.board-page .slot{display:flex;align-items:center;gap:6px;margin:2px 9px;padding:3px 7px;width:calc(100% - 18px);
  border:1px dashed #E3B778;border-left:3px solid var(--warn);border-radius:4px;
  color:var(--warn);font-size:11px;font-weight:800;background:var(--warn-tint);
  cursor:pointer;font-family:inherit;text-align:left}
.board-page .slot:hover{background:#FCEBD0;border-color:var(--warn)}
.board-page .slot .go{margin-left:auto;font-weight:900}
.board-page[data-mode="dawn"] .slot{border-color:#E8ADA8;border-left-color:var(--danger);
  color:var(--danger);background:var(--danger-tint)}
.board-page .wl{margin:6px 10px 0;padding:5px 8px;background:var(--surface-2);border-radius:4px;
  font-size:11.5px;font-weight:700;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.board-page .wl b{color:var(--ink-2);font-weight:800}
/* 미수 — 결정이 일어나는 그 자리에 띄운다 */
.board-page .ar{font-size:11px;font-weight:800;color:var(--age-3);background:var(--danger-tint);
  border:1px solid #F0CCC9;border-radius:4px;padding:2px 7px;display:flex;gap:6px;
  align-items:center;justify-content:space-between;font-variant-numeric:tabular-nums}
.board-page .ar.soft{color:var(--muted);background:var(--surface-2);border-color:var(--line)}

/* 남는 폭은 비워두지 않는다 — 새 구인 건을 받는 자리다 */
.board-page .bd-ghost{flex:0 1 130px;min-width:0;display:flex;justify-content:center;padding:9px 8px 0}
.board-page .bd-ghost a{border:1px dashed var(--line-strong);background:#fff;color:var(--muted);
  font-size:12px;font-weight:800;padding:9px 10px;border-radius:var(--r-sm);width:100%;
  height:fit-content;letter-spacing:-.2px;text-align:center}
.board-page .bd-ghost a:hover{border-color:var(--ink);color:var(--ink)}
.board-page .bd-hidden{flex:0 0 150px;min-width:150px;background:var(--surface-2);
  border-left:1px dashed var(--line-strong);display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:8px;padding:14px 12px;text-align:center;font-size:11.5px;
  font-weight:700;color:var(--muted);line-height:1.55}
.board-page .bd-hidden b{font-size:12.5px;font-weight:900;color:var(--ink-2);letter-spacing:-.3px}
.board-page .bd-empty{flex:1;min-width:300px;background:#fff;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:9px;text-align:center;padding:20px;
  font-size:12.5px;font-weight:700;color:var(--muted);line-height:1.6}
.board-page .bd-empty b{font-size:15px;font-weight:900;letter-spacing:-.4px;color:var(--ink)}

/* ── 아래 액션 줄 — 늘 같은 자리에 있어야 한다 ── */
.board-page .bd-foot{background:#fff;border-top:1px solid var(--line);display:flex;align-items:center;gap:6px;
  padding:0 12px;min-width:0;overflow:hidden;height:52px}
.board-page .bd-foot .btn{flex:none}
.board-page .bd-foot .sp{flex:1 1 8px;min-width:8px}
.board-page .bd-note{font-size:11.5px;color:var(--subtle);font-weight:700;white-space:nowrap;
  flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
.board-page .bd-note b{color:var(--ink-2);font-weight:900}
.board-page .lg{display:inline-flex;align-items:center;gap:4px;margin-right:10px;font-size:11.5px;font-weight:800;
  color:var(--ink-2)}
.board-page .lg i{width:9px;height:9px;border-radius:2px;border:1px solid rgba(16,32,48,.18);flex:none}
.board-page .lg b{color:var(--ink);font-weight:900}

/* 메뉴가 늘 떠 있으니 노트북(1366px)에서는 현장이 세 칸이 안 된다.
   명단 칸을 먼저 줄여 현장을 한 칸이라도 더 보이게 한다 — 이름·공수는 좁아도 읽힌다. */
@media (max-width:1600px){
  .board-page .bd-body{grid-template-columns:236px 1fr}
  .board-page .col{flex:0 0 314px;min-width:314px}
}
@media (max-width:1400px){
  .board-page .bd-body{grid-template-columns:214px 1fr}
  .board-page .col{flex:0 0 296px;min-width:296px}
}

/* ── 모바일 ────────────────────────────────────
   새벽 3종(오늘 오더·소개 확정·출역 체크)만 모바일 퍼스트로 만든다.
   정산·통계·설정은 PC 퍼스트이고 모바일에서는 조회만 한다.
   요소를 둘 두고 CSS 로 하나만 보이는 방식을 쓴다 — JS 로 폭을 판단하지 않는다.
   ------------------------------------------------------------ */
.only-mobile{display:none}
@media (max-width:900px){
  :root{--tbh:52px}
  .tb-burger{display:inline-flex}
  .tb-right .hide-m{display:none}
  .tenant-badge{max-width:120px}
  .sidebar{transform:translateX(-100%);transition:transform .18s ease;width:264px;box-shadow:0 0 0 100vmax rgba(0,0,0,0)}
  body.nav-open .sidebar{transform:translateX(0);box-shadow:0 0 0 100vmax rgba(16,24,32,.4)}
  .nav-item{padding:11px 20px;font-size:15px}
  .main{margin-left:0}
  .content{padding:14px 12px 70px}
  .page-head h1{font-size:19px}
  .stats{grid-template-columns:1fr 1fr;gap:8px}
  .stats.c7,.stats.c4,.stats.c3{grid-template-columns:1fr 1fr}
  .stat{padding:11px 12px}
  .stat .val{font-size:22px}
  .crow{flex-direction:column;align-items:flex-start;gap:7px}
  .crow .cl{width:auto}
  .only-mobile{display:block}
  .only-pc{display:none!important}
  .fgrid.g2,.fgrid.g3{grid-template-columns:1fr}
  .panel-head{gap:9px}
  /* 목록은 카드로 — 같은 데이터를 두 가지로 그린다 */
  .cardlist{display:flex;flex-direction:column}
  .cardrow{display:block;padding:13px 15px;border-bottom:1px solid var(--line)}
  .cardrow:last-child{border-bottom:0}
  .cardrow .t{font-size:15px;font-weight:800;letter-spacing:-.3px}
  .cardrow .s{font-size:12.5px;color:var(--muted);margin-top:3px;font-weight:600}
  .cardrow .m{display:flex;gap:12px;margin-top:8px;flex-wrap:wrap;font-size:13px;font-variant-numeric:tabular-nums}
  .cardrow .m b{font-weight:800}
  .cardrow .m .k{color:var(--muted);font-weight:600;margin-right:3px}
  .cardrow .a{display:flex;gap:6px;margin-top:10px}
  .cardrow .btn{padding:9px 14px;font-size:13px}
  .btn{padding:9px 13px;font-size:13px}
  .fp{padding:7px 13px;font-size:12.5px}
}
@media (min-width:901px){
  .cardlist{display:none}
}
@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}

/* ============================================================
   대시보드 — 한 화면에 최대한 많은 정보
   본사 콘솔과 사무소 관리자가 함께 쓴다.
   ============================================================ */

.tnum{font-variant-numeric:tabular-nums}

/* ── 헤드라인 KPI : 아이콘 + 큰 숫자 + 라벨/힌트 ──── */
.kpi-row{display:grid;grid-template-columns:repeat(6,1fr);gap:14px;margin-bottom:18px}
.kpi-row.c4{grid-template-columns:repeat(4,1fr)}
.kpi-row.c5{grid-template-columns:repeat(5,1fr)}
.kpi-row.c7{grid-template-columns:repeat(7,1fr);gap:10px}
.kpi-row.c7 .kpi{padding:12px 12px}
.kpi-row.c7 .kpi-num{font-size:23px}
.kpi-row.c7 .kpi-ico{width:30px;height:30px;font-size:13px}
.kpi{background:#fff;border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);
  padding:13px 15px;color:inherit;display:flex;flex-direction:column;gap:9px;
  transition:box-shadow .15s,transform .15s,border-color .15s}
a.kpi:hover{box-shadow:0 6px 18px rgba(16,32,48,.11);transform:translateY(-2px);border-color:var(--line-strong)}
.kpi-top{display:flex;align-items:center;gap:11px}
.kpi-ico{width:34px;height:34px;border-radius:9px;display:flex;align-items:center;justify-content:center;
  flex:0 0 auto;font-size:14px;font-weight:900}
.kpi-ico.c1{background:var(--primary-tint);color:var(--primary)}
.kpi-ico.c2{background:#EAF2FE;color:#2563EB}
.kpi-ico.c3{background:var(--ok-tint);color:var(--ok)}
.kpi-ico.c4{background:var(--warn-tint);color:var(--warn)}
.kpi-ico.c5{background:var(--danger-tint);color:var(--danger)}
.kpi-ico.c6{background:var(--bg);color:var(--muted)}
.kpi-num{font-size:27px;font-weight:900;letter-spacing:-.8px;line-height:1}
.kpi-num small{font-size:13px;font-weight:700;color:var(--muted);margin-left:2px;letter-spacing:0}
.kpi-bot{display:flex;align-items:center;justify-content:space-between;gap:8px}
.kpi-lbl{font-size:12.5px;color:var(--muted);font-weight:600;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.kpi-bot .kd{font-size:11.5px;flex:0 0 auto}
.kpi.alert .kpi-num{color:var(--danger)}

.kd{font-weight:700}
.kd.up{color:var(--ok)} .kd.down{color:var(--danger)}
.kd.flat{color:var(--subtle);font-weight:600}
.kd.warn{color:var(--primary)} .kd.danger{color:var(--danger)}

/* ── 전체 현황 : 라벨 + 타일 나열 ────────────────── */
.sumrows .sgrow{display:grid;grid-template-columns:96px 1fr;gap:14px;align-items:center;
  padding:11px 18px;border-bottom:1px solid var(--line)}
.sumrows .sgrow:last-child{border-bottom:0}
.sg-label{font-size:12px;font-weight:800;color:var(--muted)}
.sg-tiles{display:flex;flex-wrap:wrap;gap:7px}
.mtile{display:inline-flex;align-items:baseline;gap:7px;padding:7px 11px;border:1px solid var(--line);
  border-radius:7px;background:var(--surface-2);color:inherit;transition:border-color .12s,background .12s}
a.mtile:hover{border-color:var(--primary);background:var(--primary-tint)}
.mtile b{font-size:11px;font-weight:600;color:var(--muted);white-space:nowrap}
.mtile span{font-size:15px;font-weight:900;letter-spacing:-.4px;color:var(--ink);flex:0 0 auto}
.mtile.warn span{color:var(--warn)}
.mtile.danger span{color:var(--danger)}
.mtile.good span{color:var(--ok)}

/* ── 스파크라인 ─────────────────────────────────── */
.trend-cards{display:grid;grid-template-columns:repeat(5,1fr);gap:14px;padding:16px 18px}
.tcard{border:1px solid var(--line);border-radius:9px;padding:12px 14px 6px;background:#fff;
  color:inherit;transition:border-color .12s,box-shadow .12s}
a.tcard:hover{border-color:var(--primary);box-shadow:var(--shadow)}
.tc-top{display:flex;align-items:baseline;gap:7px;margin-bottom:6px;flex-wrap:wrap}
.tc-lbl{font-size:12px;color:var(--muted);font-weight:700}
.tc-top b{font-size:19px;font-weight:900;letter-spacing:-.6px;margin-left:auto;font-variant-numeric:tabular-nums}
.tc-top .kd{font-size:11px;flex:0 0 auto;width:100%;text-align:right}
.spark{width:100%;height:46px;display:block}
.sparkwrap{position:relative;cursor:crosshair}
.sp-guide{position:absolute;top:0;bottom:0;width:1px;background:rgba(16,32,48,.28);
  display:none;pointer-events:none;transform:translateX(-.5px)}
.sp-dot{position:absolute;width:9px;height:9px;border-radius:50%;background:#fff;
  border:2px solid var(--primary);display:none;pointer-events:none;transform:translate(-50%,-50%);
  box-shadow:0 0 0 2px rgba(255,255,255,.7)}
.sp-tip{position:fixed;display:none;z-index:9999;background:var(--navy);color:#fff;padding:5px 9px;
  border-radius:7px;font-size:11px;line-height:1.35;pointer-events:none;white-space:nowrap;
  box-shadow:0 4px 14px rgba(0,0,0,.22);font-variant-numeric:tabular-nums}
.sp-tip .spt-d{display:block;font-size:10px;opacity:.7}
.sp-tip b{font-size:13px;font-weight:800}
.spark-axis{position:relative;height:13px;margin-top:3px}
.spark-axis span{position:absolute;top:0;transform:translateX(-50%);font-size:9px;line-height:13px;
  color:var(--subtle);white-space:nowrap;font-variant-numeric:tabular-nums}
.spark-axis span:first-child{transform:translateX(0)}
.spark-axis span:last-child{transform:translateX(-100%)}
.growbox{padding:10px 18px 12px;flex:1;display:flex;flex-direction:column}
.growbox .sparkwrap{flex:1;min-height:78px}
.growbox .spark{height:100%}

/* ── 다열 배치 ──────────────────────────────────── */
.dash-3col{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px;margin-bottom:16px}
.dash-3col .panel{margin-bottom:0;display:flex;flex-direction:column}
.dash-2col{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}
.dash-2col .panel{margin-bottom:0;display:flex;flex-direction:column}

/* ── 가로 막대 목록 (사무소별 · 구간별) ──────────── */
.branchlist{padding:16px 18px;display:flex;flex-direction:column;gap:12px}
.brow{display:flex;align-items:center;gap:12px;color:inherit}
a.brow:hover .bn{color:var(--primary)}
a.brow:hover .bfill{background:var(--primary-dark)}
.brow .bn{width:86px;flex:0 0 auto;font-size:12.5px;font-weight:700;color:var(--ink-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.brow .btrack{flex:1;height:9px;background:var(--surface-2);border-radius:999px;overflow:hidden}
.brow .bfill{height:100%;background:var(--primary);border-radius:999px;transition:background .12s}
.brow .bc{min-width:56px;text-align:right;font-size:13px;font-weight:800;flex:0 0 auto;
  white-space:nowrap;font-variant-numeric:tabular-nums}
.brow .bc2{min-width:66px;text-align:right;font-size:12px;font-weight:700;color:var(--muted);
  flex:0 0 auto;white-space:nowrap;font-variant-numeric:tabular-nums}

/* ── 점검 항목 ──────────────────────────────────── */
.checks{display:flex;flex-direction:column}
.check{display:flex;align-items:center;gap:13px;padding:12px 18px;border-bottom:1px solid var(--line);color:inherit}
.check:last-child{border-bottom:0}
a.check:hover{background:var(--surface-2)}
.check .cn{font-size:19px;font-weight:900;min-width:38px;text-align:center;letter-spacing:-.6px;
  font-variant-numeric:tabular-nums}
.check.warn .cn{color:var(--warn)} .check.danger .cn{color:var(--danger)} .check.ok .cn{color:var(--ok)}
.check .ct{display:block;font-size:13.5px;font-weight:700}
.check .cw{display:block;font-size:12px;color:var(--muted);margin-top:2px}
.check .go{margin-left:auto;font-size:12px;font-weight:700;color:var(--muted);flex:0 0 auto}
a.check:hover .go{color:var(--primary)}

/* ── 표 행 hover : 클릭 가능한 행임을 알린다 ─────── */
.tbl tbody tr[data-href]{cursor:pointer}
.tbl tbody tr[data-href]:hover{background:var(--primary-tint)}
.tbl tbody tr[data-href]:hover td:first-child{box-shadow:inset 3px 0 0 var(--primary)}
.tbl tbody tr[data-href] .rowgo{opacity:0;font-weight:800;color:var(--primary);transition:opacity .12s}
.tbl tbody tr[data-href]:hover .rowgo{opacity:1}

@media (max-width:1500px){
  .kpi-row{grid-template-columns:repeat(3,1fr)}
  .trend-cards{grid-template-columns:repeat(3,1fr)}
  .dash-3col{grid-template-columns:1fr 1fr}
}
@media (max-width:900px){
  .kpi-row,.kpi-row.c4,.kpi-row.c5{grid-template-columns:repeat(2,1fr)}
  .trend-cards{grid-template-columns:1fr 1fr}
  .dash-3col,.dash-2col{grid-template-columns:1fr}
  .sumrows .sgrow{grid-template-columns:1fr;gap:8px}
}
@media (max-width:560px){
  .kpi-row,.kpi-row.c4,.kpi-row.c5,.trend-cards{grid-template-columns:1fr}
}
