:root{--bg:#f4f6fb;--card:#fff;--ink:#1f2430;--muted:#6b7280;--line:#e7eaf1;--accent:#4f46e5;--accent-2:#0ea5e9;--green:#16a34a;--red:#dc2626;--amber:#d97706;--radius:16px;--shadow:0 1px 2px #1018280a, 0 8px 24px #1018280f;--sidebar-w:264px}*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}body{background:var(--bg);color:var(--ink);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,Hiragino Sans GB,sans-serif;line-height:1.6}.app{min-height:100vh;display:flex}aside.sidebar{width:var(--sidebar-w);color:#fff;background:linear-gradient(#4f46e5 0%,#0ea5e9 100%);flex-direction:column;flex:none;height:100vh;padding:28px 20px;display:flex;position:sticky;top:0;overflow-y:auto}.profile{align-items:center;gap:14px;display:flex}.avatar{object-fit:cover;background:#ffffff2e;border:2px solid #ffffff80;border-radius:50%;flex:none;justify-content:center;align-items:center;width:52px;height:52px;font-size:22px;font-weight:700;display:flex}.profile .name{font-size:18px;font-weight:700}.profile .sub{opacity:.9;font-size:12px}nav.menu{flex-direction:column;gap:4px;margin-top:30px;display:flex}nav.menu .menu-item{color:#fff;cursor:pointer;border-radius:12px;align-items:center;gap:12px;padding:12px 14px;font-size:15px;text-decoration:none;transition:background .15s;display:flex}nav.menu .menu-item .ico{text-align:center;flex:none;width:22px;height:22px;font-size:16px;font-weight:700;line-height:22px}nav.menu .menu-item:hover{background:#ffffff1f}nav.menu .menu-item.active{background:#ffffff38;font-weight:600}.sidebar .spacer{flex:1}.intro-link{color:#4f46e5;background:#fff;border-radius:12px;justify-content:center;align-items:center;gap:8px;padding:11px 14px;font-size:14px;font-weight:600;text-decoration:none;display:flex;box-shadow:0 4px 14px #0000001f}.intro-link:hover{transform:translateY(-1px)}main.content{flex:1;min-width:0;padding:32px 36px 60px}.panel.active{animation:.25s fade}@keyframes fade{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.page-title{margin-bottom:4px;font-size:22px;font-weight:700}.page-desc{color:var(--muted);margin-bottom:22px;font-size:14px}.stats{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px;display:grid}.stat{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);border:1px solid var(--line);padding:18px 20px}.stat .label{color:var(--muted);font-size:13px}.stat .value{margin-top:4px;font-size:26px;font-weight:700}.stat .value small{color:var(--muted);font-size:14px;font-weight:500}.stat .hint{color:var(--muted);margin-top:4px;font-size:12px}.stat.up .value{color:var(--green)}.stat.blue .value{color:var(--accent)}.card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);border:1px solid var(--line);padding:22px 24px}.card h3{align-items:center;gap:8px;margin-bottom:12px;font-size:15px;font-weight:700;display:flex}.card h3 .dot{background:var(--accent);border-radius:50%;flex:none;width:8px;height:8px}.grid-2{grid-template-columns:1fr 1fr;gap:16px;display:grid}@media (width<=720px){.grid-2{grid-template-columns:1fr}}.chart{align-items:flex-end;gap:26px;height:150px;padding:8px 4px 0;display:flex}.bar-col{flex-direction:column;flex:1;justify-content:flex-end;align-items:center;height:100%;display:flex}.bar{background:linear-gradient(#6366f1,#0ea5e9);border-radius:8px 8px 4px 4px;width:100%;max-width:64px;transition:height .4s;position:relative}.bar span{color:var(--ink);font-size:13px;font-weight:700;position:absolute;top:-24px;left:50%;transform:translate(-50%)}.bar-label{color:var(--muted);margin-top:8px;font-size:12px}ul.plain{list-style:none}ul.plain li{border-bottom:1px dashed var(--line);align-items:flex-start;gap:10px;padding:9px 0;font-size:14px;display:flex}ul.plain li:last-child{border-bottom:none}ul.plain li:before{content:"◆";color:var(--accent);flex:none;margin-top:5px;font-size:10px}.tags{flex-wrap:wrap;gap:8px;display:flex}.tag{color:#4338ca;background:#eef2ff;border:1px solid #e0e7ff;border-radius:999px;padding:6px 13px;font-size:13px}.tag.teal{color:#0e7490;background:#ecfeff;border-color:#cffafe}.tag.green{color:#15803d;background:#f0fdf4;border-color:#dcfce7}.tag.amber{color:#b45309;background:#fffbeb;border-color:#fef3c7}.exam-grid{grid-template-columns:repeat(auto-fit,minmax(360px,1fr));gap:16px;display:grid}.exam-card{padding:20px}.exam-head{justify-content:space-between;align-items:flex-start;gap:10px;margin-bottom:16px;display:flex}.exam-head h3{font-size:16px;font-weight:700}.exam-sub{color:var(--muted);margin-top:4px;font-size:12.5px}.badge{border-radius:999px;flex:none;padding:5px 10px;font-size:12px;font-weight:600}.badge.open{color:#15803d;background:#dcfce7}.badge.done{color:#b91c1c;background:#fee2e2}.exam-timeline{flex-direction:column;margin:4px 0 16px;display:flex}.tl-item{gap:12px;padding-bottom:18px;display:flex;position:relative}.tl-item:last-child{padding-bottom:0}.tl-item:not(:last-child):before{content:"";background:var(--line);width:2px;position:absolute;top:12px;bottom:-2px;left:5px}.tl-dot{background:#cbd5e1;border-radius:50%;flex:none;width:12px;height:12px;margin-top:4px}.tl-item.past .tl-dot{background:#cbd5e1}.tl-item.now .tl-dot{background:var(--accent);box-shadow:0 0 0 4px #4f46e526}.tl-item.future .tl-dot{background:#fbbf24}.tl-label{color:var(--muted);margin-bottom:2px;font-size:12px}.tl-date{color:var(--ink);font-size:15px;font-weight:700}.tl-item.now .tl-date{color:var(--accent)}.tl-extra{color:var(--muted);margin-top:2px;font-size:12px}.exam-links{border-top:1px dashed var(--line);flex-wrap:wrap;gap:8px;padding-top:14px;display:flex}.exam-links a{color:var(--accent);border:1px solid var(--line);border-radius:8px;padding:6px 12px;font-size:12.5px;text-decoration:none}.exam-links a:hover{border-color:var(--accent);background:#eef2ff}.add-form{gap:6px;margin-top:12px;display:flex}.add-form input{border:1px solid var(--line);background:var(--bg);border-radius:8px;outline:none;flex:1;padding:7px 10px;font-size:13px}.add-form input:focus{border-color:var(--accent);background:#fff}.add-form button{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:8px;padding:0 12px;font-size:16px}.add-form button:hover{background:#4338ca}.cal-layout{grid-template-columns:3fr 2fr;align-items:start;gap:16px;display:grid}.cal-panel{min-width:0}.cal-toolbar{align-items:center;gap:10px;margin-bottom:14px;display:flex}.cal-title{text-align:center;flex:1;font-size:16px;font-weight:700}.cal-nav{border:1px solid var(--line);background:var(--bg);cursor:pointer;width:34px;height:34px;color:var(--ink);border-radius:8px;font-size:18px}.cal-nav:hover{background:#eef2ff}.btn-today{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:8px;padding:7px 13px;font-size:13px}.btn-today:hover{background:#4338ca}.cal-selected{text-align:center;color:var(--muted);margin-bottom:8px;font-size:13px}.cal-week{text-align:center;grid-template-columns:repeat(7,1fr);margin-bottom:6px;display:grid}.cal-week span{color:var(--muted);padding:4px 0;font-size:12px;font-weight:600}.cal-grid{grid-template-columns:repeat(7,1fr);gap:4px;display:grid}.cal-day{cursor:pointer;border:1px solid #0000;border-radius:10px;flex-direction:column;justify-content:center;align-items:center;height:46px;font-size:14px;transition:background .12s;display:flex;position:relative}.cal-day:hover{background:#eef2ff}.cal-day.other{color:#c3c8d4}.cal-day.today{border-color:var(--accent);font-weight:700}.cal-day.selected{background:var(--accent);color:#fff}.cal-day .dot{background:var(--accent-2);border-radius:50%;width:5px;height:5px;position:absolute;bottom:6px}.cal-day.selected .dot{background:#fff}.cal-day.event-mark:after{content:"";background:#ef4444;border:1.5px solid #fff;border-radius:50%;width:7px;height:7px;position:absolute;top:5px;right:6px}.countdown-wrap{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin-bottom:16px;display:grid}.countdown-card{color:#fff;box-shadow:var(--shadow);background:linear-gradient(135deg,#4f46e5,#7c3aed);border-radius:14px;padding:14px 16px}.countdown-card.cmc{background:linear-gradient(135deg,#0e7490,#0ea5e9)}.countdown-card.warn{background:linear-gradient(135deg,#d97706,#f59e0b)}.countdown-card .cd-name{opacity:.92;font-size:13px;font-weight:600}.countdown-card .cd-num{margin:2px 0;font-size:30px;font-weight:800;line-height:1.25}.countdown-card .cd-date{opacity:.85;font-size:12px}.cal-remind{color:#b45309;background:#fffbeb;border:1px solid #fef3c7;border-radius:10px;margin-bottom:10px;padding:10px 14px;font-size:13px}.event-list{list-style:none}.event-list li{border-bottom:1px dashed var(--line);align-items:center;gap:10px;padding:8px 0;font-size:14px;display:flex}.event-list li:last-child{border-bottom:none}.event-list .del{color:var(--muted);cursor:pointer;background:0 0;border:none;margin-left:auto;padding:2px 6px;font-size:15px}.event-list .del:hover{color:var(--red)}.day-courses{flex-direction:column;gap:8px;margin-bottom:12px;display:flex}.day-courses .day-courses-empty{color:#9ca3af;padding:6px 2px;font-size:13px}.course-chip{color:#fff;border-radius:10px;align-items:center;gap:8px;padding:9px 12px;font-size:12.5px;display:flex;box-shadow:0 1px 3px #1018281a}.course-chip .c-time{white-space:nowrap;font-size:12px;font-weight:700}.course-chip .c-name{flex:1;font-weight:600}.course-chip .c-loc{opacity:.88;font-size:11px}.week-nav{align-items:center;gap:10px;margin-bottom:14px;display:flex}.week-title{text-align:center;flex:1;font-size:15px;font-weight:700}.timetable-wrap{overflow-x:auto}.tt-grid{grid-template-rows:auto repeat(10,56px);grid-template-columns:58px repeat(7,minmax(0,1fr));gap:5px;min-width:720px;display:grid}.tt-corner{color:var(--muted);justify-content:center;align-items:flex-end;padding-bottom:8px;font-size:12px;display:flex}.tt-head{color:var(--muted);text-align:center;padding:4px 4px 8px;font-size:13px;font-weight:600}.tt-head .week-date{font-size:11px;font-weight:400;display:block}.tt-head.today-col{color:var(--accent)}.tt-head.today-col .week-date{color:var(--accent);font-weight:700}.tt-period{text-align:center;flex-direction:column;justify-content:center;align-items:center;display:flex}.tt-period .p-num{color:var(--ink);font-size:13px;font-weight:700}.tt-period .p-time{color:var(--muted);margin-top:2px;font-size:11px}.tt-cell{min-height:0;display:flex}.tt-cell .cell{flex:1}.cell{cursor:pointer;border-radius:12px;flex-direction:column;justify-content:center;align-items:center;gap:3px;min-height:56px;padding:10px 8px;font-size:12px;transition:transform .1s,box-shadow .1s,background .1s,border-color .1s;display:flex;box-shadow:0 1px 3px #10182814}.cell:hover{transform:translateY(-1px);box-shadow:0 4px 12px #1018281f}.cell.empty{color:#c3c8d4;box-shadow:none;background:#f7f8fc;border:1px dashed #e0e4ee}.cell.empty:hover{color:var(--accent);border-color:var(--accent);background:#eef2ff}.cell.filled{color:#fff;font-weight:600}.cell .course-name{font-size:13px;line-height:1.3}.cell .course-info{opacity:.92;font-size:11px;font-weight:400}.course-stack{width:100%;min-width:0}.course-sep{background:#ffffff80;width:80%;height:1px;margin:2px auto}.modal-mask{z-index:50;background:#10182866;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.modal{background:#fff;border-radius:16px;width:100%;max-width:380px;padding:22px;box-shadow:0 20px 50px #10182840}.modal h3{margin-bottom:14px;font-size:16px;font-weight:700}.modal .field{margin-bottom:12px}.modal .field label{color:var(--muted);margin-bottom:4px;font-size:13px;display:block}.modal .field input{border:1px solid var(--line);border-radius:8px;outline:none;width:100%;padding:8px 10px;font-size:14px}.modal .field input:focus{border-color:var(--accent)}.modal-actions{gap:8px;margin-top:16px;display:flex}.modal-actions button{cursor:pointer;border:none;border-radius:8px;flex:1;padding:9px;font-size:14px}.modal-actions .ok{background:var(--accent);color:#fff}.modal-actions .ok:hover{background:#4338ca}.modal-actions .cancel{background:var(--bg);color:var(--ink)}.modal-actions .cancel:hover{background:var(--line)}.modal-actions .danger{color:var(--red);background:#fee2e2}.course-edit-list{flex-direction:column;gap:8px;max-height:320px;display:flex;overflow-y:auto}.course-edit-item{border:1px solid var(--line);border-radius:10px;justify-content:space-between;align-items:center;gap:10px;padding:10px 12px;font-size:14px;display:flex}.course-edit-item .course-info{color:var(--muted);margin-top:2px;font-size:12px}.course-edit-item .del{color:var(--red);cursor:pointer;background:#fee2e2;border:none;border-radius:8px;flex:none;padding:6px 12px;font-size:13px}.course-edit-item .del:hover{background:#fecaca}.grade-table{border:1px solid var(--line);border-radius:12px;overflow:hidden}.grade-row{border-bottom:1px dashed var(--line);grid-template-columns:1fr 74px 70px 44px;align-items:center;gap:8px;padding:8px 12px;display:grid}.grade-row:last-child{border-bottom:none}.grade-row.grade-head{background:var(--bg);color:var(--muted);border-bottom:1px solid var(--line);font-size:12px;font-weight:600}.grade-group-title{color:var(--accent);border-bottom:1px dashed var(--line);background:#f6f7ff;align-items:center;gap:6px;padding:8px 12px;font-size:13px;font-weight:700;display:flex}.grade-group-title:before{content:"▍";color:var(--accent)}.grade-group-title .cnt{color:var(--muted);font-size:12px;font-weight:500}.grade-row input{background:0 0;border:1px solid #0000;border-radius:6px;outline:none;width:100%;padding:5px 8px;font-size:14px}.grade-row input:hover{border-color:var(--line);background:#fff}.grade-row input:focus{border-color:var(--accent);background:#fff}.grade-row .score{color:var(--green);font-weight:600}.grade-row.chem-row{background:#f0f7ff}.grade-row.chem-row input{color:#1e40af;font-weight:600}.grade-row.cs-row{background:#f0fdf4}.grade-row.cs-row input{color:#166534;font-weight:600}.grade-row .del{color:var(--muted);cursor:pointer;background:0 0;border:none;padding:4px;font-size:15px}.grade-row .del:hover{color:var(--red)}.grade-empty{text-align:center;color:var(--muted);padding:18px;font-size:13px}.grade-add{flex-wrap:wrap;gap:8px;margin-top:12px;display:flex}.grade-add select,.grade-add input{border:1px solid var(--line);background:#fff;border-radius:8px;outline:none;padding:8px 10px;font-size:13px}.grade-add select{width:86px}.grade-add input:first-of-type{flex:1;min-width:120px}.grade-add input:nth-of-type(2),.grade-add input:nth-of-type(3){width:90px}.grade-add .add-btn{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:8px;padding:8px 14px;font-size:13px}.grade-add .add-btn:hover{background:#4338ca}@media (width<=820px){.app{flex-direction:column}aside.sidebar{z-index:40;flex-flow:wrap;align-items:center;gap:10px;width:100%;height:auto;padding:14px 16px;position:sticky;top:0;box-shadow:0 2px 12px #1018281f}nav.menu{flex-flow:wrap;gap:6px;margin-top:0}nav.menu .menu-item{gap:8px;padding:9px 13px;font-size:14px}.sidebar .spacer,.profile .sub{display:none}.profile .avatar{width:44px;height:44px}.profile .name{font-size:16px}.intro-link{margin-left:auto;padding:9px 12px;font-size:13px}main.content{padding:20px 16px 50px}.cal-layout,.exam-grid{grid-template-columns:1fr}}@media (width<=640px){.page-title{font-size:19px}.page-desc{margin-bottom:16px;font-size:13px}nav.menu .menu-item{gap:6px;padding:8px 10px;font-size:13px}nav.menu .menu-item .ico{width:18px;height:18px;font-size:14px;line-height:18px}.intro-link{justify-content:center;width:100%;margin-left:0}.card{padding:16px 14px}.stats{grid-template-columns:repeat(2,1fr);gap:10px}.stat{padding:14px 16px}.stat .value{font-size:22px}.chart{gap:12px;height:130px}.cal-toolbar{flex-wrap:wrap}.cal-day{height:44px;font-size:13px}.cal-week span{font-size:11px}.countdown-card .cd-num{font-size:26px}.course-chip{flex-wrap:wrap}.course-chip .c-loc{width:100%}.tt-grid{grid-template-rows:auto repeat(10,48px)}.week-title{font-size:13px}.exam-head{flex-direction:column}.tl-date{font-size:14px}.modal{max-width:none}.grade-add select,.grade-add input:first-of-type,.grade-add input:nth-of-type(2),.grade-add input:nth-of-type(3){width:100%}}@media (width>=1400px){.panel.active{max-width:1280px;margin:0 auto}}
