@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;600;700&display=swap');
:root{--green:#256453;--ink:#233e35;--muted:#7b8980;--line:#e4e9e1;--paper:#f5f6f0}*{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font-family:'Noto Sans SC',-apple-system,BlinkMacSystemFont,sans-serif;font-size:14px}button,input,select{font:inherit}button,a{touch-action:manipulation}button{cursor:pointer;border:1px solid var(--line);background:white;border-radius:10px;padding:10px 15px;color:var(--ink)}button:hover{filter:brightness(.96)}button:focus-visible,a:focus-visible{outline:3px solid #d0a25b;outline-offset:3px}.primary{background:var(--green);color:white;border-color:var(--green)}.shell{display:flex;min-height:100vh}aside{width:240px;background:#fcfcf8;border-right:1px solid var(--line);padding:35px 25px;position:fixed;height:100vh;display:flex;flex-direction:column}.brand{font-size:26px;font-weight:700;color:var(--ink);text-decoration:none}.logo{display:inline-grid;place-items:center;background:var(--green);color:#fff;width:42px;height:42px;border-radius:13px;font-size:22px}.brand small{display:block;font-size:9px;letter-spacing:2px;margin:13px 0 0 3px;color:#879488}.semester{margin:50px 0 25px;font-size:12px;line-height:2;color:var(--muted)}.semester b{font-weight:500;color:var(--ink)}nav{display:grid;gap:8px}nav button{border:0;background:transparent;text-align:left;padding:14px 16px;display:flex;gap:15px}nav button.active{background:#e8efe4;color:var(--green);font-weight:600}.aside-bottom{margin-top:auto;font-size:12px;color:var(--muted);line-height:2.5}.aside-bottom small{display:block;font-size:10px}.dot{display:inline-block;width:6px;height:6px;background:#69936b;border-radius:50%;margin-right:7px}main{margin-left:240px;padding:42px 48px;width:calc(100% - 240px);max-width:1600px}header{display:flex;align-items:center;justify-content:space-between;margin-bottom:34px;gap:16px}.eyebrow{font-size:10px;letter-spacing:2px;color:var(--muted);margin:0 0 12px}h1{font-size:29px;letter-spacing:-1px;margin:0;font-weight:600}h2{font-size:19px;margin:0}h3{font-size:16px;margin:0}p{line-height:1.8}.muted{color:var(--muted)}.date-line{display:flex;gap:12px;align-items:center;margin-bottom:20px;color:var(--muted)}.tag{font-size:11px;padding:5px 10px;border-radius:6px;background:#e6ecdf;color:#536947;white-space:nowrap}.hero{background:var(--green);border-radius:20px;padding:30px 34px;color:white;position:relative;overflow:hidden;min-height:210px}.hero:after{content:'◷';position:absolute;right:25px;top:-55px;font-size:270px;color:#ffffff09;pointer-events:none}.hero .eyebrow{color:#c4d6c9}.hero h2{font-size:30px;margin:15px 0}.hero p{color:#d5e0d5;margin-bottom:0}.hero .tag{background:#ffffff1c;color:white}.dashboard{display:grid;grid-template-columns:minmax(0,1.8fr) minmax(240px,1fr);gap:25px}.panel{background:#fff;border:1px solid var(--line);border-radius:16px;padding:25px;margin-bottom:22px}.section-title{display:flex;align-items:center;justify-content:space-between;margin:28px 0 16px;gap:10px}.section-title small{color:var(--muted)}.course-card{display:flex;gap:20px;padding:20px 0;border-bottom:1px solid var(--line);align-items:center}.course-card:last-child{border:0}.time{min-width:75px;font-size:18px;font-weight:600}.time small{display:block;font-size:11px;font-weight:400;color:var(--muted);margin-top:5px}.course-body{border-left:3px solid var(--course-color);padding-left:16px;flex:1}.course-body h3{margin-bottom:8px}.course-body p{margin:0;font-size:12px;color:var(--muted)}.course-card.past{opacity:.58}.subtle{background:transparent;border:0;color:var(--muted);padding:7px}.stat{padding:18px 0;border-bottom:1px solid var(--line)}.stat:last-child{border:0}.stat strong{font-size:29px;font-weight:500;margin-right:8px}.stat small{color:var(--muted)}.note{background:#eeeadd;border:1px solid #e3ddc9;border-radius:13px;padding:18px;line-height:1.9;font-size:12px;color:#7e7051}.note b{display:block}.empty{padding:45px 20px;text-align:center;color:var(--muted)}.empty strong{display:block;color:var(--ink);font-size:22px;margin-bottom:10px}.toolbar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:20px}.toolbar .push{margin-left:auto}.week-wrap{overflow:auto;border:1px solid var(--line);border-radius:14px;background:white}.week-grid{display:grid;grid-template-columns:70px repeat(7,minmax(110px,1fr));min-width:840px}.week-head{padding:15px 5px;text-align:center;border-bottom:1px solid var(--line);position:sticky;top:0;background:#fff;z-index:1;font-size:12px}.week-head.today{color:var(--green);background:#eef4e9}.week-head small{display:block;font-size:10px;color:var(--muted);margin-top:6px}.slot-label{font-size:14px;text-align:center;padding:12px 3px;border-bottom:1px solid #f0f2ec;min-height:100px}.slot-label small{display:block;font-size:9px;color:var(--muted);margin-top:5px}.week-cell{border-left:1px solid #f0f2ec;border-bottom:1px solid #f0f2ec;padding:4px;min-height:100px}.week-course{width:100%;text-align:left;border:0;background:color-mix(in srgb,var(--course-color) 12%,white);color:var(--course-color);font-size:11px;padding:10px 7px;margin-bottom:4px;border-radius:7px;line-height:1.6}.week-course b,.week-course small{display:block}.week-course small{font-size:10px;font-weight:400}.manage-card{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:19px 0;border-bottom:1px solid var(--line)}.manage-card:last-child{border:0}.manage-card h3{margin-bottom:6px}.manage-card p{margin:0;font-size:12px;color:var(--muted)}.manage-actions{display:flex;gap:5px;flex-shrink:0}.manage-actions button{font-size:12px;padding:8px}.danger{color:#aa514a}.settings-grid{display:grid;grid-template-columns:1fr 1fr;gap:22px}.settings-grid .panel{margin:0}label{display:block;font-size:12px;margin-top:18px}input,select{width:100%;border:1px solid #dce2d8;background:#fcfdf9;border-radius:8px;padding:11px;color:var(--ink);margin-top:7px}input[type=checkbox]{width:auto;margin:0 8px 0 0}input[type=color]{height:43px;padding:4px}.check{display:flex;align-items:center;min-height:40px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 15px}.actions{display:flex;justify-content:flex-end;gap:10px;margin-top:24px}dialog{border:0;border-radius:18px;padding:28px;width:540px;max-width:94vw;max-height:90dvh;overflow:auto;color:var(--ink);box-shadow:0 25px 100px #1e392d33}dialog::backdrop{background:#16392b66;backdrop-filter:blur(3px)}.dialog-head{display:flex;justify-content:space-between;align-items:center}.dialog-head button{border:0;padding:3px 10px;font-size:25px}.dialog-head h2{font-size:20px}#form-error{color:#a34c45;font-size:12px}footer{margin-top:36px;padding-top:20px;border-top:1px solid var(--line);font-size:10px;color:#929b8e;display:flex;justify-content:space-between}#toast{position:fixed;left:50%;bottom:90px;transform:translateX(-50%);background:#243f34;color:white;padding:12px 22px;border-radius:12px;opacity:0;pointer-events:none;transition:opacity .2s;z-index:10;max-width:90vw}#toast.show{opacity:1}.import-row{padding:12px 0;border-bottom:1px solid var(--line);font-size:12px}.import-row input{width:auto}.import-row small{color:var(--muted)}.settings-grid h3{margin-bottom:12px}.settings-grid button{margin-top:12px}.settings-grid p{font-size:12px}.mobile-brand{display:none}a{color:var(--green)}
@media(min-width:1500px){main{padding:50px 70px}}@media(max-width:1100px){aside{width:190px;padding:30px 18px}main{margin-left:190px;width:calc(100% - 190px);padding:30px 25px}.dashboard{grid-template-columns:1fr}.right-column{display:grid;grid-template-columns:1fr 1fr;gap:20px}.settings-grid{grid-template-columns:1fr}.manage-card{align-items:flex-start}.manage-actions{flex-wrap:wrap;max-width:135px}}@media(max-width:650px){aside{width:100%;height:66px;bottom:0;top:auto;padding:0 7px calc(env(safe-area-inset-bottom)/2);z-index:5;border-right:0;border-top:1px solid var(--line);background:#fcfcf8f5;backdrop-filter:blur(15px)}aside .brand,.semester,.aside-bottom{display:none}nav{grid-template-columns:repeat(4,1fr);gap:0}nav button{display:flex;flex-direction:column;gap:2px;align-items:center;justify-content:center;padding:7px 0;font-size:20px;border-radius:0}nav button span{font-size:10px}nav button.active{background:transparent}main{margin:0;padding:26px 18px 95px;width:100%}h1{font-size:23px}header{margin-bottom:24px}header .primary{padding:10px;font-size:11px}.hero{padding:25px;min-height:195px}.hero h2{font-size:26px}.hero p{font-size:12px}.panel{padding:19px}.right-column{grid-template-columns:1fr;gap:0}.course-card{gap:11px}.time{min-width:64px;font-size:16px}.course-body h3{font-size:14px}.manage-card{flex-direction:column;gap:10px}.manage-actions{max-width:none}.form-grid{gap:0 10px}footer span{display:none}.date-line{font-size:12px}.toolbar{gap:5px}.toolbar button{padding:8px 10px;font-size:12px}.toolbar .push{margin-left:0}dialog{padding:22px}.week-grid{grid-template-columns:50px repeat(7,minmax(95px,1fr));min-width:715px}}

/* Weekly timetable: fixed time axis, spanning course cards, compact mobile columns. */
.week-top{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:20px}.week-top .eyebrow{margin-bottom:10px}.week-caption{display:flex;align-items:baseline;gap:18px}.week-caption h2{font-size:26px;letter-spacing:-.5px}.week-caption>span{font-size:13px;color:var(--muted)}.week-summary{margin:9px 0 0;color:var(--muted);font-size:12px}.week-controls{display:flex;align-items:center;padding:4px;background:#e8ede3;border-radius:13px;gap:3px;flex-shrink:0}.week-controls button{border:0;background:transparent;min-width:40px;height:38px;padding:5px 12px;font-size:23px}.week-controls #this-week{background:white;font-size:12px;box-shadow:0 2px 5px #233e3508}.schedule-scroll{overflow:auto;max-height:75vh;border:1px solid #dde5d9;border-radius:18px;background:white;isolation:isolate;scrollbar-width:thin;scrollbar-color:#bbcbb7 transparent;overscroll-behavior-x:contain}.schedule-board{display:grid;grid-template-columns:64px repeat(7,minmax(105px,1fr));min-width:800px}.schedule-corner,.schedule-head{height:97px;position:sticky;top:0;z-index:3;background:#fcfdf9;border-bottom:1px solid #dde5d9;text-align:center}.schedule-corner{left:0;z-index:5;display:grid;place-items:center;color:#8b9686;font-size:11px}.schedule-head{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;border-left:1px solid #edf0e9}.schedule-head>span{font-size:11px;color:#7b8980}.schedule-head>b{font-size:24px;font-weight:500;line-height:1.25}.schedule-head>small{font-size:9px;color:#8b9686}.schedule-head.is-today{background:#eaf1e5;color:#256453}.schedule-head.is-today>b{background:#256453;color:white;border-radius:50%;width:33px;height:33px;display:grid;place-items:center;font-size:20px}.schedule-head.is-today>small{color:#256453}.schedule-times{position:sticky;left:0;z-index:2;background:#fcfdf9;display:grid;grid-template-rows:repeat(12,68px)}.period{border-bottom:1px solid #edf0e9;text-align:center;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:3px}.period b{font-size:13px;font-weight:500}.period small{font-size:9px;line-height:1.5;color:#94a08e}.schedule-day{display:grid;grid-template-rows:repeat(12,68px);grid-template-columns:repeat(var(--lanes),minmax(0,1fr));border-left:1px solid #edf0e9;position:relative;min-width:0}.schedule-day.is-today{background:#f6f9f2}.schedule-rule{border-bottom:1px solid #edf0e9;pointer-events:none}.session-break{border-top:3px solid #e9ede3}.schedule-course{z-index:1;min-width:0;align-self:stretch;overflow:hidden;margin:4px 3px;padding:10px 8px;text-align:left;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;gap:6px;border:0;border-top:3px solid var(--course-color);border-radius:9px;background:color-mix(in srgb,var(--course-color) 12%,white);color:var(--course-color);box-shadow:0 2px 3px #233e3505;transition:filter .15s,transform .15s}.schedule-course:hover{transform:translateY(-1px);filter:brightness(.97)}.schedule-course strong{font-size:12px;line-height:1.5;overflow-wrap:anywhere;font-weight:600}.schedule-room{font-size:11px;font-weight:500}.schedule-detail{margin-top:auto;font-size:9px;line-height:1.6;opacity:.8}.schedule-course em{font-size:9px;font-style:normal}.week-footnote{display:flex;justify-content:space-between;gap:10px;margin-top:13px;font-size:10px;color:#8b9686}.week-footnote i{display:inline-block;width:6px;height:6px;border-radius:50%;background:#256453;margin-right:5px}.week-scroll-hint{display:none}
@media(max-width:650px){.week-top{margin-bottom:13px;align-items:flex-start;gap:8px}.week-top .eyebrow{font-size:8px;letter-spacing:1.5px}.week-caption{gap:8px;flex-wrap:wrap}.week-caption h2{font-size:23px}.week-caption>span{font-size:10px}.week-summary{font-size:10px;margin-top:6px;max-width:220px}.week-controls{padding:3px;gap:0}.week-controls button{min-width:28px;padding:4px 8px;height:33px}.week-controls #this-week{font-size:10px}.schedule-board{grid-template-columns:42px repeat(7,minmax(81px,1fr));min-width:609px}.schedule-scroll{border-radius:12px;max-height:calc(100dvh - 275px);min-height:330px;margin:0 -6px}.schedule-corner,.schedule-head{height:84px}.schedule-head>b{font-size:22px}.schedule-head.is-today>b{width:30px;height:30px;font-size:18px}.schedule-times,.schedule-day{grid-template-rows:repeat(12,61px)}.schedule-course{padding:7px 5px;margin:3px 2px;gap:4px;border-radius:7px}.schedule-course strong{font-size:10px;line-height:1.5}.schedule-room{font-size:10px}.schedule-detail{font-size:8px}.period small{font-size:8px}.week-scroll-hint{display:flex;justify-content:space-between;color:#92a08c;font-size:9px;margin:0 0 8px}.week-footnote{font-size:9px}.week-footnote span:last-child{max-width:170px;text-align:right}}

.reminder-master{margin:18px 0;padding:16px;border:1px solid var(--line);border-radius:12px;background:#f6f8f1}.reminder-master b{font-size:14px}.reminder-master p{margin:7px 0;color:var(--muted);font-size:12px}.reminder-master button{width:100%;min-height:44px}

.tool-launchers{display:grid;grid-template-columns:1fr 1fr;gap:22px}.tool-launcher{text-align:left;min-height:220px;margin:0}.tool-launcher>span{font-size:35px;color:var(--green)}.tool-launcher h2{margin:15px 0}.tool-launcher p{color:var(--muted);font-size:12px}.tool-launcher small{color:var(--green)}.tool-tabs{display:flex;gap:8px;flex-wrap:wrap;margin:22px 0 18px}.tool-form{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr;gap:15px}.free-card{display:flex;justify-content:space-between;align-items:center;padding:22px 0;border-bottom:1px solid var(--line);gap:12px}.free-card b{font-size:22px;font-weight:500}.free-card p{font-size:12px;margin:5px 0 0}.file-picker{padding:20px;border:1px dashed #9aaf97;border-radius:12px;background:#f6f9f1}.file-picker input{border:0;background:transparent}.file-row{display:flex;justify-content:space-between;align-items:center;padding:13px 0;border-bottom:1px solid var(--line);gap:10px}.file-row>span{min-width:0;overflow-wrap:anywhere}.file-row small{display:block;color:var(--muted);margin-top:4px}.file-row>div{display:flex;gap:4px;flex-shrink:0}.file-row button{padding:7px 10px}.download-result{display:block;padding:15px;border:1px solid var(--line);border-radius:10px;margin-top:10px;background:#f0f6e9;overflow-wrap:anywhere}button:disabled{opacity:.45;cursor:default}@media(max-width:650px){nav{grid-template-columns:repeat(5,1fr)}.tool-launchers{grid-template-columns:1fr;gap:16px}.tool-launcher{min-height:185px}.tool-form{grid-template-columns:1fr 1fr;gap:0 12px}.free-card b{font-size:18px}.free-card .tag{font-size:9px}.tool-tabs button{padding:9px 10px;font-size:11px}.file-row button{padding:7px 9px}.file-picker{padding:13px}}

.schedule-times,.schedule-day{grid-template-rows:repeat(var(--period-count,12),68px)}.time-edit-row{display:grid;grid-template-columns:42px 1fr 1fr 44px;gap:5px;align-items:center;margin:8px 0}.time-edit-row input{margin:0;padding:8px 4px}.time-edit-row button{padding:8px}.time-edit-actions{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:650px){.schedule-times,.schedule-day{grid-template-rows:repeat(var(--period-count,12),61px)}}