@import url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css");
:root{
  --p:#5B6FC2; --p2:#4A5BB0; --pl:#EEF1FB; --ink:#1C1E2B; --mute:#6B6F80; --line:#E3E5EE; --bg:#F5F6FA; --card:#fff;
  --ok:#2E9E5B; --okl:#E6F6EC; --warn:#D9822B; --warnl:#FFF2E3; --bad:#D6453D; --badl:#FDECEB; --cy:#50BDDB; --cyl:#E6F6FA; --pu:#B384BB; --pul:#F3EAF5;
  --r:12px; --sh:0 1px 2px rgba(28,30,43,.04),0 6px 20px -12px rgba(28,30,43,.12);
}
*{box-sizing:border-box} html{-webkit-text-size-adjust:100%}
body{margin:0;font-family:"Pretendard Variable",Pretendard,"Malgun Gothic",sans-serif;background:var(--bg);color:var(--ink);font-size:14px;line-height:1.55;letter-spacing:-.01em}
button,input,select,textarea{font:inherit;color:inherit}
a{color:inherit;text-decoration:none}
.top{height:56px;background:#fff;border-bottom:1px solid var(--line);display:flex;align-items:center;padding:0 24px;gap:28px;position:sticky;top:0;z-index:5}
.top img{height:22px;display:block}
.top .brand{display:flex;align-items:center;gap:10px;font-weight:700;color:var(--mute);font-size:12px;letter-spacing:.02em}
.top .brand span{padding-left:10px;border-left:1px solid var(--line)}
.top nav{display:flex;gap:4px}
.top nav a{padding:7px 12px;border-radius:8px;font-weight:600;color:var(--mute);font-size:13px}
.top nav a.on{background:var(--pl);color:var(--p)}
.top nav a.dim{opacity:.45;cursor:default}
.top .right{margin-left:auto;display:flex;align-items:center;gap:10px;font-size:12px;color:var(--mute)}
.lang{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.lang b{padding:4px 10px;font-weight:600;font-size:12px}
.lang b.on{background:var(--p);color:#fff}
.top .right .usr{border:1px solid var(--line);border-radius:8px;padding:4px 8px;font-size:12px;background:#fff;color:var(--ink);font-weight:600}
.wrap{max-width:1240px;margin:0 auto;padding:22px 24px 60px}
h1{font-size:22px;margin:0;font-weight:800;letter-spacing:-.02em}
.row{display:flex;align-items:center;gap:12px}
.sp{flex:1}
.btn{border:1px solid var(--line);background:#fff;border-radius:9px;padding:8px 14px;font-weight:600;font-size:13px;cursor:pointer;transition:.15s}
.btn:hover{border-color:#c9cde0;background:#fafbfe}
.btn.p{background:var(--p);border-color:var(--p);color:#fff}
.btn.p:hover{background:var(--p2)}
.btn.sm{padding:5px 10px;font-size:12px;border-radius:7px}
.btn.ok{background:var(--okl);border-color:transparent;color:var(--ok)}
.btn.bad{background:var(--badl);border-color:transparent;color:var(--bad)}
.btn.cy{background:var(--cyl);border-color:transparent;color:#1F8FA8}
.btn.ghost{border-color:transparent;background:transparent;color:var(--mute)}
.search{display:flex;align-items:center;border:1px solid var(--line);border-radius:9px;background:#fff;padding:0 10px;height:36px;width:260px}
.search input{border:0;outline:0;background:transparent;width:100%;font-size:13px}
.search svg{width:15px;height:15px;color:var(--mute);margin-right:6px}
.cards{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:18px 0}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r);padding:16px 18px;box-shadow:var(--sh)}
.card .k{font-size:12px;color:var(--mute);font-weight:600}
.card .v{font-size:26px;font-weight:800;color:var(--p);letter-spacing:-.03em;margin-top:4px}
.card .v small{font-size:13px;color:var(--mute);font-weight:600;margin-left:4px}
.tabs{display:flex;gap:6px;flex-wrap:wrap}
.tab{padding:6px 12px;border-radius:8px;border:1px solid var(--line);background:#fff;font-size:12.5px;font-weight:600;color:var(--mute);cursor:pointer}
.tab.on{background:var(--p);border-color:var(--p);color:#fff}
.tab.cat.on{background:var(--pul);border-color:var(--pu);color:#7A4F86}
.hint{font-size:11.5px;color:var(--mute);margin:8px 0 12px}
table{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;box-shadow:var(--sh)}
table{display:table}
th{font-size:11.5px;color:var(--mute);font-weight:600;text-align:left;padding:10px 14px;border-bottom:1px solid var(--line);background:#FAFBFE}
td{padding:11px 14px;border-bottom:1px solid var(--line);vertical-align:middle;font-size:13px}
tr:last-child td{border-bottom:0}
tr.st:hover td{background:#FAFBFF;cursor:pointer}
tr.dim td{color:#A0A3B3}
.av{width:30px;height:30px;border-radius:50%;background:linear-gradient(135deg,#6B86C4,#B384BB);color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;margin-right:10px;vertical-align:middle}
.nm{font-weight:700}
.cnt b{font-weight:800}
.cnt b.red{color:var(--bad)}
.chip{display:inline-block;padding:3px 9px;border-radius:999px;font-size:11.5px;font-weight:700}
.chip.active{background:var(--pl);color:var(--p)}
.chip.ending{background:var(--warnl);color:var(--warn)}
.chip.reenrolled{background:var(--okl);color:var(--ok)}
.chip.paused{background:var(--pul);color:#7A4F86}
.chip.ended{background:#EEEFF3;color:var(--mute)}
.chip.today{background:var(--p);color:#fff;margin-left:6px;font-size:10.5px;padding:2px 7px}
.chip.done{background:var(--okl);color:var(--ok)}
.chip.absent{background:var(--badl);color:var(--bad)}
.chip.pre{background:var(--cyl);color:#1F8FA8}
.chip.mk{background:var(--pul);color:#7A4F86}
.acts{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.foot{font-size:11px;color:var(--mute);margin-top:12px;line-height:1.6}
/* 상세 */
.head{display:flex;align-items:center;gap:12px;margin:4px 0 16px}
.head h1{font-size:24px}
.g4{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
.card h4{margin:0 0 10px;font-size:13px;font-weight:700}
.kv{display:flex;justify-content:space-between;font-size:12.5px;padding:4px 0;border-bottom:1px dashed var(--line)}
.kv:last-child{border:0}
.kv span{color:var(--mute)}
.big{font-size:34px;font-weight:800;letter-spacing:-.03em;line-height:1}
.big.red{color:var(--bad)}
.bar{height:6px;background:var(--line);border-radius:4px;overflow:hidden;margin:8px 0 6px}
.bar i{display:block;height:100%;background:linear-gradient(90deg,#6B86C4,#B384BB)}
.dtabs{display:flex;gap:2px;border-bottom:1px solid var(--line);margin:22px 0 16px}
.dtab{padding:10px 14px;font-weight:600;font-size:13px;color:var(--mute);border-bottom:2px solid transparent;cursor:pointer;margin-bottom:-1px}
.dtab.on{color:var(--p);border-color:var(--p)}
.dtab.soon{opacity:.5}
.dtab.soon::after{content:"준비 중";font-size:10px;margin-left:5px;padding:1px 6px;border-radius:99px;background:#EEEFF3;color:var(--mute)}
.g2{display:grid;grid-template-columns:1fr 1.15fr;gap:16px;align-items:start}
.cal{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}
.cal .d{font-size:11px;color:var(--mute);text-align:center;font-weight:600;padding:4px 0}
.cal .c{height:58px;border:1px solid var(--line);border-radius:8px;padding:5px 6px;font-size:11.5px;cursor:pointer;background:#fff;position:relative;transition:.12s}
.cal .c:hover{border-color:var(--p)}
.cal .c.off{background:transparent;border-color:transparent;cursor:default}
.cal .c.sel{border-color:var(--p);box-shadow:0 0 0 2px var(--pl)}
.cal .c.today{font-weight:800;color:var(--p)}
.cal .c .m{display:block;margin-top:6px;font-size:10px;font-weight:700;padding:1px 5px;border-radius:5px;width:fit-content}
.cal .c .m.present{background:var(--okl);color:var(--ok)}
.cal .c .m.absent{background:var(--badl);color:var(--bad)}
.cal .c .m.pre{background:var(--cyl);color:#1F8FA8}
.cal .c .m.mk{background:var(--pul);color:#7A4F86}
.cal .c .m.plan{background:#F1F2F6;color:var(--mute)}
.legend{display:flex;gap:8px;align-items:center;font-size:11px;color:var(--mute);margin-left:auto}
.frm label{display:block;font-size:11.5px;color:var(--mute);font-weight:600;margin:10px 0 4px}
.frm input,.frm select,.frm textarea{width:100%;border:1px solid var(--line);border-radius:8px;padding:8px 10px;background:#fff;outline:0;font-size:13px}
.frm input:focus,.frm select:focus,.frm textarea:focus{border-color:var(--p);box-shadow:0 0 0 3px var(--pl)}
.frm textarea{min-height:56px;resize:vertical}
.g2f{display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
.seg{display:flex;gap:4px}
.seg b{flex:1;text-align:center;padding:6px 0;border:1px solid var(--line);border-radius:7px;font-size:12px;font-weight:600;cursor:pointer;color:var(--mute)}
.seg b.on{background:var(--pl);border-color:var(--p);color:var(--p)}
.seg b.on.ok{background:var(--okl);border-color:var(--ok);color:var(--ok)}
.seg b.on.bad{background:var(--badl);border-color:var(--bad);color:var(--bad)}
.seg b.on.cy{background:var(--cyl);border-color:var(--cy);color:#1F8FA8}
.eval{display:grid;grid-template-columns:1fr 1fr;gap:10px 14px}
.note{background:var(--pl);border-radius:8px;padding:9px 12px;font-size:12px;color:var(--p2);margin-top:10px}
.note.warn{background:var(--warnl);color:#9A5A17}
.toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%) translateY(20px);background:var(--ink);color:#fff;padding:10px 16px;border-radius:10px;font-size:13px;opacity:0;transition:.25s;pointer-events:none;z-index:20}
.toast.on{opacity:1;transform:translateX(-50%)}
.list{display:flex;flex-direction:column;gap:6px}
.li{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:9px;background:#fff;font-size:13px}
.li .sp{flex:1}
/* 로그인 */
.login{min-height:calc(100vh - 56px);display:grid;place-items:center;background:radial-gradient(900px 400px at 20% -10%,#E9ECFA,transparent),radial-gradient(700px 400px at 100% 100%,#F3EAF5,transparent)}
.login .card{width:380px;padding:30px 32px}
.login h1{font-size:19px;margin-bottom:4px}
.login .sub{font-size:12.5px;color:var(--mute);margin-bottom:18px}
/* 모바일 출결 */
.mob{max-width:430px;margin:0 auto;padding:16px 16px 40px}
.mob h2{font-size:17px;margin:0 0 10px;font-weight:800}
.mstep{font-size:11.5px;color:var(--mute);font-weight:600;margin:14px 0 6px}
.days{display:flex;gap:6px;overflow-x:auto;padding-bottom:4px}
.day{flex:0 0 46px;text-align:center;border:1px solid var(--line);border-radius:10px;padding:6px 0;background:#fff;font-size:11px;color:var(--mute)}
.day b{display:block;font-size:15px;color:var(--ink)}
.day.on{background:var(--p);border-color:var(--p)} .day.on,.day.on b{color:#fff}
.slot{display:flex;align-items:center;gap:10px;padding:11px 12px;border:1px solid var(--line);border-radius:10px;background:#fff;margin-bottom:6px}
.slot.on{border-color:var(--p);background:var(--pl)}
.slot b{font-size:15px;min-width:48px}
.mrow{padding:12px;border:1px solid var(--line);border-radius:12px;background:#fff;margin-bottom:8px}
.mrow .nm{font-size:15px}
.mrow .acts{margin-top:10px}
.mrow .acts .btn{flex:1;text-align:center;padding:9px 0}
.mrow textarea{width:100%;margin-top:8px;border:1px solid var(--line);border-radius:8px;padding:8px;font-size:13px;min-height:44px}
.hide{display:none!important}
.pill{font-size:11px;color:var(--mute);background:#F1F2F6;border-radius:99px;padding:2px 8px;font-weight:600}
@media (max-width:760px){
  .top{padding:0 14px;gap:12px} .top nav{display:none} .top .brand span{display:none} .top .right .pill,.top .right>span:last-child{display:none} .lang b{white-space:nowrap;padding:4px 8px}
  .wrap{padding:14px 14px 40px} .wrap>.row:first-child{flex-wrap:wrap} .wrap>.row:first-child h1{white-space:nowrap;flex-basis:100%} .btn.p{white-space:nowrap} .cards{grid-template-columns:1fr 1fr;gap:8px} .card .v{font-size:20px}
  .g4{grid-template-columns:1fr 1fr} .g2{grid-template-columns:1fr} .g2f{grid-template-columns:1fr}
  table{display:block;overflow-x:auto;white-space:nowrap} .search{width:100%}
}

/* ---- v2 추가 ---- */
button.tab,button.dtab,button.slot,button.c{font:inherit;color:inherit;text-align:left;cursor:pointer}
button.tab{appearance:none}
button.slot{width:100%;text-align:left}
button.day{appearance:none;cursor:pointer;font:inherit;text-align:center}
.day.td:not(.on){border-color:var(--p);color:var(--p)}
.m0{margin:0!important}
.ell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bar.sm{height:4px;margin:8px 0 0}
.tw{overflow:auto;border-radius:var(--r)}
tr.grp td{background:#F3F4F9;padding:8px 14px;font-size:12.5px;border-top:1px solid var(--line)}
.cnt2{font-size:10.5px;background:rgba(0,0,0,.06);border-radius:99px;padding:1px 6px;margin-left:3px}
.tab.on .cnt2{background:rgba(255,255,255,.25)}
td.empty,.card.empty{text-align:center;color:var(--mute);padding:28px 14px!important}
.search{position:relative}.search .x{position:absolute;right:6px;top:6px;width:24px;height:24px;border:0;border-radius:50%;background:#EEEFF3;color:var(--mute);cursor:pointer;font-size:14px;line-height:1}
.mb{position:fixed;inset:0;background:rgba(28,30,43,.38);display:grid;place-items:center;z-index:30;padding:16px;animation:fd .15s}
.mc{width:420px;max-width:100%;animation:up .18s}
@keyframes fd{from{opacity:0}}@keyframes up{from{transform:translateY(8px);opacity:0}}
body.lock{overflow:hidden}
.err{border-color:var(--bad)!important;box-shadow:0 0 0 3px var(--badl)!important}
.note.ok{background:var(--okl);color:#1E6B3A}
.toast.bad{background:var(--bad)}
.av.lg{width:44px;height:44px;font-size:14px}
.ph{width:84px;height:84px;border:1px dashed #c9cde0;border-radius:10px;display:grid;place-items:center;font-size:11px;color:var(--mute);text-align:center;flex:none;cursor:pointer}
.ph:hover{border-color:var(--p);color:var(--p)}
.cal .m.miss{background:var(--warnl);color:var(--warn)}
button.c{display:block;width:100%;font-family:inherit}
.btn:focus-visible,.tab:focus-visible,.c:focus-visible,tr.st:focus-visible{outline:2px solid var(--p);outline-offset:2px}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn.ok:hover{background:#D7F0E0}.btn.bad:hover{background:#FBDAD7}.btn.cy:hover{background:#D3EEF5}
/* 오늘의 수업 */
.today{margin-bottom:26px;padding-bottom:22px;border-bottom:1px solid var(--line)}
.slots{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}
.sc{padding:14px 16px}
.sc.done{border-color:#BFE3CC}
.sch{margin-bottom:8px}
.tm{font-size:20px;font-weight:800;letter-spacing:-.02em;color:var(--p);min-width:58px}
.srows{display:flex;flex-direction:column}
.srow{display:flex;align-items:center;gap:10px;padding:8px 0;border-top:1px dashed var(--line);min-height:44px}
.srow a.row:hover .nm{color:var(--p)}
.cntm{flex:none}
@media (max-width:760px){
  .hm{display:none!important}
  .slots{grid-template-columns:1fr}
  .srow{flex-wrap:wrap} .srow .acts{width:100%} .srow .acts .btn{flex:1;text-align:center;padding:8px 0}
  .cards{grid-template-columns:1fr 1fr}
  .mc{width:100%}
  .mrow .acts .btn{min-height:44px}
  .top .right{gap:6px} .top .right .btn.ghost{padding:5px 6px}
}

/* ---- v2 QA 수정 ---- */
body{word-break:keep-all;overflow-wrap:anywhere}
.btn{white-space:nowrap}
button.dtab{border:0;border-bottom:2px solid transparent;background:transparent;border-radius:0;white-space:nowrap;margin-bottom:-1px;padding:10px 14px}
.dtabs{overflow-x:auto;scrollbar-width:none} .dtabs::-webkit-scrollbar{display:none}
.row.hd{flex-wrap:wrap} .row.hd h1{white-space:nowrap}
.head{flex-wrap:wrap} .head h1{white-space:nowrap}
.cal .c{height:60px;overflow:hidden} .cal .c .m{white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:block}
.legend .chip{white-space:nowrap}
@media (max-width:760px){
  .row.hd h1{flex-basis:100%}
  .head{gap:8px} .head h1{font-size:20px;flex-basis:auto} .head .sp{flex-basis:100%;height:0}
  .head .btn{flex:1;text-align:center}
  .g4{gap:8px} .card{padding:14px}
  .cal .c{height:52px;padding:4px 5px;font-size:11px} .cal .c .m{font-size:9.5px;padding:1px 3px}
  .mrow .row textarea{flex:1}
}

.cal .c{height:64px} .cal .c .m{white-space:normal;line-height:1.15;overflow:visible;text-overflow:clip}

/* ---- 11/3 백지수 검수 반영 ---- */
/* 6 메인 리스트 = 이름 열만 왼쪽, 나머지 가운데 */
th,td{text-align:center} th:first-child,td:first-child{text-align:left} tr.grp td{text-align:left} td .acts{justify-content:center}
/* 3 프로필 사진 미리보기 */
.ph.has{background-size:cover;background-position:center;border-style:solid;border-color:var(--line)}
/* 4 학생별 추가 요일 칩 */
.tab.ex{background:var(--pul);border-color:var(--pu);color:#7A4F86} .tab.ex b{cursor:pointer;margin-left:4px;font-weight:800} button.tab#fdadd{border-style:dashed}
/* 5 납부 일정 소제목 */
.frm label.sub{margin:6px 0 3px;font-size:11px}
/* 8 모바일 출결 수정 버튼 = 출석·결석과 같은 박스 */
.mrow .acts .btn[data-undo]{border:1px solid var(--line);background:#fff;color:var(--mute);font-weight:600}
@media (max-width:760px){ .head > a.btn.sm:first-child{flex:0 0 auto} .cal .c{height:56px} }

/* ---- 11/4 v4 검수 반영 ---- */
/* 12 모바일 달력 월 표시 세로 깨짐 = 월 라벨 줄바꿈 금지 · 좁으면 범례를 다음 줄로 */
.calhd b{white-space:nowrap}
@media (max-width:760px){ .calhd{flex-wrap:wrap} .calhd .legend{flex-basis:100%;margin-left:0;margin-top:6px} }
/* 추가 요일 칩 */
.tab.ex{border-style:dashed}

/* v3 설정 */
.dchk{display:inline-flex;align-items:center;gap:4px;padding:5px 10px;border:1px solid var(--line);border-radius:8px;font-size:12.5px;cursor:pointer;margin:0}
.dchk input{width:auto;margin:0}
@media (max-width:760px){ .g2 > div{min-width:0} #ulist .li{flex-wrap:wrap;gap:6px} }
