:root{--bg:#f7f8fa;--surface:#ffffff;--surface-muted:#f1f3f6;--border:#d8dde5;--border-strong:#aeb7c4;--text:#111827;--muted:#5f6b7a;--accent:#1d4ed8;--accent-soft:#eef4ff;--success:#166534;--shadow:0 12px 30px rgba(17,24,39,0.08)}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;letter-spacing:0;overflow-x:hidden}body,html{max-width:100%}button,input,select,textarea{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.6}.portal-shell{display:grid;grid-template-columns:260px minmax(0,1fr);width:100%;min-width:0;max-width:100vw;min-height:100vh;overflow-x:hidden}.sidebar{display:flex;flex-direction:column;gap:24px;min-width:0;border-right:1px solid var(--border);background:var(--surface);padding:24px 18px}.brand{display:flex;align-items:center;gap:12px;padding-bottom:18px;border-bottom:1px solid var(--border)}.brand-mark{display:grid;width:42px;height:42px;place-items:center;border:1px solid var(--text);border-radius:6px;color:var(--text);font-weight:800;font-size:14px}.brand p,.brand span,.course-code,.eyeless-label{margin:0}.brand p{font-size:16px;font-weight:800}.brand span{color:var(--muted);font-size:13px}.nav-list{display:grid;gap:6px;min-width:0}.nav-item{display:flex;align-items:center;gap:10px;width:100%;min-height:42px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--muted);padding:10px 11px;text-align:left;font-size:14px;font-weight:650}.nav-item.active,.nav-item:hover{border-color:#bfd2ff;background:var(--accent-soft);color:var(--accent)}.nav-item.staff-only{border-color:#fecaca;background:#fef2f2;color:#991b1b}.nav-item.staff-only.active,.nav-item.staff-only:hover{border-color:#ef4444;background:#fee2e2;color:#7f1d1d}.nav-item.student-view-switch{border-color:#bbf7d0;background:#f0fdf4;color:#166534}.nav-item.student-view-switch.active,.nav-item.student-view-switch:hover{border-color:#22c55e;background:#dcfce7;color:#14532d}.sidebar-note{display:flex;gap:10px;margin-top:auto;border:1px solid var(--border);border-radius:6px;padding:12px;color:var(--muted);font-size:13px;line-height:1.45}.sidebar-note p{margin:0}.workspace{min-width:0;width:100%;max-width:100vw;padding:22px;overflow-x:hidden}.topbar{display:flex;align-items:center;justify-content:space-between;gap:24px;border:1px solid var(--border);border-radius:6px;background:var(--surface);box-shadow:var(--shadow);padding:18px 20px}.topbar>div{min-width:0}.course-code{color:var(--accent);font-size:13px;font-weight:800;text-transform:uppercase}.topbar h1{margin:2px 0 4px;font-size:23px;line-height:1.2;letter-spacing:0;overflow-wrap:anywhere}.topbar span{color:var(--muted);font-size:14px}.google-button,.primary-action,.secondary-action{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:38px;border-radius:6px;padding:9px 13px;font-size:14px;font-weight:750;white-space:nowrap}.account-stack{display:grid;justify-items:end;gap:8px;width:min(560px,100%)}.account-control{display:flex;align-items:center;flex-wrap:wrap;gap:12px;justify-content:flex-end}.account-control div{display:grid;flex:1 1 180px;justify-items:end;gap:2px;min-width:0}.account-control strong{max-width:260px;overflow:hidden;color:var(--text);font-size:13px;text-overflow:ellipsis;white-space:nowrap}.account-control span{color:var(--muted);font-size:12px;font-weight:800;text-transform:uppercase}.google-button,.primary-action{border:1px solid var(--accent);background:var(--accent);color:white}.secondary-action{border:1px solid var(--border-strong);background:var(--surface);color:var(--text)}.auth-panel{display:grid;flex:0 0 360px;gap:8px;width:min(360px,100%)}.auth-mode-toggle{display:grid;grid-template-columns:1fr 1fr;gap:4px;border:1px solid var(--border);border-radius:6px;background:var(--surface-muted);padding:4px}.auth-mode-toggle button{min-height:30px;border:0;border-radius:4px;background:transparent;color:var(--muted);font-size:12px;font-weight:850}.auth-mode-toggle button.active{background:var(--surface);color:var(--text);box-shadow:0 1px 2px rgb(15 23 42/.08)}.auth-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:8px}.auth-fields input{min-height:38px;padding:8px 10px}.auth-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}.auth-status{margin:0;color:var(--muted);font-size:12px;line-height:1.35;text-align:right}.password-panel{display:grid;grid-template-columns:minmax(120px,1fr) minmax(120px,1fr) auto;gap:8px;width:100%;border:1px solid var(--border);border-radius:6px;background:var(--surface-muted);padding:10px}.password-panel .auth-status{grid-column:1/-1}.content-grid{display:grid;grid-template-columns:minmax(0,1fr) 330px;gap:18px;margin-top:18px;min-width:0}.primary-pane,.side-pane>section{border:1px solid var(--border);border-radius:6px;background:var(--surface)}.primary-pane{min-width:0;overflow:hidden;padding:20px}.section-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;border-bottom:1px solid var(--border);padding-bottom:16px;margin-bottom:18px}.eyeless-label{color:var(--muted);font-size:12px;font-weight:800;text-transform:uppercase}.section-heading h2{margin:2px 0 0;font-size:24px;line-height:1.2;letter-spacing:0}.student-preview-banner{display:flex;gap:12px;align-items:flex-start;border:1px solid #86efac;border-radius:6px;background:#f0fdf4;color:#14532d;padding:12px 13px;margin-bottom:16px}.student-preview-banner strong{display:block;margin-bottom:3px}.student-preview-banner p{margin:0;color:#166534;line-height:1.45}.release-state{border:1px solid var(--border);border-radius:6px;background:var(--surface-muted);color:var(--muted);padding:7px 9px;font-size:12px;font-weight:800}.table-stack,.text-stack{display:grid;gap:16px}.table-stack h3{margin:0;font-size:17px;letter-spacing:0}.muted,.text-stack p{color:var(--muted);line-height:1.6}.file-state,.muted,.text-stack p{margin:0}.table-wrap{overflow-x:auto;min-width:0;max-width:100%;border:1px solid var(--border);border-radius:6px}table{width:100%;min-width:720px;border-collapse:collapse;background:var(--surface)}.wide-table{min-width:1080px}td,th{border-bottom:1px solid var(--border);padding:12px 13px;text-align:left;vertical-align:top;line-height:1.45;font-size:14px}th{background:var(--surface-muted);color:#1f2937;font-size:12px;font-weight:850;text-transform:uppercase}tr:last-child td{border-bottom:0}.calendar-stack{display:grid;gap:18px}.calendar-legend{display:flex;flex-wrap:wrap;gap:8px}.calendar-legend-item{border:1px solid var(--border);border-left-width:4px;border-radius:6px;background:var(--surface);padding:7px 9px;color:#253041;font-size:12px;font-weight:800;line-height:1.1}.calendar-months{display:grid;gap:18px}.calendar-month{overflow-x:auto;border:1px solid var(--border);border-radius:6px;background:var(--surface)}.calendar-month h3{margin:0;border-bottom:1px solid var(--border);background:var(--surface-muted);padding:13px 14px;color:#172033;font-size:17px;letter-spacing:0}.calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(108px,1fr));min-width:820px}.calendar-weekday{border-right:1px solid var(--border);border-bottom:1px solid var(--border);background:#fafbfc;padding:9px 8px;color:#445266;font-size:11px;font-weight:850;text-align:center;text-transform:uppercase}.calendar-weekday:nth-child(7n){border-right:0}.calendar-day{min-height:126px;border-right:1px solid var(--border);border-bottom:1px solid var(--border);background:var(--surface);padding:8px}.calendar-day:nth-child(7n){border-right:0}.calendar-day-empty{background:#f6f7f9}.calendar-day-number{color:#172033;font-size:13px;font-weight:850;line-height:1}.calendar-day-events{display:grid;gap:5px;margin-top:8px}.calendar-event{overflow-wrap:anywhere;border:1px solid var(--border);border-left-width:4px;border-radius:5px;padding:6px 7px;color:#172033;font-size:11px;line-height:1.25}.calendar-event span{display:block;font-weight:850}.calendar-event small{display:block;margin-top:3px;color:#4b5563;font-size:10px;line-height:1.25}.calendar-lecture{border-left-color:#1d4ed8;background:#eef4ff}.calendar-tutorial{border-left-color:#047857;background:#ecfdf5}.calendar-assignment{border-left-color:#b45309;background:#fff7ed}.calendar-exam{border-left-color:#b91c1c;background:#fef2f2}.calendar-project{border-left-color:#0f766e;background:#f0fdfa}.calendar-pause{border-left-color:#64748b;background:#f8fafc}.side-pane{display:grid;align-content:start;gap:14px}.action-panel{display:grid;gap:12px;padding:16px}.panel-title{display:flex;align-items:center;gap:9px}.panel-title h3{margin:0;font-size:16px}.grade-status{display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid var(--border);padding:9px 0;font-size:14px}.grade-status:last-child{border-bottom:0}.grade-status span{color:var(--muted)}.grade-status strong{color:var(--success);font-size:13px}.dashboard-stack{gap:18px}.dashboard-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px}.dashboard-metric{display:grid;gap:5px;min-width:0;border:1px solid var(--border);border-radius:6px;background:var(--surface);padding:14px}.dashboard-metric span{color:var(--muted);font-size:12px;font-weight:850;text-transform:uppercase}.dashboard-metric strong{color:var(--text);font-size:26px;line-height:1.1;overflow-wrap:anywhere}.dashboard-metric p{margin:0;color:var(--muted);font-size:13px;line-height:1.35}.button-row,.grade-tools{display:flex;flex-wrap:wrap;gap:10px}.grade-editor-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.grade-editor-heading>div{display:grid;gap:4px;min-width:0}.gradebook-wrap table{min-width:1400px}.gradebook-table td,.gradebook-table th{padding:8px;vertical-align:middle}.gradebook-table td:first-child,.gradebook-table th:first-child{min-width:180px}.gradebook-table td:nth-child(2),.gradebook-table th:nth-child(2){min-width:240px}.grade-input{min-width:70px;min-height:34px;padding:7px 8px;font-size:13px}.grade-email-input{min-width:230px}.student-cell{display:grid;gap:2px;min-width:0}.student-cell strong{color:var(--text);font-size:13px;line-height:1.3;overflow-wrap:anywhere}.student-cell span{color:var(--muted);font-size:12px;line-height:1.3;overflow-wrap:anywhere}.release-toggle{display:flex;align-items:center;gap:8px;min-height:34px;color:var(--muted);font-size:13px}.release-toggle input{width:16px;min-width:16px;height:16px;padding:0}.compact-action{min-height:34px;padding:7px 10px;font-size:13px}.icon-action{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}.danger-action{border-color:#fecaca;color:#b91c1c}.danger-action:hover:not(:disabled){background:#fef2f2}.download-panel,.notice-panel{display:grid;gap:12px;border:1px solid var(--border);border-radius:6px;background:var(--surface-muted);padding:14px}.notice-panel{grid-template-columns:auto minmax(0,1fr);align-items:start}.download-panel h3,.notice-panel strong{display:block;margin:0 0 4px;font-size:15px}.download-panel p,.notice-panel p{margin:0}.editor-form{display:grid;gap:12px;border:1px solid var(--border);border-radius:6px;background:var(--surface);padding:14px}.editor-form label{display:grid;gap:7px;color:var(--muted);font-size:12px;font-weight:800;text-transform:uppercase}.announcement-stack{display:grid;gap:16px}.announcement-composer{gap:16px}.announcement-composer-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.announcement-card h3,.announcement-composer-head h3,.announcement-summary h3{margin:0;letter-spacing:0}.announcement-delivery-strip{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12px;color:var(--muted);font-size:12px;font-weight:800;text-align:right;text-transform:uppercase}.announcement-delivery-strip span{display:grid;gap:2px;min-width:120px}.announcement-delivery-strip strong{color:var(--text);font-size:15px}.compact-notice{grid-template-columns:auto minmax(0,1fr);padding:10px 12px}.announcement-fields{display:grid;grid-template-columns:minmax(180px,.45fr) minmax(260px,1fr);gap:12px}.announcement-preview{display:grid;gap:7px;border-left:4px solid var(--accent);background:var(--surface-muted);padding:12px 14px}.announcement-card-head span,.announcement-meta,.announcement-preview span{color:var(--muted);font-size:12px;font-weight:800;text-transform:uppercase}.announcement-preview strong{color:var(--text);font-size:16px;line-height:1.35;overflow-wrap:anywhere}.announcement-card p,.announcement-preview p{margin:0;line-height:1.55;overflow-wrap:anywhere;white-space:pre-wrap}.confirmation-row{display:flex!important;align-items:flex-start;gap:9px!important;color:var(--text)!important;font-size:13px!important;line-height:1.45;text-transform:none!important}.confirmation-row input{width:16px;min-width:16px;height:16px;margin-top:1px;padding:0}.announcement-actions{align-items:center}.announcement-summary{display:flex;align-items:flex-start;gap:10px;border:1px solid var(--border);border-radius:6px;background:var(--surface);padding:14px}.announcement-feed{display:grid;gap:12px}.announcement-card,.announcement-empty{border:1px solid var(--border);border-radius:6px;background:var(--surface);padding:14px}.announcement-empty{color:var(--muted);font-size:14px}.announcement-card{display:grid;gap:10px}.announcement-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.announcement-status{flex:0 0 auto;border:1px solid var(--border);border-radius:999px;background:var(--surface-muted);padding:4px 8px;color:var(--muted);font-size:11px;font-weight:850;text-transform:uppercase}.announcement-status.sent{border-color:#bbf7d0;background:#f0fdf4;color:#166534}.announcement-status.failed{border-color:#fecaca;background:#fef2f2;color:#b91c1c}.announcement-meta{display:flex;flex-wrap:wrap;gap:8px 12px;overflow-wrap:anywhere}.announcement-failure{border-left:3px solid #ef4444;color:#b91c1c;padding-left:10px}.roster-form{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.roster-form .button-row{align-items:center;grid-column:1/-1}.discussion-form{grid-template-columns:minmax(160px,.45fr) minmax(220px,1fr)}.discussion-form .button-row,.discussion-message-field{grid-column:1/-1}input,textarea{width:100%;border:1px solid var(--border-strong);border-radius:6px;background:var(--surface);color:var(--text);padding:10px 11px;font-size:14px;line-height:1.45;text-transform:none}textarea{resize:vertical}.discussion-list{display:grid;gap:12px}.discussion-item,.discussion-reply,.discussion-thread{min-width:0}.discussion-thread{display:grid;gap:0;border:1px solid var(--border);border-radius:6px;background:var(--surface);overflow:hidden}.discussion-item,.discussion-reply{display:grid;gap:10px;padding:14px}.discussion-replies{display:grid;gap:0;border-top:1px solid var(--border);background:var(--surface-muted)}.discussion-reply{border-bottom:1px solid var(--border);padding-left:24px}.discussion-reply:last-child{border-bottom:0}.discussion-meta{display:flex;flex-wrap:wrap;gap:7px;color:var(--muted);font-size:12px}.discussion-meta span{border:1px solid var(--border);border-radius:999px;background:var(--surface);padding:3px 8px;overflow-wrap:anywhere}.discussion-body{display:grid;gap:6px;min-width:0}.discussion-body h4{margin:0;color:var(--text);font-size:16px;line-height:1.35;overflow-wrap:anywhere}.discussion-body strong{color:var(--text);font-size:13px;overflow-wrap:anywhere}.discussion-body p{margin:0;color:var(--text);font-size:14px;line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere}.discussion-reply-form{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:end}.check-list{color:var(--muted)}.check-list,.document-links{display:grid;gap:8px;margin:0;padding:0;font-size:14px;line-height:1.45;list-style:none}.document-links a{display:block;border:1px solid var(--border);border-radius:6px;background:var(--surface);color:var(--accent);padding:9px 10px;font-weight:750;text-decoration:none}.document-links a:hover{border-color:var(--border-strong);text-decoration:underline}.contact-group,.roster-summary{display:grid;gap:10px}.contact-group{border-top:1px solid var(--border);padding-top:10px}.contact-group>strong{font-size:13px}.contact-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}.contact-list li{display:grid;gap:2px;min-width:0}.contact-list span{color:var(--text);font-weight:750}.contact-list a,.contact-list span{font-size:13px;overflow-wrap:anywhere}.contact-list a{color:var(--accent);text-decoration:none}.contact-list a:hover{text-decoration:underline}.check-list li{position:relative;padding-left:18px}.check-list li:before{position:absolute;left:0;top:.38em;width:8px;height:4px;border-bottom:2px solid var(--success);border-left:2px solid var(--success);color:var(--success);content:"";transform:rotate(-45deg)}.upload-form{display:flex;flex-wrap:wrap;align-items:end;gap:12px;border:1px solid var(--border);border-radius:6px;background:var(--surface-muted);padding:14px}.schedule-form{display:grid;grid-template-columns:minmax(220px,1.4fr) minmax(150px,.8fr) minmax(190px,1fr) auto;align-items:end;gap:12px}.schedule-form label,.upload-form label{display:grid;gap:7px;color:var(--muted);font-size:12px;font-weight:800;text-transform:uppercase}.upload-form label{min-width:280px}select{width:100%;min-height:40px;border:1px solid var(--border-strong);border-radius:6px;background:var(--surface);color:var(--text);padding:8px 10px;font-size:14px;text-transform:none}.hidden-input{display:none}.file-state{color:var(--muted);font-size:13px}.inline-link{color:var(--accent);font-weight:750;text-decoration:none}.inline-link:hover{text-decoration:underline}@media (max-width:1100px){.portal-shell{grid-template-columns:1fr}.sidebar{position:sticky;top:0;z-index:5;display:block;width:100%;max-width:100vw;overflow-x:hidden;border-right:0;border-bottom:1px solid var(--border);padding:14px}.brand,.sidebar-note{display:none}.nav-list{display:flex;gap:8px;width:100%;max-width:100%;overflow-x:auto;padding-bottom:2px}.nav-item{flex:0 0 auto;width:auto;min-width:max-content}.content-grid{grid-template-columns:1fr}}@media (max-width:700px){.workspace{width:100vw;max-width:100vw;padding:12px}.action-panel,.content-grid,.primary-pane,.side-pane,.topbar{width:calc(100vw - 36px);max-width:calc(100vw - 36px)}.section-heading,.topbar{align-items:stretch;flex-direction:column}.auth-panel{flex-basis:auto;min-width:0;width:100%}.auth-mode-toggle{grid-template-columns:minmax(0,1fr) minmax(0,1fr);min-width:0}.auth-mode-toggle button{min-width:0;padding:6px 4px;overflow-wrap:anywhere;white-space:normal}.auth-fields{grid-template-columns:1fr}.auth-actions{justify-content:stretch}.auth-actions button{flex:1 1 auto}.topbar h1{font-size:18px;max-width:100%;overflow-wrap:anywhere;word-break:break-word}.section-heading>div,.topbar>div{min-width:0;max-width:100%}.primary-pane{padding:14px}.account-control,.account-stack,.google-button,.primary-action,.secondary-action{width:100%}.account-control{align-items:stretch;flex-direction:column}.account-control div{flex:0 1 auto;justify-items:start}.password-panel{grid-template-columns:1fr}.upload-form label{min-width:100%}.discussion-form,.discussion-reply-form{grid-template-columns:1fr}.announcement-card-head,.announcement-composer-head{display:grid}.announcement-delivery-strip{justify-content:flex-start;text-align:left}.announcement-fields{grid-template-columns:1fr}.discussion-reply{padding-left:14px}.schedule-form{grid-template-columns:1fr}.grade-editor-heading{display:grid}.grade-email-input,.grade-input,.gradebook-table td:first-child,.gradebook-table td:nth-child(2),.gradebook-table th:first-child,.gradebook-table th:nth-child(2),.gradebook-wrap table{min-width:0}.table-wrap{overflow:visible;border:0}.table-wrap,table{width:100%;max-width:100%}table{display:block}.wide-table,table{min-width:0}thead{display:none}tbody{display:grid;gap:10px;width:100%;max-width:100%}tr{border:1px solid var(--border);border-radius:6px;background:var(--surface);overflow:hidden}td,tr{display:block;width:100%;max-width:100%}td{min-width:0;border-bottom:1px solid var(--border);padding:11px 12px;font-size:13px;line-height:1.45;overflow-wrap:anywhere;word-break:break-all}td:before{content:attr(data-label);display:block;margin-bottom:6px;color:var(--muted);font-size:11px;font-weight:850;line-height:1.35;text-transform:uppercase}td:last-child,tr:last-child td{border-bottom:0}}