:root{--paper:#f6f4ee;--surface:#fff;--panel:#fbfaf6;--done:#eeebe3;--line:#e2ddd2;--line-soft:#eeebe3;--field:#c9c3b5;--ink:#1b1f23;--ink-2:#3a4046;--muted:#5a6068;--accent:#0e5a5f;--accent-dark:#08393c;--accent-soft:#e1efee;--accent-line:#cfe3e1;--bad:#a3261b;--bad-soft:#fbeae7;--bad-line:#f0c4bd;--warn:#7a4e00;--warn-ink:#4a3200;--warn-soft:#fff2d2;--warn-line:#f1d9a0;--ok:#1d6a44;--ok-soft:#e4f2ea;--blue:#2f5a99;--blue-line:#3f6fb5;--stone:#5e5646;--stone-line:#9a8f7a;--display:"Fraunces", Georgia, serif;--sans:"IBM Plex Sans", system-ui, sans-serif;--mono:"IBM Plex Mono", ui-monospace, monospace}*{box-sizing:border-box}body{font-family:var(--sans);color:var(--ink);background:var(--paper);margin:0;font-size:16px;line-height:1.55}a{color:var(--accent)}a:hover{color:var(--accent-dark)}:focus-visible{outline:3px solid var(--accent);outline-offset:2px}.vh{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.skip{position:absolute;left:-999px}.skip:focus{background:var(--surface);z-index:1;padding:.5rem;top:1rem;left:1rem}.code,.mono{font-family:var(--mono)}.code{font-weight:600}header.site{border-bottom:1px solid var(--line);background:var(--panel);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:4px 28px;min-height:72px;padding:6px 56px;display:flex}.brand{min-height:44px;color:var(--ink);align-items:center;gap:12px;text-decoration:none;display:flex}.brand-name{font-family:var(--display);font-size:21px;font-weight:600}.brand-note{color:var(--muted);font-size:14px}header.site nav{flex-wrap:wrap;column-gap:26px;font-size:15px;display:flex}header.site nav a{color:var(--ink);padding:12px 0;text-decoration:none}header.site nav a:hover{text-decoration:underline}header.site nav a[aria-current=page]{box-shadow:inset 0 -3px 0 var(--accent);font-weight:600}footer.site{border-top:1px solid var(--line);color:var(--muted);padding:18px 56px 28px;font-size:14px}footer.site p{max-width:60rem;margin:0}main{max-width:1440px;margin:0 auto;padding:32px 56px 56px}main.narrow>*{max-width:50rem}h1,h2,h3{font-family:var(--display);font-weight:600;line-height:1.12}h1{margin:6px 0 12px;font-size:46px}h2{margin:28px 0 10px;font-size:26px}h3{margin:0;font-size:21px}.eyebrow{font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0;font-size:13px}.lede{color:var(--ink-2);max-width:46rem;font-size:18px}.help{color:var(--muted);margin:0;font-size:15px}.crumbs{color:var(--muted);margin:0 0 8px;font-size:14px}label{color:var(--ink-2);font-size:14px;font-weight:600}input,select,button{font:inherit;min-height:44px}input,select{border:1px solid var(--field);background:var(--panel);border-radius:8px;max-width:100%;padding:0 12px}input.code-in{font-family:var(--mono)}.btn{background:var(--accent);color:#fff;cursor:pointer;border:0;border-radius:8px;justify-content:center;align-items:center;gap:8px;padding:0 18px;font-weight:600;text-decoration:none;display:inline-flex}.btn:hover{background:var(--accent-dark);color:#fff}.btn.quiet{background:var(--surface);color:var(--ink);border:1px solid var(--field);font-weight:400}.btn.quiet:hover{background:var(--panel)}.btn.small{min-height:40px;padding:0 14px;font-size:14px}form.stack{gap:6px;max-width:28rem;display:grid}form.stack .btn{justify-self:start;margin-top:10px}.card{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:18px 22px}.card>h2:first-child,.card>h3:first-child{margin-top:0}.message{border:1px solid var(--line);background:var(--surface);border-radius:10px;margin:12px 0;padding:12px 16px}.message.error{background:var(--bad-soft);border-color:var(--bad-line)}.message.notice{background:var(--panel)}.message p{margin:0 0 8px}.chips{flex-wrap:wrap;gap:8px;margin:10px 0 0;padding:0;font-size:14px;list-style:none;display:flex}.chips>*{background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:5px 12px}.chips a{background:var(--accent-soft);border-color:var(--accent-soft);font-weight:500;text-decoration:none}.tag{background:var(--accent-soft);color:var(--accent);border-radius:999px;padding:4px 10px;font-size:13px;font-weight:500;display:inline-block}.pill{white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:3px 10px;font-size:13px;font-weight:600;display:inline-flex}.pill svg{flex:none}.pill.ok{background:var(--ok-soft);color:var(--ok)}.pill.bad{background:var(--bad-soft);color:var(--bad)}.pill.warn{background:var(--warn-soft);color:var(--warn)}.pill.plain{background:var(--done);color:var(--ink-2)}.problem-box,.note-box{border-radius:8px;padding:10px 14px;font-size:14px;line-height:1.5}.problem-box{background:var(--bad-soft);border:1px solid var(--bad-line)}.note-box{background:var(--warn-soft);border:1px solid var(--warn-line);color:var(--warn-ink)}.note-box strong{color:var(--warn)}.problem-box p{margin:0 0 8px}.problem-box p:last-child{margin:0}.problem-box .fix{margin-top:6px;display:block}.row-actions{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.row-actions form{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.row-actions select{min-height:40px;font-size:14px}.plan-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:12px 24px;display:flex}.plan-head h1{margin-bottom:0}.stats{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin:20px 0;display:grid}.tile{background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:14px 18px}.tile b{font-family:var(--display);font-size:30px;font-weight:600;line-height:1.2;display:block}.tile span{color:var(--muted);font-size:14px}.tile.bad{background:var(--bad-soft);border-color:var(--bad-line)}.tile.bad b,.tile.bad span{color:var(--bad)}.tile.warn{background:var(--warn-soft);border-color:var(--warn-line)}.tile.warn b,.tile.warn span{color:var(--warn)}.plan-layout{grid-template-columns:minmax(0,1fr) 340px;align-items:start;gap:40px;display:grid}.plan-aside{flex-direction:column;gap:16px;display:flex}.plan-aside .card h2{margin:0 0 10px;font-size:19px}.jump{color:var(--ink);border-radius:8px;flex-direction:column;gap:2px;margin-top:8px;padding:10px 12px;font-size:14px;text-decoration:none;display:flex}.jump .code{font-size:13px}.jump.bad{background:var(--bad-soft)}.jump.bad .code{color:var(--bad)}.jump.warn{background:var(--warn-soft)}.jump.warn .code{color:var(--warn)}.legend{gap:8px;font-size:14px;display:grid}.legend div{align-items:center;gap:10px;display:flex}.done-band{background:var(--done);border-radius:12px;padding:4px 22px 18px}.done-band summary{cursor:pointer;flex-wrap:wrap;align-items:baseline;gap:4px 12px;min-height:52px;padding-top:12px;display:flex}.done-band summary h2{margin:0;font-size:20px;display:inline}.done-band summary span{color:var(--muted);font-size:14px}.done-terms{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-top:8px;display:grid}.done-term{background:var(--panel);border-radius:8px;flex-direction:column;gap:6px;padding:12px 14px;font-size:14px;display:flex}.done-term .mono{color:var(--muted);font-size:13px}.year-head{flex-wrap:wrap;align-items:baseline;gap:8px 14px;margin:28px 0 12px;display:flex}.year-head h2{margin:0;font-size:30px}.terms-grid{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:20px;display:grid}.term{background:var(--surface);border:1px solid var(--line);border-radius:12px;flex-direction:column;gap:12px;min-width:0;padding:18px 20px;display:flex}.term.s1{grid-column:1}.term.s2{grid-column:2}.term.empty{border-style:dashed;border-color:var(--field)}.term-head{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.term-head .mono{color:var(--muted);font-size:13px}.load{background:var(--done);border-radius:3px;height:6px;overflow:hidden}.load span{background:var(--accent);border-radius:3px;height:6px;display:block}.load.over span{background:var(--bad)}.courses{margin:0;padding:0;list-style:none}.course{border-top:1px solid var(--line-soft);flex-direction:column;gap:8px;padding:11px 0;display:flex}.course-line{grid-template-columns:96px minmax(0,1fr) auto;align-items:center;gap:4px 12px;display:grid}.course-line .code{font-size:15px}.course-line .units{color:var(--muted);font-size:13px}.add-form{border-top:1px solid var(--line-soft);flex-direction:column;gap:6px;padding-top:12px;display:flex}.add-form div{gap:8px;display:flex}.add-form input{flex:1;min-width:0}.term details summary{cursor:pointer;min-height:44px;color:var(--accent);align-items:center;gap:6px;font-size:14px;font-weight:600;display:flex}.eligible{flex-wrap:wrap;gap:8px;margin:4px 0 0;padding:0;list-style:none;display:flex}.eligible button{background:var(--panel);cursor:pointer;text-align:left;border:1px solid #d6d0c3;border-radius:8px;align-items:center;gap:6px;padding:0 12px;font-size:14px;display:inline-flex}.eligible button:hover{border-color:var(--accent)}.eligible .plus{color:var(--accent);font-weight:700}.runs{grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;display:grid}.runs .year{flex-direction:column;gap:8px;display:flex}.runs .cells{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.runs .cell{border-radius:8px;align-items:center;gap:6px;padding:10px 12px;font-size:14px;font-weight:600;display:flex}.runs .cell.on{background:var(--accent-soft);color:var(--accent)}.runs .cell.off{background:var(--done);color:var(--muted);font-weight:400}.two-col{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px;margin-top:24px;display:grid}.two-col .card h2{margin:0 0 12px;font-size:22px}blockquote.pc{background:var(--paper);border-radius:8px;margin:0 0 10px;padding:16px 18px;font-size:16px;line-height:1.65}.rule-box{border:1px solid var(--line);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px 12px;margin-bottom:10px;padding:12px 14px;display:flex}.rule-box .mono{color:var(--muted);font-size:13px}.code-chip{font-family:var(--mono);background:var(--accent-soft);border-radius:6px;padding:6px 10px;font-weight:600;text-decoration:none}.left-box{background:var(--warn-soft);border:1px solid var(--warn-line);color:var(--warn-ink);border-radius:12px;margin-top:24px;padding:16px 22px}.left-box h2{color:var(--warn);margin:0 0 8px;font-size:20px}.left-box ul{margin:0;padding-left:20px}.course-cards{grid-template-columns:repeat(5,minmax(0,1fr));gap:12px;margin:0;padding:0;list-style:none;display:grid}.course-card{background:var(--surface);border:1px solid var(--line);color:var(--ink);border-radius:10px;flex-direction:column;gap:4px;height:100%;padding:12px 14px;font-size:14px;text-decoration:none;display:flex}.course-card .code{color:var(--accent);font-size:15px}.course-card:hover{border-color:var(--accent);color:var(--ink)}.section-head{flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin:28px 0 12px;display:flex}.section-head h2{margin:0;font-size:24px}.section-head span{color:var(--muted);font-size:14px}.level-cols{grid-template-columns:repeat(4,minmax(0,1fr));align-items:start;gap:16px;display:grid}.level-cols ul{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.level-cols h2{margin:0 0 10px;font-size:20px}.map-top{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:16px 24px;display:flex}.map-top h1{margin-bottom:0;font-size:40px}.map-go{align-items:flex-end;gap:8px;display:flex}.map-go div{flex-direction:column;gap:4px;display:flex}.map-go input{width:220px}.map{grid-template-columns:minmax(0,430px) 56px minmax(0,330px) 56px minmax(0,1fr);align-items:center;margin-top:28px;display:grid}.map h2.band{font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 12px;font-size:13px}.need-box{background:var(--surface);border:1px solid var(--line);border-radius:12px;flex-direction:column;gap:8px;padding:14px;display:flex}.need-box .label{color:var(--ink-2);font-size:13px;font-weight:600}.joiner{text-align:center;color:var(--muted);margin:6px 0;font-size:12px;font-weight:600;display:block}.node{border:1px solid var(--line);background:var(--surface);color:var(--ink);border-radius:8px;flex-direction:column;gap:2px;padding:10px 12px;font-size:14px;text-decoration:none;display:flex}a.node:hover{border-color:var(--accent);color:var(--ink)}.node .code{color:var(--accent);font-size:15px}.node.before{border-color:var(--accent-line);background:#f2f8f7}.node .sub{color:var(--muted);font-size:12px}.node .sub.none{color:var(--ok)}.arrow{color:var(--stone-line);justify-content:center;align-items:center;display:flex}.arrow .down{display:none}.this{background:var(--accent);color:#fff;border-radius:16px;flex-direction:column;gap:10px;padding:22px;display:flex}.this .code{font-size:20px}.this h2{color:#fff;margin:0;font-size:30px}.this .runs-line{font-size:14px}.this .note-box{font-size:13px}.this .links{flex-wrap:wrap;gap:8px;display:flex}.this .links a{min-height:44px;color:var(--accent);background:#fff;border-radius:8px;align-items:center;padding:0 14px;font-size:14px;font-weight:600;text-decoration:none;display:inline-flex}.this .links a.ghost{color:#fff;background:0 0;border:1px solid #ffffffb3}.opens{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0;padding:0;list-style:none;display:grid}.map-key{background:var(--panel);border:1px solid var(--line);color:var(--ink-2);border-radius:10px;flex-wrap:wrap;gap:8px 28px;margin-top:28px;padding:14px 18px;font-size:14px;display:flex}.majors-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;margin:24px 0 0;padding:0;list-style:none;display:grid}.major-card{background:var(--surface);border:1px solid var(--line);min-height:150px;color:var(--ink);border-radius:12px;flex-direction:column;gap:8px;height:100%;padding:18px 20px;text-decoration:none;display:flex}.major-card:hover{border-color:var(--accent);color:var(--ink)}.major-card .code{color:var(--accent);font-size:13px}.major-card .name{font-family:var(--display);font-size:22px;font-weight:600;line-height:1.2}.major-card .meta{color:var(--muted);font-size:14px}.major-layout{grid-template-columns:minmax(0,1fr) 340px;align-items:start;gap:40px;display:grid}.block{background:var(--surface);border:1px solid var(--line);border-top:4px solid var(--stone-line);border-radius:12px;margin-top:20px;padding:16px 22px}.block.compulsory{border-top-color:var(--accent)}.block.minimum{border-top-color:var(--blue-line)}.block-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;margin-bottom:6px;display:flex}.block-head .kind{font-family:var(--mono);letter-spacing:.08em;color:var(--stone);font-size:12px;font-weight:600}.block.compulsory .kind{color:var(--accent)}.block.minimum .kind{color:var(--blue)}.block-head h2{font-family:var(--sans);margin:2px 0 0;font-size:17px;line-height:1.4}.count{background:var(--done);color:var(--ink-2);white-space:nowrap;border-radius:8px;padding:6px 12px;font-size:14px;font-weight:600}.count.some{background:var(--accent-soft);color:var(--accent)}.count.full{background:var(--ok-soft);color:var(--ok)}.lines{margin:0;padding:0;list-style:none}.line{border-top:1px solid var(--line-soft);grid-template-columns:100px minmax(0,1fr) 250px 150px;align-items:center;gap:4px 12px;padding:10px 0;display:grid}.line .when{font-family:var(--mono);color:var(--ink-2);font-size:13px}.line .mine{color:var(--muted);font-size:13px}.line .mine.yes{color:var(--ok);font-weight:600}@media (width<=900px){header.site,main,footer.site{padding-left:20px;padding-right:20px}header.site{padding-top:8px;padding-bottom:4px}.brand-note{display:none}header.site nav{column-gap:16px;font-size:14px}h1,.map-top h1{font-size:32px}.stats{grid-template-columns:repeat(2,minmax(0,1fr))}.plan-layout,.major-layout,.two-col{grid-template-columns:minmax(0,1fr)}.legend-card{display:none}.done-terms,.runs,.terms-grid{grid-template-columns:minmax(0,1fr)}.term.s1,.term.s2{grid-column:1}.course-line{grid-template-columns:minmax(0,1fr) auto}.course-line .title{grid-area:2/1/auto/-1}.course-cards,.majors-grid,.level-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.map{grid-template-columns:minmax(0,1fr)}.arrow .right{display:none}.arrow .down{margin:8px 0;display:block}.opens{grid-template-columns:minmax(0,1fr)}.map-go,.map-go div,.map-go input{width:100%}.line{grid-template-columns:minmax(0,1fr) auto}.line .title{grid-column:1/-1}}@media (width<=480px){.course-cards,.majors-grid,.level-cols{grid-template-columns:minmax(0,1fr)}}
