:root{
  --brand:#3323E4; --brand-2:#5B4CFF; --brand-d:#2418B5; --brand-soft:#ECEAFF; --brand-ink:#2A1DB8;
  --navy:#0B1020; --navy-2:#141A33;
  --bg:#F4F5F9; --surface:#FFFFFF; --sunken:#F3F4F8; --raise:#FAFAFD; --line:rgba(16,20,43,.06);
  --ink:#141829; --ink-2:#414866; --muted:#7C829C; --faint:#B4B9CC;
  --in:#0E8A5F; --in-bg:#E3F6EE; --ex:#C2262E; --ex-bg:#FCE8E9;
  --warn:#B25E07; --warn-bg:#FDF1DD;
  --sh-1:0 1px 1px rgba(16,20,43,.03), 0 2px 6px rgba(16,20,43,.04), 0 12px 24px -16px rgba(16,20,43,.10);
  --sh-2:0 2px 6px rgba(16,20,43,.05), 0 18px 36px -18px rgba(16,20,43,.18);
  --sh-3:0 24px 64px -16px rgba(16,20,43,.32);
  --r:20px; --r-s:13px; --r-xs:10px;
  --bar:66px; --tab:64px;
  --font:"Pretendard Variable","Pretendard",-apple-system,"Segoe UI","Malgun Gothic",system-ui,sans-serif;
}
*{box-sizing:border-box}
[hidden]{display:none !important}
html,body{margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{
  background:var(--bg); color:var(--ink); font-family:var(--font);
  font-size:15.5px; font-weight:500; line-height:1.45; -webkit-font-smoothing:antialiased;
  padding-top:var(--bar); padding-bottom:env(safe-area-inset-bottom);
}
h1,h2,h3{margin:0; font-weight:700; letter-spacing:-.025em}
b,strong{font-weight:700}
a{color:var(--brand); text-decoration:none}
.ic{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;flex:none}
.ic-s{width:16px;height:16px}

/* ── 앱바 ── */
.appbar{
  position:fixed; inset:0 0 auto 0; height:var(--bar); z-index:40; overflow:hidden;
  background:rgba(255,255,255,.82); backdrop-filter:saturate(180%) blur(16px); -webkit-backdrop-filter:saturate(180%) blur(16px);
  box-shadow:0 1px 0 var(--line);
  display:flex; align-items:center; gap:16px; padding:0 22px;
}
.brand{display:flex; align-items:center; gap:11px; flex:none}
.brand img{width:36px; height:36px; display:block; border-radius:10px}
.brand-t{font-weight:800; font-size:16px; line-height:1; color:var(--ink); letter-spacing:-.035em}
.brand-t i{display:block; font-style:normal; font-size:9.5px; color:var(--brand); font-weight:700; letter-spacing:.22em; margin-top:3px}
.topnav{display:flex; gap:2px; flex:1; min-width:0; overflow:auto; scrollbar-width:none}
.topnav::-webkit-scrollbar{display:none}
.topnav a{
  padding:9px 12px; border-radius:11px; color:var(--ink-2); font-weight:600; font-size:13.5px;
  white-space:nowrap; display:flex; align-items:center; gap:6px; transition:background .15s,color .15s;
}
.topnav a .ic{width:17px;height:17px; color:var(--faint)}
.topnav a:hover{background:var(--sunken); color:var(--ink)} .topnav a:hover .ic{color:var(--ink-2)}
.topnav a.on{background:var(--navy); color:#fff} .topnav a.on .ic{color:#fff}
.appbar-actions{display:flex; align-items:center; gap:8px; flex:none}
.chip{
  border:0; cursor:pointer; background:var(--sunken); color:var(--ink-2);
  height:38px; padding:0 13px; border-radius:11px; font:inherit; font-size:13.5px; font-weight:700;
  display:flex; align-items:center; gap:7px; position:relative;
}
.chip:hover{background:#E9EBF3}
.chip-approve{background:linear-gradient(135deg,var(--brand-2),var(--brand)); color:#fff; box-shadow:0 8px 20px -8px rgba(51,35,228,.7)}
.chip-approve b{background:rgba(255,255,255,.22); border-radius:999px; padding:1px 8px; font-size:12.5px}
.chip-bell{width:38px; padding:0; justify-content:center}
.chip .dot{position:absolute; top:7px; right:8px; width:9px; height:9px; border-radius:50%; background:var(--ex); box-shadow:0 0 0 2.5px #fff}
.actor{display:flex; flex-direction:column; align-items:flex-start; gap:0; background:var(--sunken); border:0; border-radius:11px; padding:4px 11px 5px; cursor:pointer; font:inherit; color:var(--ink)}
.actor:hover{background:#E9EBF3}
.actor span{font-size:10px; color:var(--muted); font-weight:700; letter-spacing:.04em}
.actor b{font-size:13.5px; font-weight:800; white-space:nowrap}
.login{position:fixed; inset:0; z-index:200; background:var(--navy) url(/img/hero.jpg) center/cover; display:flex; align-items:center; justify-content:center; padding:20px}
.login::before{content:""; position:absolute; inset:0; background:linear-gradient(160deg,rgba(11,16,32,.82),rgba(51,35,228,.55))}
.login-box{position:relative; width:100%; max-width:380px; background:#fff; border-radius:22px; padding:28px 26px 22px; box-shadow:0 30px 70px -20px rgba(0,0,0,.6)}
.login-brand{display:flex; align-items:center; gap:10px; margin-bottom:18px}
.login-brand img{width:34px; height:34px; border-radius:9px}
.login-box h1{font-size:22px; font-weight:800; margin:0 0 16px}
.login-box select,.login-box input{width:100%; font-size:16px; font-weight:700; padding:12px 13px; border:0; background:var(--sunken); border-radius:12px; margin-top:6px}
.login-box .btn.p{width:100%; margin-top:18px; padding:13px; font-size:16px; justify-content:center}
.login-err{margin-top:12px; color:var(--ex); font-weight:800; font-size:13.5px}
.login-hint{margin-top:16px; text-align:center; font-size:12px}
body.viewer .only-write{display:none !important}

/* ── 레이아웃 ── */
#main{max-width:1280px; margin:0 auto; padding:24px 22px 90px}
.head{display:flex; align-items:flex-end; justify-content:space-between; gap:16px; margin-bottom:18px; flex-wrap:wrap}
.head h1{font-size:26px}
.head .sub{margin-top:6px; color:var(--muted); font-size:13.5px; font-weight:500}
.grid{display:grid; gap:14px}
.g2{grid-template-columns:repeat(2,1fr)} .g3{grid-template-columns:repeat(3,1fr)} .g4{grid-template-columns:repeat(4,1fr)}
.split{display:grid; grid-template-columns:1.8fr 1fr; gap:14px; align-items:start}
.card{background:var(--surface); border-radius:var(--r); box-shadow:var(--sh-1); padding:22px}
.card.pad0{padding:0; overflow:hidden}
.card h2{font-size:15.5px; margin-bottom:14px; display:flex; align-items:center; gap:8px; color:var(--ink)}
.card h2 .ic{color:var(--brand); width:18px; height:18px}
.card-h{display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:14px}
.card-h h2{margin:0}
.card-h a{font-size:13px; font-weight:600}
.muted{color:var(--muted); font-weight:500; font-size:13px}
.empty{padding:40px 20px; text-align:center; color:var(--muted); font-weight:500; font-size:13.5px}
.empty .ic{width:34px;height:34px; color:var(--faint); margin-bottom:10px}
.empty img{width:120px; height:120px; object-fit:contain; display:block; margin:0 auto 6px; opacity:.95}

/* ── 히어로 ── */
.hero{
  position:relative; border-radius:24px; overflow:hidden; color:#fff; padding:30px 32px; margin-bottom:16px; min-height:170px;
  background:linear-gradient(120deg,#0B1020 0%,#1A1B6B 55%,#3323E4 100%); box-shadow:var(--sh-2);
  display:flex; align-items:flex-end; justify-content:space-between; gap:20px; flex-wrap:wrap;
}
.hero::before{content:""; position:absolute; inset:0; background:url(/img/hero.jpg) center/cover no-repeat; opacity:.9}
.hero::after{content:""; position:absolute; inset:0; background:linear-gradient(90deg,rgba(11,16,32,.72) 0%,rgba(11,16,32,.35) 55%,rgba(11,16,32,0) 100%)}
.hero > *{position:relative; z-index:1}
.hero .eyebrow{font-size:12px; font-weight:600; letter-spacing:.08em; text-transform:uppercase; color:rgba(255,255,255,.7); margin-bottom:8px}
.hero h1{font-size:30px; color:#fff; letter-spacing:-.03em}
.hero .sub{margin-top:8px; color:rgba(255,255,255,.75); font-size:13.5px}
.hero .btn{backdrop-filter:blur(8px)}
.hero .btn.glass{background:rgba(255,255,255,.14); color:#fff; box-shadow:inset 0 0 0 1px rgba(255,255,255,.18)}
.hero .btn.glass:hover{background:rgba(255,255,255,.22)}
.hero .btn.p{background:#fff; color:var(--brand-ink); box-shadow:0 10px 26px -10px rgba(0,0,0,.5)}
.hero .btn.p:hover{background:#F2F1FF}

/* ── 통계 타일 ── */
.stat{border-radius:var(--r); padding:18px 20px 16px; box-shadow:var(--sh-1); background:var(--surface); position:relative; overflow:hidden}
.stat .k{font-size:12.5px; font-weight:600; color:var(--muted); display:flex; align-items:center; gap:8px}
.stat .k i{width:26px; height:26px; border-radius:8px; display:grid; place-items:center; flex:none}
.stat .k i .ic{width:15px; height:15px; stroke-width:2.4}
.stat .v{font-size:27px; font-weight:700; letter-spacing:-.035em; margin-top:10px; font-variant-numeric:tabular-nums; line-height:1.05; color:var(--ink)}
.stat .d{margin-top:7px; font-size:12.5px; font-weight:500; color:var(--muted)}
.stat.in .k i{background:var(--in-bg); color:var(--in)} .stat.in .v{color:var(--in)}
.stat.ex .k i{background:var(--ex-bg); color:var(--ex)} .stat.ex .v{color:var(--ex)}
.stat.br .k i{background:var(--brand-soft); color:var(--brand)} .stat.br .v{color:var(--brand-ink)}
.stat.wa .k i{background:var(--warn-bg); color:var(--warn)} .stat.wa .v{color:var(--warn)}
.stat.clickable{cursor:pointer; transition:transform .15s, box-shadow .15s} .stat.clickable:hover{transform:translateY(-2px); box-shadow:var(--sh-2)}

/* ── 표 ── */
.wrap{overflow-x:auto; -webkit-overflow-scrolling:touch}
table{width:100%; border-collapse:separate; border-spacing:0; font-size:13.5px}
th{
  text-align:left; font-size:11px; color:var(--muted); font-weight:700; padding:10px 12px;
  background:var(--sunken); position:sticky; top:0; white-space:nowrap; letter-spacing:.04em; text-transform:uppercase;
}
th:first-child{border-radius:var(--r-xs) 0 0 var(--r-xs)} th:last-child{border-radius:0 var(--r-xs) var(--r-xs) 0}
td{padding:12px 12px; font-weight:500; background:var(--surface); white-space:nowrap; color:var(--ink)}
td b{font-weight:600}
td.wrapcell{white-space:normal}
tr+tr td{box-shadow:inset 0 1px 0 var(--line)}
td.num,th.num{text-align:right; font-variant-numeric:tabular-nums}
tbody tr:hover td{background:var(--raise)}
.amt{font-variant-numeric:tabular-nums; font-weight:700}
.amt.in{color:var(--in)} .amt.ex{color:var(--ex)}

/* ── 배지/버튼 ── */
.pill{display:inline-flex; align-items:center; gap:5px; padding:3px 9px; border-radius:999px; font-size:11.5px; font-weight:600; white-space:nowrap; line-height:1.6}
.pill.in{background:var(--in-bg); color:var(--in)} .pill.ex{background:var(--ex-bg); color:var(--ex)}
.pill.br{background:var(--brand-soft); color:var(--brand-ink)} .pill.wa{background:var(--warn-bg); color:var(--warn)}
.pill.gy{background:var(--sunken); color:var(--ink-2)}
.btn{
  border:0; cursor:pointer; font:inherit; font-size:14px; font-weight:600; border-radius:var(--r-s);
  padding:11px 16px; background:var(--sunken); color:var(--ink); display:inline-flex; align-items:center; gap:7px;
  transition:background .15s, transform .1s, box-shadow .15s;
}
.btn:hover{background:#E9EBF3} .btn:active{transform:translateY(1px)}
.btn .ic{width:17px;height:17px}
.btn.p{background:linear-gradient(135deg,var(--brand-2),var(--brand)); color:#fff; box-shadow:0 10px 24px -10px rgba(51,35,228,.75)}
.btn.p:hover{filter:brightness(1.06)}
.btn.g{background:var(--in); color:#fff} .btn.r{background:var(--ex); color:#fff}
.btn.s{padding:7px 11px; font-size:12.5px; border-radius:var(--r-xs)}
.btn.ghost{background:transparent; color:var(--brand)} .btn.ghost:hover{background:var(--brand-soft)}
.btn:disabled{opacity:.45; cursor:not-allowed}
.row{display:flex; gap:9px; flex-wrap:wrap; align-items:center}
.tabs{display:flex; gap:6px; margin-bottom:16px; flex-wrap:wrap}
.tabs .btn{background:transparent; color:var(--ink-2)} .tabs .btn:hover{background:var(--sunken)}
.tabs .btn.on{background:var(--navy); color:#fff}

/* ── 폼 ── */
label.f{display:block; font-size:11.5px; color:var(--muted); font-weight:600; margin:0 0 6px 2px; letter-spacing:.01em}
input,select,textarea{
  width:100%; font:inherit; font-size:14px; font-weight:500; color:var(--ink);
  background:var(--sunken); border:0; border-radius:var(--r-s); padding:11px 13px; outline:none;
  transition:box-shadow .15s, background .15s;
}
input:focus,select:focus,textarea:focus{background:#fff; box-shadow:0 0 0 3px var(--brand-soft), 0 0 0 1px var(--brand)}
input[type=checkbox]{width:auto; accent-color:var(--brand)}
.toolbar{display:flex; gap:10px; flex-wrap:wrap; align-items:flex-end}
.toolbar > div{min-width:126px}

/* ── 모달 ── */
.modal{position:fixed; inset:0; background:rgba(11,16,32,.55); backdrop-filter:blur(4px); display:grid; place-items:center; padding:18px; z-index:60}
.modal .box{background:#fff; border-radius:24px; box-shadow:var(--sh-3); width:min(760px,100%); max-height:90vh; overflow:auto; padding:28px}
.modal h3{font-size:20px; margin-bottom:18px}
.modal .foot{display:flex; gap:9px; justify-content:flex-end; margin-top:22px; flex-wrap:wrap}

/* ── 결재 스텝 ── */
.step{display:flex; gap:6px; margin:12px 0}
.step div{flex:1; padding:8px 10px; border-radius:var(--r-xs); background:var(--sunken); font-size:12px; font-weight:600; color:var(--muted); text-align:center}
.step div.done{background:var(--in-bg); color:var(--in)}
.step div.now{background:var(--brand-soft); color:var(--brand-ink)}
.step div.rej{background:var(--ex-bg); color:var(--ex)}
.reqcard{background:var(--sunken); border-radius:var(--r-s); padding:15px; margin-bottom:10px}
.reqcard .t{display:flex; justify-content:space-between; gap:10px; align-items:flex-start}
.reqcard .t b{font-size:14.5px}
.reqcard .btn{background:#fff; box-shadow:var(--sh-1)}
.reqcard .btn.g{background:var(--in); color:#fff} .reqcard .btn.r{background:var(--ex); color:#fff}

/* ── 기타 ── */
.bar{height:8px; border-radius:999px; background:var(--sunken); overflow:hidden}
.bar i{display:block; height:100%; background:linear-gradient(90deg,var(--brand-2),var(--brand)); border-radius:999px}
.chart{width:100%; display:block}
.dl{display:flex; align-items:baseline; justify-content:space-between; padding:10px 0; gap:12px}
.dl+.dl{box-shadow:inset 0 1px 0 var(--line)}
.dl b{font-variant-numeric:tabular-nums; font-size:14.5px}
.dday{display:inline-flex; align-items:center; justify-content:center; min-width:46px; padding:4px 8px; border-radius:var(--r-xs); font-size:12px; font-weight:700}
.dday.soon{background:var(--ex-bg); color:var(--ex)} .dday.near{background:var(--warn-bg); color:var(--warn)}
.dday.far{background:var(--sunken); color:var(--ink-2)} .dday.past{background:var(--navy); color:#fff}
#toast{position:fixed; left:50%; bottom:calc(var(--tab) + 18px); transform:translateX(-50%); background:var(--navy); color:#fff;
  padding:13px 22px; border-radius:var(--r-s); font-weight:600; font-size:14px; box-shadow:var(--sh-3); z-index:90; display:none; max-width:90vw}
.bottomnav{display:none}
.tasklist{display:flex; flex-direction:column; gap:8px}
.taskrow{display:flex; gap:12px; align-items:flex-start; background:var(--sunken); border-radius:var(--r-s); padding:13px 14px}
.taskrow.done{opacity:.5}
.taskrow .tt{flex:1; min-width:0}
.taskrow .tt b{display:block; font-size:14px}
.check{width:22px;height:22px;border-radius:7px;background:#fff;box-shadow:inset 0 0 0 1.5px #CBD0E0;cursor:pointer;flex:none;display:grid;place-items:center;margin-top:1px}
.check.on{background:var(--brand); box-shadow:none}
.check.on .ic{width:14px;height:14px;color:#fff}
.legend{display:flex; gap:14px; flex-wrap:wrap; margin-top:10px}
.legend span{display:inline-flex; align-items:center; gap:6px; font-size:12.5px; font-weight:600; color:var(--ink-2)}
.legend i{width:10px; height:10px; border-radius:3px; display:block}
.hint{background:var(--brand-soft); color:var(--brand-ink); border-radius:var(--r-s); padding:13px 15px; font-size:13px; font-weight:500; line-height:1.6}
.warnbox{background:var(--warn-bg); color:var(--warn); border-radius:var(--r-s); padding:13px 15px; font-size:13px; font-weight:500; line-height:1.6}

/* ── 반응형 ── */
@media(max-width:1100px){ .g4{grid-template-columns:repeat(2,1fr)} .split{grid-template-columns:1fr} }
@media(max-width:860px){
  body{padding-bottom:calc(var(--tab) + env(safe-area-inset-bottom))}
  .topnav{display:none}
  .appbar{gap:10px; padding:0 14px}
  .appbar-actions{margin-left:auto}
  .actor span{display:none}
  .actor{padding:8px 10px; flex:none}
  .actor b{font-size:13px; max-width:60px; overflow:hidden; text-overflow:ellipsis}
  .brand-t{display:none}
  .appbar .brand{flex:none}
  #main{padding:16px 14px 30px}
  .head h1{font-size:22px}
  .hero{padding:22px 20px; border-radius:20px; min-height:0}
  .hero h1{font-size:24px}
  .g2,.g3,.g4{grid-template-columns:repeat(2,1fr)}
  .stat .v{font-size:22px}
  .modal{padding:0; place-items:end center}
  .modal .box{border-radius:24px 24px 0 0; max-height:92vh; padding:22px 18px calc(22px + env(safe-area-inset-bottom))}
  .bottomnav{
    display:flex; position:fixed; left:0; right:0; bottom:0; height:calc(var(--tab) + env(safe-area-inset-bottom));
    padding-bottom:env(safe-area-inset-bottom); background:rgba(255,255,255,.92); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px);
    box-shadow:0 -1px 0 var(--line); z-index:40;
  }
  .bottomnav a{flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:3px; color:var(--muted); font-size:10.5px; font-weight:600}
  .bottomnav a.on{color:var(--brand)}
  .bottomnav a .ic{width:22px;height:22px}
  th{padding:9px 9px; font-size:10px} td{padding:11px 9px; font-size:13px}
}
@media(max-width:480px){ .g2,.g3{grid-template-columns:1fr} .g4{grid-template-columns:repeat(2,1fr)} .stat{padding:14px 15px} .stat .v{font-size:19px} }
@media print{
  .appbar,.bottomnav,#toast,.noprint{display:none !important}
  body{padding:0; background:#fff} #main{padding:0; max-width:none}
  .card{box-shadow:none; border-radius:0; padding:12px 0; break-inside:avoid}
  .hero{background:#0B1020 !important} .hero::before{display:none}
}
