body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}:root{--bg:#0f1216;--surface:#171b21;--surface-2:#1e232b;--border:#2a313c;--text:#eef1f5;--text-muted:#9aa4b2;--accent:#4f9dff;--accent-soft:#4f9dff26;--success:#34c98f;--success-soft:#34c98f26;--danger:#e5555f;--danger-soft:#e5555f26;--radius:12px;--radius-sm:8px}*{box-sizing:border-box}body,html{max-width:100%}.App,body,html{background:#0f1216;background:var(--bg);overflow-x:hidden}.App{color:#eef1f5;color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;min-height:100vh;text-align:left;width:100%}.app-shell{margin:0 auto;max-width:1100px;padding:0 1.25rem 4rem}.topbar{align-items:center;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0f1216e6;border-bottom:1px solid #2a313c;border-bottom:1px solid var(--border);display:flex;flex-wrap:wrap;gap:1rem;justify-content:space-between;margin:0 0 1.5rem;padding:.9rem 1.25rem;position:-webkit-sticky;position:sticky;row-gap:.5rem;top:0;width:100%;z-index:20}.topbar-title{font-size:1.15rem;font-weight:700;letter-spacing:.01em;white-space:nowrap}.topbar-right{align-items:center;display:flex;flex-wrap:wrap;gap:.6rem .9rem}.topbar-user{color:#9aa4b2;color:var(--text-muted);font-size:.9rem}.save-status{border-radius:999px;font-size:.8rem;padding:.25rem .6rem;white-space:nowrap}.save-status--saving{animation:pulseSoft 1.1s ease-in-out infinite;background:#4f9dff26;background:var(--accent-soft);color:#4f9dff;color:var(--accent)}.save-status--saved{background:#34c98f26;background:var(--success-soft);color:#34c98f;color:var(--success)}.save-status--error{background:#e5555f26;background:var(--danger-soft);color:#e5555f;color:var(--danger)}.save-status--idle{color:#9aa4b2;color:var(--text-muted)}.btn-ghost{background:#0000;border:1px solid #2a313c;border:1px solid var(--border);border-radius:8px;border-radius:var(--radius-sm);color:#eef1f5;color:var(--text);cursor:pointer;font-size:.85rem;padding:.4rem .9rem;transition:border-color .15s ease,background .15s ease,transform .15s ease}.btn-ghost:hover{background:#4f9dff26;background:var(--accent-soft);border-color:#4f9dff;border-color:var(--accent);transform:translateY(-1px)}.btn-ghost:active{transform:translateY(0)}.loading-state{color:#9aa4b2;color:var(--text-muted);padding:4rem 0;text-align:center}.summary-grid{grid-gap:.9rem;display:grid;gap:.9rem;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));margin-bottom:1.5rem}.stat-card{animation:cardIn .45s ease forwards;animation-delay:0ms;animation-delay:calc(var(--card-i, 0)*60ms);background:#171b21;background:var(--surface);border:1px solid #2a313c;border:1px solid var(--border);border-radius:12px;border-radius:var(--radius);opacity:0;padding:1rem 1.1rem;transform:translateY(10px);transition:border-color .2s ease,transform .2s ease}.stat-card:hover{border-color:#384154;transform:translateY(-2px)}.stat-card-label{color:#9aa4b2;color:var(--text-muted);font-size:.8rem;margin-bottom:.4rem}.stat-card-value{font-size:1.1rem;font-weight:700;margin-bottom:.55rem}.stat-card-value span{color:#9aa4b2;color:var(--text-muted);font-size:.85rem;font-weight:400}.bar-track{background:#1e232b;background:var(--surface-2);border-radius:999px;height:8px;overflow:hidden}.bar-fill{background:linear-gradient(90deg,#4f9dff,#34c98f);background:linear-gradient(90deg,var(--accent),var(--success));border-radius:999px;height:100%;transition:width .3s ease}.wx-grid{grid-gap:.6rem;display:grid;gap:.6rem;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));margin-bottom:2rem}.wx-tile{background:#171b21;background:var(--surface);border:1px solid #2a313c;border:1px solid var(--border);border-radius:8px;border-radius:var(--radius-sm);padding:.6rem .75rem}.wx-label{color:#9aa4b2;color:var(--text-muted);font-size:.75rem;margin-bottom:.35rem}.mini-bar{background:#1e232b;background:var(--surface-2);border-radius:999px;height:6px;margin-bottom:.3rem;overflow:hidden}.mini-bar-fill{background:#4f9dff;background:var(--accent);border-radius:999px;height:100%}.wx-value{font-size:.75rem}.section-title,.wx-value{color:#9aa4b2;color:var(--text-muted)}.section-title{font-size:1rem;letter-spacing:.08em;margin:2rem 0 .9rem;text-transform:uppercase}.module-grid{display:flex;flex-direction:column;gap:.9rem}.module-card{animation:cardIn .45s ease forwards;animation-delay:0ms;animation-delay:calc(var(--card-i, 0)*60ms);background:#171b21;background:var(--surface);border:1px solid #2a313c;border:1px solid var(--border);border-radius:12px;border-radius:var(--radius);opacity:0;overflow:hidden;transform:translateY(10px);transition:border-color .2s ease,box-shadow .2s ease}.module-card:hover{border-color:#384154;box-shadow:0 8px 24px #00000040}.module-card-header{align-items:center;background:#1e232b;background:var(--surface-2);border-bottom:1px solid #2a313c;border-bottom:1px solid var(--border);display:flex;flex-wrap:wrap;gap:1rem;justify-content:space-between;padding:.85rem 1.1rem}.module-card-name{font-size:.95rem;font-weight:600}.module-card-progress{align-items:center;display:flex;flex:1 1;gap:.6rem;max-width:320px;min-width:160px}.module-card-progress .bar-track{flex:1 1}.module-card-ects{color:#9aa4b2;color:var(--text-muted);font-size:.8rem;white-space:nowrap}.module-select-all{accent-color:#4f9dff;accent-color:var(--accent);cursor:pointer;height:18px;width:18px}.course-table-wrap{overflow-x:auto}.course-table{border-collapse:collapse;font-size:.88rem;width:100%}.course-table thead th{color:#9aa4b2;color:var(--text-muted);font-size:.72rem;letter-spacing:.05em;padding:.5rem 1.1rem;text-align:left;text-transform:uppercase}.course-table tbody td,.course-table thead th{border-bottom:1px solid #2a313c;border-bottom:1px solid var(--border)}.course-table tbody td{padding:.55rem 1.1rem;vertical-align:middle}.course-table tbody tr:last-child td{border-bottom:none}.course-table tbody tr:hover{background:#1e232b;background:var(--surface-2)}.course-table tr.is-selected,.course-table tr.is-selected:hover{background:#34c98f26;background:var(--success-soft)}.course-checkbox{accent-color:#34c98f;accent-color:var(--success);cursor:pointer;height:18px;width:18px}.type-badge{background:#1e232b;background:var(--surface-2);border:1px solid #2a313c;border:1px solid var(--border);border-radius:999px;color:#eef1f5;color:var(--text);cursor:pointer;font-size:.75rem;padding:.25rem .7rem;transition:border-color .15s ease,transform .15s ease}.type-badge:hover{border-color:#4f9dff;border-color:var(--accent);transform:translateY(-1px)}.course-checkbox{transition:transform .15s ease}.course-checkbox:hover{transform:scale(1.15)}.btn-danger-ghost{background:#0000;border:1px solid #e5555f;border:1px solid var(--danger);border-radius:8px;border-radius:var(--radius-sm);color:#e5555f;color:var(--danger);cursor:pointer;font-size:.78rem;padding:.3rem .7rem}.btn-danger-ghost:hover{background:#e5555f26;background:var(--danger-soft)}.empty-row td{color:#9aa4b2;color:var(--text-muted);padding:1.1rem;text-align:center}.popup-content{background:#171b21;background:var(--surface);border:1px solid #2a313c;border:1px solid var(--border);border-radius:12px;border-radius:var(--radius);margin:auto;padding:1.25rem;text-align:center;width:min(90vw,360px)}.popup-content input{background:#1e232b;background:var(--surface-2);border:1px solid #2a313c;border:1px solid var(--border);border-radius:8px;border-radius:var(--radius-sm);color:#eef1f5;color:var(--text);margin-bottom:.6rem;padding:.5rem .7rem;width:100%}.popup-title{font-weight:600;margin-bottom:.9rem}.popup-hint{background:#e5555f26;background:var(--danger-soft);border-radius:8px;border-radius:var(--radius-sm);color:#e5555f;color:var(--danger);font-size:.78rem;margin:-.4rem 0 .9rem;padding:.45rem .6rem}.type-popup-options{display:flex;flex-direction:column;gap:.5rem}.add-course-row{display:flex;justify-content:flex-start;padding:1rem 1.1rem}.btn-primary{background:#4f9dff;background:var(--accent);border:none;border-radius:8px;border-radius:var(--radius-sm);color:#04121f;cursor:pointer;font-weight:600;padding:.5rem 1.1rem;transition:filter .15s ease,transform .1s ease}.btn-primary:hover{filter:brightness(1.08);transform:translateY(-1px)}.btn-primary:active{transform:translateY(0)}@media (max-width:640px){.app-shell{padding:0 .75rem 3rem}.topbar{margin:0 0 1.25rem}.course-table{font-size:.8rem}.course-table tbody td,.course-table thead th{padding:.5rem .6rem}.exam-drawer{width:100%}}@keyframes cardIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes pulseSoft{0%,to{opacity:1}50%{opacity:.55}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes topbarIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.app-fade-in{animation:fadeIn .35s ease both}.topbar{animation:topbarIn .35s ease both}.btn-exams{align-items:center;display:inline-flex;gap:.4rem}.exam-backdrop{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#05070a8c;inset:0;opacity:0;pointer-events:none;position:fixed;transition:opacity .25s ease;z-index:40}.exam-backdrop.is-open{opacity:1;pointer-events:auto}.exam-drawer{background:#171b21;background:var(--surface);border-left:1px solid #2a313c;border-left:1px solid var(--border);bottom:0;box-shadow:-20px 0 50px #00000059;display:flex;flex-direction:column;position:fixed;right:0;top:0;transform:translateX(100%);transition:transform .3s cubic-bezier(.22,1,.36,1);width:min(440px,100%);z-index:41}.exam-drawer.is-open{transform:translateX(0)}.exam-drawer-header{align-items:center;border-bottom:1px solid #2a313c;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;padding:1.1rem 1.25rem}.exam-drawer-title{font-size:1.05rem;font-weight:700}.exam-drawer-subtitle{color:#9aa4b2;color:var(--text-muted);font-size:.78rem;margin-top:.15rem}.exam-drawer-close{background:#0000;border:1px solid #2a313c;border:1px solid var(--border);border-radius:999px;color:#eef1f5;color:var(--text);cursor:pointer;font-size:1rem;height:32px;line-height:1;transition:border-color .15s ease,transform .15s ease;width:32px}.exam-drawer-close:hover{border-color:#e5555f;border-color:var(--danger);transform:rotate(90deg)}.exam-drawer-search{padding:.9rem 1.25rem 0}.exam-drawer-search input{background:#1e232b;background:var(--surface-2);border:1px solid #2a313c;border:1px solid var(--border);border-radius:8px;border-radius:var(--radius-sm);color:#eef1f5;color:var(--text);font-size:.85rem;outline:none;padding:.55rem .8rem;transition:border-color .15s ease,box-shadow .15s ease;width:100%}.exam-drawer-search input:focus{border-color:#4f9dff;border-color:var(--accent);box-shadow:0 0 0 3px #4f9dff26;box-shadow:0 0 0 3px var(--accent-soft)}.exam-drawer-list{display:flex;flex:1 1;flex-direction:column;gap:.6rem;overflow-y:auto;padding:1rem 1.25rem 1.5rem}.exam-item{animation:cardIn .35s ease forwards;animation-delay:0ms;animation-delay:calc(var(--card-i, 0)*35ms);background:#1e232b;background:var(--surface-2);border:1px solid #2a313c;border:1px solid var(--border);border-radius:8px;border-radius:var(--radius-sm);opacity:0;padding:.7rem .85rem;transform:translateY(8px);transition:border-color .15s ease}.exam-item:hover{border-color:#4f9dff;border-color:var(--accent)}.exam-item-top{align-items:center;display:flex;gap:.5rem;justify-content:space-between;margin-bottom:.3rem}.exam-item-title{font-size:.9rem;font-weight:600}.exam-item-date{color:#4f9dff;color:var(--accent);font-size:.75rem;white-space:nowrap}.exam-item-meta{color:#9aa4b2;color:var(--text-muted);display:flex;flex-wrap:wrap;font-size:.78rem;gap:.4rem .8rem}.exam-reg-pill{border-radius:999px;display:inline-block;font-size:.7rem;margin-top:.4rem;padding:.12rem .5rem}.exam-reg-pill--open{background:#34c98f26;background:var(--success-soft);color:#34c98f;color:var(--success)}.exam-reg-pill--closed{background:#9aa4b226;color:#9aa4b2;color:var(--text-muted)}.exam-drawer-state{color:#9aa4b2;color:var(--text-muted);font-size:.85rem;padding:2rem 1.25rem;text-align:center}.exam-drawer-state--error{color:#e5555f;color:var(--danger)}.login-page{--bg:#0f1216;--surface:#171b21;--surface-2:#1e232b;--border:#2a313c;--text:#eef1f5;--text-muted:#9aa4b2;--accent:#4f9dff;--accent-soft:#4f9dff26;--danger:#e5555f;--danger-soft:#e5555f26;--radius:14px;--radius-sm:8px;align-items:center;background:radial-gradient(circle at 20% 20%,#1a2230 0,var(--bg) 55%);color:var(--text);display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;justify-content:center;min-height:100vh;padding:1.5rem;width:100%}.login-page,.login-page *,.login-page :after,.login-page :before{box-sizing:border-box}.login-card{animation:loginCardIn .5s cubic-bezier(.22,1,.36,1) forwards;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:0 20px 50px #00000059;max-width:380px;opacity:0;padding:2rem 1.75rem;transform:translateY(14px) scale(.98);width:100%}.login-brand{gap:.6rem;margin-bottom:.35rem}.login-brand,.login-brand-icon{align-items:center;display:flex}.login-brand-icon{background:linear-gradient(135deg,var(--accent),#34c98f);border-radius:9px;font-size:1.1rem;height:34px;justify-content:center;transition:transform .25s ease;width:34px}.login-brand:hover .login-brand-icon{transform:rotate(-8deg) scale(1.08)}.login-title{font-size:1.3rem;font-weight:700}.login-subtitle{color:var(--text-muted);font-size:.88rem;margin:0 0 1.5rem}.login-field{margin-bottom:1.1rem}.login-label{color:var(--text-muted);display:block;font-size:.78rem;margin-bottom:.4rem}.login-input-wrap{align-items:center;display:flex;position:relative}.login-input{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-size:.92rem;outline:none;padding:.65rem .85rem;transition:border-color .15s ease,box-shadow .15s ease;width:100%}.login-input::placeholder{color:#5c6674}.login-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.login-input--with-toggle{padding-right:2.6rem}.login-toggle-visibility{background:#0000;border:none;color:var(--text-muted);cursor:pointer;font-size:.78rem;padding:.3rem .4rem;position:absolute;right:.6rem}.login-toggle-visibility:hover{color:var(--text)}.login-error{align-items:center;animation:shakeIn .4s ease;background:var(--danger-soft);border:1px solid #e5555f59;border-radius:var(--radius-sm);color:var(--danger);display:flex;font-size:.85rem;gap:.5rem;margin-bottom:1.1rem;padding:.6rem .75rem}.login-submit{background:var(--accent);border:none;border-radius:var(--radius-sm);color:#04121f;cursor:pointer;font-size:.95rem;font-weight:700;padding:.7rem;transition:filter .15s ease,transform .05s ease;width:100%}.login-submit:hover:not(:disabled){filter:brightness(1.08)}.login-submit:active:not(:disabled){transform:translateY(1px)}.login-submit:disabled{cursor:not-allowed;opacity:.65}@media (max-width:420px){.login-card{padding:1.5rem 1.25rem}}@keyframes loginCardIn{0%{opacity:0;transform:translateY(14px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes shakeIn{0%{opacity:0;transform:translateX(-6px)}30%{transform:translateX(4px)}60%{transform:translateX(-2px)}to{opacity:1;transform:translateX(0)}}
/*# sourceMappingURL=main.2219dc04.css.map*/