:root{--color-rose:#e5c1bd;--color-sand:#d2d0ba;--color-sage:#b6be9c;--color-green:#7b9e87;--color-slate:#5e747f;--canvas:#0a0a0a;--surface:#191919;--surface-2:#121212;--hairline:rgba(255,255,255,0.10);--hairline-strong:rgba(255,255,255,0.18);--text:#f4f4f2;--text-dim:rgba(244,244,242,0.62);--text-faint:rgba(244,244,242,0.40);--r-card:8px;--r-pill:9999px;--s-2:2px;--s-4:4px;--s-8:8px;--s-12:12px;--s-16:16px;--s-24:24px;--s-32:32px;--s-48:48px;--s-64:64px;--max-w:1200px;--font-ui:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Apple SD Gothic Neo","Malgun Gothic",sans-serif;--font-mono:"Geist Mono","JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace}*{box-sizing:border-box}body,html{margin:0;padding:0;background:var(--canvas);color:var(--text);font-family:var(--font-ui);font-weight:400;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}body{min-height:100dvh}a{color:inherit;text-decoration:none}button{font-family:inherit}.display-xl{font-size:clamp(48px,12vw,96px);line-height:.98;letter-spacing:-.025em;font-weight:400}.display-lg{font-size:clamp(40px,9vw,72px)}.display-lg,.display-md{line-height:1;letter-spacing:-.025em;font-weight:400}.display-md{font-size:clamp(32px,6vw,48px)}.display-sm{font-size:clamp(24px,4vw,32px);line-height:1.12;letter-spacing:-.02em;font-weight:400}.display-xs{font-size:20px;line-height:1.4;font-weight:400}.body-lg{font-size:18px;line-height:1.55}.body-md{font-size:16px;line-height:1.5}.body-sm{font-size:14px;line-height:1.45}.mono{font-family:var(--font-mono);font-size:12px;line-height:1.4;letter-spacing:.14em;text-transform:uppercase;color:var(--text-faint)}.mono--sm{font-size:11px}.container{width:100%;max-width:var(--max-w);margin:0 auto;padding:0 var(--s-16)}@media (min-width:768px){.container{padding:0 var(--s-24)}}.card{background:var(--surface);border:1px solid var(--hairline);border-radius:var(--r-card);padding:var(--s-24)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--s-8);min-height:44px;padding:0 var(--s-24);border-radius:var(--r-pill);font-size:15px;font-weight:400;cursor:pointer;border:1px solid transparent;transition:transform .12s ease,background .15s ease,border-color .15s ease,opacity .15s ease}.btn:active{transform:scale(.98)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn--primary{background:var(--text);color:#0a0a0a}.btn--primary:hover{background:#ffffff}.btn--secondary{background:transparent;border-color:var(--hairline-strong);color:var(--text)}.btn--secondary:hover{border-color:rgba(255,255,255,.32);background:rgba(255,255,255,.03)}.input{width:100%;min-height:44px;background:var(--surface-2);border:1px solid var(--hairline);border-radius:var(--r-card);color:var(--text);padding:0 var(--s-16);font-size:16px;font-family:inherit}.input::placeholder{color:var(--text-faint)}.input:focus{outline:none;border-color:var(--color-slate)}:focus-visible{outline:2px solid var(--color-sage);outline-offset:2px;border-radius:4px}.hr{height:1px;background:var(--hairline);border:0;margin:var(--s-24) 0}.dot{width:8px;height:8px;border-radius:var(--r-pill);display:inline-block;flex:none}.dot--assignment{background:var(--color-sage)}.dot--exam{background:var(--color-rose)}.dot--event{background:var(--color-green)}.dot--notice{background:var(--color-sand)}.dot--other{background:var(--color-slate)}@media (prefers-reduced-motion:reduce){*{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.nav-top{position:-webkit-sticky;position:sticky;top:0;z-index:20;background:rgba(10,10,10,.82);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--hairline)}.nav-top__inner{display:flex;align-items:center;justify-content:space-between;height:56px}.nav-brand{font-family:var(--font-mono);font-size:18px;letter-spacing:.02em;color:var(--text)}.nav-desktop{display:none;gap:var(--s-8)}.nav-link{min-height:36px;display:inline-flex;align-items:center;padding:0 var(--s-16);border-radius:var(--r-pill);font-size:14px;color:var(--text-dim)}.nav-link:hover{color:var(--text)}.nav-link--active{color:var(--text);background:rgba(255,255,255,.06)}.nav-bottom{position:fixed;bottom:0;left:0;right:0;z-index:20;display:grid;grid-template-columns:repeat(4,1fr);background:rgba(10,10,10,.92);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-top:1px solid var(--hairline);padding-bottom:env(safe-area-inset-bottom)}.nav-bottom__item{min-height:52px;display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--text-faint)}.nav-bottom__item--active{color:var(--text)}.nav-bottom__item--active:before{content:"";position:absolute;margin-top:-26px;width:20px;height:2px;border-radius:2px;background:var(--color-sage)}main{padding-bottom:72px}@media (min-width:768px){.nav-desktop{display:flex}.nav-bottom{display:none}main{padding-bottom:0}}.sched{list-style:none;margin:0;padding:0}.sched__row{display:grid;grid-template-columns:28px 1fr auto;align-items:baseline;grid-gap:var(--s-16);gap:var(--s-16);padding:var(--s-12) 0;border-bottom:1px solid var(--hairline)}.sched__row:last-child{border-bottom:0}.sched__period{color:var(--color-sage)}.sched__meta{text-align:right}.meal{list-style:none;margin:0;padding:0}.meal__item{padding:var(--s-8) 0;border-bottom:1px solid var(--hairline)}.meal__item:last-child{border-bottom:0}.events{list-style:none;margin:0;padding:0}.events__row{display:flex;gap:var(--s-12);padding:var(--s-16) 0;border-bottom:1px solid var(--hairline)}.events__row:last-child{border-bottom:0}.events__row .dot{margin-top:7px}.events__row>.grow{min-width:0;overflow-wrap:anywhere}.events__link{color:var(--text);text-decoration:underline;-webkit-text-decoration-color:var(--hairline-strong);text-decoration-color:var(--hairline-strong);text-underline-offset:3px;transition:-webkit-text-decoration-color .15s ease;transition:text-decoration-color .15s ease;transition:text-decoration-color .15s ease,-webkit-text-decoration-color .15s ease}.events__link:hover{-webkit-text-decoration-color:var(--color-sage);text-decoration-color:var(--color-sage)}.events__thumb{display:block;margin-top:var(--s-8);border:1px solid var(--hairline);border-radius:var(--r-card);overflow:hidden;max-width:320px}.events__thumb img{display:block;width:100%;height:auto}.empty{display:flex;flex-direction:column;gap:var(--s-8);padding:var(--s-24) 0}.home{padding-top:var(--s-32);padding-bottom:var(--s-64)}.home__hero{padding:var(--s-24) 0 var(--s-32)}.home__brand{margin:0}.home__date{margin-top:var(--s-16)}.home__sub{margin:var(--s-8) 0 0}.home__grid{display:grid;grid-template-columns:1fr;grid-gap:var(--s-16);gap:var(--s-16)}@media (min-width:768px){.home__grid{grid-template-columns:1fr 1fr}.home__events{grid-column:1/-1}}.card__head{margin-bottom:var(--s-16)}.home__ai{margin-top:var(--s-48);border-top:1px solid var(--hairline);padding-top:var(--s-32)}.home__ai-title{margin:var(--s-12) 0 var(--s-24)}.home__chips{display:flex;flex-wrap:wrap;gap:var(--s-8);margin-bottom:var(--s-24)}.chip{display:inline-flex;align-items:center;min-height:40px;padding:0 var(--s-16);border-radius:var(--r-pill);border:1px solid var(--hairline);color:var(--text-dim);font-size:14px;background:var(--surface);transition:border-color .15s ease,color .15s ease}.chip:hover{border-color:var(--hairline-strong);color:var(--text)}.home__ai-btn{margin-right:var(--s-12)}.home__privacy{margin-top:var(--s-16)}.ai-page{padding-top:var(--s-16)}.chat{display:flex;flex-direction:column;height:calc(100dvh - 56px - 72px);min-height:420px}@media (min-width:768px){.chat{height:calc(100dvh - 56px);max-width:760px;margin:0 auto}}.chat__scroll{flex:1 1;overflow-y:auto;padding:var(--s-24) 0 var(--s-16);display:flex;flex-direction:column;gap:var(--s-16)}.chat__intro{padding:var(--s-24) 0}.chat__intro-title{margin:var(--s-12) 0 var(--s-12)}.chat__examples{display:flex;flex-wrap:wrap;gap:var(--s-8);margin-top:var(--s-24)}.bubble{max-width:88%;border-radius:var(--r-card);padding:var(--s-16);font-size:16px;line-height:1.55;word-break:break-word}.bubble--user{align-self:flex-end;background:var(--color-slate);color:#f7fafb;border:1px solid transparent;white-space:pre-wrap}.bubble--ai{align-self:flex-start;background:var(--surface);border:1px solid var(--hairline);max-width:100%;width:100%}.bubble__text{margin:0}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md-p{margin:0 0 var(--s-12)}.md-h{margin:var(--s-8) 0 var(--s-4);font-size:16px;color:var(--text)}.md strong,.md-h strong{font-weight:600}.md-list{margin:0 0 var(--s-12);padding-left:1.25em}.md-list li{margin:2px 0}.md em{font-style:italic;color:var(--text)}.md code{font-family:var(--font-mono);font-size:.9em;background:rgba(255,255,255,.07);padding:1px 5px;border-radius:4px}.ai-section{margin-top:var(--s-16);padding-top:var(--s-16)}.ai-section,.bubble__note{border-top:1px solid var(--hairline)}.bubble__note{margin-top:var(--s-12);padding-top:var(--s-12)}.thinking{color:var(--text-dim);font-size:15px}.thinking__dots:after{content:"";animation:dots 1.4s steps(4) infinite}@keyframes dots{0%{content:""}25%{content:"·"}50%{content:"··"}75%{content:"···"}to{content:""}}.limit-note{align-self:center;text-align:center;color:var(--color-rose);border:1px solid var(--hairline);border-radius:var(--r-card);padding:var(--s-16) var(--s-24);background:var(--surface)}.modal-overlay{position:fixed;inset:0;z-index:100;align-items:center;justify-content:center;background:rgba(0,0,0,.6);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.modal,.modal-overlay{display:flex;padding:var(--s-24)}.modal{width:100%;max-width:380px;background:var(--surface);border:1px solid var(--hairline-strong);border-radius:var(--r-card);flex-direction:column;gap:var(--s-12)}.modal__body{font-size:16px;line-height:1.5}.modal__hint{margin-top:calc(-1 * var(--s-4))}.modal__turnstile{min-height:65px;display:flex;justify-content:center}.modal__turnstile:empty{min-height:0}.modal__error{color:var(--color-rose)}.modal__actions{display:flex;justify-content:flex-end;margin-top:var(--s-4)}.chat__form{padding:var(--s-12) 0 var(--s-16);border-top:1px solid var(--hairline);background:var(--canvas)}.chat__inputwrap{position:relative;display:flex;align-items:center}.chat__input{width:100%;min-height:52px;background:var(--surface);border:1px solid var(--hairline);border-radius:var(--r-pill);color:var(--text);padding:0 56px 0 var(--s-24);font-size:16px;font-family:inherit}.chat__input::placeholder{color:var(--text-faint)}.chat__input:focus{outline:none;border-color:var(--color-slate)}.chat__send{position:absolute;right:6px;width:40px;height:40px;border-radius:var(--r-pill);border:none;background:var(--text);color:#0a0a0a;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:opacity .15s ease,transform .12s ease}.chat__send:active{transform:scale(.94)}.chat__send:disabled{opacity:.35;cursor:not-allowed}.chat__privacy{text-align:center;margin:var(--s-12) 0 0}.page{padding-top:var(--s-32);padding-bottom:var(--s-64)}.page__head{margin-bottom:var(--s-24)}.page__title{margin:var(--s-12) 0 0}.week-grid{display:grid;grid-template-columns:1fr;grid-gap:var(--s-16);gap:var(--s-16)}@media (min-width:768px){.week-grid{grid-template-columns:repeat(5,1fr);align-items:start}}.week-col--today{border-color:var(--color-slate)}.admin{padding-top:var(--s-24);padding-bottom:var(--s-64)}.admin__loading,.admin__login{padding-top:var(--s-48)}.admin__login{max-width:420px}.admin__loginform{margin-top:var(--s-8)}.admin__bar{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--s-24)}.admin__logout,.admin__refresh{min-height:36px;font-size:13px;padding:0 var(--s-16)}.admin__stats{display:grid;grid-template-columns:1fr;grid-gap:var(--s-12);gap:var(--s-12);margin-bottom:var(--s-16)}@media (min-width:640px){.admin__stats{grid-template-columns:repeat(3,1fr)}}.admin__stat-value{margin:var(--s-8) 0 2px}.admin__warn{padding:var(--s-12) var(--s-16);border:1px solid rgba(229,193,189,.4);border-radius:var(--r-card);color:var(--color-rose);font-size:13px;line-height:1.5}.admin__override,.admin__warn{margin-bottom:var(--s-16)}.admin__override-grid{display:grid;grid-template-columns:1fr;grid-gap:var(--s-12);gap:var(--s-12);align-items:end}@media (min-width:720px){.admin__override-grid{grid-template-columns:120px 1fr 160px 120px auto}.admin__field--wide{grid-column:auto}}.admin__apply{display:flex}.admin__apply .btn{width:100%}.admin__msg{margin-top:var(--s-12)}.admin__table-head{display:flex;align-items:center;justify-content:space-between}.admin__table-scroll{overflow-x:auto}.admin__table{width:100%;border-collapse:collapse;font-size:14px;min-width:560px}.admin__table th{text-align:left;font-family:var(--font-mono);font-size:11px;letter-spacing:.12em;color:var(--text-faint);font-weight:400;padding:0 var(--s-12) var(--s-12)}.admin__table td,.admin__table th{border-bottom:1px solid var(--hairline)}.admin__table td{padding:var(--s-12);vertical-align:middle}.admin__id{font-family:var(--font-mono);font-size:12px;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin__actions{text-align:right}.linkbtn{background:none;border:none;color:var(--color-sage);cursor:pointer;font-size:13px;padding:var(--s-4) var(--s-8)}.linkbtn:hover{color:var(--text)}.badge{display:inline-block;font-family:var(--font-mono);font-size:11px;letter-spacing:.08em;padding:3px 8px;border-radius:var(--r-pill);border:1px solid var(--hairline);color:var(--text-dim)}.badge--exempt{color:var(--color-sage);border-color:rgba(182,190,156,.4)}.badge--blocked{color:var(--color-rose);border-color:rgba(229,193,189,.4)}.badge--custom{color:var(--color-sand);border-color:rgba(210,208,186,.4)}.stack>*+*{margin-top:var(--s-16)}.row{display:flex;align-items:center}.gap-8{gap:var(--s-8)}.gap-12{gap:var(--s-12)}.gap-16{gap:var(--s-16)}.dim{color:var(--text-dim)}.faint{color:var(--text-faint)}.grow{flex:1 1}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:root{--ease-out:cubic-bezier(0.22,0.61,0.36,1);--motion:0.5s}html{scroll-behavior:smooth}@keyframes rise{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes pop-in{0%{opacity:0;transform:translateY(8px) scale(.99)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes nav-drop{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}.nav-top{animation:nav-drop var(--motion) var(--ease-out) both}.home__hero>*{animation:rise var(--motion) var(--ease-out) both}.home__brand{animation-delay:.02s}.home__date{animation-delay:.1s}.home__sub{animation-delay:.16s}.card{animation:rise var(--motion) var(--ease-out) both}.home__grid>.card:first-child{animation-delay:.1s}.home__grid>.card:nth-child(2){animation-delay:.18s}.home__grid>.card:nth-child(3){animation-delay:.26s}.home__ai{animation:rise var(--motion) var(--ease-out) both;animation-delay:.3s}.page__head>*{animation:rise var(--motion) var(--ease-out) both}.page__title{animation-delay:.06s}.chat__intro>*{animation:rise var(--motion) var(--ease-out) both}.chat__intro-title{animation-delay:.06s}.chat__intro .chat__examples{animation-delay:.12s}.events>*,.meal>*,.sched>*{animation:rise .44s var(--ease-out) both}.events>:nth-child(2),.meal>:nth-child(2),.sched>:nth-child(2){animation-delay:.05s}.events>:nth-child(3),.meal>:nth-child(3),.sched>:nth-child(3){animation-delay:.1s}.events>:nth-child(4),.meal>:nth-child(4),.sched>:nth-child(4){animation-delay:.15s}.events>:nth-child(5),.meal>:nth-child(5),.sched>:nth-child(5){animation-delay:.2s}.events>:nth-child(6),.meal>:nth-child(6),.sched>:nth-child(6){animation-delay:.25s}.events>:nth-child(7),.meal>:nth-child(7),.sched>:nth-child(7){animation-delay:.3s}.events>:nth-child(n+8),.meal>:nth-child(n+8),.sched>:nth-child(n+8){animation-delay:.34s}.bubble{animation:pop-in .42s var(--ease-out) both}.ai-section{animation:fade-in var(--motion) var(--ease-out) both}.card{transition:border-color .2s ease}.card:hover{border-color:var(--hairline-strong)}.chip{transition:border-color .15s ease,color .15s ease,background .15s ease,transform .15s var(--ease-out)}.chip:hover{transform:translateY(-1px)}.events__thumb img{transition:transform .35s var(--ease-out)}.events__thumb:hover img{transform:scale(1.03)}.events__row{transition:background .15s ease}.events__row:hover{background:rgba(255,255,255,.02)}.nav-link{transition:color .15s ease,background .15s ease}.nav-bottom__item{transition:color .15s ease}@media (prefers-reduced-motion:reduce){*{animation-delay:0s!important}html{scroll-behavior:auto}}