:root{--bg:#f5f4ef;--surface:#fff;--surface-soft:#eef0ea;--line:#e2ded2;--ink:#1f2723;--ink-soft:#5c655e;--ink-faint:#92998f;--primary:#2f4b3c;--primary-strong:#21362a;--primary-soft:#e4ebe4;--accent:#4a5fa5;--accent-soft:#e7eaf6;--success:#3c7a5c;--success-soft:#e4f0e9;--warning:#b5722a;--warning-soft:#f6ead9;--danger:#a83232;--danger-soft:#f6e3e1;--radius-sm:6px;--radius-md:10px;--radius-lg:16px;--shadow-sm:0 1px 2px #1f27230f, 0 1px 1px #1f27230a;--shadow-md:0 8px 24px #1f272314;--font-display:"Fraunces", Georgia, serif;--font-body:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif}*{box-sizing:border-box}html,body,#root{height:100%}body{background:var(--bg);color:var(--ink);font-family:var(--font-body);-webkit-font-smoothing:antialiased;margin:0;font-size:15px;line-height:1.5}h1,h2,h3,h4{font-family:var(--font-display);color:var(--primary-strong);letter-spacing:-.01em;margin:0 0 .4em;font-weight:600}h1{font-size:1.9rem}h2{font-size:1.4rem}h3{font-size:1.1rem}p{margin:0 0 .8em}a{color:var(--accent)}button,input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.app-shell{min-height:100vh;display:flex}.sidebar{background:var(--primary);color:#f4f6f3;flex-direction:column;flex-shrink:0;width:232px;padding:20px 14px;display:flex}.sidebar-brand{font-family:var(--font-display);color:#fff;padding:6px 10px 22px;font-size:1.25rem}.sidebar-brand small{font-family:var(--font-body);letter-spacing:.08em;text-transform:uppercase;color:#b9c8bd;margin-top:2px;font-size:.72rem;font-weight:500;display:block}.sidebar-search{color:#d9e3da;border-radius:var(--radius-sm);cursor:pointer;background:#ffffff14;border:1px solid #ffffff2e;justify-content:space-between;align-items:center;gap:10px;margin-bottom:12px;padding:8px 10px;font-family:inherit;font-size:.85rem;transition:background .15s;display:flex}.sidebar-search:hover{background:#ffffff24}.kbd-hint{opacity:.75;white-space:nowrap;border:1px solid #ffffff4d;border-radius:4px;padding:1px 5px;font-size:.68rem}.sidebar-user-info{color:#c3d0c5;border-top:1px solid #ffffff26;margin-top:10px;padding:12px 12px 4px;font-size:.76rem;line-height:1.4}.sidebar-user-info strong{color:#fff;word-break:break-all;font-size:.84rem;display:block}.sidebar nav{flex-direction:column;flex:1;gap:2px;display:flex}.sidebar a,.sidebar .nav-action{white-space:nowrap;text-align:left;cursor:pointer;color:#d9e3da;border-radius:var(--radius-sm);background:0 0;border:none;align-items:center;gap:9px;padding:10px 12px;font-family:inherit;font-size:.92rem;font-weight:500;text-decoration:none;transition:background .15s,color .15s;display:flex}.sidebar a:hover,.sidebar .nav-action:hover{color:#fff;background:#ffffff14}.sidebar a.active{color:var(--primary-strong);background:#fff}.sidebar-footer{color:#c3d0c5;border-top:1px solid #ffffff26;margin-top:12px;padding-top:12px;font-size:.82rem}.sidebar-footer button{color:#f4f6f3;border-radius:var(--radius-sm);cursor:pointer;background:0 0;border:1px solid #ffffff4d;width:100%;margin-top:8px;padding:6px 10px;font-size:.82rem}.sidebar-footer button:hover{background:#ffffff1a}.main{flex:1;min-width:0;max-width:1180px;padding:32px 40px 60px}.page-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:24px;display:flex}.page-header p{color:var(--ink-soft);margin:0}.page-header .actions{flex-wrap:wrap;gap:10px;display:flex}.btn{border-radius:var(--radius-sm);cursor:pointer;white-space:nowrap;border:1px solid #0000;align-items:center;gap:6px;padding:9px 16px;font-size:.88rem;font-weight:600;transition:filter .15s,background .15s;display:inline-flex}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover:not(:disabled){background:var(--primary-strong)}.btn-accent{background:var(--accent);color:#fff}.btn-accent:hover:not(:disabled){filter:brightness(.92)}.btn-ghost{border-color:var(--line);color:var(--ink);background:0 0}.btn-ghost:hover:not(:disabled){background:var(--surface-soft)}.btn-danger{border-color:var(--danger);color:var(--danger);background:0 0}.btn-danger:hover:not(:disabled){background:var(--danger-soft)}.btn-sm{padding:5px 10px;font-size:.8rem}.btn-icon{padding:7px;line-height:0}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);padding:22px}.card+.card{margin-top:18px}.card-title-row{justify-content:space-between;align-items:center;gap:10px;margin-bottom:14px;display:flex}.stat-grid{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:22px;display:grid}.dashboard-grid{grid-template-columns:1fr;align-items:flex-start;gap:14px;display:grid}.stat-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-md);padding:16px 18px}.stat-card .value{font-family:var(--font-display);color:var(--primary-strong);font-size:1.7rem}.stat-card .label{color:var(--ink-soft);text-transform:uppercase;letter-spacing:.05em;font-size:.78rem}.field{flex-direction:column;gap:5px;min-width:0;margin-bottom:14px;display:flex}.field label{color:var(--ink-soft);font-size:.8rem;font-weight:600}.field-row{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;display:grid}input,select,textarea{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;min-width:0;padding:9px 11px}input:focus,select:focus,textarea:focus{border-color:var(--accent)}textarea{resize:vertical;min-height:70px}.checkbox-row{align-items:center;gap:8px;display:flex}.checkbox-row input{width:auto}.hint{color:var(--ink-faint);font-size:.78rem}.form-actions{border-top:1px solid var(--line);justify-content:flex-end;gap:10px;margin-top:18px;padding-top:16px;display:flex}.search-input{max-width:320px}.table-wrap{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:.9rem}th{text-align:left;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-soft);border-bottom:1px solid var(--line);padding:8px 12px;font-size:.75rem}td{border-bottom:1px solid var(--line);vertical-align:middle;padding:11px 12px}tr:last-child td{border-bottom:none}.clickable{cursor:pointer}tr.clickable:hover{background:var(--surface-soft)}.table-actions{justify-content:flex-end;gap:6px;display:flex}.empty-state{text-align:center;color:var(--ink-soft);padding:48px 20px}.empty-state h3{color:var(--ink)}.badge{border-radius:999px;align-items:center;gap:4px;padding:3px 9px;font-size:.74rem;font-weight:600;display:inline-flex}.badge-success{background:var(--success-soft);color:var(--success)}.badge-warning{background:var(--warning-soft);color:var(--warning)}.badge-danger{background:var(--danger-soft);color:var(--danger)}.badge-neutral{background:var(--surface-soft);color:var(--ink-soft)}.badge-accent{background:var(--accent-soft);color:var(--accent)}.banner{border-radius:var(--radius-md);margin-bottom:16px;padding:12px 16px;font-size:.88rem}.banner-danger{background:var(--danger-soft);color:var(--danger)}.banner-success{background:var(--success-soft);color:var(--success)}.banner-info{background:var(--accent-soft);color:var(--accent)}.modal-overlay{z-index:50;background:#181e1a73;justify-content:center;align-items:flex-start;padding:40px 20px;display:flex;position:fixed;inset:0;overflow-y:auto}.modal{background:var(--surface);border-radius:var(--radius-lg);width:100%;max-width:560px;box-shadow:var(--shadow-md);padding:26px}.modal-wide{max-width:780px}.modal-header{justify-content:space-between;align-items:flex-start;margin-bottom:16px;display:flex}.modal-close{cursor:pointer;color:var(--ink-soft);background:0 0;border:none;font-size:1.1rem;line-height:1}.login-screen{background:linear-gradient(180deg, var(--primary) 0%, var(--primary-strong) 100%);justify-content:center;align-items:center;min-height:100vh;display:flex}.login-card{background:var(--surface);border-radius:var(--radius-lg);width:100%;max-width:380px;box-shadow:var(--shadow-md);padding:36px 34px}.login-card h1{margin-bottom:4px}.login-card .hint{margin-bottom:22px}.flex{display:flex}.flex-between{justify-content:space-between;align-items:center;display:flex}.gap-8{gap:8px}.gap-12{gap:12px}.muted{color:var(--ink-soft)}.text-right{text-align:right}.mt-0{margin-top:0}.section-title{text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft);margin:26px 0 10px;font-size:.78rem;font-weight:700}.section-title:first-child{margin-top:0}.tabs{border-bottom:1px solid var(--line);gap:4px;margin-bottom:18px;display:flex}.tabs button{color:var(--ink-soft);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-1px;padding:9px 14px;font-size:.86rem;font-weight:600}.tabs button.active{color:var(--primary-strong);border-bottom-color:var(--primary)}.spinner-line{text-align:center;color:var(--ink-soft);padding:30px}.date-field-row{flex-wrap:wrap;gap:14px;display:flex}.date-field-row .field{flex:none;margin-bottom:0}.date-field-fixed{width:170px}.datetime-field-fixed{width:210px}.guide-sections{flex-direction:column;gap:6px;display:flex}.guide-section{border:1px solid var(--line);border-radius:var(--radius-sm);border-left-width:4px;padding:10px 14px}.guide-section summary{cursor:pointer;color:var(--primary-strong);align-items:center;gap:10px;font-size:.92rem;font-weight:600;list-style:none;display:flex}.guide-icon{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:26px;height:26px;display:inline-flex}.guide-section summary::-webkit-details-marker{display:none}.guide-section summary:before{content:"▸";width:1.1em;color:var(--ink-faint);display:inline-block}.guide-section[open] summary:before{content:"▾"}.guide-section-body{color:var(--ink);padding:10px 4px 4px 1.1em;font-size:.9rem}.guide-section-body p:last-child{margin-bottom:0}.guide-section-body ul{margin:0 0 .8em;padding-left:20px}.guide-section-body li{margin-bottom:6px}.guide-section-body li:last-child{margin-bottom:0}.calendar-nav{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:14px;display:flex}.calendar-range{color:var(--primary-strong);margin-right:auto;font-weight:600}.calendar-grid{grid-template-columns:repeat(7,minmax(140px,1fr));gap:10px;padding-bottom:8px;display:grid;overflow-x:auto}.calendar-day{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-md);flex-direction:column;min-height:170px;display:flex}.calendar-day.is-today{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.calendar-day-header{border-bottom:1px solid var(--line);text-align:center;padding:10px 10px 6px}.calendar-day-name{text-transform:uppercase;letter-spacing:.04em;color:var(--ink-soft);font-size:.72rem;font-weight:700}.calendar-day-date{color:var(--ink);font-size:.82rem}.calendar-day-sessions{flex-direction:column;flex:1;gap:6px;padding:8px;display:flex}.calendar-session{background:var(--surface-soft);border-left:3px solid var(--accent);cursor:pointer;border-radius:4px;padding:6px 8px;transition:background .15s}.calendar-session:hover{background:var(--primary-soft)}.calendar-session-time{color:var(--primary-strong);font-size:.8rem;font-weight:700}.calendar-session-title{font-size:.82rem;font-weight:600}.calendar-session-teacher{color:var(--ink-soft);font-size:.76rem}.bar-chart{align-items:flex-end;gap:14px;height:170px;padding:10px 4px 0;display:flex}.bar-chart-col{flex-direction:column;flex:1;justify-content:flex-end;align-items:center;height:100%;display:flex}.bar-chart-bar{background:var(--accent);border-radius:4px 4px 0 0;width:100%;max-width:48px;min-height:2px;transition:height .2s}.bar-chart-value{color:var(--ink-soft);white-space:nowrap;margin-top:6px;font-size:.72rem}.bar-chart-label{color:var(--ink-faint);text-transform:capitalize;margin-top:2px;font-size:.72rem}@media (width<=900px){.app-shell{flex-direction:column}.sidebar{flex-direction:row;align-items:center;width:100%;padding:10px 14px;overflow-x:auto}.sidebar-brand{white-space:nowrap;padding:0 12px 0 0}.sidebar nav{flex-direction:row}.sidebar-search{background:0 0;border:none;margin-bottom:0}.sidebar-search,.sidebar a,.sidebar .nav-action{white-space:nowrap;justify-content:center;padding:10px}.nav-label,.kbd-hint,.sidebar-user-info{display:none}.main{padding:20px}}@media (prefers-reduced-motion:reduce){*{transition:none!important}}
