:root{--bg:#eef4fb;--card:#ffffff;--text:#17344f;--muted:#5a7388;--line:#d5e2ee;--primary:#13558f;--primary-soft:#e5f1fb;--focus-ring:rgba(19,85,143,0.36);--focus-halo:rgba(19,85,143,0.16);--danger:#ad2636;--danger-soft:#fbecef;--ok:#0c7c55;--shadow:0 15px 35px rgba(13,37,57,0.12);--shadow-strong:0 20px 38px rgba(8,27,46,0.2);--radius-md:14px;--radius-lg:20px;--space-1:clamp(0.28rem,0.18vw + 0.22rem,0.4rem);--space-2:clamp(0.48rem,0.28vw + 0.3rem,0.64rem);--space-3:clamp(0.68rem,0.42vw + 0.44rem,0.9rem);--space-4:clamp(0.88rem,0.52vw + 0.6rem,1.1rem);--space-5:clamp(1.05rem,0.7vw + 0.7rem,1.42rem);--space-6:clamp(1.24rem,1vw + 0.72rem,1.9rem);--fz-body:clamp(0.9rem,0.22vw + 0.84rem,1rem);--fz-caption:clamp(0.75rem,0.16vw + 0.69rem,0.82rem);--fz-h2:clamp(1.2rem,0.95vw + 0.92rem,1.72rem);--fz-h3:clamp(1.02rem,0.45vw + 0.9rem,1.2rem);--motion-fast:180ms;--motion-normal:320ms;--ease-out:cubic-bezier(0.22,1,0.36,1)}*{box-sizing:border-box}body,html{width:100%;max-width:100%;overflow-x:hidden}body{margin:0;min-height:100vh;font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:var(--fz-body);line-height:1.45;color:var(--text);background:#ffffff;position:relative}.app-container{position:relative;z-index:1;width:min(1380px,94vw);max-width:100%;margin:clamp(.65rem,2vw,1rem) auto}.app-container-login{width:100%;max-width:100%;margin:0}.card-shell{background:var(--card);border:1px solid rgba(213,226,238,.95);border-radius:var(--radius-lg);box-shadow:var(--shadow);padding:var(--space-4);animation:cardRise var(--motion-normal) var(--ease-out) both}.card-shell>h3{margin-bottom:var(--space-3);color:#153a58}@keyframes cardRise{0%{opacity:0;transform:translate3d(0,12px,0)}to{opacity:1;transform:translateZ(0)}}.login-screen{position:relative;min-height:100vh;overflow:hidden;display:grid;place-items:end center;padding:clamp(.95rem,1.8vw,1.5rem) clamp(.95rem,1.8vw,1.5rem) calc(1rem + env(safe-area-inset-bottom))}.login-scene{position:absolute;inset:0;background:none;background-position:50%;background-size:cover;background-repeat:no-repeat}.login-header{position:absolute;top:calc(.72rem + env(safe-area-inset-top));left:50%;transform:translateX(-50%);z-index:3}.login-content{position:relative;z-index:2;width:min(320px,70vw);border:none;background:transparent;padding:var(--space-6) var(--space-5) var(--space-4);text-align:center;animation-delay:90ms}.login-countdown{margin:0;padding:.58rem .72rem;display:inline-flex;flex-direction:column;align-items:center;width:max-content;min-width:max-content;border-radius:12px;border:1px solid rgba(232,244,255,.68);background:rgba(8,30,54,.52);color:#f4fbff;box-shadow:0 10px 22px rgba(8,25,43,.22);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.login-countdown-label{margin:0;font-size:.74rem;letter-spacing:.03em;font-weight:700;text-transform:uppercase;color:#d2ebff;white-space:nowrap}.login-countdown-value{margin:.26rem 0 0;display:flex;flex-wrap:wrap;justify-content:center;align-items:baseline;gap:.34rem .42rem;font-size:clamp(1rem,1.45vw,1.18rem);font-weight:800;letter-spacing:.01em;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.login-countdown-part{display:inline-flex;align-items:baseline;gap:.2rem}.login-countdown-digit{display:inline-block;min-width:2ch;text-align:right;padding:.03em .18em;border-radius:8px;color:#f8fcff;background:rgba(235,246,255,.14);box-shadow:inset 0 1px 0 rgba(255,255,255,.22);transform-origin:50% 62%}.login-countdown-word{font-size:.75em;font-weight:700;letter-spacing:.02em;color:#d6ecff;text-transform:none}@keyframes countdownDigitTick{0%{opacity:.32;transform:translate3d(0,7px,0) scale(.94);filter:blur(.8px)}55%{opacity:1;transform:translateZ(0) scale(1.04);filter:blur(0)}to{opacity:1;transform:translateZ(0) scale(1);filter:blur(0)}}.login-countdown-digit.countdown-tick{animation:countdownDigitTick .42s var(--ease-out)}.login-countdown[data-state=expired]{border-color:rgba(215,239,255,.92);background:rgba(16,71,112,.56)}.login-logo-row{display:flex;justify-content:center;margin-bottom:var(--space-3)}.login-logo-image{width:92px;height:92px;object-fit:contain;border-radius:18px;background:rgba(255,255,255,.94);border:1px solid rgba(156,177,206,.64);padding:7px;box-shadow:0 10px 26px rgba(14,37,64,.16)}h1{margin:0;font-size:clamp(1.35rem,2.5vw,2.1rem);line-height:1.25;color:#1b2941}.login-subtitle{margin:var(--space-1) 0 var(--space-3);color:#2d3e59;font-size:clamp(.88rem,.25vw + .82rem,.98rem);font-weight:600}.login-mode-hint{margin:calc(var(--space-2) * -1) 0 var(--space-3);color:#49647d;font-size:.8rem;font-weight:600;line-height:1.45}body[data-device=desktop] .login-content{width:min(560px,86vw)}body[data-device=desktop] .login-subtitle{color:#194f83;font-weight:800}body[data-device=desktop] .login-submit{background:linear-gradient(140deg,#1f5f9d,#1f8d8a)}body[data-device=mobile] .login-subtitle{color:#155d45;font-weight:800}body[data-device=mobile] .login-submit{background:linear-gradient(140deg,#1f5f9d,#1f8d8a)}body[data-device=mobile] .login-countdown{padding:.52rem .66rem}.login-footer{margin:var(--space-3) 0 0;color:#33506a;font-size:.78rem;font-weight:700;letter-spacing:.04em}.eyebrow{margin:0;color:var(--primary);text-transform:uppercase;letter-spacing:.08em;font-weight:800;font-size:.77rem}.lead-small{margin:.2rem 0 0;font-size:.88rem;max-width:60ch}.lead-small,label{color:var(--muted)}label{display:grid;grid-gap:var(--space-1);gap:var(--space-1);font-size:var(--fz-caption);font-weight:700}button,input,select,textarea{font:inherit}input,select,textarea{width:100%;border:1px solid var(--line);background:#ffffff;color:var(--text);border-radius:11px;padding:.58rem .68rem}input,select{min-height:44px}input:focus,select:focus,textarea:focus{border-color:var(--primary)}:where(input,select,textarea):focus-visible{outline:2px solid var(--focus-ring);outline-offset:1px;box-shadow:0 0 0 4px var(--focus-halo)}button{border:none;border-radius:11px;padding:.58rem .9rem;font-weight:700;cursor:pointer;min-height:44px}button:disabled{opacity:.55;cursor:not-allowed}.card-shell,.connection-badge,.session-badge,.sidebar-link,.status,a,button,input,select,textarea{transition:color var(--motion-fast) var(--ease-out),background-color var(--motion-fast) var(--ease-out),border-color var(--motion-fast) var(--ease-out),box-shadow var(--motion-fast) var(--ease-out),transform var(--motion-fast) var(--ease-out),opacity var(--motion-fast) var(--ease-out)}button:not(:disabled):hover{transform:translateY(-1px);box-shadow:0 8px 18px rgba(10,41,69,.16)}button:not(:disabled):active{transform:translateY(0)}:where(a,button,.sidebar-link):focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px;box-shadow:0 0 0 4px var(--focus-halo)}.form-stack{width:100%;display:grid;grid-gap:var(--space-3);gap:var(--space-3)}.login-form-modern{text-align:left;width:50%;margin-inline:auto}.login-form-modern label{color:#263b56}.login-form-modern input,.login-form-modern select{border:1px solid rgba(156,177,206,.78);border-radius:14px;background:rgba(255,255,255,.94);color:#17283f;padding:.68rem .78rem;font-size:.94rem;text-align:center}.login-form-modern input::placeholder{color:rgba(135,149,170,.62)}.login-userid-wrap{position:relative}.login-userid-wrap input{padding-right:4.8rem}.login-userid-toggle{position:absolute;top:50%;right:.45rem;transform:translateY(-50%);min-height:34px;width:34px;display:inline-grid;place-items:center;border:1px solid rgba(156,177,206,.45);border-radius:999px;background:rgba(238,246,255,.4);color:#1b527d;opacity:.68;padding:0;line-height:1;box-shadow:none}.login-userid-icon{width:17px;height:17px;display:block}.login-userid-toggle .icon-hide,.login-userid-toggle[data-visible=true] .icon-show{display:none}.login-userid-toggle[data-visible=true] .icon-hide{display:block}.login-userid-toggle:not(:disabled):hover{transform:translateY(-50%);background:rgba(222,236,251,.75);opacity:.95;box-shadow:none}.login-userid-toggle:not(:disabled):active{transform:translateY(-50%);opacity:1}.login-userid-toggle[data-visible=true]{background:rgba(222,236,251,.85);border-color:rgba(156,177,206,.75);opacity:.92}.primary{background:linear-gradient(140deg,#13558f,#1b86a4);color:#ffffff}.login-submit{margin-top:var(--space-2);border-radius:14px;padding:.73rem .9rem;font-size:1rem;background:linear-gradient(140deg,#1f5f9d,#1f8d8a)}.ghost{border:1px solid var(--line);background:#ffffff;color:var(--text)}.danger{border:1px solid transparent;background:var(--danger-soft);color:var(--danger)}.topbar{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--space-4);margin-bottom:var(--space-3);animation:cardRise var(--motion-normal) var(--ease-out) both;animation-delay:40ms}h2{margin:.2rem 0 0;font-size:var(--fz-h2);color:#123752}h3{margin:0;font-size:var(--fz-h3)}.topbar-actions{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;justify-content:flex-end}.session-badge{background:#edf6ff;color:#1d4b71;font-size:.8rem;font-weight:700}.connection-badge,.session-badge{border:1px solid #cde2f2;border-radius:999px;padding:.35rem .72rem}.connection-badge{background:#eef8f0;color:#1b6a45;font-size:.78rem;font-weight:800;letter-spacing:.01em}.connection-badge[data-state=offline]{background:#fff2ed;border-color:#f4cec1;color:#9a4427}.connection-badge[data-state=online]{background:#eef8f0;border-color:#cfe7d8;color:#1b6a45}.card-shell,.connection-badge,.identity-item,.session-badge,.topbar-actions,.topbar>div{min-width:0;max-width:100%}.card-caption,.connection-badge,.identity-value,.session-badge,.status,.table-page-info{overflow-wrap:anywhere;word-break:break-word}.status{min-height:1.3rem;margin:0 0 var(--space-3);color:var(--ok);font-size:clamp(.84rem,.22vw + .78rem,.96rem);font-weight:700}.status.error{color:var(--danger)}.login-status{min-height:1rem;margin:.2rem 0 0;font-size:.8rem;text-align:left}.toast-stack{position:fixed;top:1rem;right:1rem;z-index:120;width:min(360px,calc(100vw - 1.2rem));grid-gap:var(--space-2);pointer-events:none}.toast,.toast-stack{display:grid;gap:var(--space-2)}.toast{pointer-events:auto;grid-template-columns:10px 1fr auto;align-items:start;grid-gap:var(--space-2);border-radius:var(--radius-md);border:1px solid #d8e6f3;background:rgba(255,255,255,.96);box-shadow:var(--shadow-strong);padding:var(--space-2) var(--space-2) var(--space-2) var(--space-2);opacity:0;transform:translate3d(0,-10px,0) scale(.98);transition:opacity var(--motion-fast) var(--ease-out),transform var(--motion-fast) var(--ease-out)}.toast.show{opacity:1;transform:translateZ(0) scale(1)}.toast-mark{width:100%;min-height:100%;border-radius:999px;background:linear-gradient(180deg,#2d8cc5,#145886)}.toast.error .toast-mark{background:linear-gradient(180deg,#d43d52,#a12231)}.toast-copy strong{display:block;font-size:.82rem;color:#20476a;margin-bottom:2px}.toast.error .toast-copy strong{color:#92273a}.toast-copy p{margin:0;font-size:.78rem;color:#35556f;line-height:1.45}.toast.error .toast-copy p{color:#6f2a37}.toast-close{min-height:auto;border:1px solid #d6e4ef;background:#f6fbff;color:#355a79;border-radius:8px;padding:.2rem .4rem;font-size:.74rem;line-height:1}.toast-close:hover{transform:none;box-shadow:none;background:#eef6ff}.admin-shell{display:grid;grid-template-columns:250px minmax(0,1fr);grid-gap:var(--space-4);gap:var(--space-4)}.admin-sidebar{position:-webkit-sticky;position:sticky;top:.8rem;height:-moz-fit-content;height:fit-content;display:grid;grid-gap:.45rem;gap:.45rem;animation:cardRise var(--motion-normal) var(--ease-out) both;animation-delay:80ms}.admin-sidebar h3{margin-bottom:.25rem}.sidebar-link{display:block;width:100%;text-align:left;border:1px solid var(--line);background:#ffffff;color:var(--text);text-decoration:none;border-radius:11px;min-height:44px;padding:.58rem .72rem;font-size:.85rem;font-weight:700;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.sidebar-link:hover{border-color:#bfd8ee;background:#f3f9ff}.sidebar-link.active{background:#eaf3fc;border-color:#bfd8ee;color:#134d7b}.admin-content,.admin-section{display:grid;grid-gap:var(--space-4);gap:var(--space-4)}.stats-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));grid-gap:var(--space-3);gap:var(--space-3)}.admin-content .card-shell:first-child,.stats-grid .card-shell:first-child,.workspace-student .card-shell:first-child{animation-delay:90ms}.admin-content .card-shell:nth-child(2),.stats-grid .card-shell:nth-child(2),.workspace-student .card-shell:nth-child(2){animation-delay:.15s}.admin-content .card-shell:nth-child(3),.stats-grid .card-shell:nth-child(3),.workspace-student .card-shell:nth-child(3){animation-delay:.21s}.stat-card{text-align:center;background:radial-gradient(circle at 82% -14%,#edf5ff 0,transparent 45%),#ffffff}.stat-card p{margin:0 0 .3rem;color:var(--muted);font-size:.8rem}.stat-card h3{font-size:1.65rem;color:#154d79;letter-spacing:.01em}body[data-role=admin][data-device=desktop] .stats-grid{grid-template-columns:repeat(6,minmax(0,1fr));gap:var(--space-2)}body[data-role=admin][data-device=desktop] .stats-grid .stat-card{padding:var(--space-2);border-radius:14px}body[data-role=admin][data-device=desktop] .stats-grid .stat-card p{margin:0 0 .16rem;font-size:.7rem;line-height:1.25;overflow-wrap:anywhere}body[data-role=admin][data-device=desktop] .stats-grid .stat-card h3{margin:0;font-size:1.16rem;line-height:1.15}.card-head{display:flex;justify-content:space-between;align-items:center;gap:var(--space-3);flex-wrap:wrap;margin-bottom:var(--space-3);padding-bottom:var(--space-2);border-bottom:1px solid #deebf5}.card-head--compact{margin-bottom:var(--space-2)}.card-title{display:grid;grid-gap:.18rem;gap:.18rem;min-width:min(100%,260px)}.card-head h3{line-height:1.3;color:#17344f}.card-caption{margin:0;color:#4b667d;font-size:.79rem;font-weight:600;max-width:68ch}.action-row{display:flex;gap:var(--space-2);flex-wrap:wrap;align-items:center}.card-head .action-row{margin-left:auto}.mobile-sticky-actions{position:relative}.form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.form-grid,.subject-grid{display:grid;grid-gap:var(--space-3);gap:var(--space-3)}.subject-group{margin:0;padding:var(--space-3);border:1px solid var(--line);border-radius:12px;background:#f9fcff}.subject-group legend{padding:0 .35rem;color:#2c4d66;font-size:.78rem;font-weight:800}.subject-group-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-gap:var(--space-3);gap:var(--space-3)}.class-elective-details{margin:0 0 .4rem}.class-elective-summary{cursor:pointer;font-weight:700;padding:.2rem 0;color:#1f3953}.class-elective-caption{margin:.2rem 0 .55rem}.class-elective-grid{display:grid;grid-gap:.5rem;gap:.5rem}.class-elective-card{border:1px solid #d7e5f1;border-radius:10px;background:#ffffff;padding:.5rem .65rem}.class-elective-card>header{display:flex;justify-content:space-between;align-items:center;gap:.4rem;margin-bottom:.4rem}.class-elective-card>header h4{margin:0;color:#243d56;font-size:.95rem}.class-elective-card>header p{margin:0;color:#587186;font-size:.74rem;font-weight:700}.class-elective-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-gap:.15rem .8rem;gap:.15rem .8rem}.class-elective-option{display:flex;align-items:center;gap:.42rem;margin:0;padding:.16rem 0;min-height:0;color:#2b455e;font-size:.86rem;font-weight:600}.class-elective-option input[type=checkbox]{width:16px;height:16px;min-height:0;margin:0;padding:0;border-radius:4px;flex:0 0 auto;accent-color:#2f6ea8}.class-elective-option span{display:block;line-height:1.3}.span-2{grid-column:span 2}.search-box,.table-tools{margin:var(--space-3) 0 var(--space-2)}.table-tools{display:grid;grid-gap:var(--space-2);gap:var(--space-2);grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.table-tools .filter-box,.table-tools .search-box{margin:0}.filter-box{display:grid;grid-gap:.35rem;gap:.35rem;color:#38536a;font-size:.82rem;font-weight:700}.table-wrap{border:1px solid #d2e1ed;border-radius:12px;overflow:auto;background:linear-gradient(180deg,#ffffff,#fbfdff);box-shadow:inset 0 1px 0 rgba(255,255,255,.95)}.table-footer{margin-top:var(--space-2);display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);flex-wrap:wrap}.table-meta{margin:0;font-size:.78rem;color:#4d6880;font-weight:600}.table-pagination{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}.table-page-info{min-width:94px;text-align:center;font-size:.76rem;font-weight:700;color:#2d4f6b}.table-pagination .tiny{min-width:92px}.is-loading{position:relative;isolation:isolate;overflow:hidden}.is-loading:before{content:"";position:absolute;inset:0;z-index:8;background:rgba(245,250,255,.74)}.is-loading:after{content:"";position:absolute;top:0;left:-45%;width:45%;height:100%;z-index:9;background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.88) 50%,rgba(255,255,255,0));animation:skeletonSweep 1.1s linear infinite}@keyframes skeletonSweep{to{transform:translateX(330%)}}.table-wrap.is-loading{min-height:180px}#studentLetterContainer.is-loading,.letter-empty.is-loading{min-height:220px}table{width:100%;border-collapse:collapse}.table-wrap table{min-width:620px}thead th{background:#f1f7fc;color:#37546d;font-size:.78rem;text-align:left;padding:.6rem .62rem}tbody td{border-top:1px solid #e8eef4;padding:var(--space-2) var(--space-3);font-size:.82rem;vertical-align:top}tbody tr.selected{background:var(--primary-soft)}tbody tr:hover{background:#f7fbff}tbody tr.selected:hover{background:var(--primary-soft)}tbody tr:focus-within{outline:2px solid rgba(32,107,167,.32);outline-offset:-2px}.table-actions{display:flex;gap:var(--space-2);flex-wrap:wrap}.tiny{padding:.4rem .54rem;border-radius:9px;font-size:.74rem}.security-grid,.settings-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-gap:var(--space-3);gap:var(--space-3)}.security-note{margin:0;border:1px solid #d6e5f2;border-radius:12px;padding:var(--space-2) var(--space-3);background:#f5fbff;color:#3f607a;font-size:.78rem;line-height:1.45}.skl-pdf-import-panel{display:grid;grid-gap:var(--space-3);gap:var(--space-3)}.upload-card{border:1px solid var(--line);border-radius:var(--radius-md);padding:var(--space-3);display:grid;grid-gap:var(--space-2);gap:var(--space-2);background:linear-gradient(180deg,#ffffff,#f8fbff);box-shadow:inset 0 1px 0 rgba(255,255,255,.95)}.upload-card p{margin:0;font-size:.84rem;font-weight:700;color:#2d4e67}.asset-preview{width:100%;height:120px;object-fit:contain;border-radius:11px;border:1px solid #d7e5f1;background:#f7fbff}.asset-preview.large{height:220px;object-fit:cover}.student-skl-pdf-table td,.student-skl-pdf-table th{vertical-align:middle}.student-skl-pdf-table td:last-child,.student-skl-pdf-table th:last-child{width:94px;text-align:center}.workspace-student{display:grid;grid-gap:1rem;gap:1rem}.student-card{border-color:#d6ecd9;background:radial-gradient(circle at 80% 0,#eefaf2 0,transparent 42%),#ffffff}.identity-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-gap:.58rem .8rem;gap:.58rem .8rem}.identity-grid>.empty-state{grid-column:1/-1}.identity-item{border:1px solid #dce8f2;border-radius:11px;padding:.5rem .58rem;background:linear-gradient(180deg,#ffffff,#f8fbff);box-shadow:inset 0 1px 0 rgba(255,255,255,.95)}.identity-label{margin:0;font-size:.75rem;color:var(--muted)}.identity-value{margin:.18rem 0 0;font-weight:700;font-size:.9rem}.table-wrap--student-grades{padding:.4rem}.student-grades-image-panel{overflow:hidden;overflow-y:hidden;padding-bottom:0}.student-grades-image{display:block;width:100%;min-width:0;max-width:100%;height:auto;margin:0;border:1px solid #172638;border-radius:8px;background:#ffffff;box-shadow:0 8px 22px rgba(9,31,49,.14)}.student-grades-image-note{margin:.48rem 0 0;color:#476177;font-size:.74rem;font-weight:600;display:none}.student-grade-table--fallback,.table-wrap--student-grades.is-image-fallback .student-grades-image-panel{display:none}.table-wrap--student-grades.is-image-fallback .student-grade-table--fallback{display:table}.student-result-card{border:1px solid #d8e5f1;border-radius:14px;padding:.85rem .95rem;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.22rem;background:linear-gradient(180deg,#ffffff,#f8fbff);box-shadow:inset 0 1px 0 rgba(255,255,255,.95)}.student-result-label{margin:0;color:#4a647a;font-size:.78rem;font-weight:700;letter-spacing:.01em;line-height:1.25;white-space:nowrap;text-align:center}.student-result-value{margin:0;width:100%;text-align:center;font-size:clamp(2.1rem,1.35rem + 2vw,3.2rem);font-weight:900;letter-spacing:.08em;line-height:1}.student-result-note{margin:.06rem 0 0;color:#3d6077;font-size:.82rem;font-weight:600;text-align:center}.student-result-card.pass{border-color:#bde2c9;background:radial-gradient(circle at 50% -20%,#ecfff2 0,transparent 52%),#ffffff}.student-result-card.pass .student-result-value{color:#0d7b42;text-shadow:0 4px 16px rgba(13,123,66,.25)}.student-result-card.fail{border-color:#f0c9ce;background:radial-gradient(circle at 50% -20%,#fff1f3 0,transparent 52%),#ffffff}.student-result-card.fail .student-result-value{color:#b0293b;text-shadow:0 4px 14px rgba(176,41,59,.2)}.student-confetti-layer{position:fixed;inset:0;overflow:hidden;pointer-events:none;z-index:92}.student-confetti-piece{position:absolute;left:50%;bottom:-14px;width:var(--piece-width,6px);height:var(--piece-height,6px);opacity:0;transform:translate3d(var(--origin-offset,0),0,0) rotate(0deg);will-change:transform,opacity;animation-name:studentConfettiBurst;animation-timing-function:linear;animation-fill-mode:forwards}.student-confetti-piece.shape-square{border-radius:2px}.student-confetti-piece.shape-circle,.student-confetti-piece.shape-line{border-radius:999px}@keyframes studentConfettiBurst{0%{opacity:1;transform:translate3d(var(--origin-offset,0),0,0) rotate(0deg)}24%{opacity:1;transform:translate3d(calc(var(--origin-offset, 0px) + var(--drift-launch, 0px)),calc(-1 * var(--apex, 420px)),0) rotate(calc(var(--spin, 180deg) * .46))}38%{opacity:1;transform:translate3d(calc(var(--origin-offset, 0px) + var(--drift-apex, 0px)),calc(-1 * var(--apex-mid, 260px)),0) rotate(calc(var(--spin, 180deg) * .68))}56%{opacity:1;transform:translate3d(calc(var(--origin-offset, 0px) + var(--drift-fall, 0px)),calc(-1 * var(--float-height, 180px)),0) rotate(calc(var(--spin, 180deg) * .86))}84%{opacity:1;transform:translate3d(calc(var(--origin-offset, 0px) + var(--drift-settle, 0px)),calc(-1 * var(--settle-rise, 64px)),0) rotate(calc(var(--spin, 180deg) * 1.08))}96%{opacity:.88;transform:translate3d(calc(var(--origin-offset, 0px) + var(--drift-settle, 0px)),var(--settle-drop,10px),0) rotate(calc(var(--spin, 180deg) * 1.18))}to{opacity:0;transform:translate3d(calc(var(--origin-offset, 0px) + var(--drift-settle, 0px)),var(--settle-drop,10px),0) rotate(calc(var(--spin, 180deg) * 1.22))}}.average-text{margin:.7rem 0 0;font-weight:700;color:#1a557c}.empty-state{display:grid;grid-template-columns:34px 1fr;grid-gap:var(--space-2);gap:var(--space-2);align-items:center;border:1px solid #d5e4f1;border-radius:var(--radius-md);padding:var(--space-3);background:radial-gradient(circle at 14% 0,#edf6ff 0,transparent 60%),#ffffff}.empty-state--warning{border-color:#f3d6c4;background:radial-gradient(circle at 14% 0,#fff4eb 0,transparent 62%),#ffffff}.empty-state--error{border-color:#f1c1cc;background:radial-gradient(circle at 14% 0,#ffeef2 0,transparent 62%),#ffffff}.empty-state-badge{width:32px;height:32px;border-radius:50%;border:6px solid #dcecff;background:#3e8cc6;box-shadow:inset 0 0 0 2px #ffffff}.empty-state--warning .empty-state-badge{border-color:#fde3ce;background:#d98133}.empty-state--error .empty-state-badge{border-color:#f7d4dd;background:#c53b50}.empty-state-copy h4{margin:0 0 2px;font-size:.92rem;color:#204968}.empty-state-copy p{margin:0;font-size:.8rem;color:#506a80;line-height:1.45}.empty-state-inline{display:grid;grid-template-columns:12px 1fr;grid-gap:var(--space-2);gap:var(--space-2);align-items:start;border:1px solid #d6e5f1;border-radius:12px;padding:var(--space-2) var(--space-3);background:#f7fbff}.empty-state-dot{width:12px;height:12px;margin-top:.2rem;border-radius:50%;background:#2f7cb5;box-shadow:0 0 0 4px rgba(47,124,181,.18)}.empty-state-inline strong{display:block;font-size:.82rem;color:#245173;margin-bottom:2px}.empty-state-inline p{margin:0;font-size:.78rem;color:#547089}.letter-empty{min-height:180px;border:2px dashed #d4e5f2;border-radius:12px;display:grid;place-items:center;text-align:center;color:var(--muted);padding:1rem;background:#f7fbff}.letter-paper{width:min(100%,210mm);min-height:297mm;margin:0 auto;border:1px solid #d6dce4;border-radius:6px;background:#ffffff;box-shadow:0 12px 31px rgba(12,33,50,.1);padding:1.3cm 2.2cm .5cm;box-sizing:border-box;line-height:1.34}.letter-paper,.letter-paper *{font-family:Times New Roman,Times,serif;color:#000}.letter-kop{margin-bottom:.62rem}.letter-kop-head{display:flex;align-items:flex-start;justify-content:space-between;gap:.4rem}.letter-kop-logo-wrap{width:92px;flex:0 0 92px;height:98px;display:flex;justify-content:center;align-items:flex-start;padding-top:2px}.letter-kop-logo{height:98px;width:auto;max-width:100%;max-height:98px;object-fit:contain;display:block}.letter-kop-text{flex:1 1 auto;min-width:0;text-align:center}.letter-kop-line{margin:0;font-size:.85rem;line-height:1.2}.letter-kop-line--contact{font-size:.75rem;line-height:1.08;white-space:nowrap}.letter-kop h4{margin:.04rem 0;font-size:1.27rem;font-weight:800;text-transform:uppercase;letter-spacing:.01em;line-height:1.1}.letter-kop-divider{border-top:1px solid #000;border-bottom:1px solid #000;height:2px;margin-top:.34rem}.letter-title{text-align:center;margin:.05rem 0 0;font-size:14px;font-weight:800;text-transform:uppercase;line-height:1.2}.letter-title-text{display:inline-block;border-bottom:1px solid #000;padding-bottom:.1em;line-height:1.05;font-size:14px}.letter-number{margin:.08rem 0;text-align:center;font-size:.9rem;line-height:1.22}.letter-lead{margin:.48rem 0 .2rem;font-size:1rem}.letter-table{width:100%;border-collapse:collapse;margin:0 0 .35rem;border:none}.letter-table tbody td,.letter-table tr{border:none}.letter-table td{font-size:1rem;padding:.08rem 0;vertical-align:top;border:none}.letter-table td:first-child{width:37%;padding-right:.5rem}.grade-table{width:100%;border-collapse:collapse;margin-top:.18rem;table-layout:fixed}.grade-table td,.grade-table th{border:1px solid #000;padding:.23rem .3rem;font-size:.88rem;overflow-wrap:anywhere;word-break:break-word}.grade-table th{text-align:center;background:#fff}.grade-group-row td{font-weight:700;text-align:left}.grade-summary-row td{font-weight:700}.grade-table td:first-child,.grade-table th:first-child{width:11%;text-align:center}.grade-table td:nth-child(3),.grade-table th:nth-child(3){width:24%;text-align:center}.pass-text{text-align:center;margin:.28rem 0 .34rem;font-weight:700;letter-spacing:.35em;font-size:1.14rem}.letter-closing{margin:.5rem 0 0;font-size:1rem;text-align:justify}.letter-extra-note{margin:.35rem 0 0;font-size:.95rem;text-align:justify}.signature-block{width:45%;margin-left:auto;margin-top:.62rem;padding-left:10ch;box-sizing:border-box;font-size:.95rem;line-height:1.2}.signature-block p{margin:0}.letter-note{margin-top:.38rem;font-size:.72rem;display:flex;align-items:center;gap:.44rem;line-height:1.18}.letter-note p{margin:0;flex:1 1 auto}.letter-note-logo{width:40px;height:auto;flex:0 0 auto}.sign-space{height:74px;display:flex;align-items:center;justify-content:flex-start}.signature-qr{width:74px;height:74px;object-fit:contain;display:block}.footer-note{text-align:center;color:#d5e1f2;font-size:.82rem;margin-top:.78rem}body[data-role=admin]{background:#ffffff;height:100vh;overflow-y:hidden;overflow-x:hidden}body[data-role=admin] .app-container{height:calc(100vh - 2rem)}body[data-role=admin] #appScreen{display:flex;flex-direction:column;height:100%}body[data-role=admin] .admin-shell{flex:1 1;min-height:0}body[data-role=admin] .admin-content{min-height:0}body[data-role=admin] .admin-section{min-height:0;overflow:auto;padding-right:.25rem}body[data-role=admin] .footer-note{display:none}body[data-role=siswa]{background:#ffffff}body[data-role=admin][data-device=desktop] .app-container{width:min(1500px,96vw)}body[data-role=admin][data-device=desktop] .admin-shell{grid-template-columns:282px minmax(0,1fr);gap:var(--space-5)}body[data-role=admin][data-device=desktop] .admin-sidebar{top:1rem}body[data-role=admin][data-device=desktop] .admin-content .card-shell{padding:var(--space-5)}body[data-role=siswa][data-device=mobile] .app-container{width:min(780px,calc(100vw - .9rem))}body[data-role=siswa][data-device=mobile] .workspace-student{gap:.85rem}body[data-role=siswa][data-device=mobile] .student-card{padding:var(--space-3);border-radius:16px}body[data-role=siswa][data-device=mobile] .student-result-label{font-size:clamp(.55rem,2.55vw,.68rem);letter-spacing:0}body[data-role=siswa][data-device=mobile] #logoutButton{position:fixed;top:calc(.5rem + env(safe-area-inset-top));right:.55rem;z-index:64;min-height:30px;padding:.2rem .56rem;border-radius:999px;font-size:.7rem;font-weight:700;line-height:1.15;box-shadow:0 8px 16px rgba(8,27,46,.18)}body[data-role=siswa][data-device=mobile] .topbar-actions{width:auto;justify-content:flex-end}body[data-role=siswa][data-device=mobile] #connectionBadge,body[data-role=siswa][data-device=mobile] #roleSubtitle,body[data-role=siswa][data-device=mobile] #roleTitle,body[data-role=siswa][data-device=mobile] #sessionBadge{display:none}@media (max-width:1200px){body[data-role=admin]{height:auto;overflow-y:auto;overflow-x:hidden}body[data-role=admin] .app-container{height:auto}body[data-role=admin] #appScreen{display:block;height:auto}body[data-role=admin] .admin-section{overflow:visible;padding-right:0}body[data-role=admin] .footer-note{display:block}.admin-shell{grid-template-columns:1fr}.admin-sidebar{position:static;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));grid-gap:.5rem;gap:.5rem}.admin-sidebar h3{grid-column:1/-1}.sidebar-link{text-align:center}.stats-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:980px){.toast-stack{left:.6rem;right:.6rem;width:auto;top:auto;bottom:calc(.7rem + env(safe-area-inset-bottom))}body[data-role=admin] .toast-stack{bottom:calc(7.2rem + env(safe-area-inset-bottom))}body[data-role=siswa] .toast-stack{bottom:calc(4.8rem + env(safe-area-inset-bottom))}.topbar{flex-direction:column;align-items:stretch}.topbar-actions{width:100%;justify-content:flex-start}.admin-sidebar{position:fixed;left:.6rem;right:.6rem;bottom:calc(.6rem + env(safe-area-inset-bottom));z-index:48;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));grid-gap:.4rem;gap:.4rem;padding:.55rem;border-radius:18px;border-color:rgba(196,215,234,.95);background:rgba(255,255,255,.95);box-shadow:0 16px 32px rgba(9,32,56,.2);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.admin-sidebar h3{display:none}.sidebar-link{text-align:center;padding:.44rem .32rem;min-height:42px;border-radius:10px;font-size:.74rem;line-height:1.2;display:flex;align-items:center;justify-content:center}body[data-role=admin] .admin-content{padding-bottom:calc(6.2rem + env(safe-area-inset-bottom))}body[data-role=admin] .admin-section{padding-bottom:.35rem}body[data-role=admin] .footer-note{display:none}}@media (max-width:900px){.form-grid{grid-template-columns:1fr}.span-2{grid-column:auto}.class-elective-options,.identity-grid,.security-grid,.settings-grid,.subject-group-grid{grid-template-columns:1fr}.card-head{align-items:flex-start}.action-row{width:100%}.action-row button,.action-row select{flex:1 1 100%}.mobile-sticky-actions{position:-webkit-sticky;position:sticky;z-index:42;margin-top:var(--space-3);padding:var(--space-2);border:1px solid #ccdeef;border-radius:var(--radius-md);background:rgba(255,255,255,.95);box-shadow:0 10px 24px rgba(10,35,58,.16);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}body[data-role=admin] .mobile-sticky-actions{bottom:calc(6.85rem + env(safe-area-inset-bottom))}body[data-role=siswa] .mobile-sticky-actions{bottom:calc(.65rem + env(safe-area-inset-bottom))}.table-wrap{border:none;background:transparent;overflow:visible}.table-wrap--student-grades{border:1px solid #d2e1ed;background:linear-gradient(180deg,#ffffff,#fbfdff);overflow:hidden}.table-wrap--student-grades .student-grades-image-panel{overflow:hidden}.table-wrap--student-grades .student-grades-image{margin:0}.table-wrap--student-grades .student-grades-image-note{display:none}.table-wrap table{min-width:0;border-collapse:separate;border-spacing:0 .62rem}.table-wrap thead{display:none}.table-wrap tbody{display:grid;grid-gap:.62rem;gap:.62rem}.table-wrap tbody tr{display:block;background:#ffffff;border:1px solid #d7e4ef;border-radius:14px;padding:.45rem .62rem;box-shadow:0 8px 20px rgba(13,37,57,.08)}.table-wrap tbody tr.selected{background:var(--primary-soft);border-color:#bfd8ee}.table-wrap tbody td{display:flex;justify-content:space-between;align-items:flex-start;gap:.62rem;border-top:none;padding:.34rem 0;font-size:.8rem}.table-wrap tbody td:before{content:attr(data-label);color:var(--muted);font-weight:700;font-size:.76rem;line-height:1.35;flex:0 0 44%}.table-wrap tbody td[data-label=Aksi]{display:block;padding-top:.5rem}.table-wrap tbody td[data-label=Aksi]:before{display:block;margin-bottom:.4rem}.table-wrap tbody tr.group-row{background:#edf5fd;border-color:#cfe1f2}.table-wrap tbody td[colspan],.table-wrap tbody tr.empty-row td,.table-wrap tbody tr.group-row td{display:block}.table-wrap tbody td[colspan]:before,.table-wrap tbody tr.empty-row td:before,.table-wrap tbody tr.group-row td:before{content:none}.table-wrap .table-actions{justify-content:flex-start}.table-wrap .table-actions .tiny{flex:1 1 120px}.table-footer{margin-top:var(--space-3)}.table-meta{width:100%}.table-pagination{width:100%;justify-content:space-between}.table-pagination .tiny{flex:1 1 118px}.table-page-info{min-width:auto;flex:1 1 90px}.letter-paper{width:min(100%,210mm);max-width:210mm;min-height:297mm;padding:1.3cm 2.2cm .5cm;border-radius:10px}.letter-kop{margin-bottom:.8rem;padding-bottom:.56rem}.letter-kop h4{font-size:.96rem;letter-spacing:.02em}.letter-kop-logo-wrap{width:64px;flex-basis:64px;height:68px}.letter-kop-logo{height:68px;max-height:68px}.letter-kop-line,.letter-number,.letter-table td{font-size:.79rem}.letter-kop-line--contact{font-size:.65rem;line-height:1.05}.letter-table td:first-child{width:42%}.grade-table td,.grade-table th{padding:.24rem .2rem;font-size:.72rem}.pass-text{letter-spacing:.2em;font-size:.92rem}.signature-block{width:64%;padding-left:6ch}}@media (max-width:640px){.app-container{width:calc(100vw - 1rem);max-width:calc(100vw - 1rem)}.app-container-login{width:100vw;max-width:100vw;margin:0}.login-screen{min-height:100vh;border-radius:0}.login-content{width:min(520px,93vw);padding:1.1rem .95rem .95rem}.topbar-actions .connection-badge,.topbar-actions .session-badge{width:100%;text-align:center}.topbar-actions button{flex:1 1 150px}.card-caption{font-size:.77rem}.login-mode-hint{font-size:.76rem}}@media (max-width:480px){.card-shell{padding:var(--space-3)}.card-head{gap:var(--space-2)}.table-wrap tbody td:before{flex-basis:48%}.student-grades-image{min-width:0}.letter-paper{width:min(100%,210mm);max-width:210mm;min-height:297mm;padding:1.3cm 2.2cm .5cm}.grade-table td:first-child,.grade-table th:first-child{width:12%}.grade-table td:nth-child(3),.grade-table th:nth-child(3){width:32%}}@media (prefers-reduced-motion:reduce){*,:after,:before{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}@media print{@page{size:A4 portrait;margin:1.3cm 2.2cm .5cm 2.2cm}body{background:#ffffff!important}#downloadButton,#loginScreen,#printButton,#studentDownloadButton,#studentPrintButton,.admin-shell .admin-section:not(#adminSection-dashboard),.admin-sidebar,.card-head select,.footer-note,.stats-grid,.status,.toast-stack,.topbar{display:none!important}#appScreen,.admin-shell,.workspace-student{display:block!important}#adminSection-dashboard .card-shell,.workspace-student .card-shell:last-child{border:none!important;box-shadow:none!important;padding:0!important;background:#ffffff!important}.workspace-student .card-shell:not(:last-child){display:none!important}.letter-paper{width:auto;min-height:unset;margin:0;border:none;box-shadow:none;border-radius:0;padding:0}}