:root{--bg:#f2f4f8;--card:#fff;--border:#e1e5ec;--text:#14213d;--muted:#6b7280;--primary:#004ea2;--primary-dark:#003b7a;--primary-tint:#e8f0fa;--danger:#d6323c;--danger-tint:#fbe6e7;--success:#1a8a54;--success-tint:#e2f7ea;--radius:12px;--radius-sm:8px;--shadow-sm:0 1px 2px rgba(20,33,61,.05);--shadow-md:0 8px 24px rgba(20,33,61,.08);--font-mono:"SF Mono",ui-monospace,"Roboto Mono",monospace}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Apple SD Gothic Neo,Noto Sans KR,sans-serif;-webkit-font-smoothing:antialiased}:focus-visible{outline:2px solid var(--primary);outline-offset:2px}a{color:inherit}.page{max-width:1080px;margin:0 auto;padding:24px 20px 60px}.card{border:1px solid var(--border);border-radius:var(--radius);padding:20px;margin-bottom:20px;box-shadow:var(--shadow-sm)}.card,.topbar{background:var(--card)}.topbar{position:relative;display:flex;align-items:center;gap:14px;padding:12px 20px;border-bottom:1px solid var(--border);margin-bottom:24px}.topbar:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:var(--primary)}.topbar nav{gap:16px;margin-left:auto}.topbar nav,.topbar-logo{display:flex;align-items:center}.topbar-logo{transition:opacity .15s ease}.topbar-logo:hover{opacity:.8}.topbar-branch{font-size:12px;font-weight:700;letter-spacing:.02em;color:var(--primary-dark);background:var(--primary-tint);padding:3px 10px;border-radius:999px}.topbar a.navlink{padding:6px 10px;border-radius:var(--radius-sm);text-decoration:none;color:var(--muted);font-size:14px;transition:background .15s ease,color .15s ease}.topbar a.navlink:hover{background:var(--bg);color:var(--text)}.topbar a.navlink.active{background:var(--primary-tint);color:var(--primary-dark);font-weight:600}h1{font-size:22px;letter-spacing:-.01em;margin:0 0 4px}h1,h2{font-weight:700}h2{font-size:17px;margin:0 0 12px}.muted{color:var(--muted);font-size:13px}.title-lab-tag{font-size:50%;font-weight:700}.login-shell{min-height:100vh;display:flex;align-items:center;justify-content:center;background:var(--bg)}.login-box{width:100%;max-width:360px;background:var(--card);border:1px solid var(--border);border-top:3px solid var(--primary);border-radius:var(--radius);padding:32px;box-shadow:var(--shadow-md)}.login-logo{display:block;height:28px;width:auto;margin-bottom:18px}label{display:block;font-size:13px;color:var(--muted);margin:14px 0 6px}input[type=date],input[type=password],input[type=text],select,textarea{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:14px;background:#fff;color:var(--text);transition:border-color .15s ease,box-shadow .15s ease}input[type=date]:hover,input[type=password]:hover,input[type=text]:hover,select:hover,textarea:hover{border-color:#c7cedb}input[type=date]:focus,input[type=password]:focus,input[type=text]:focus,select:focus,textarea:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-tint)}input[type=date]{font-variant-numeric:tabular-nums;letter-spacing:.03em;font-weight:500;color:var(--text);accent-color:var(--primary);cursor:pointer}input[type=date]::-webkit-datetime-edit{padding:0 2px}input[type=date]::-webkit-calendar-picker-indicator{cursor:pointer;opacity:.6;border-radius:4px}input[type=date]::-webkit-calendar-picker-indicator:hover{opacity:1;background:#eef1f6}.class-record-layout{display:grid;grid-template-columns:1.1fr .9fr;gap:24px;align-items:start}.class-record-layout>:last-child{max-height:640px;overflow-y:auto;padding-left:4px}@media (max-width:860px){.class-record-layout{grid-template-columns:1fr}}.field-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}.field-row>div{min-width:0}.field-row label{margin-top:0}.class-checkbox-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(90px,1fr));gap:6px 12px;margin-top:4px;margin-bottom:12px}textarea{min-height:80px;resize:vertical;font-family:inherit}button{cursor:pointer;border:none;border-radius:var(--radius-sm);padding:10px 16px;font-size:14px;font-weight:600;background:var(--primary);color:#fff;transition:background .15s ease,transform .05s ease}button:hover{background:var(--primary-dark)}button:active{transform:scale(.98)}button:disabled{opacity:.6;cursor:not-allowed;transform:none}button.secondary{background:transparent;color:var(--muted);border:1px solid var(--border)}button.secondary:hover{background:var(--bg);color:var(--text)}.error-text{color:var(--danger);font-size:13px;margin-top:8px}.success-box{background:#eafaf0;border:1px solid #b7ebc8;color:#1a7f3c;padding:14px 16px;border-radius:8px;font-weight:600}table{width:100%;border-collapse:collapse;font-size:13px}td,th{text-align:left;padding:8px 10px;border-bottom:1px solid var(--border)}.search-input-wrap{position:relative}.search-input-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--muted);pointer-events:none}.search-input-wrap input{padding-left:34px}.student-row{display:flex;justify-content:space-between;align-items:center;padding:10px 0;border-bottom:1px solid var(--border);cursor:pointer}.student-row:hover{background:#fafbfc}.badge{display:inline-block;padding:2px 9px;border-radius:999px;font-size:12px;font-weight:600;background:#eef1f6;color:var(--muted)}.badge-urgent{background:var(--danger-tint);color:var(--danger);font-weight:700}.badge-success{background:var(--success-tint);color:var(--success);font-weight:700}.recent-list{display:flex;flex-direction:column;gap:2px}.autocomplete-list{position:absolute;z-index:20;top:100%;left:0;right:0;background:var(--card);border:1px solid var(--border);border-radius:8px;margin-top:4px;max-height:220px;overflow-y:auto;box-shadow:0 8px 24px rgba(15,18,25,.12)}.autocomplete-item{padding:8px 12px;font-size:13px;cursor:pointer}.autocomplete-item.active,.autocomplete-item:hover{background:#eaf0ff}.autocomplete-empty{padding:8px 12px;font-size:13px;color:var(--muted)}.modal-backdrop{position:fixed;inset:0;background:rgba(15,18,25,.5);display:flex;align-items:center;justify-content:center;padding:20px;z-index:1000}.modal-box{background:var(--card);border-radius:var(--radius);padding:24px;width:100%;max-width:640px;max-height:85vh;overflow-y:auto;box-shadow:var(--shadow-md);scrollbar-gutter:stable}.modal-header{display:flex;justify-content:space-between;align-items:center}.modal-controls{display:grid;grid-template-columns:auto 1fr auto 1fr;align-items:center;gap:8px;margin-top:14px}.modal-controls label{margin:0}.modal-list{margin-top:16px;display:flex;flex-direction:column;gap:12px}.modal-briefing-item{border:1px solid var(--border);border-radius:8px;padding:12px}.modal-briefing-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.modal-briefing-text{white-space:pre-wrap;font-family:inherit;font-size:13px;margin:0;color:var(--text)}.modal-briefing-textarea{width:100%;min-height:140px;font-family:inherit;font-size:13px;border:1px solid var(--border);border-radius:6px;padding:8px;resize:vertical}.roster-table-wrap{overflow-x:auto}.roster-table{width:100%;border-collapse:collapse;font-size:13px}.roster-table thead th{position:sticky;top:0;background:var(--card);border-bottom:2px solid var(--border);padding:6px 8px;text-align:left;font-size:11px;font-weight:600;color:var(--muted);white-space:nowrap;z-index:1}.roster-table td{padding:4px 8px;border-bottom:1px solid var(--border);vertical-align:middle;white-space:nowrap}.roster-table tbody tr:nth-child(2n){background:var(--bg)}.roster-chip{border:1px solid var(--border);border-radius:999px;padding:2px 8px;font-size:11px;background:transparent;cursor:pointer;color:var(--muted);line-height:1.6}.roster-chip.is-on{background:var(--danger-tint);border-color:var(--danger);color:var(--danger);font-weight:600}.roster-score-input{width:56px;padding:2px 5px;font-size:9.5px;text-align:center;color:var(--text);background:var(--card)}.roster-notice-btn,.roster-score-input{border:1px solid var(--border);border-radius:4px}.roster-notice-btn{background:transparent;padding:2px 6px;font-size:11px;cursor:pointer;color:var(--muted)}.roster-notice-btn.has-content{border-color:var(--primary);color:var(--primary-dark);background:var(--primary-tint)}.roster-notice-row td{white-space:normal;padding-top:0}.score-type-chip{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--primary);background:var(--primary-tint);color:var(--primary-dark);border-radius:999px;padding:2px 6px 2px 10px;font-size:12px}.score-type-chip button{border:0;background:transparent;color:var(--primary-dark);cursor:pointer;font-size:13px;line-height:1;padding:0 2px}.score-type-suggest{border:1px dashed var(--border);border-radius:999px;padding:2px 10px;font-size:12px;background:transparent;cursor:pointer;color:var(--muted)}.schedule-cards-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:20px}.schedule-cards-grid .card{margin-bottom:0;display:flex;flex-direction:column}.schedule-cards-grid .date-nav{gap:4px;flex-wrap:nowrap}.schedule-cards-grid .date-nav-today{font-size:.75em;padding:2px 4px}.schedule-more-btn{align-self:flex-start;margin-top:auto;font-size:12px}.date-nav-today,.schedule-more-btn{padding:3px 6px;line-height:1.2;border-radius:4px}.date-nav-today{font-size:.9em}.schedule-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:16px}@media (max-width:960px){.schedule-cards-grid,.schedule-grid{grid-template-columns:1fr 1fr}}@media (max-width:520px){.schedule-cards-grid{grid-template-columns:1fr}}.schedule-section-title{display:flex;justify-content:space-between;align-items:center;font-weight:700;font-size:13px;margin-bottom:6px}.schedule-quickadd-btn{padding:2px 6px;font-size:11px;line-height:1.2;border-radius:4px;flex-shrink:0}.schedule-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px;font-size:13px}.schedule-item-row{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:4px 6px}.schedule-item-row>label{flex:1 1 auto;min-width:0;flex-wrap:wrap;row-gap:2px}.schedule-item-memo{flex-basis:100%;white-space:normal;word-break:break-word}.schedule-item-clickable{cursor:pointer}.schedule-edit-btn{flex-shrink:0;padding:2px 6px;font-size:11px;border-radius:4px}.donut-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px}.donut-legend{display:flex;justify-content:center;flex-wrap:wrap;gap:8px 12px;margin-top:2px;font-size:11px;color:var(--muted)}.donut-legend-item{display:inline-flex;align-items:center;gap:4px}.donut-legend-dot{width:8px;height:8px;border-radius:50%;display:inline-block;flex-shrink:0}.date-nav{display:flex;align-items:center;gap:12px;margin-bottom:14px}.date-nav-arrow{flex-shrink:0;font-size:.8em;line-height:1;padding:4px 8px;min-width:0;min-height:0}.sortable-table{width:100%;border-collapse:collapse;font-size:13px}.sortable-table th{position:sticky;top:0;text-align:left;padding:9px 10px;border-bottom:2px solid var(--border);cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:var(--muted);white-space:nowrap;font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;background:var(--card)}.sortable-table th:hover{color:var(--text)}.sortable-table th.active{color:var(--primary-dark)}.sortable-table td{padding:9px 10px;border-bottom:1px solid var(--border);white-space:nowrap;font-variant-numeric:tabular-nums}.sortable-table tbody tr{cursor:pointer;transition:background .1s ease}.sortable-table tbody tr:nth-child(2n){background:#fbfbfd}.sortable-table tbody tr:hover{background:var(--primary-tint)}.new-badge{display:inline-block;margin-left:4px;padding:1px 7px;border:1px solid;border-radius:3px;font-size:10px;font-weight:700;letter-spacing:.03em;background:var(--danger-tint);color:var(--danger);transform:rotate(-4deg)}.table-scroll{overflow-x:auto;max-height:480px;overflow-y:auto}.pager{display:flex;align-items:center;justify-content:center;gap:12px;margin-top:12px}.recent-list-row{padding:10px 4px;border-bottom:1px solid var(--border);font-size:13px}.recent-list-row:last-child{border-bottom:none}.recent-list-top{display:flex;justify-content:space-between;gap:8px;margin-bottom:4px}.recent-list-meta{color:var(--muted);font-size:12px}.recent-list-row.clickable{cursor:pointer}.compact-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}.grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px}@media (max-width:960px){.grid-3{grid-template-columns:1fr}}.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media (max-width:720px){.grid-2{grid-template-columns:1fr}}.input-tabbar{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:20px;position:sticky;top:0;background:var(--bg);padding:4px 0 12px;z-index:10}.ticker-bar{overflow:hidden;white-space:nowrap;background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:10px 0;margin-bottom:20px}.ticker-track{display:inline-flex;animation:tickerScroll linear infinite;animation-duration:83.45s}.ticker-item{padding:0 32px;font-size:14px;font-weight:600;flex-shrink:0}.ticker-item-flag{color:#c92a2a}@keyframes tickerScroll{0%{transform:translateX(0)}to{transform:translateX(-50%)}}.datetime-header{text-align:center;font-size:20px;font-weight:700;font-variant-numeric:tabular-nums;padding:14px 0;margin-bottom:20px;background:var(--card);border:1px solid var(--border);border-radius:var(--radius);color:var(--primary-dark)}.datetime-header-row{display:flex;align-items:center;justify-content:center;gap:14px}.datetime-header-row .date-nav-arrow{font-size:.7em;padding:6px 10px}.datetime-header-sub{align-items:center;justify-content:center;margin-top:8px;font-weight:600;color:var(--muted)}.datetime-header-sub,.history-log{display:flex;gap:8px;font-size:13px}.history-log{list-style:none;margin:0;padding:0;flex-direction:column}.history-log li{border-bottom:1px solid var(--border);padding-bottom:8px}@page{size:A4 portrait;margin:12mm}@media print{body *{visibility:hidden}.print-area,.print-area *{visibility:visible}.print-area{position:absolute;left:0;top:0;width:100%}.no-print{display:none!important}.report-page{page-break-after:always}.report-page:last-child{page-break-after:auto}}.class-summary-card{display:flex;flex-direction:column}.class-summary-body{margin-top:12px}.class-summary-fade{animation:classSummaryFadeIn .5s ease}@keyframes classSummaryFadeIn{0%{opacity:0}to{opacity:1}}.class-chip-row{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto;padding-top:14px}.class-chip{padding:3px 8px;font-size:12px;line-height:1.2;border-radius:4px}.class-chip.active{background:var(--primary);color:#fff;border-color:var(--primary)}