:root{font-family:Inter,system-ui,sans-serif;color:#172033;background:#f5f7fb}*{box-sizing:border-box}body{margin:0}.app{display:grid;grid-template-columns:220px 1fr;min-height:100vh}aside{background:#101a2f;color:#fff;padding:24px 16px}.brand{font-size:24px;font-weight:800;margin:0 12px 28px}nav{display:grid;gap:7px}nav a{color:#cdd5e5;text-decoration:none;padding:11px 12px;border-radius:9px}nav a.active,nav a:hover{background:#233454;color:#fff}main{padding:32px;max-width:1500px;width:100%}.pageHeader{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}.pageHeader h1{margin:0 0 6px;font-size:30px}.pageHeader p{margin:0;color:#667085}button{border:0;border-radius:9px;padding:10px 14px;background:#173e72;color:#fff;font-weight:700;cursor:pointer}.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:28px}.stats article,.attendanceStats article,.calendarCard,.table,.empty{background:#fff;border:1px solid #e5e9f2;border-radius:13px;padding:18px}.stats b,.attendanceStats b{font-size:28px;display:block}.stats span,.attendanceStats span{color:#667085}.attendanceStats{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:28px}.stack{display:grid;gap:10px}.session{display:grid;grid-template-columns:100px 1fr auto;align-items:center;background:#fff;border:1px solid #e5e9f2;border-radius:12px;padding:14px}.session h3{margin:0 0 5px}.session p{margin:0;color:#667085}.search{width:100%;max-width:420px;padding:12px;border:1px solid #d8deea;border-radius:9px;margin-bottom:16px}.table{padding:0;overflow:hidden}.tr{display:grid;grid-template-columns:2fr 1fr 1fr;padding:14px 18px;border-top:1px solid #edf0f5}a.tr{text-decoration:none;color:inherit;cursor:pointer}a.tr:hover{background:#f8fafc}.tr[role=button]{cursor:pointer}.tr[role=button]:hover{background:#f8fafc}.tr.head{border-top:0;background:#f8fafc;color:#667085;font-size:13px;font-weight:700}.empty{text-align:center;color:#667085;padding:60px}.fc .fc-button-primary{background:#173e72;border-color:#173e72}.classGrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px}.classCard{display:block;background:#fff;border:1px solid #e5e9f2;border-radius:13px;padding:18px;text-decoration:none;color:inherit;transition:box-shadow .15s ease}.classCard:hover{box-shadow:0 4px 16px #1720331a}.classCardHead{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;margin-bottom:12px}.classCardHead h3{margin:0;font-size:18px}.classCard dl{display:grid;gap:8px;margin:0}.classCard dl>div{display:flex;justify-content:space-between;gap:10px}.classCard dt{color:#667085}.classCard dd{margin:0;font-weight:600;text-align:right}.badge{display:inline-block;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:700;text-transform:capitalize;white-space:nowrap}.badge-active{background:#e6f4ea;color:#1e7d34}.badge-inactive{background:#fdecea;color:#b3261e}.badge-archived{background:#eceef1;color:#667085}.badge-expiring_soon{background:#fff6e0;color:#a06600}.badge-completed{background:#e8f0fe;color:#1a56db}.badge-paused{background:#eceef1;color:#667085}.badge-scheduled{background:#eef2f8;color:#173e72}.badge-cancelled{background:#fdecea;color:#b3261e}.badge-rescheduled{background:#fff6e0;color:#a06600}.badge-confirmed{background:#e6f4ea;color:#1e7d34}.badge-no_show,.badge-teacher_no_show{background:#fdecea;color:#b3261e}.badge-present{background:#e6f4ea;color:#1e7d34}.badge-late{background:#fff6e0;color:#a06600}.badge-absent{background:#fdecea;color:#b3261e}.badge-excused,.badge-pending{background:#eceef1;color:#667085}.badge-paid{background:#e6f4ea;color:#1e7d34}.badge-partially_paid{background:#fff6e0;color:#a06600}.badge-unpaid{background:#fdecea;color:#b3261e}.badge-waived{background:#eceef1;color:#667085}.badge-overdue{background:#b3261e;color:#fff}.overdueText{color:#b3261e}.tr.finance{grid-template-columns:1.3fr 1.3fr 1fr .8fr .8fr .8fr 1fr .9fr .9fr;align-items:center;gap:10px}.tr.enrol{grid-template-columns:1.6fr 1fr 1.4fr 1fr .7fr .9fr 1fr 1fr;align-items:center;gap:10px}.tr.attendanceRow{display:grid;grid-template-columns:1fr .8fr 1.8fr 1.3fr 1fr .7fr .7fr .6fr .7fr .7fr 1.1fr;align-items:center;gap:10px;font-size:13px}.tr.bookingRow{display:grid;grid-template-columns:.9fr .7fr .7fr 1.6fr 1.2fr 1.1fr 1.1fr .9fr 1.4fr .8fr;align-items:center;gap:10px;font-size:13px}.missingPackage{color:#b3261e;font-weight:700}.formHint{margin:0;color:#667085;font-weight:400;font-size:13px}.tr.session{grid-template-columns:.6fr 1.4fr 1.4fr 1.2fr 1fr 1fr;align-items:center;gap:10px;cursor:pointer}.tr.session:hover{background:#f8fafc}.backLink{display:inline-block;color:#173e72;text-decoration:none;font-weight:700;margin-bottom:10px}.backLink:hover{text-decoration:underline}.sessionLink{text-decoration:none;color:inherit}.attendanceList{display:grid;gap:10px}.attendanceRow{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:14px;background:#fff;border:1px solid #e5e9f2;border-radius:12px;padding:14px 16px}.statusButtons{display:flex;flex-wrap:wrap;gap:8px}.statusBtn{background:#fff;color:#172033;border:1px solid #d8deea;border-radius:9px;padding:8px 12px;font-size:13px;font-weight:700;cursor:pointer}.statusBtn.active-present{background:#e6f4ea;border-color:#1e7d34;color:#1e7d34}.statusBtn.active-late{background:#fff6e0;border-color:#a06600;color:#a06600}.statusBtn.active-absent{background:#fdecea;border-color:#b3261e;color:#b3261e}.statusBtn.active-excused{background:#eceef1;border-color:#667085;color:#667085}.headerActions{display:flex;align-items:center;gap:12px}.modalOverlay{position:fixed;inset:0;background:#101a2f8c;display:flex;align-items:center;justify-content:center;padding:20px;z-index:50}.modalCard{background:#fff;border-radius:16px;padding:24px;width:100%;max-width:480px;max-height:90vh;overflow-y:auto}.modalHeader{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px}.modalHeader h2{margin:0;font-size:20px}.modalClose{background:none;border:0;color:#667085;font-size:22px;line-height:1;padding:2px 6px;cursor:pointer}.formField{display:grid;gap:6px;margin-bottom:14px}.formField label{font-size:13px;font-weight:700;color:#344054}.formField p{margin:0;font-weight:600}.formField input,.formField select{padding:10px 12px;border:1px solid #d8deea;border-radius:9px;font-family:inherit;font-size:14px;width:100%}.formRow{display:grid;grid-template-columns:1fr 1fr;gap:14px}.formActions{display:flex;justify-content:flex-end;gap:10px;margin-top:18px}.formError{color:#b3261e;font-size:13px;font-weight:700;margin:0 0 14px}.btnSecondary{background:#fff;color:#173e72;border:1px solid #173e72}.btnDanger{background:#fff;color:#b3261e;border:1px solid #b3261e}.btnDanger:disabled{opacity:.6;cursor:not-allowed}.classCode{font-family:monospace;font-size:12px;color:#667085;background:#eef2f8;display:inline-block;padding:2px 8px;border-radius:6px;margin:6px 0 0}.studentPicker{max-height:180px;overflow-y:auto;border:1px solid #d8deea;border-radius:9px;padding:6px;display:grid;gap:2px;margin-top:8px}.studentPickerEmpty{margin:0;padding:8px;color:#667085;font-size:13px}.studentPickerRow{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;font-size:14px;font-weight:400;cursor:pointer}.studentPickerRow:hover{background:#f8fafc}.studentPicker input[type=checkbox]{width:auto}.chipList{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.chip{display:inline-flex;align-items:center;gap:6px;background:#eef2f8;border-radius:999px;padding:4px 6px 4px 12px;font-size:13px;font-weight:600}.chip button{background:none;border:0;padding:0 4px;color:#667085;cursor:pointer;font-size:15px;line-height:1}.rosterList{max-height:200px;overflow-y:auto;display:grid;gap:6px;margin-top:6px}.rosterRow{display:flex;justify-content:space-between;align-items:center;padding:6px 0;border-bottom:1px solid #edf0f5}.rosterRow:last-child{border-bottom:0}.scheduleBuilder{display:grid;gap:8px;margin-top:8px;margin-bottom:10px}.scheduleRow{display:grid;grid-template-columns:1.4fr 1fr .8fr auto auto;align-items:center;gap:8px}.scheduleRow select,.scheduleRow input{width:100%;padding:8px 10px;border:1px solid #d8deea;border-radius:9px;font-family:inherit;font-size:13px}.scheduleRowUnit{color:#667085;font-size:13px}.scheduleRowRemove{background:none;border:0;color:#b3261e;font-size:18px;line-height:1;cursor:pointer;padding:4px 8px}.scheduleConfirm{background:#fff6e0;border:1px solid #f0d98c;border-radius:12px;padding:14px 16px;margin-bottom:14px}.scheduleConfirm p{margin:0;color:#7a5200;font-size:13px;font-weight:600}.formField textarea{padding:10px 12px;border:1px solid #d8deea;border-radius:9px;font-family:inherit;font-size:14px;width:100%;min-height:100px;resize:vertical}.dateNav{display:flex;align-items:center;gap:10px;margin-bottom:20px;flex-wrap:wrap}.dateNav input[type=date]{padding:10px 12px;border:1px solid #d8deea;border-radius:9px;font-family:inherit;font-size:14px}.viewModeBar{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:14px}.viewModeTabs{display:flex;gap:4px;background:#eef2f8;border-radius:10px;padding:4px}.viewModeTab{background:none;border:0;padding:7px 14px;border-radius:7px;font-size:13px;font-weight:600;color:#667085;cursor:pointer}.viewModeTab.active{background:#fff;color:#173e72;box-shadow:0 1px 3px #17203326}.displayToggle{display:flex;gap:4px;background:#eef2f8;border-radius:10px;padding:4px}.displayToggle button{background:none;border:0;padding:7px 14px;border-radius:7px;font-size:13px;font-weight:600;color:#667085;cursor:pointer}.displayToggle button.active{background:#fff;color:#173e72;box-shadow:0 1px 3px #17203326}.customRangeFields{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.rangeError{color:#b3261e;font-size:13px;font-weight:700;margin:0 0 14px}.session p+p{margin-top:2px}.profileHeading,.photoPickerRow{display:flex;align-items:center;gap:14px}.photoPreview{width:64px;height:64px;border-radius:12px;object-fit:cover;border:1px solid #e5e9f2;flex-shrink:0}.contactFieldset{border:1px solid #e5e9f2;border-radius:12px;padding:12px 16px 2px;margin:0 0 16px}.contactFieldset legend{padding:0 6px;color:#344054;font-size:13px;font-weight:700}.checkboxGroup{display:flex;flex-wrap:wrap;gap:8px 16px}.checkboxOption{display:inline-flex;align-items:center;gap:6px;font-size:14px;font-weight:400}.checkboxOption input{width:auto}.checkboxRow{display:flex;align-items:center;gap:10px;min-height:44px;margin-bottom:12px;font-size:14px;font-weight:400;color:#344054;cursor:pointer}.checkboxRow input[type=checkbox]{width:18px;height:18px;flex-shrink:0;margin:0}.badge-valid{background:#e6f4ea;color:#1e7d34}.badge-expired{background:#fdecea;color:#b3261e}.badge-not_provided,.badge-not_required{background:#eceef1;color:#667085}.availabilityDay{border:1px solid #e5e9f2;border-radius:12px;padding:12px 16px;margin-bottom:10px}.availabilityDay h4{margin:0 0 8px}.availabilityRangeRow{display:grid;grid-template-columns:1fr 1fr auto 1.4fr auto;align-items:center;gap:8px;margin-bottom:8px}.availabilityRangeRow input,.availabilityRangeRow select{width:100%;padding:8px 10px;border:1px solid #d8deea;border-radius:9px;font-family:inherit;font-size:13px}.usageList{display:grid;gap:10px}.usageRow{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:14px;background:#fff;border:1px solid #e5e9f2;border-radius:12px;padding:14px 16px}.usageRow h3{margin:0 0 4px}.usageRow p{margin:0;color:#667085;font-size:13px}.usageNotes{font-style:italic}.usageStatus{display:flex;flex-direction:column;align-items:flex-end;gap:6px;text-align:right}.usageConsumed{font-size:12px;color:#667085;font-weight:600}.filterBar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:20px}.filterBar select,.filterBar input[type=text]{padding:10px 12px;border:1px solid #d8deea;border-radius:9px;font-family:inherit;font-size:14px}.filterBar input[type=text]{min-width:220px}.filterCount{font-size:13px;font-weight:700;color:#173e72;background:#eef2f8;padding:6px 12px;border-radius:999px;white-space:nowrap}.statTile{cursor:pointer;transition:box-shadow .15s ease}.statTile:hover,.statTile:focus-visible{box-shadow:0 4px 16px #1720331a}.statTile.active{background:#eef2f8;box-shadow:0 0 0 2px #173e72 inset}.complianceDetail{margin-top:10px;padding-top:10px;border-top:1px solid #edf0f5}.contactGrid{display:grid;grid-template-columns:1fr;gap:16px}.contactCard{background:#fff;border:1px solid #e5e9f2;border-radius:13px;padding:20px 22px;min-width:0}.contactCard dl{display:grid;gap:14px;margin:0}.contactCard dl>div{display:block;min-width:0}.contactCard dt{color:#667085;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.02em;margin-bottom:4px}.contactCard dd{margin:0;font-weight:600;text-align:left;overflow-wrap:anywhere;word-break:break-word}.profilePhotoButton{background:none;border:0;padding:0;cursor:pointer;flex-shrink:0;border-radius:14px}.profilePhoto{width:96px;height:96px;border-radius:14px;object-fit:cover;border:1px solid #e5e9f2;display:block;transition:opacity .15s ease}.profilePhotoButton:hover .profilePhoto,.profilePhotoButton:focus-visible .profilePhoto{opacity:.85}.photoLightboxCard{background:#fff;border-radius:16px;padding:16px;max-width:min(1040px,94vw);max-height:92vh;overflow:auto;position:relative}.photoLightboxCard img{display:block;width:100%;max-width:1000px;height:auto;border-radius:10px}.photoLightboxClose{position:absolute;top:10px;right:10px;background:#101a2f99;color:#fff;border:0;border-radius:999px;width:32px;height:32px;font-size:18px;line-height:1;cursor:pointer}@media(min-width:801px){.contactGrid{grid-template-columns:repeat(2,1fr)}}@media(max-width:800px){.app{grid-template-columns:1fr}aside{padding:14px}.brand{margin-bottom:12px}nav{display:flex;overflow:auto}main{padding:18px}.stats{grid-template-columns:1fr}.attendanceStats{grid-template-columns:repeat(2,1fr)}.session{grid-template-columns:80px 1fr}.session button{grid-column:1 / -1;justify-self:start}.attendanceRow{flex-direction:column;align-items:flex-start}.statusButtons{width:100%;justify-content:space-between}.formRow{grid-template-columns:1fr}.modalCard{padding:18px}.headerActions{flex-wrap:wrap}.tr.enrol,.tr.finance,.tr.session,.tr.attendanceRow,.tr.bookingRow{grid-template-columns:1fr;gap:4px}.scheduleRow{grid-template-columns:1fr 1fr}.dateNav,.viewModeBar{flex-direction:column;align-items:stretch}.usageRow{flex-direction:column;align-items:flex-start}.usageStatus{align-items:flex-start;text-align:left}.profileHeading{flex-wrap:wrap}.filterBar{flex-direction:column;align-items:stretch}.filterBar input[type=text]{min-width:0}.profilePhoto{width:72px;height:72px}}.timesheetPage{max-width:900px;margin:0 auto;padding:32px;background:#fff;color:#172033}.timesheetActions{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.timesheetPage h1{margin:0 0 4px;font-size:22px}.timesheetPage h2{margin:0 0 20px;font-size:16px;color:#667085;font-weight:700}.timesheetMeta{display:grid;grid-template-columns:1fr 1fr;gap:8px 24px;margin-bottom:24px;font-size:14px}.timesheetTable{width:100%;border-collapse:collapse;margin-bottom:20px}.timesheetTable th,.timesheetTable td{border:1px solid #d8deea;padding:8px 10px;text-align:left;font-size:13px}.timesheetTable th{background:#f8fafc}.excludedRow{color:#667085;font-style:italic}.timesheetFooter{display:flex;gap:32px;font-size:14px;font-weight:700;border-top:2px solid #172033;padding-top:12px}@media print{.no-print{display:none!important}body{background:#fff}.timesheetPage{padding:0;max-width:none}.timesheetTable th{background:#fff!important;-webkit-print-color-adjust:exact}}.loginPage{min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f5f7fb;padding:20px}.loginCard{background:#fff;border:1px solid #e5e9f2;border-radius:16px;padding:32px;width:100%;max-width:420px}.loginBrand{margin:0 0 4px}.loginCard h1{margin:0 0 8px;font-size:22px}.loginCard>p{margin:0 0 20px;color:#667085}.loginDevHint{margin-top:20px;padding-top:16px;border-top:1px solid #edf0f5;font-size:13px;color:#667085}.loginDevHint p{margin:0 0 6px}.loginDevHint ul{margin:0;padding-left:18px}.sidebarUser{margin-top:auto;padding-top:16px;border-top:1px solid #233454}.sidebarUserName{margin:0;font-weight:700;color:#fff}.sidebarUserGroup{margin:0 0 10px;color:#8b97ae;font-size:13px}.sidebarLogout{width:100%;background:transparent;color:#cdd5e5;border-color:#3a4d70}aside{display:flex;flex-direction:column}.tr.users{grid-template-columns:1.3fr 1.6fr 1fr .9fr .9fr 1.2fr;align-items:center;gap:10px}.badge-invited{background:#fff6e0;color:#a06600}.badge-deactivated{background:#fdecea;color:#b3261e}@media(max-width:800px){.tr.users{grid-template-columns:1fr;gap:4px}}.mobileHeader,.hamburgerBtn,.drawerOverlay,.drawerCloseBtn{display:none}@media(max-width:800px){.mobileHeader{display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:40;background:#101a2f;padding:10px 16px;min-height:52px}.mobileHeader .brand{margin:0;font-size:20px}.hamburgerBtn{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:4px;width:44px;height:44px;background:none;border:0;border-radius:8px;padding:8px;cursor:pointer}.hamburgerBtn:hover,.hamburgerBtn:focus-visible{background:#1a2740}.hamburgerBtn span{display:block;width:22px;height:2px;border-radius:2px;background:#fff}.drawerOverlay{display:block;position:fixed;inset:0;background:#101a2f80;z-index:45}aside{position:fixed;top:0;left:0;height:100vh;width:min(80vw,300px);z-index:50;transform:translate(-100%);transition:transform .25s ease;overflow-y:auto;padding:18px 16px}aside.drawerOpen{transform:translate(0)}.asideTop{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.asideTop .brand{margin:0}.drawerCloseBtn{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background:none;border:0;border-radius:8px;color:#fff;font-size:26px;line-height:1;cursor:pointer}.drawerCloseBtn:hover,.drawerCloseBtn:focus-visible{background:#233454}aside nav{display:grid;gap:7px;overflow:visible}aside nav a{padding:13px 12px;font-size:15px}.brand{margin-bottom:0}}@media(max-width:800px){.table{background:transparent;border:0;padding:0;display:grid;gap:10px;overflow:visible}.tr.head{display:none}.tr{grid-template-columns:1fr;gap:4px;background:#fff;border:1px solid #e5e9f2;border-radius:12px;padding:14px 16px;border-top:0}.tr[role=button],a.tr{-webkit-tap-highlight-color:transparent}.tr>span,.tr>strong{min-width:0;overflow-wrap:anywhere;justify-self:start}.tr>span[data-label]:before,.tr>strong[data-label]:before{content:attr(data-label);display:block;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:#667085;margin-bottom:2px}.tr>span[data-label] .badge{margin-top:2px}}@media(max-width:800px){button,.btnSecondary,.viewModeTab,.displayToggle button,.statusBtn{min-height:44px}.chip button,.modalClose,.hamburgerBtn,.drawerCloseBtn,.scheduleRowRemove,.profilePhotoButton,.photoLightboxClose{min-height:0}.formField input,.formField select,.formField textarea,.filterBar select,.filterBar input[type=text],.dateNav input[type=date],.search,.scheduleRow select,.scheduleRow input,.availabilityRangeRow select,.availabilityRangeRow input{max-width:100%;font-size:16px}.filterBar input[type=text]{min-width:0;width:100%}.formActions{flex-wrap:wrap}.formActions button{flex:1 1 auto}button{font-size:15px}}@media(max-width:800px){.modalOverlay{padding:12px;align-items:flex-end}.modalCard{max-width:100%;max-height:88vh;border-radius:16px 16px 0 0}}.session,.classCard,.contactCard,.usageRow,.attendanceRow,article.usageRow{box-shadow:0 1px 2px #1720330a}@media(max-width:800px){.calendarCard{padding:10px;overflow-x:auto}}img,svg{max-width:100%}@media(max-width:380px){main{padding:14px}.pageHeader{flex-direction:column;align-items:flex-start;gap:10px}.pageHeader h1{font-size:24px}.stats,.attendanceStats{grid-template-columns:1fr}.tr.finance,.tr.enrol,.tr.attendanceRow,.tr.bookingRow,.tr.users{font-size:13px}.viewModeTabs,.displayToggle{width:100%}.viewModeTab,.displayToggle button{flex:1}}.environmentBadge{position:fixed;top:0;left:50%;transform:translate(-50%);z-index:100;background:#a06600;color:#fff;font-weight:700;font-size:12px;letter-spacing:.05em;padding:5px 16px;border-radius:0 0 9px 9px;pointer-events:none;box-shadow:0 2px 8px #17203333}.envErrorScreen{min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f5f7fb;padding:20px}.envErrorCard{background:#fff;border:1px solid #e5e9f2;border-left:4px solid #b3261e;border-radius:16px;padding:32px;width:100%;max-width:560px}.envErrorCard h1{margin:0 0 12px;font-size:22px;color:#b3261e}.envErrorCard ul{margin:12px 0;padding-left:20px}.envErrorCard li{margin-bottom:6px}
