/* ============================================================
   components.css — 재사용 UI 컴포넌트 (로그인/셸/카드/표/칩/모달/토스트)
   기능 모듈은 여기 클래스만 조합해서 화면을 만든다. (모듈마다 CSS 새로 쓰지 않음)
   ============================================================ */

/* ---- 로그인 ---- */
#login{min-height:100vh;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(135deg,var(--green),#3a9a66 60%,#5bb37e)}
.login-card{background:#fff;width:380px;max-width:92vw;border-radius:20px;padding:34px 30px 26px;box-shadow:0 20px 60px rgba(0,0,0,.25)}
.logo{display:flex;flex-direction:column;align-items:center;gap:4px;margin-bottom:18px}
.logo .leaf{font-size:38px} .logo h1{margin:2px 0 0;font-size:21px;letter-spacing:-.5px} .logo .sub{color:var(--muted);font-size:12.5px}
.field{margin:9px 0}
.field input{width:100%;padding:12px 13px;border:1px solid var(--line);border-radius:11px;outline:none}
.field input:focus{border-color:var(--green)}
.btn{width:100%;padding:12px;border:none;border-radius:11px;font-weight:700;font-size:14.5px}
.btn-green{background:var(--green);color:#fff;margin-top:6px} .btn-green:hover{background:var(--green-d)}
.divider{display:flex;align-items:center;gap:10px;color:var(--muted);font-size:12px;margin:16px 0 12px}
.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--line)}
.sns{display:flex;flex-direction:column;gap:8px}
.sns button{display:flex;align-items:center;justify-content:center;gap:8px;padding:11px;border-radius:11px;border:1px solid var(--line);background:#fff;font-weight:700}
.sns .kakao{background:var(--kakao);color:var(--kakao-ink);border-color:var(--kakao)}
.sns .naver{background:var(--naver);color:#fff;border-color:var(--naver)}
.foot{margin-top:16px;text-align:center;font-size:12.5px;color:var(--muted)} .foot a{font-weight:600}
.demo-box{margin-top:16px;background:var(--green-ll);border:1px dashed #bcd9c6;border-radius:12px;padding:11px 12px}
.demo-box .t{font-size:11.5px;color:var(--green-d);font-weight:800;letter-spacing:.3px;margin-bottom:7px}
.demo-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px}
.demo-grid button{padding:8px 4px;border:1px solid #c3ddcb;background:#fff;border-radius:9px;font-size:12px;font-weight:700;color:var(--green-d)}
.demo-grid button:hover{background:var(--green);color:#fff}

/* ---- 앱 셸 ---- */
#app{display:none;min-height:100vh}
.topbar{position:sticky;top:0;z-index:30;background:var(--green);color:#fff;display:flex;align-items:center;gap:12px;padding:0 16px;height:54px;box-shadow:0 2px 8px rgba(0,0,0,.12)}
.topbar .brand{font-weight:800;letter-spacing:-.3px;display:flex;align-items:center;gap:7px;white-space:nowrap} .topbar .brand .leaf{font-size:18px}
.topbar .brand .short{display:none}
.topbar .spacer{flex:1}
.deptsel,.rolepill{background:rgba(255,255,255,.18);padding:5px 11px;border-radius:20px;font-size:12.5px;font-weight:700;display:flex;align-items:center;gap:7px}
.deptsel select,.rolepill select{background:transparent;border:none;color:#fff;font-weight:700;outline:none}
.deptsel select option,.rolepill select option{color:#000}
.iconbtn{background:rgba(255,255,255,.16);border:none;color:#fff;width:34px;height:34px;border-radius:9px;font-size:15px;cursor:pointer}
.iconbtn:hover{background:rgba(255,255,255,.28)}

/* ---- 페이지 안내 배너 ---- */
.guidebar{display:flex;align-items:center;gap:12px;
  background:linear-gradient(180deg,var(--green-ll),#fff);
  border:1px solid #cfe6d7;border-left:4px solid var(--green);border-radius:14px;
  padding:12px 14px;margin-bottom:16px;box-shadow:0 2px 12px rgba(46,125,82,.07);
  animation:gbIn .28s ease}
.guidebar .gb-ico{font-size:20px;line-height:1;flex:none}
.guidebar .gb-body{flex:1;min-width:0}
.guidebar .gb-body b{display:block;font-size:13.5px;color:var(--green-d);margin-bottom:2px;letter-spacing:-.2px}
.guidebar .gb-body div{font-size:12.8px;color:var(--muted);line-height:1.55}
.guidebar .gb-x{flex:none;align-self:flex-start;border:1px solid #cfe6d7;background:#fff;color:var(--green-d);
  font-weight:700;font-size:12px;border-radius:9px;padding:7px 11px;cursor:pointer;white-space:nowrap}
.guidebar .gb-x:hover{background:var(--green-l)}
@keyframes gbIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
@media(max-width:820px){ .guidebar{flex-wrap:wrap;gap:8px} .guidebar .gb-body{flex:1 1 70%} .guidebar .gb-x{order:3;margin-left:auto;align-self:auto} }
.layout{display:flex;align-items:flex-start}
.side{width:212px;flex:none;background:var(--card);border-right:1px solid var(--line);min-height:calc(100vh - 54px);padding:12px 10px;position:sticky;top:54px}
.side .grp{font-size:11px;color:var(--muted);font-weight:800;letter-spacing:.4px;margin:14px 8px 5px;text-transform:uppercase}
.navitem{display:flex;align-items:center;gap:10px;padding:10px 11px;border-radius:10px;color:var(--ink);font-weight:600;font-size:14px;border:none;background:none;width:100%;text-align:left;margin-bottom:2px}
.navitem .ico{width:20px;text-align:center}
.navitem:hover{background:var(--green-ll)}
.navitem.active{background:var(--green-l);color:var(--green-d);font-weight:800}
.navitem .badge{margin-left:auto;background:var(--accent);color:#fff;font-size:11px;font-weight:800;border-radius:10px;padding:1px 7px}
.main{flex:1;padding:22px 26px;max-width:1100px}
.pagehead{display:flex;align-items:flex-end;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.pagehead h2{margin:0;font-size:22px;letter-spacing:-.5px} .pagehead .desc{color:var(--muted);font-size:13px}

/* ---- 카드/통계 ---- */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px;margin-bottom:16px}
.card h3{margin:0 0 12px;font-size:15.5px}
.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
.stat{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:15px 16px;box-shadow:var(--shadow)}
.stat .n{font-size:26px;font-weight:800;letter-spacing:-1px} .stat .l{color:var(--muted);font-size:12.5px;margin-top:2px}
.stat.green{background:var(--green);color:#fff;border-color:var(--green)} .stat.green .l{color:rgba(255,255,255,.85)}
.stat.accent{background:var(--accent-l);border-color:#f3d3c1}

/* ---- 컨트롤 ---- */
.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.btn-sm{padding:7px 13px;border-radius:9px;border:1px solid var(--line);background:#fff;font-weight:700;font-size:13px}
.btn-sm.primary{background:var(--green);color:#fff;border-color:var(--green)} .btn-sm.primary:hover{background:var(--green-d)}
.btn-sm.accent{background:var(--accent);color:#fff;border-color:var(--accent)} .btn-sm:hover{border-color:var(--green)}
select.inp,input.inp,textarea.inp{padding:9px 11px;border:1px solid var(--line);border-radius:9px;outline:none;background:#fff}
select.inp:focus,input.inp:focus,textarea.inp:focus{border-color:var(--green)}
.seg{display:inline-flex;border:1px solid var(--line);border-radius:10px;overflow:hidden}
.seg button{padding:7px 13px;border:none;background:#fff;font-weight:700;font-size:13px;border-right:1px solid var(--line)} .seg button:last-child{border-right:none} .seg button.on{background:var(--green);color:#fff}

/* ---- 표 ---- */
table{width:100%;border-collapse:collapse;font-size:13.5px}
th,td{text-align:left;padding:9px 10px;border-bottom:1px solid var(--line)}
th{color:var(--muted);font-size:12px;font-weight:700;background:var(--green-ll)}
tbody tr:hover{background:var(--green-ll)}

/* ---- 태그/칩 ---- */
.tag{display:inline-block;padding:1px 8px;border-radius:20px;font-size:11.5px;font-weight:700}
.tag.boy{background:#e7f0fb;color:#2d6cb5}.tag.girl{background:#fbe9f1;color:#b5436f}
.tag.A{background:#e3f3e9;color:#2e7d52}.tag.B{background:#eef6e3;color:#5d8a2e}
.tag.C{background:#fdf2e3;color:#c98a2e}.tag.D{background:#fbe6e2;color:#c0392b}
.tag.ok{background:var(--green-l);color:var(--green-d)}.tag.no{background:#f0f0f0;color:#888}
.chip{display:inline-flex;align-items:center;gap:5px;padding:5px 11px;border-radius:20px;background:#fff;border:1px solid var(--line);font-size:13px;font-weight:600}
.chip.on{background:var(--green);color:#fff;border-color:var(--green)}

/* ---- 출석/달란트 위젯 ---- */
.pres{display:inline-flex;gap:4px}
.pres button{width:30px;height:30px;border-radius:8px;border:1px solid var(--line);background:#fff;font-weight:800;font-size:13px}
.pres button.P.on{background:var(--ok);color:#fff;border-color:var(--ok)}
.pres button.A.on{background:var(--warn);color:#fff;border-color:var(--warn)}
.pres button.L.on{background:var(--late);color:#fff;border-color:var(--late)}
.talctrl{display:inline-flex;align-items:center;gap:8px}
.talctrl button{width:28px;height:28px;border-radius:8px;border:1px solid var(--line);background:#fff;font-weight:800;font-size:15px;line-height:1}
.talctrl .v{min-width:34px;text-align:center;font-weight:800;font-size:15px}

/* ---- 공지/배너/진행바 ---- */
.banner{background:var(--accent-l);border:1px solid #f3d3c1;border-radius:12px;padding:11px 14px;font-size:13px;color:#9a4a26;margin-bottom:14px}
.banner b{color:#7a3a1e}
.notice{border-left:4px solid var(--green);background:var(--green-ll);border-radius:0 10px 10px 0;padding:12px 14px;margin-bottom:10px}
.notice .meta{font-size:12px;color:var(--muted);margin-top:5px}
.notice.pin{border-left-color:var(--accent);background:var(--accent-l)}
.progress{height:8px;background:#eef2ef;border-radius:6px;overflow:hidden} .progress>i{display:block;height:100%;background:var(--green)}
.bar-row{display:flex;align-items:center;gap:10px;margin:7px 0}
.bar-row .lab{width:70px;font-weight:700;font-size:13px}
.bar-row .track{flex:1;height:16px;background:#eef2ef;border-radius:8px;overflow:hidden} .bar-row .track>i{display:block;height:100%;background:var(--green);border-radius:8px}
.bar-row .val{width:54px;text-align:right;font-weight:700;font-size:13px}

/* ---- 모달/토스트/아바타/AI ---- */
.modal-bg{position:fixed;inset:0;background:rgba(20,30,25,.45);display:flex;align-items:center;justify-content:center;z-index:60;padding:20px}
.modal{background:#fff;border-radius:16px;max-width:560px;width:100%;max-height:88vh;overflow:auto;padding:22px}
.modal h3{margin:0 0 4px}
.kv{display:grid;grid-template-columns:92px 1fr;gap:6px 12px;font-size:13.5px;margin:12px 0} .kv .k{color:var(--muted);font-weight:600}
.avatar{width:54px;height:54px;border-radius:14px;background:var(--green-l);color:var(--green-d);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:20px;flex:none}
.aiout{white-space:pre-wrap;background:var(--green-ll);border:1px solid #cfe6d7;border-radius:12px;padding:14px;font-size:13.5px;line-height:1.7;margin-top:12px}
.toast{position:fixed;bottom:22px;left:50%;transform:translateX(-50%);background:#1f2a24;color:#fff;padding:11px 18px;border-radius:30px;font-size:13.5px;font-weight:600;z-index:80;box-shadow:0 6px 20px rgba(0,0,0,.3);opacity:0;transition:.25s}
.toast.show{opacity:1;bottom:32px}

/* ---- 모바일 좌측 메뉴(햄버거 드로어) ---- */
#botnav{display:none}            /* 하단 탭바 제거 — 햄버거 메뉴로 통합 */
.menubtn{display:none}           /* 데스크톱에서는 햄버거 숨김 */
#navScrim{display:none}

@media(max-width:820px){
  /* 페이지 자체는 가로로 넘치지 않게 (표는 .card 안에서만 가로 스크롤) */
  html,body{overflow-x:hidden;max-width:100%}
  #app,.layout,.main{max-width:100%;overflow-x:hidden}
  /* 상단바 요소가 폭을 넘기지 않도록 (select 등) */
  .topbar{gap:8px}
  .topbar .spacer{min-width:0}
  .rolepill{min-width:0;overflow:hidden}
  .rolepill select{max-width:38vw}
  #app img{max-width:100%}
  .menubtn{display:inline-flex;align-items:center;justify-content:center;font-size:18px;margin-right:2px}
  /* 사이드바를 좌측에서 슬라이드되는 드로어로 */
  .side{display:block;position:fixed;top:54px;left:0;bottom:0;width:264px;max-width:82vw;z-index:46;min-height:0;
    transform:translateX(-100%);transition:transform .25s ease;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;
    box-shadow:2px 0 16px rgba(0,0,0,.18);padding:12px 10px calc(env(safe-area-inset-bottom,0px) + 32px);border-right:1px solid var(--line)}
  body.nav-open .side{transform:translateX(0)}
  #navScrim{display:block;position:fixed;inset:54px 0 0 0;background:rgba(0,0,0,.4);z-index:45;opacity:0;pointer-events:none;transition:opacity .25s}
  body.nav-open #navScrim{opacity:1;pointer-events:auto}
  .main{padding:16px 14px}.stat-grid{grid-template-columns:1fr 1fr}.kv{grid-template-columns:84px 1fr}
  .topbar{padding:0 12px}.topbar .brand span:not(.leaf){font-size:15px}
  .topbar .brand .full{display:none}.topbar .brand .short{display:inline}  /* 모바일: 새봄One 한 줄 */
  .deptsel{display:none}              /* 모바일은 상단 간소화 */
  .pagehead h2{font-size:19px}
  .row{gap:8px}
  .btn-sm{padding:9px 13px}           /* 터치 타깃 확대 */
  /* 표: 좁은 화면에서 글자가 세로로 쪼개지지 않게 + 넘치면 카드 안에서 가로 스크롤 */
  .card{overflow-x:auto;-webkit-overflow-scrolling:touch}
  table{font-size:13px}
  th,td{padding:8px 8px;white-space:nowrap}
  /* 긴 줄글(이름 외) 영역은 정상 줄바꿈 유지 */
  .notice,.aiout,.kv,.guidebar{white-space:normal}
  /* row 안 요소가 칸을 넘지 않도록 */
  .row{gap:8px}
  .row>*{min-width:0}
  input.inp,select.inp,textarea.inp{max-width:100%}
  .modal{padding:18px 16px;border-radius:16px 16px 0 0;align-self:flex-end;max-height:92vh}
  .modal-bg{align-items:flex-end;padding:0}
}
