:root{--brand: #2a78d6;--brand-dark: #184f95;--brand-050: #eef5fe;--aqua: #1baf7a;--orange: #eb6834;--violet: #4a3aa7;--red: #e34948;--good: #0ca30c;--warn: #fab219;--crit: #d03b3b;--surface: #ffffff;--plane: #f4f6fa;--card: #ffffff;--ink: #0b0b0b;--ink2: #52514e;--muted: #898781;--grid: #e6e8ee;--border: rgba(11, 11, 11, .1);--radius: 14px;--shadow: 0 1px 2px rgba(16, 24, 40, .05), 0 4px 16px rgba(16, 24, 40, .06);--sans: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--sidebar-w: 250px;--topbar-h: 60px}body{margin:0;font-family:var(--sans);background:var(--plane);color:var(--ink);font-size:15px;line-height:1.5}button{font-family:inherit;cursor:pointer}*{box-sizing:border-box}.app-shell{min-height:100vh;display:grid;grid-template-columns:var(--sidebar-w) 1fr;grid-template-rows:var(--topbar-h) 1fr}.topbar{grid-column:1 / 3;display:flex;align-items:center;gap:12px;background:var(--surface);border-bottom:1px solid var(--border);padding:0 20px;height:var(--topbar-h);position:sticky;top:0;z-index:20}.brand-logo{display:inline-flex;align-items:center;gap:10px;font-weight:800;font-size:17px;letter-spacing:-.02em;color:var(--ink);text-decoration:none}.brand-logo .mark{width:30px;height:30px;border-radius:9px;background:linear-gradient(135deg,var(--brand),var(--aqua));display:grid;place-items:center;color:#fff;font-size:16px}.chip{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;font-weight:600;padding:6px 11px;border-radius:999px;border:1px solid var(--border)}.chip .dot{width:8px;height:8px;border-radius:50%}.chip.online{color:#0a7d55;background:#e8f8f1;border-color:#bfe9d7}.chip.online .dot{background:var(--aqua);box-shadow:0 0 0 3px #1baf7a2e}.chip.offline{color:#8a5a00;background:#fff6e6;border-color:#f4e0b0}.chip.offline .dot{background:var(--warn)}.spacer{flex:1}.langsel{display:flex;border:1px solid var(--grid);border-radius:9px;overflow:hidden}.langsel button{border:none;background:#fff;padding:6px 10px;font-size:12.5px;font-weight:600;color:var(--ink2)}.langsel button.on{background:var(--brand);color:#fff}.icon-btn{border:1px solid var(--grid);background:#fff;border-radius:9px;width:36px;height:36px;font-size:15px}.user-badge{display:flex;align-items:center;gap:9px}.avatar{width:34px;height:34px;border-radius:50%;background:var(--violet);color:#fff;display:grid;place-items:center;font-weight:700;font-size:14px}.user-badge .meta{line-height:1.2}.user-badge .meta b{font-size:13.5px}.user-badge .meta span{font-size:11.5px;color:var(--muted);display:block}.icon-hamburger{display:none}.sidebar{background:var(--surface);border-right:1px solid var(--border);padding:16px 12px;overflow:auto;display:flex;flex-direction:column}.nav-sec{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:14px 10px 6px}.nav-item{display:flex;align-items:center;gap:11px;width:100%;border:none;background:transparent;text-align:left;padding:10px 12px;border-radius:10px;font-size:14px;font-weight:500;color:var(--ink2);margin-bottom:2px}.nav-item .ic{font-size:17px;width:20px;text-align:center}.nav-item:hover:not(.locked){background:var(--plane);color:var(--ink)}.nav-item.on{background:var(--brand-050);color:var(--brand-dark);font-weight:700}.nav-item.locked{opacity:.45;cursor:not-allowed}.nav-item .soon-tag{margin-left:auto;font-size:10px;font-weight:700;text-transform:uppercase;color:var(--muted);border:1px dashed var(--grid);border-radius:999px;padding:2px 6px}.sidebar-footer{margin-top:auto;padding:10px 12px;font-size:12px;color:var(--muted);border-top:1px solid var(--grid)}.main{padding:26px 30px;overflow:auto}.main-inner{max-width:1120px;margin:0 auto}.page-head{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:22px;gap:16px;flex-wrap:wrap}.page-head h1{font-size:24px;margin:0;letter-spacing:-.02em}.page-head p{margin:4px 0 0;color:var(--ink2);font-size:14px}.grid{display:grid;gap:16px}.grid.kpis{grid-template-columns:repeat(4,1fr)}.grid.two-col{grid-template-columns:1.4fr 1fr}@media (max-width: 900px){.grid.kpis{grid-template-columns:repeat(2,1fr)}}@media (max-width: 960px){.grid.two-col{grid-template-columns:1fr}}.shell-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:18px;box-shadow:var(--shadow)}.shell-card h3{margin:0 0 4px;font-size:16px}.shell-card .csub{color:var(--muted);font-size:12.5px;margin:0 0 16px}.kpi .top{display:flex;align-items:center;justify-content:space-between}.kpi .ic{width:38px;height:38px;border-radius:10px;display:grid;place-items:center;font-size:19px}.kpi .val{font-size:30px;font-weight:800;margin:12px 0 2px;letter-spacing:-.02em}.kpi .lbl{color:var(--ink2);font-size:13px}.bars{display:flex;align-items:flex-end;gap:14px;height:190px;padding-top:10px}.bar-col{flex:1;display:flex;flex-direction:column;align-items:center;gap:8px;height:100%;justify-content:flex-end}.bar{width:70%;max-width:46px;border-radius:6px 6px 4px 4px;background:linear-gradient(180deg,var(--brand),var(--brand-dark));position:relative;transition:.4s;min-height:4px}.bar span{position:absolute;top:-20px;left:50%;transform:translate(-50%);font-size:12px;font-weight:700;color:var(--ink)}.bar-col small{font-size:11.5px;color:var(--ink2);text-align:center;font-weight:600}.placeholder-block{border:1px dashed var(--grid);border-radius:12px;padding:22px;color:var(--muted);font-size:13px;text-align:center}.quick-links{display:grid;gap:8px}.quick-links a{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:10px;border:1px solid var(--grid);color:var(--brand-dark);text-decoration:none;background:#fff;font-weight:600;font-size:14px}.quick-links a:hover{background:var(--brand-050);border-color:var(--brand)}.quick-links .ic{font-size:18px}.search-wrap{position:relative;flex:1 1 380px;max-width:460px;min-width:240px}.search-input,.filter-input{width:100%;border:1px solid var(--grid);border-radius:10px;padding:8px 12px 8px 34px;font-size:13.5px;font-family:inherit;background:#fff url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23184f95' stroke-width='2.2' viewBox='0 0 24 24'><circle cx='11' cy='11' r='7'/><path d='m20 20-3.5-3.5'/></svg>") no-repeat 10px 50% / 16px 16px}.search-input:focus,.filter-input:focus{outline:2px solid var(--brand-050);border-color:var(--brand)}.filter-bar{display:flex;align-items:center;gap:10px;margin:12px 0;flex-wrap:wrap}.filter-bar .filter-input{flex:0 1 340px}.filter-bar .count{font-size:12.5px;color:var(--muted)}.search-menu{position:absolute;top:calc(100% + 6px);left:0;right:0;background:#fff;border:1px solid var(--grid);border-radius:12px;box-shadow:var(--shadow);max-height:60vh;overflow:auto;z-index:30}.search-group-title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);padding:10px 12px 4px}.search-item{display:block;width:100%;border:none;background:transparent;text-align:left;padding:8px 12px;font-size:13.5px;color:var(--ink)}.search-item:hover{background:var(--brand-050)}.search-item small{color:var(--muted);margin-left:6px;font-size:12px}@media (max-width: 820px){.app-shell{grid-template-columns:1fr}.sidebar{position:fixed;top:var(--topbar-h);left:0;bottom:0;width:min(280px,82vw);z-index:25;transform:translate(-100%);transition:transform .18s ease-out;box-shadow:var(--shadow)}.sidebar.open{transform:translate(0)}.sidebar-overlay{position:fixed;inset:var(--topbar-h) 0 0 0;background:#0b0b0b59;z-index:24}.icon-hamburger{display:inline-flex}.main{padding:18px 14px}.user-badge .meta{display:none}.chip span:not(.dot){display:none}.chip{padding:6px}.search-wrap{flex:1 1 140px;min-width:120px}.brand-logo span:not(.mark){display:none}}@media print{.topbar,.sidebar,.sidebar-overlay{display:none!important}.app-shell{display:block!important}.main{padding:0!important;overflow:visible!important}.main-inner{max-width:none!important;margin:0!important}}.portal{display:grid;gap:14px}.portal-profile{display:flex;align-items:center;gap:14px;background:var(--card);border:1px solid var(--grid);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px}.portal-photo,.portal-photo-ph{width:62px;height:62px;flex:0 0 auto;border-radius:16px;object-fit:cover;background:var(--brand-050);border:1px solid var(--grid)}.portal-photo-ph{display:flex;align-items:center;justify-content:center;font-weight:800;font-size:20px;color:var(--brand-dark)}.portal-id{min-width:0}.portal-name{font-size:19px;font-weight:800;letter-spacing:-.02em;line-height:1.2}.portal-meta{display:flex;flex-wrap:wrap;gap:4px 10px;margin-top:4px;color:var(--ink2);font-size:13px}.portal-meta>span+span:before{content:"·";margin-right:10px;color:var(--muted)}.portal-badge{display:inline-block;font-size:11.5px;font-weight:700;padding:2px 9px;border-radius:999px;border:1px solid var(--grid);background:var(--plane);color:var(--ink2)}.portal-badge.ok{background:#e8f8f1;border-color:#bfe9d7;color:#0a7d55}.portal-badge.off{background:#fdeceb;border-color:#f6c9c6;color:#a4302e}.portal-kpis{display:grid;gap:10px;grid-template-columns:repeat(2,1fr)}.portal-kpi{background:var(--card);border:1px solid var(--grid);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px 14px}.portal-kpi .v{font-size:23px;font-weight:800;letter-spacing:-.02em;line-height:1.15}.portal-kpi .v small{font-size:13px;font-weight:600;color:var(--muted)}.portal-kpi .k{color:var(--ink2);font-size:12.5px;margin-top:2px}.portal-kpi.good .v{color:var(--good)}.portal-kpi.mid .v{color:#b07600}.portal-kpi.bad .v{color:var(--crit)}.portal-tabs{display:flex;gap:8px;overflow-x:auto;padding-bottom:2px;scrollbar-width:none}.portal-tabs::-webkit-scrollbar{display:none}.portal-tab{flex:0 0 auto;padding:9px 15px;border-radius:999px;border:1px solid var(--grid);background:var(--surface);color:var(--ink2);font-size:13.5px;font-weight:600;white-space:nowrap}.portal-tab.on{background:var(--brand-050);border-color:#c9d8ee;color:var(--brand-dark);font-weight:800}.portal-tab.locked{opacity:.5;cursor:not-allowed}.portal-tab .soon-tag{margin-left:6px;font-size:10px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.portal-panel{background:var(--card);border:1px solid var(--grid);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px}.portal-panel>h3{margin:0 0 12px;font-size:15.5px;color:var(--brand-dark)}.portal-toolbar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px;margin-bottom:14px}.portal-toolbar label{font-size:12px;color:var(--ink2)}.portal-toolbar select{display:block;margin-top:3px;padding:8px 10px;border:1px solid var(--grid);border-radius:10px;background:var(--surface);font:inherit;font-size:13.5px}.portal-toolbar .grow{flex:1 1 auto}.portal-switch{display:inline-flex;align-items:center;gap:7px;font-size:13px;color:var(--ink2);padding:9px 0}.portal-btn{padding:9px 15px;border-radius:10px;border:none;background:var(--brand);color:#fff;font-weight:700;font-size:13.5px}.portal-btn:disabled{opacity:.5}.portal-btn.ghost{background:var(--surface);border:1px solid var(--grid);color:var(--brand-dark)}.domain{border-top:1px solid var(--grid);padding-top:12px;margin-top:12px}.domain:first-of-type{border-top:none;padding-top:0;margin-top:0}.domain-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:8px}.domain-name{font-size:13px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--brand-dark)}.domain-avg{font-size:13px;color:var(--ink2);white-space:nowrap}.domain-avg b{font-size:15px;color:var(--ink)}.subject{display:flex;align-items:center;gap:10px;padding:9px 0;border-top:1px dashed var(--grid)}.domain .subject:first-of-type{border-top:none}.subject-main{flex:1 1 auto;min-width:0}.subject-name{font-weight:600;font-size:14px}.subject-sub{display:flex;flex-wrap:wrap;gap:3px 10px;color:var(--muted);font-size:12px;margin-top:2px}.subject-sub>span+span:before{content:"·";margin-right:10px}.subject-note{flex:0 0 auto;min-width:62px;text-align:right;font-size:17px;font-weight:800;letter-spacing:-.02em}.subject-note small{font-size:11.5px;font-weight:600;color:var(--muted)}.note-good{color:var(--good)}.note-mid{color:#b07600}.note-bad{color:var(--crit)}.note-none{color:var(--muted);font-weight:600;font-size:14px}.marks{display:flex;gap:6px;margin-top:5px;overflow-x:auto;scrollbar-width:none}.marks::-webkit-scrollbar{display:none}.mark{flex:0 0 auto;display:inline-flex;align-items:baseline;gap:5px;font-size:12.5px;font-weight:700;padding:2px 9px;border-radius:999px;background:var(--plane);border:1px solid var(--grid);white-space:nowrap}.mark em{font-style:normal;font-weight:500;color:var(--muted);font-size:11.5px}.appreciation{margin-top:4px;font-size:12.5px;color:var(--ink2);font-style:italic}.general{margin-top:16px;border-radius:12px;background:var(--brand-050);border:1px solid #dbe7f8;padding:14px;display:grid;gap:10px;grid-template-columns:repeat(3,1fr);text-align:center}.general .k{font-size:11.5px;color:var(--ink2)}.general .v{font-size:20px;font-weight:800;color:var(--brand-dark);letter-spacing:-.02em}.general .v small{font-size:12px;font-weight:600;color:var(--muted)}.progress{height:10px;border-radius:999px;background:var(--plane);border:1px solid var(--grid);overflow:hidden;margin:12px 0 6px}.progress>i{display:block;height:100%;background:var(--aqua)}.progress.part>i{background:var(--warn)}.progress.none>i{background:var(--red)}.progress-legend{display:flex;justify-content:space-between;font-size:12.5px;color:var(--ink2)}.plist{display:grid;gap:0}.pline{display:flex;align-items:baseline;gap:10px;padding:9px 0;border-top:1px dashed var(--grid);font-size:13.5px}.pline:first-child{border-top:none}.pline .d{flex:0 0 auto;color:var(--ink2);font-variant-numeric:tabular-nums}.pline .m{flex:1 1 auto;min-width:0;color:var(--muted);font-size:12.5px}.pline .a{flex:0 0 auto;font-weight:700}.kid-grid{display:grid;gap:12px;grid-template-columns:1fr}.kid-card{display:flex;align-items:center;gap:13px;width:100%;text-align:left;background:var(--card);border:1px solid var(--grid);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px;font:inherit;color:inherit}.kid-card:hover{border-color:var(--brand);background:var(--brand-050)}.kid-card .chevron{flex:0 0 auto;color:var(--muted);font-size:18px}.kid-pills{display:flex;flex-wrap:wrap;gap:6px;margin-top:7px}.kid-pill{font-size:11.5px;font-weight:700;padding:3px 9px;border-radius:999px;background:var(--plane);border:1px solid var(--grid);color:var(--ink2);white-space:nowrap}.kid-pill.good{background:#e8f8f1;border-color:#bfe9d7;color:#0a7d55}.kid-pill.mid{background:#fff6e6;border-color:#f4e0b0;color:#8a5a00}.kid-pill.bad{background:#fdeceb;border-color:#f6c9c6;color:#a4302e}.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}.disc-badge{display:inline-block;font-size:12px;font-weight:700;padding:2px 9px;border-radius:999px;background:#fdeceb;border:1px solid #f6c9c6;color:#a4302e;white-space:nowrap}.disc-badge.merit{background:#e8f8f1;border-color:#bfe9d7;color:#0a7d55}.portal-muted{color:var(--muted);font-size:13.5px}.portal-error{background:#fdeceb;border:1px solid #f6c9c6;color:#a4302e;padding:10px 12px;border-radius:12px;font-size:13.5px}.portal-warn{background:#fff6e6;border:1px solid #f4e0b0;color:#7a5b00;padding:10px 12px;border-radius:12px;font-size:13.5px;margin-bottom:12px}@media (min-width: 700px){.portal-kpis{grid-template-columns:repeat(4,1fr)}.kid-grid{grid-template-columns:repeat(2,1fr)}.portal-photo,.portal-photo-ph{width:74px;height:74px}.portal-name{font-size:22px}}.portal-print-only{display:none}@media print{.portal-print-only{display:block}}.bulletin{box-sizing:border-box;width:210mm;min-height:297mm;padding:15mm;margin:12px auto;background:#fff;color:#222;font-family:system-ui,Segoe UI,sans-serif;font-size:12pt;border:1px solid #e6ecf4;box-shadow:0 2px 10px #0000000f}.bulletin+.bulletin{margin-top:24px}.bulletin-head{display:flex;align-items:center;gap:14px;border-bottom:2px solid #184f95;padding-bottom:8px;margin-bottom:14px}.bulletin-logo{width:56px;height:56px;object-fit:contain}.bulletin-est{font-size:16pt;font-weight:700;color:#184f95}.bulletin-meta{font-size:10.5pt;color:#555}.bulletin-student{display:flex;align-items:center;gap:14px;padding:8px 0 14px}.bulletin-photo,.bulletin-photo-placeholder{width:72px;height:72px;border-radius:8px;border:1px solid #cfd8e3;object-fit:cover;background:#f8fbff}.bulletin-photo-placeholder{display:flex;align-items:center;justify-content:center;font-weight:700;color:#184f95;font-size:20pt}.bulletin-student-name{font-size:14pt;font-weight:700}.bulletin-grades{width:100%;border-collapse:collapse;margin:10px 0}.bulletin-grades th,.bulletin-grades td{border:1px solid #cfd8e3;padding:6px 8px;text-align:left;font-size:11pt;vertical-align:top}.bulletin-grades thead{background:#eef5ff;color:#184f95}.bulletin-grades .num{text-align:right;white-space:nowrap}.bulletin-grades .seq{width:1%;color:#555;padding-left:4px;padding-right:4px}.bulletin-grades thead .seq{color:#3a6ea8}.bulletin-grades.has-seq th,.bulletin-grades.has-seq td{font-size:9pt;padding:3px 4px}.bulletin-grades.has-seq .seq{font-size:8.5pt}.bulletin-grades.has-seq td{overflow-wrap:anywhere}.bulletin-grades tr.bulletin-domain th{background:#f4f7fc;color:#184f95;font-size:10.5pt;letter-spacing:.03em;text-transform:uppercase}.bulletin-summary{margin-top:14px}.bulletin-summary h3{margin:0 0 8px;color:#184f95;font-size:13pt}.bulletin-summary-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.bulletin-summary-grid .k{color:#555;font-size:10.5pt}.bulletin-summary-grid .v{font-weight:700}.bulletin-summary-grid .big{font-size:18pt;color:#184f95}.bulletin-summary-grid .muted{color:#888;font-size:12pt;font-weight:400}.bulletin-remarks{margin-top:14px}.bulletin-remarks .k{color:#555;font-size:10.5pt}.bulletin-remarks-box{min-height:22mm;border:1px solid #cfd8e3;border-radius:4px;margin-top:4px}.bulletin-signature{margin-top:24px;display:flex;justify-content:flex-end;align-items:flex-end;gap:10mm}.bulletin-signature-line{border-top:1px solid #444;padding-top:4px;min-width:60mm;text-align:center;color:#555;font-size:10.5pt}.bulletin-signature-block{display:flex;flex-direction:column;align-items:center}.bulletin-sign{max-height:18mm;max-width:60mm;object-fit:contain;margin-bottom:-6px;mix-blend-mode:multiply}.bulletin-stamp{max-height:26mm;max-width:34mm;object-fit:contain;opacity:.9;mix-blend-mode:multiply}.timetable-grid{width:100%;border-collapse:collapse;background:#fff}.timetable-grid th,.timetable-grid td{border:1px solid #cfd8e3;padding:6px 8px;vertical-align:top;font-size:13px;text-align:left}.timetable-grid thead th{background:#eef5ff;color:#184f95;text-align:center}.timetable-grid th.hour{background:#f8fbff;color:#555;font-weight:600;white-space:nowrap}.timetable-grid td.lesson{background:#f8fbff}.timetable-grid td.lesson .s{font-weight:700;color:#184f95}.timetable-grid td.lesson .m{font-size:12px;color:#555}.timetable-grid td.lesson .acts{margin-top:6px;display:flex;gap:6px}.timetable-grid td.lesson .acts button{font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid #c9d8ee;background:#fff;color:#184f95}.timetable-print-head{display:none}@media (max-width: 720px){.timetable-grid{min-width:640px}.timetable-grid th,.timetable-grid td{padding:4px 6px;font-size:12px}}@media print{@page{size:A4;margin:0}@page timetable{size:A4 landscape;margin:10mm}.timetable-print{page:timetable}.timetable-print-head{display:block;font-size:13pt;color:#184f95;border-bottom:2px solid #184f95;padding-bottom:6px;margin-bottom:10px}.timetable-grid{font-size:10pt}.timetable-grid td.lesson{background:#fff}.timetable-grid thead th{background:#eef5ff!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}.bulletin-grades tr.bulletin-domain th{background:#f4f7fc!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}.bulletin-grades tr.bulletin-domain{break-after:avoid-page;page-break-after:avoid}.bulletin-stamp,.bulletin-sign{-webkit-print-color-adjust:exact;print-color-adjust:exact}.bulletin-signature{break-inside:avoid;page-break-inside:avoid}html,body{background:#fff!important;margin:0;padding:0}.no-print{display:none!important}.bulletin{box-shadow:none!important;border:none!important;margin:0!important;page-break-after:always;break-after:page}.bulletin:last-of-type{page-break-after:auto;break-after:auto}}
