:root{
  --bg:#eef1f4; --card:#fff; --ink:#1f2933; --muted:#6b7785; --line:#e2e8ee;
  --brand:#0b6b5e; --brand2:#12897a; --accent:#f0a500; --danger:#e53935;
  --ok:#2e7d32; --danger-bg:#ffe8e8; --shadow:0 1px 3px rgba(0,0,0,.08);
  --r:12px;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
/* Ẩn hết thanh cuộn (vẫn cuộn được bằng lăn chuột / vuốt) */
*{scrollbar-width:none;-ms-overflow-style:none}
*::-webkit-scrollbar{width:0;height:0;display:none}
html,body{margin:0;overflow-x:hidden}
body{font-family:"Segoe UI",system-ui,-apple-system,Roboto,Arial,sans-serif;background:var(--bg);color:var(--ink);font-size:15px;line-height:1.45}
/* Chuỗi dài (mã đăng ký…) tự xuống dòng, không đẩy tràn layout */
.msg,.crow-stat,.crow-name,.smart,.rn,.snap-note{overflow-wrap:anywhere;word-break:break-word;min-width:0}
h3{font-size:15px;margin:0 0 8px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
small{color:var(--muted);font-weight:400;font-size:12px}
.hint{color:var(--muted);font-style:italic;font-size:13px;margin:4px 0}
.mono{font-family:Consolas,"Courier New",monospace}
b{color:inherit}

/* Buttons */
.btn{cursor:pointer;border:1px solid var(--line);background:#fff;border-radius:10px;padding:9px 14px;font-size:14px;color:var(--ink);font-weight:600;transition:.12s}
.btn:hover{background:#f2f5f7}
.btn:active{transform:scale(.97)}
.btn.primary{background:var(--brand);color:#fff;border-color:var(--brand)}
.btn.primary:hover{background:var(--brand2)}
.btn.big{padding:12px 20px;font-size:15px}
.btn.tiny{padding:4px 9px;font-size:12px;font-weight:600}
.btn.ghost{background:transparent;border-color:transparent}
.btn:disabled{opacity:.45;cursor:not-allowed}
.inp,select,textarea{font-family:inherit;font-size:14px;padding:9px 11px;border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink);width:100%}
textarea{resize:vertical}

/* Topbar */
.topbar{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  background:linear-gradient(90deg,var(--brand),var(--brand2));color:#fff;padding:9px 12px;box-shadow:var(--shadow)}
.brand{font-weight:800;font-size:17px}
.term{display:flex;gap:6px;flex:1;min-width:150px}
.term select{padding:6px 8px;font-size:13px;width:auto;flex:1;max-width:150px}
.code-badge{background:rgba(255,255,255,.2);color:#fff;border:1px solid rgba(255,255,255,.35);border-radius:20px;
  padding:5px 12px;font-weight:700;font-family:monospace;cursor:pointer;font-size:13px}
.code-badge:hover{background:rgba(255,255,255,.32)}

/* Tabs */
.tabs{position:sticky;top:48px;z-index:19;display:flex;background:var(--card);border-bottom:1px solid var(--line);box-shadow:var(--shadow)}
.tab-btn{flex:1;border:none;background:none;padding:12px 6px;font-size:14px;font-weight:700;color:var(--muted);cursor:pointer;border-bottom:3px solid transparent}
.tab-btn.active{color:var(--brand);border-bottom-color:var(--brand)}
.tab-badge{background:var(--accent);color:#3a2c00;border-radius:9px;padding:0 6px;font-size:11px}

main{max-width:1300px;margin:0 auto;padding:12px}
.tab-panel{display:none;flex-direction:column;gap:12px}
.tab-panel.active{display:flex}

/* Hàng trên: nhập môn + ưu tiên — 2 card BẰNG chiều cao */
.top-row{display:flex;gap:12px;align-items:stretch}
.top-input{flex:0 0 300px;min-width:260px;display:flex;flex-direction:column}
.top-input .smart{flex:1;display:flex;flex-direction:column;gap:8px}
.top-input textarea{flex:1;min-height:96px;resize:vertical}
.top-prefs{flex:1;min-width:0}
/* Hàng dưới: trái danh sách · phải lịch — card trái LUÔN cao bằng lịch (JS đồng bộ), dài thì cuộn trong */
.plan-split{display:flex;flex-direction:row;align-items:flex-start;gap:12px}
.plan-left{flex:0 0 300px;min-width:260px;display:flex;flex-direction:column}
.plan-left>.card{display:flex;flex-direction:column;min-height:0;overflow:hidden}
.plan-right{flex:1;min-width:0;display:flex;flex-direction:column;gap:12px}
@media(max-width:860px){
  .top-row{flex-direction:column}
  .top-input{flex:none;width:100%}
  .plan-split{flex-direction:column}
  .plan-left,.plan-right{flex:none;width:100%}
  .plan-left>.card{flex:none;overflow:visible;height:auto!important}
  .rows{max-height:none;overflow:visible}
}

/* Dòng chọn môn */
.row-tools{display:flex;gap:6px;margin-bottom:8px}
.rows{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}
.crow{border:1px solid var(--line);border-radius:10px;padding:8px;border-left:5px solid var(--line)}
.crow.clash{border-color:var(--danger);background:var(--danger-bg)}
.crow-top{display:flex;align-items:center;gap:6px}
.crow-code{font-weight:800;color:var(--brand)}
.crow-name{color:var(--muted);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}
.crow-rm{margin-left:auto}
.crow-pick{width:100%;margin-top:6px;font-size:12.5px}
.crow-stat{font-size:11.5px;margin-top:4px;color:var(--muted);display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.crow-stat .warn{color:var(--danger);font-weight:700}
.crow-stat .warnlow{color:#b26a00;font-weight:700}
.crow-stat .ok{color:var(--ok);font-weight:700}
.crow-stat .lk{color:var(--accent)}
.crow-choose{width:100%;margin-top:6px;text-align:left;font-size:13px}

/* Modal chọn lớp */
.modal{position:fixed;inset:0;z-index:100;background:rgba(0,0,0,.45);display:flex;align-items:flex-start;justify-content:center;padding:20px 10px}
.modal[hidden]{display:none}
.modal-box{background:var(--card);border-radius:14px;width:100%;max-width:940px;max-height:88vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 10px 40px rgba(0,0,0,.4)}
.modal-head{display:flex;align-items:center;gap:10px;padding:12px 14px;border-bottom:1px solid var(--line)}
.modal-head b{flex:1;color:var(--brand);font-size:15px}
.modal .cd-filter{border-left:none;border-right:none}
.modal-body{overflow:auto;flex:1}
.modal-body .rows-tbl{min-width:660px}
tbody.grp.clashg{background:var(--danger-bg)}
tbody.grp.clashg .grp-head{border-left:4px solid var(--danger)}
.pk-pick{white-space:nowrap}
@media(max-width:560px){ .modal{padding:8px 4px} .modal-box{max-height:94vh} }

.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r);padding:12px;box-shadow:var(--shadow)}
.badge{background:var(--accent);color:#3a2c00;border-radius:11px;padding:0 9px;font-size:12px;font-weight:700}
.badge.alt{background:#e3f2fd;color:#1565c0}
.msg{font-size:13px;color:var(--muted)}
.msg.block{margin-top:8px}
.msg.ok{color:var(--ok)} .msg.err{color:var(--danger)} .msg.warn{color:#b26a00}

/* Smart input */
.smart-row{display:flex;gap:8px;align-items:center;margin-top:8px;flex-wrap:wrap}
.smart-row .msg{flex:1;min-width:120px}

/* Search results */
.search-results:empty{display:none}
.search-results{background:var(--card);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);overflow:hidden}
.res-item{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;border-bottom:1px solid var(--line)}
.res-item:last-child{border-bottom:none}
.res-item:active{background:#eef6f4}
.res-item .rcode{font-weight:800;color:var(--brand)}
.res-item .rname{color:var(--muted);font-size:13px}

/* Cart */
.cart{display:flex;flex-direction:column;gap:8px}
.cart-item{border:1px solid var(--line);border-radius:10px;padding:9px}
.ci-head{display:flex;align-items:center;gap:8px}
.ci-dot{width:12px;height:12px;border-radius:3px;flex:none}
.ci-title{flex:1;min-width:0;cursor:pointer;display:flex;gap:6px;align-items:baseline;flex-wrap:wrap}
.ci-code{font-weight:800;color:var(--brand)}
.ci-name{color:var(--muted);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.chip{border:1px solid var(--line);border-radius:16px;padding:6px 11px;font-size:13px;cursor:pointer;display:flex;align-items:center;gap:5px;background:#fff}
.chip:active{transform:scale(.97)}
.chip .dot{width:9px;height:9px;border-radius:50%}
.chip.selected{background:var(--brand);color:#fff;border-color:var(--brand)}
.chip.clash{border-color:var(--danger);color:var(--danger);background:var(--danger-bg)}
.chip.clash.selected{background:var(--danger);color:#fff}
.pbadge{padding:0 6px;border-radius:5px;font-size:10.5px;font-weight:700}
.pbadge.p1{background:#e3f2fd;color:#1565c0} .pbadge.p2{background:#fff3e0;color:#e65100}
.chip.selected .pbadge{background:rgba(255,255,255,.85)}
.cseat{font-size:11px;opacity:.85}
.lockic{font-size:11px}

/* Course detail */
.course-detail:empty{display:none}
.cd-head{background:var(--card);border:1px solid var(--line);border-radius:var(--r) var(--r) 0 0;padding:12px;box-shadow:var(--shadow)}
.cd-head .ct{font-size:16px;font-weight:800;color:var(--brand)}
.cd-meta{font-size:12.5px;color:var(--muted);margin-top:4px;line-height:1.5}
.cd-filter{display:flex;flex-wrap:wrap;gap:6px;align-items:center;background:var(--card);border:1px solid var(--line);border-top:none;padding:8px 10px}
.cd-filter select,.cd-filter input{font-size:12.5px;padding:5px 7px;width:auto}
.cd-filter input[type=text]{flex:1;min-width:120px}
.flt-count{font-size:12px;color:var(--muted);margin-left:auto}
.detail-scroll{overflow-x:auto;background:var(--card);border:1px solid var(--line);border-top:none;border-radius:0 0 var(--r) var(--r);box-shadow:var(--shadow)}
.rows-tbl{width:100%;border-collapse:collapse;font-size:12.5px;min-width:640px}
.rows-tbl th{text-align:left;color:var(--muted);font-weight:600;padding:6px;border-bottom:1px solid var(--line);position:sticky;top:0;background:#f0f3f5}
.rows-tbl td{padding:5px 6px;border-bottom:1px solid #f0f3f5;vertical-align:top}
tbody.grp{border-top:2px solid var(--line)}
tbody.grp.sel{background:#eef6f4}
.grp-head td{background:#f7faf9;padding:7px 8px!important}
.grp-head .group-name{font-weight:800}
.grp-actions{float:right;display:inline-flex;gap:5px}
.regcode{cursor:pointer;color:var(--brand);font-weight:700;text-decoration:underline dotted}
.tag{padding:1px 6px;border-radius:4px;font-size:11px;font-weight:700}
.tag.lec{background:#e3f2fd;color:#1565c0} .tag.lab{background:#fff3e0;color:#e65100}
.tag.online{background:#ede7f6;color:#5e35b1} .tag.open{background:#e8f5e9;color:var(--ok)} .tag.closed{background:#fdecea;color:var(--danger)}
.seats.low{color:var(--danger);font-weight:700}
.gc-pick.on{background:var(--brand);color:#fff;border-color:var(--brand)}

/* Pref buttons */
.pref-btns{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}
.pref-btn{border:1px solid var(--line);background:#fff;border-radius:20px;padding:8px 13px;font-size:13px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:6px}
.pref-btn:active{transform:scale(.97)}
.pref-btn.on{background:var(--brand);color:#fff;border-color:var(--brand)}
.pref-btn .ord{background:var(--accent);color:#3a2c00;border-radius:50%;width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:800}
.chk{display:flex;align-items:center;gap:7px;font-size:13.5px;cursor:pointer;margin:8px 0}
.solve-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:6px}
.campus-wrap{margin:6px 0}
.campus-wrap select{width:auto;max-width:220px;display:inline-block}

/* Warn bar */
.warn-bar:empty{display:none}
.warn-bar{background:var(--danger-bg);color:var(--danger);font-weight:600;font-size:13px;padding:10px 12px;border-radius:var(--r);border:1px solid #f3c2c0}

/* Timetable grid (desktop) */
.grid-card{padding:0;overflow:hidden}
.grid-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 12px;flex-wrap:wrap}
.timetable{overflow-x:auto}
.tt-phase{border-top:1px solid var(--line)}
.tt-phase-title{display:flex;align-items:center;gap:8px;font-weight:800;font-size:13.5px;padding:9px 12px;background:linear-gradient(90deg,#eef6f4,#fff)}
.tt-phase-title .pnum{width:20px;height:20px;border-radius:50%;background:var(--brand);color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:12px}
.tt-phase-title .cnt{margin-left:auto;font-weight:400;font-size:12px;color:var(--muted)}
/* Luôn vừa khung: 7 ngày co giãn, không cắt/không cuộn ngang dù thu nhỏ */
.tt-grid{display:grid;grid-template-columns:40px repeat(7,minmax(0,1fr));position:relative;min-width:0;width:100%}
.tt-corner,.tt-dayhead{background:#f0f3f5;border-bottom:2px solid var(--line);border-right:1px solid var(--line);padding:6px 1px;text-align:center;font-weight:700;font-size:12px;position:sticky;top:0;z-index:3}
.tt-timecol{border-right:2px solid var(--line);background:#fafbfc}
.tt-daycol{position:relative;border-right:1px solid var(--line)}
.tt-hour{border-bottom:1px dashed #e7ecf0;font-size:10px;color:var(--muted);padding:1px 2px;box-sizing:border-box;position:relative}
.tt-hour.solid{border-bottom:1px solid var(--line)}
.tt-hour.solid b{font-weight:700}
.tt-hour .zl{position:absolute;left:3px;bottom:2px;font-size:8.5px;font-weight:800;letter-spacing:.5px;font-style:normal;color:var(--muted);opacity:.65}
/* Ranh phân Sáng/Chiều/Tối — chỉ thanh kẻ, không nền màu */
.tt-hour.noon{border-top:2px solid #c4ccd4}
.tt-hour.eveline{border-top:2px solid #c4ccd4}
.tt-block{position:absolute;left:2px;right:2px;border-radius:7px;padding:3px 5px;overflow:hidden;color:#fff;font-size:11px;line-height:1.25;box-shadow:0 1px 3px rgba(0,0,0,.25);border:1.5px solid rgba(255,255,255,.4)}
.tt-block .bt{font-weight:800;font-size:11.5px;overflow:hidden;text-overflow:ellipsis}
.tt-block .bs{opacity:.96;font-size:10px}
.tt-block .bs.bl{font-weight:700;opacity:1}
.tt-block.clash{outline:3px solid var(--danger);z-index:5;animation:pulse 1s infinite}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(229,57,53,.6)}50%{box-shadow:0 0 0 5px rgba(229,57,53,0)}}
.tt-on{position:absolute;top:1px;right:2px;font-size:8px;background:rgba(0,0,0,.28);padding:0 3px;border-radius:3px}

/* Timetable list (mobile) */
.tt-list{padding:6px 10px 12px}
.tt-day{margin-top:10px}
.tt-day-h{font-weight:800;font-size:13px;color:var(--brand);margin:6px 0 4px}
.tt-li{display:flex;gap:8px;align-items:stretch;border:1px solid var(--line);border-left-width:5px;border-radius:9px;padding:7px 9px;margin-bottom:6px}
.tt-li.clash{border-color:var(--danger);background:var(--danger-bg)}
.tt-li .time{font-weight:700;font-size:12.5px;min-width:74px}
.tt-li .info{flex:1;min-width:0}
.tt-li .nm{font-weight:700;font-size:13px}
.tt-li .sub{font-size:11.5px;color:var(--muted)}
.tt-empty{color:var(--muted);font-style:italic;padding:14px;text-align:center}

/* Selected list */
.selected-list{display:flex;flex-direction:column;gap:6px}
.sel-item{display:flex;align-items:center;gap:8px;font-size:13px;padding:7px 9px;border:1px solid var(--line);border-radius:9px;flex-wrap:wrap}
.sel-item .sdot{width:12px;height:12px;border-radius:3px}
.sel-item .scode{font-weight:800}
.sel-item .sreg{font-family:monospace;margin-left:auto;color:var(--brand);cursor:pointer}
.cr-tag{background:#e3f2fd;color:#1565c0;border-radius:5px;padding:0 6px;font-size:11px;font-weight:700}

/* Code / share box */
.code-box>*{margin-bottom:8px}
.code-actions{display:flex;gap:8px;flex-wrap:wrap}
.open-box{display:flex;gap:8px;margin-top:6px}
.open-box .inp{flex:1}
.recent-list{margin-top:10px;display:flex;flex-direction:column;gap:6px}
.recent-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
.recent-item{display:flex;align-items:center;gap:8px;font-size:13px;padding:7px 9px;border:1px solid var(--line);border-radius:9px}
.recent-item.cur{border-color:var(--brand);background:#eef6f4}
.recent-item .rn{flex:1;min-width:0;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.recent-item .rc{font-family:monospace;color:var(--muted);font-size:11.5px}

/* Toast */
.toast{position:fixed;left:50%;bottom:18px;transform:translateX(-50%) translateY(140px);background:#222;color:#fff;padding:11px 18px;border-radius:10px;font-size:13.5px;z-index:999;transition:transform .3s;max-width:90vw;box-shadow:0 4px 14px rgba(0,0,0,.3)}
.toast.show{transform:translateX(-50%) translateY(0)}
.toast.ok{background:var(--ok)} .toast.err{background:var(--danger)}
.save-tag{position:fixed;right:10px;bottom:10px;font-size:11px;color:var(--muted);background:rgba(255,255,255,.85);padding:2px 8px;border-radius:9px}

@media(max-width:560px){
  body{font-size:14px}
  .brand{font-size:15px}
  .term{order:3;flex-basis:100%}
  .term select{max-width:none}
}
