:root{--sidebar:#07385f;--sidebar2:#062e4e;--primary:#1677e8;--bg:#f5f7fb;--text:#17243a;--muted:#728096;--border:#e5eaf2}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:Inter,system-ui,-apple-system,"Segoe UI",sans-serif;font-size:14px}.app-shell{min-height:100vh;display:flex}.sidebar{width:228px;background:linear-gradient(180deg,var(--sidebar),var(--sidebar2));color:#fff;position:fixed;left:0;top:0;bottom:0;z-index:1030;overflow-y:auto}.brand{height:60px;padding:10px 18px;display:flex;gap:12px;align-items:center;font-size:14px;border-bottom:1px solid rgba(255,255,255,.12)}.brand i{font-size:28px}.brand b{font-weight:700}.side-section{font-size:11px;letter-spacing:.6px;color:#91aec6;padding:18px 15px 7px}.side-link{display:flex;align-items:center;gap:12px;color:#f5f8fc;text-decoration:none;padding:9px 14px;margin:2px 9px;border-radius:6px}.side-link:hover,.side-link.active{background:#1879ea}.side-link i{font-size:17px;width:18px}.main{margin-left:228px;min-width:0;flex:1}.topbar{height:60px;background:#fff;border-bottom:1px solid var(--border);display:flex;align-items:center;padding:0 22px;position:sticky;top:0;z-index:1000}.sidebar-toggle{font-size:22px;color:#526173}.top-title{font-weight:600;font-size:16px;margin-left:18px}.top-actions{margin-left:auto;display:flex;align-items:center;gap:18px}.icon-btn{position:relative;color:#526173;font-size:21px}.badge-dot{position:absolute;top:-7px;right:-9px;background:#e33d3d;color:#fff;font-size:9px;min-width:16px;height:16px;border-radius:10px;text-align:center;line-height:16px}.profile{border:0;background:transparent;display:flex;align-items:center;gap:9px}.profile small{display:block;color:#7b8799;text-align:left}.avatar{width:34px;height:34px;background:#eef1f5;border-radius:50%;display:grid;place-items:center;color:#b4bdc9}.content{padding:24px 22px;max-width:1500px;margin:auto}.page-head{display:flex;align-items:center;justify-content:space-between;gap:15px;margin-bottom:20px}.page-head h1{font-size:24px;margin:0}.muted{color:var(--muted)}.date-chip{background:#fff;border:1px solid var(--border);padding:9px 13px;border-radius:7px}.stats-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;margin-bottom:20px}.stat-card{background:#fff;border:1px solid #e9edf3;border-radius:9px;padding:20px 16px;display:flex;align-items:center;gap:14px;box-shadow:0 3px 12px rgba(20,40,70,.05)}.stat-icon{width:54px;height:54px;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:25px}.stat-icon.blue{background:#247ce8}.stat-icon.green{background:#50c64b}.stat-icon.purple{background:#7545dd}.stat-icon.orange{background:#f6a22a}.stat-icon.red{background:#ee5155}.stat-label{font-size:14px}.stat-number{font-size:23px;font-weight:700;margin:3px 0}.stat-sub{color:#68778d;font-size:12px}.dashboard-grid{display:grid;grid-template-columns:1.1fr 1.2fr 1.15fr;gap:16px;margin-bottom:16px}.panel{background:#fff;border:1px solid #e7ebf2;border-radius:9px;padding:16px;box-shadow:0 3px 12px rgba(20,40,70,.035)}.panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.panel h3{font-size:16px;margin:0}.panel-head a{font-size:12px}.progress-row{margin:15px 0}.progress-row>div:first-child{display:flex;justify-content:space-between;margin-bottom:7px;color:#45556b}.progress{height:5px;background:#e8edf4;border-radius:5px}.progress-bar{background:#257be5;border-radius:5px}.list-item{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:12px 0;border-bottom:1px solid #edf0f5}.list-item:last-child{border-bottom:0}.list-item small{display:block;color:#6f7c8e;margin-top:3px}.bottom{grid-template-columns:1.1fr 1.2fr 1.15fr}.table{margin-bottom:0}.table> :not(caption)>*>*{padding:11px 7px;border-bottom-color:#edf0f4}.table a{text-decoration:none}.filter-bar{display:flex;gap:8px;margin-bottom:15px}.cards-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.mini-stats{display:flex;gap:25px;color:#69778a}.mini-stats b{color:var(--text)}.beds-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.bed-card{padding:13px;border:1px solid var(--border);border-radius:8px;text-align:center}.bed-card i{font-size:22px;display:block;margin-bottom:5px}.bed-card small{display:block;color:#6e7d90}.bed-card.free{background:#f1fbf3;border-color:#bde4c5}.bed-card.occupied{background:#fff4f4;border-color:#f0c3c3}.timeline-item{border-left:2px solid #2c7be5;padding:0 0 12px 12px;margin:0 0 10px}.timeline-item span{float:right;color:#8b97a6;font-size:11px}.timeline-item p{margin:5px 0 0;color:#657387}.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:8px}.calendar-day{background:#fff;border:1px solid var(--border);min-height:120px;border-radius:7px;padding:8px}.calendar-day>a{display:block;background:#eef5ff;border-radius:5px;padding:5px;margin-top:6px;text-decoration:none;font-size:12px}.notification{display:flex;align-items:center;gap:12px;padding:14px;border-bottom:1px solid var(--border)}.notification.unread{background:#f6faff}.notification-icon{width:38px;height:38px;border-radius:50%;background:#eaf3ff;color:#1976e8;display:grid;place-items:center}.notification p{margin:3px 0;color:#647387}.notification .btn{margin-left:auto}.empty-state{text-align:center;padding:100px 20px}.empty-code{font-size:80px;font-weight:800;color:#cfd8e5}.login-page{min-height:100vh;background:linear-gradient(135deg,#06375c,#0c7de7);display:grid;place-items:center;padding:20px}.login-card{width:min(420px,100%);background:#fff;border-radius:16px;padding:35px;box-shadow:0 20px 60px rgba(0,0,0,.18)}.login-logo{width:65px;height:65px;border-radius:18px;background:#eaf3ff;color:#1976e8;display:grid;place-items:center;font-size:32px;margin:0 auto 18px}.login-card h1{text-align:center;font-size:22px}.login-card p{text-align:center;color:#748196}.footer{padding:18px 22px;color:#78869a;border-top:1px solid var(--border);font-size:11px;display:flex;justify-content:space-between}.btn-primary{--bs-btn-bg:#1878e7;--bs-btn-border-color:#1878e7}.form-control,.form-select{border-color:#dbe1ea}.form-control:focus,.form-select:focus{box-shadow:0 0 0 .2rem rgba(24,120,231,.12);border-color:#7db5f4}@media(max-width:1100px){.stats-grid{grid-template-columns:repeat(3,1fr)}.dashboard-grid,.bottom{grid-template-columns:1fr}.cards-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:800px){.sidebar{transform:translateX(-100%);transition:.2s}.sidebar.open{transform:none}.main{margin-left:0}.stats-grid{grid-template-columns:repeat(2,1fr)}.cards-grid{grid-template-columns:1fr}.calendar-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:520px){.stats-grid{grid-template-columns:1fr}.content{padding:16px 12px}.topbar{padding:0 12px}.profile span:last-child{display:none}}

.sidebar-collapse{position:sticky;bottom:12px;margin:20px auto;left:0;right:0;display:block;width:34px;height:34px;border:0;border-radius:50%;background:rgba(255,255,255,.15);color:#fff}
.sidebar-collapse:hover{background:rgba(255,255,255,.25)}
.sidebar-collapsed .sidebar{width:72px}
.sidebar-collapsed .main{margin-left:72px}
.sidebar-collapsed .brand span,.sidebar-collapsed .side-section,.sidebar-collapsed .side-link span{display:none}
.sidebar-collapsed .brand{justify-content:center;padding:10px}
.sidebar-collapsed .side-link{justify-content:center;padding:11px 8px}
.sidebar-collapsed .sidebar-collapse i{transform:rotate(180deg)}
.chart-wrap{position:relative;height:240px}
@media(max-width:800px){.sidebar-collapsed .sidebar{width:228px}.sidebar-collapsed .main{margin-left:0}.sidebar-collapsed .brand span,.sidebar-collapsed .side-section,.sidebar-collapsed .side-link span{display:block}.sidebar-collapsed .brand{justify-content:flex-start}.sidebar-collapsed .side-link{justify-content:flex-start;padding:9px 14px}}

.auth-page{min-height:100vh;background:linear-gradient(135deg,#06375c,#0c7de7);display:grid;place-items:center;padding:28px 18px}.auth-card{width:min(700px,100%);background:#fff;border-radius:16px;padding:34px;box-shadow:0 20px 60px rgba(0,0,0,.18)}.auth-logo{width:65px;height:65px;border-radius:18px;background:#eaf3ff;color:#1976e8;display:grid;place-items:center;font-size:32px;margin:0 auto 18px}.auth-card h1{text-align:center;font-size:24px;margin-bottom:6px}.auth-card>p{text-align:center;color:#748196;margin-bottom:24px}.auth-card hr{border:0;border-top:1px solid #e7ebf2;margin:24px 0}.auth-card .form-label{font-weight:600;color:#33435a}.auth-card .btn{min-height:44px;font-weight:600}.auth-card a{text-decoration:none}@media(max-width:576px){.auth-page{padding:14px}.auth-card{padding:24px 18px;border-radius:12px}.auth-card h1{font-size:21px}}

.residence-card{display:flex;justify-content:space-between;align-items:center;padding:28px;border-radius:20px;background:linear-gradient(135deg,#0d6efd,#6f42c1);color:#fff;margin-bottom:20px;box-shadow:0 12px 35px rgba(0,0,0,.12)}.residence-card .muted{color:rgba(255,255,255,.75)}.residence-room{font-size:1.25rem;margin-top:6px}.residence-room strong{font-size:1.8rem}.residence-dorm{font-size:1.1rem;font-weight:700;margin-top:5px}.residence-card>i{font-size:3rem;opacity:.7}.room-card{height:100%;padding:20px;border:1px solid #e7eaf0;border-radius:18px;background:#fff}.room-rating{font-weight:700}.resident-row{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid #f0f1f3}.searchable-select{position:relative}.searchable-select select{margin-bottom:0}.calendar-event{display:flex;gap:10px;padding:9px 0;border-bottom:1px solid #eee}.calendar-event b{min-width:48px}.mini-calendar{max-height:320px;overflow:auto}.
html,body{max-width:100%;overflow-x:hidden}
.main{overflow-x:hidden}
.chart-wrap{position:relative;width:100%;height:240px;min-height:240px;overflow:hidden}
.chart-wrap canvas{display:block;width:100%!important;height:240px!important;max-height:240px}

/* Manager cabinet refinements */
.room-card{border:1px solid #cfd7e3;box-shadow:0 5px 18px rgba(20,40,70,.06);transition:border-color .15s ease,box-shadow .15s ease}
.room-card:hover{border-color:#9fb2c9;box-shadow:0 8px 24px rgba(20,40,70,.10)}
.room-card hr{border-color:#dfe5ed;opacity:1}
.resident-row{border-bottom:1px solid #e8edf3}
.resident-row a,.room-link{text-decoration:none;font-weight:500}
.pagination-wrap{display:flex;align-items:center;justify-content:space-between;gap:15px}
.pagination-info{color:var(--muted);font-size:13px}
.pagination{display:flex;gap:5px;flex-wrap:wrap}
.page-link{border:1px solid var(--border);border-radius:7px;padding:7px 10px;text-decoration:none;background:#fff;color:var(--text)}
.page-link.active,.page-link:hover{background:#1878e7;color:#fff;border-color:#1878e7}
@media(max-width:520px){.pagination-wrap{align-items:flex-start;flex-direction:column}.filter-bar{flex-wrap:wrap}.filter-bar .form-control{width:100%}}
.message-bubble{background:#f6f8fb;border:1px solid #e5eaf1;border-radius:10px;padding:12px 14px;line-height:1.5}.list-group-item{border-color:#e7ebf1}

/* Rooms: floor tabs */
.rooms-floor-panel{padding:18px;}
.rooms-floor-tabs{gap:8px;border-bottom:1px solid var(--border);padding-bottom:14px;}
.rooms-floor-tabs .nav-link{color:#526173;background:#f4f7fb;border:1px solid #dfe5ed;border-radius:10px;padding:9px 16px;font-weight:600;transition:.15s ease;}
.rooms-floor-tabs .nav-link:hover{background:#edf4fd;border-color:#bfd0e4;}
.rooms-floor-tabs .nav-link.active{background:#1878e7;border-color:#1878e7;color:#fff;box-shadow:0 4px 12px rgba(24,120,231,.18);}
.rooms-floor-count{display:inline-grid;place-items:center;min-width:22px;height:20px;padding:0 6px;margin-left:5px;border-radius:10px;background:#e3eaf3;color:#526173;font-size:11px;}
.rooms-floor-tabs .nav-link.active .rooms-floor-count{background:rgba(255,255,255,.2);color:#fff;}
.rooms-floor-content{padding-top:18px;}
.rooms-floor-empty{text-align:center;padding:65px 20px;color:#68778d;}
.rooms-floor-empty i{display:block;font-size:42px;color:#b8c3d0;margin-bottom:10px;}
@media(max-width:520px){.rooms-floor-tabs{overflow-x:auto;flex-wrap:nowrap;padding-bottom:10px;} .rooms-floor-tabs .nav-item{flex:0 0 auto;} .rooms-floor-tabs .nav-link{white-space:nowrap;padding:8px 13px;} .rooms-floor-panel{padding:12px;}}


/* Student cabinet / mobile duty cards */
.duty-mobile-list{display:flex;flex-direction:column;gap:22px}
.duty-day{min-width:0}
.duty-day-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}
.duty-day-head>div{display:flex;align-items:baseline;gap:10px}
.duty-day-label{font-size:18px;font-weight:800;color:var(--text)}
.duty-day-label.today{color:#1878e7}
.duty-day-date{font-size:13px;color:#7a8798}
.duty-room-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.duty-room-card{background:#fff;border:1px solid #dfe5ed;border-radius:16px;padding:17px;box-shadow:0 5px 18px rgba(20,40,70,.045);min-width:0}
.duty-room-card.duty-today{border-color:#a9c9ee;box-shadow:0 7px 22px rgba(24,120,231,.09)}
.duty-room-top{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}
.duty-room-caption{font-size:12px;color:#77869a;display:block}
.duty-room-number{font-size:32px;font-weight:800;line-height:1.05;margin-top:2px}
.duty-status{font-size:11px;font-weight:700;padding:5px 8px;border-radius:999px;background:#eef3f8;color:#68778d;white-space:nowrap}
.duty-status.active{background:#eaf3ff;color:#1878e7}.duty-status.rated{background:#eaf8ee;color:#25833d}.duty-status.missed{background:#fff0f0;color:#c83d3d}
.duty-room-meta{display:flex;flex-direction:column;gap:6px;margin:14px 0;color:#627186;font-size:13px}.duty-room-meta span{display:flex;align-items:center;gap:7px}.duty-room-meta i{width:16px;text-align:center;color:#8a98a9}
.duty-rate-form{border-top:1px solid #edf0f4;padding-top:13px}.duty-rate-title{font-size:13px;font-weight:700;margin-bottom:8px}
.quick-rating{display:flex;gap:4px;margin-bottom:10px}.quick-star{border:0;background:transparent;padding:3px;color:#c7d0dc;font-size:25px;line-height:1;cursor:pointer;transition:transform .12s,color .12s}.quick-star:hover,.quick-star.selected{color:#f4ad28;transform:scale(1.08)}
.duty-comment-input{font-size:13px;resize:vertical;min-height:58px}.duty-save-btn{width:100%;margin-top:9px;min-height:43px}
.duty-rated-box{border-top:1px solid #edf0f4;padding-top:12px}.duty-stars{display:flex;gap:3px;color:#f4ad28;font-size:17px}.duty-comment{font-size:13px;color:#5e6c7e;margin-top:7px;line-height:1.45;overflow-wrap:anywhere}
.duty-locked{border-top:1px solid #edf0f4;padding-top:12px;color:#8a96a6;font-size:12px;display:flex;gap:7px;align-items:center}.duty-locked i{font-size:14px}
.student-empty-duty{text-align:center;padding:70px 20px}.student-empty-duty>i{font-size:46px;color:#b8c4d2;display:block;margin-bottom:12px}
@media(max-width:1100px){.duty-room-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:700px){
 .student-content{padding-bottom:28px}.student-page-head{align-items:flex-start}.student-page-head .btn{font-size:12px;padding:7px 10px}
 .duty-mobile-list{gap:18px}.duty-day-head{margin-bottom:8px}.duty-day-label{font-size:17px}.duty-room-grid{grid-template-columns:1fr;gap:10px}
 .duty-room-card{padding:15px;border-radius:15px}.duty-room-number{font-size:30px}.duty-room-meta{margin:12px 0;font-size:12px}.quick-star{font-size:29px;padding:5px 4px}.duty-save-btn{min-height:46px}
}
@media(max-width:520px){
 .student-content .alert{border-radius:12px;font-size:13px}.residence-card{padding:20px;border-radius:16px}.residence-card>i{font-size:2.2rem}.residence-room{font-size:1.05rem}.residence-room strong{font-size:1.55rem}
 .panel{border-radius:14px;padding:14px}.student-page-head{margin-bottom:14px}.student-page-head h1{font-size:23px}.student-page-head p{font-size:12px;margin-bottom:0}.duty-day-date{font-size:12px}.duty-day-head>.muted{font-size:11px}
}

/* Beta: mobile student duties and compact calendar */
.duty-mobile-list{gap:24px}
.duty-day{background:#eef3f8;border:1px solid #d9e1ea;border-radius:18px;padding:12px}
.duty-day-head{background:#fff;border:1px solid #e1e7ef;border-radius:13px;padding:12px 14px;margin-bottom:12px;box-shadow:0 2px 8px rgba(20,40,70,.04)}
.duty-day-label{font-size:16px}.duty-day-label.today{font-weight:900}.duty-day-date{font-weight:600}
.duty-room-grid{gap:12px}
.duty-room-card{border:1px solid #d6dee8;border-radius:15px;box-shadow:0 3px 12px rgba(20,40,70,.06);padding:16px;background:#fff}
.duty-room-card.duty-today{border:2px solid #7db5f4;box-shadow:0 5px 16px rgba(24,120,231,.12)}
.duty-room-top{padding-bottom:11px;border-bottom:1px solid #edf1f5}
.duty-room-number{font-size:34px;letter-spacing:-.5px}
.duty-room-meta{margin:12px 0 13px}
.quick-rating{display:flex;justify-content:space-between;gap:4px;margin:5px -3px 8px}
.quick-star{flex:1;border:0;background:transparent;color:#b9c4d0;line-height:1;border-radius:10px;min-height:48px;cursor:pointer;transition:.15s}
.quick-star i{font-size:30px}.quick-star.selected{color:#f4ad28;background:#fff8e8}.quick-star:active{transform:scale(.94)}
@media(max-width:520px){
 .duty-mobile-list{gap:16px}.duty-day{padding:8px;border-radius:15px}.duty-day-head{padding:11px 12px;margin-bottom:9px}.duty-room-grid{gap:9px}.duty-room-card{padding:14px;border-radius:13px}.duty-room-number{font-size:32px}.duty-status{font-size:10px}.duty-rate-form{padding-top:12px}.quick-star{min-height:50px}.quick-star i{font-size:29px}
}

/* Compact monthly calendar: one day never grows with the number of events */
.compact-calendar{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px}
.compact-calendar-head{font-size:11px;font-weight:800;text-transform:uppercase;color:#7b8798;text-align:center;padding:4px}
.compact-calendar-day{min-height:112px;background:#fff;border:1px solid #dfe5ed;border-radius:12px;padding:8px;min-width:0;overflow:hidden}
.compact-calendar-day.today{border:2px solid #7db5f4;background:#f8fbff}
.compact-calendar-date{font-weight:800;font-size:13px;display:flex;justify-content:space-between;align-items:center}
.compact-calendar-count{font-size:10px;color:#1878e7;background:#eaf3ff;border-radius:999px;padding:3px 6px}
.compact-calendar-events{margin-top:7px;display:flex;flex-direction:column;gap:4px;overflow:hidden}
.compact-calendar-event{font-size:11px;line-height:1.2;background:#eef5ff;border-radius:6px;padding:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.compact-calendar-more{font-size:10px;color:#68778d;padding:2px 3px}
.calendar-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:14px}
@media(max-width:800px){.compact-calendar{grid-template-columns:repeat(2,minmax(0,1fr))}.compact-calendar-head{display:none}.compact-calendar-day{min-height:92px}.compact-calendar-day.empty{display:none}}
@media(max-width:520px){.compact-calendar{grid-template-columns:1fr}.compact-calendar-day{min-height:0}.compact-calendar-day.empty{display:none}.compact-calendar-events{max-height:none}.compact-calendar-event{font-size:12px}}
.password-section{margin-top:22px;padding-top:20px;border-top:1px solid var(--border)}

/* Student mobile duties/calendar refinement */
.quick-rating{align-items:center;justify-content:flex-start;gap:6px}
.quick-star{width:52px;height:52px;min-height:52px;flex:0 0 52px;display:grid;place-items:center;border:1px solid #d9e1ea;background:#f8fafc;color:#aab6c4;border-radius:12px;padding:0}
.quick-star i{font-size:28px;line-height:1}
.quick-star.selected{color:#f4ad28;background:#fff8e8;border-color:#f1d48e}
.quick-star:hover{color:#f4ad28;background:#fff8e8}
.student-calendar-panel{padding:20px}
.calendar-month-title{font-size:18px;font-weight:800;text-align:center;min-width:170px}
.calendar-nav{width:42px;height:42px;display:grid;place-items:center;padding:0}
.student-calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:7px}
.student-calendar-weekday{text-align:center;color:#7b8798;font-size:11px;font-weight:800;text-transform:uppercase;padding:5px 0}
.student-calendar-day{position:relative;min-width:0;height:92px;background:#fff;border:1px solid #dce3eb;border-radius:12px;padding:9px;text-align:left;cursor:pointer;transition:.15s;overflow:hidden}
.student-calendar-day:hover{border-color:#9bbce0;transform:translateY(-1px)}
.student-calendar-day.today{border:2px solid #5f9ee7;background:#f7fbff}
.student-calendar-day.selected{box-shadow:0 0 0 2px rgba(22,119,232,.12);border-color:#1677e8}
.student-calendar-day.empty{background:transparent;border-color:transparent;cursor:default}
.student-calendar-date{font-size:14px;font-weight:800}
.student-calendar-count{position:absolute;right:8px;top:7px;min-width:21px;height:21px;padding:0 5px;border-radius:999px;background:#eaf3ff;color:#1677e8;font-size:10px;font-weight:800;display:grid;place-items:center}
.student-calendar-dots{position:absolute;left:9px;bottom:10px;display:flex;gap:4px}
.student-calendar-dots i{width:6px;height:6px;border-radius:50%;background:#5f9ee7;display:block}
.calendar-selected{margin-top:18px;border-top:1px solid #e8edf3;padding-top:17px}
.calendar-selected-head{display:flex;justify-content:space-between;align-items:flex-end;gap:12px;margin-bottom:10px}
.calendar-selected-head h3{font-size:17px;margin:2px 0 0}
.calendar-selected-count{font-size:11px;color:#1677e8;background:#eaf3ff;padding:5px 9px;border-radius:999px;font-weight:700}
.calendar-selected-events{display:flex;flex-direction:column;gap:8px}
.calendar-selected-event{display:flex;align-items:center;gap:11px;padding:11px 12px;border:1px solid #e1e7ef;border-radius:11px;background:#fafbfd}
.calendar-event-icon{width:34px;height:34px;border-radius:9px;background:#eaf3ff;color:#1677e8;display:grid;place-items:center;flex:0 0 34px}
.calendar-selected-event b{display:block;font-size:13px}.calendar-selected-event span{display:block;color:#748196;font-size:11px;margin-top:3px}
.calendar-no-events{color:#8a96a6;font-size:13px;padding:12px 0}
@media(max-width:700px){
 .quick-rating{justify-content:space-between;gap:5px}
 .quick-star{width:calc((100vw - 74px)/5);max-width:58px;flex-basis:calc((100vw - 74px)/5);height:50px;min-height:50px}
 .student-calendar-panel{padding:12px}
 .student-calendar-grid{gap:3px}
 .student-calendar-weekday{font-size:9px;padding:3px 0}
 .student-calendar-day{height:62px;border-radius:9px;padding:7px}
 .student-calendar-date{font-size:13px}
 .student-calendar-count{right:5px;top:5px;min-width:18px;height:18px;font-size:9px;padding:0 4px}
 .student-calendar-dots{left:7px;bottom:7px;gap:3px}
 .student-calendar-dots i{width:5px;height:5px}
 .calendar-month-title{font-size:16px;min-width:0}
 .calendar-selected{margin-top:14px;padding-top:13px}
}


/* Beta 2.0.4 — student duty cards: clearer mobile presentation */
.duty-day {
  background: transparent;
  border: 0;
  padding: 0;
}
.duty-room-grid {
  gap: 16px;
}
.duty-room-card {
  position: relative;
  overflow: hidden;
  border: 1px solid #cfd9e5;
  border-radius: 18px;
  background: #fff;
  box-shadow: 0 5px 18px rgba(20,40,70,.08);
}
.duty-room-card::before {
  content: '';
  position: absolute;
  inset: 0 auto 0 0;
  width: 4px;
  background: #d8e2ed;
}
.duty-room-card.duty-today::before { background: #1878e7; }
.duty-room-top {
  padding-bottom: 12px;
  border-bottom: 1px solid #edf1f5;
}
.duty-room-caption {
  text-transform: uppercase;
  letter-spacing: .06em;
  font-weight: 700;
}
.duty-room-number {
  font-size: 36px;
  letter-spacing: -.03em;
}
.duty-room-floor {
  color: #33465b !important;
}
.duty-room-floor strong { font-weight: 750; }
.duty-room-meta {
  gap: 8px;
}
.duty-room-meta span {
  padding: 7px 9px;
  border-radius: 9px;
  background: #f6f8fb;
}
@media(max-width:700px) {
  .duty-mobile-list { gap: 22px; }
  .duty-day { margin: 0; }
  .duty-day-head {
    margin-bottom: 10px;
    padding: 10px 12px;
  }
  .duty-room-grid {
    gap: 14px;
  }
  .duty-room-card {
    padding: 16px;
    border-radius: 17px;
    box-shadow: 0 5px 16px rgba(20,40,70,.09);
  }
  .duty-room-number { font-size: 34px; }
  .duty-room-meta { margin: 13px 0; }
  .duty-room-meta span { font-size: 12px; }
}


/* Beta 2.0.5 — separate duty cards and no page jump after rating */
.duty-mobile-list { gap: 28px; }
.duty-day { margin-bottom: 4px; }
.duty-room-grid { row-gap: 22px; }
.duty-room-card { margin: 0; transition: box-shadow .18s ease, transform .18s ease, border-color .18s ease; }
.duty-room-card.duty-rated-card { border-color: #cfe5d5; }
@media (max-width: 700px) {
  .duty-mobile-list { gap: 26px; }
  .duty-room-grid { gap: 20px; }
  .duty-room-card { margin-bottom: 0; }
}

/* Manager duties: room-based assignment and readable monthly calendar */
.duty-manager-form{max-width:1100px}
.duty-calendar-panel{padding:18px}
.duty-calendar-toolbar{display:flex;align-items:center;justify-content:center;gap:14px;margin-bottom:18px}
.duty-calendar-title{min-width:180px;text-align:center;font-size:20px;font-weight:800}
.duty-calendar-weekdays{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;margin-bottom:8px}
.duty-calendar-weekdays>div{padding:7px 10px;color:#728096;font-size:12px;font-weight:700;text-align:center}
.duty-calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px}
.duty-calendar-cell{min-width:0;min-height:145px;background:#fff;border:1px solid #dfe5ed;border-radius:10px;padding:9px;overflow:hidden}
.duty-calendar-cell.is-outside{background:#f7f9fc;border-color:#edf0f4}
.duty-calendar-cell.is-today{border-color:#79b2f3;box-shadow:inset 0 0 0 1px #79b2f3}
.duty-calendar-date{font-size:13px;font-weight:800;margin-bottom:7px}
.duty-calendar-cell.is-today .duty-calendar-date{color:#1878e7}
.duty-calendar-events{display:flex;flex-direction:column;gap:5px;max-height:105px;overflow:auto;padding-right:2px}
.duty-calendar-event{display:grid;grid-template-columns:auto 1fr;column-gap:5px;row-gap:1px;text-decoration:none;background:#eef5ff;border-radius:6px;padding:5px 6px;color:#145fc1;border-left:3px solid #77aceb;line-height:1.15;min-width:0}
.duty-calendar-event b{font-size:12px;grid-row:span 2}
.duty-calendar-event span{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.duty-calendar-event small{font-size:10px;color:#657a96;grid-column:2}
.duty-calendar-event.status-completed{background:#eef9f1;border-left-color:#56b66a;color:#28763a}
.duty-calendar-event.status-missed{background:#fff1f1;border-left-color:#e06464;color:#a23838}
.duty-calendar-event.status-completed small,.duty-calendar-event.status-missed small{color:inherit;opacity:.8}
@media(max-width:800px){
  .duty-calendar-weekdays{display:none}
  .duty-calendar-grid{grid-template-columns:1fr;gap:10px}
  .duty-calendar-cell{min-height:auto;padding:11px}
  .duty-calendar-cell.is-outside{display:none}
  .duty-calendar-events{max-height:none}
  .duty-calendar-event{grid-template-columns:auto 1fr auto;align-items:center}
  .duty-calendar-event b{grid-row:auto}
  .duty-calendar-event span{grid-column:auto}
  .duty-calendar-event small{grid-column:auto}
  .duty-calendar-date{margin-bottom:8px}
}

/* Student dashboard — restored room rating */
.room-rating-dashboard{padding:20px}
.room-rating-summary{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding:8px 0 14px}
.room-rating-score strong{font-size:34px;line-height:1;font-weight:850}.room-rating-score span{color:#7b8798;font-size:14px}
.room-rating-stars,.room-rating-comment-stars{color:#f4ad28;letter-spacing:2px}.room-rating-stars i{font-size:22px}.room-rating-comments{display:flex;flex-direction:column;gap:7px;border-top:1px solid #edf0f4;padding-top:12px}
.room-rating-comment{display:flex;align-items:center;gap:10px;padding:9px 10px;background:#f8fafc;border-radius:10px;min-width:0}.room-rating-comment>span:nth-child(2){flex:1;min-width:0;font-size:13px;overflow:hidden;text-overflow:ellipsis}.room-rating-comment small{color:#8793a4;white-space:nowrap}
@media(max-width:520px){.room-rating-comment{align-items:flex-start;flex-wrap:wrap}.room-rating-comment>span:nth-child(2){flex-basis:100%;order:3}.room-rating-comment small{margin-left:auto}}

/* Beta 2.0.6 — restored compact student duty cards */
.duty-room-card {
  padding: 16px 16px 15px;
  border: 1px solid #cfd9e5;
  border-radius: 18px;
  background: #fff;
  box-shadow: 0 5px 18px rgba(20,40,70,.08);
}
.duty-room-card::before { width: 4px; }
.duty-room-floor-line {
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:10px;
  color:#40546a;
  font-size:13px;
  font-weight:700;
  min-height:22px;
}
.duty-room-floor-line > span:first-child { display:inline-flex; align-items:center; gap:7px; }
.duty-room-floor-line > span:first-child i { font-size:14px; color:#718197; }
.duty-room-number {
  margin-top:2px;
  font-size:42px;
  line-height:1.02;
  font-weight:900;
  letter-spacing:-.04em;
  color:#111b2b;
}
.duty-room-duty-line {
  display:flex;
  align-items:center;
  gap:7px;
  margin-top:9px;
  padding-bottom:12px;
  border-bottom:1px solid #edf1f5;
  color:#52657b;
  font-size:13px;
  font-weight:600;
  white-space:nowrap;
}
.duty-room-duty-line i { color:#7b8ba0; font-size:14px; }
.duty-room-duty-line .duty-time-separator { color:#aab4c0; }
.duty-room-duty-line span:last-child { color:#33475e; }
.duty-rated-box { margin-top:10px; padding-top:0; }
.duty-rate-form { margin-top:10px; padding-top:0; }
.duty-status { flex:0 0 auto; }
@media (max-width:700px) {
  .duty-mobile-list { gap:22px; }
  .duty-room-grid { gap:16px; }
  .duty-room-card { padding:15px 15px 14px; border-radius:17px; }
  .duty-room-number { font-size:40px; }
  .duty-room-duty-line { margin-top:8px; padding-bottom:11px; font-size:12px; }
  .duty-room-floor-line { font-size:12px; }
  .quick-rating { margin-top:7px; }
}


/* Beta 2.0.7 — компактный график дежурств менеджера */
.duty-manager-list{
    display:flex;
    flex-direction:column;
    gap:12px;
}
.duty-manager-card{
    border:1px solid var(--bs-border-color, #dee2e6);
    border-radius:14px;
    background:var(--bs-body-bg, #fff);
    overflow:hidden;
}
.duty-manager-card__head{
    display:flex;
    align-items:center;
    justify-content:space-between;
    padding:14px 16px;
    border-bottom:1px solid var(--bs-border-color, #dee2e6);
}
.duty-manager-card__name{
    font-weight:700;
    font-size:1rem;
}
.duty-manager-card__assignments{
    display:flex;
    flex-direction:column;
}
.duty-manager-assignment{
    display:grid;
    grid-template-columns:minmax(150px,1fr) auto auto;
    gap:12px;
    align-items:center;
    padding:11px 16px;
}
.duty-manager-assignment + .duty-manager-assignment{
    border-top:1px solid var(--bs-border-color, #dee2e6);
}
.duty-manager-assignment__place{
    display:flex;
    align-items:baseline;
    gap:8px;
}
.duty-manager-assignment__meta{
    display:flex;
    align-items:center;
    justify-content:flex-end;
    gap:5px;
    flex-wrap:wrap;
}
.duty-manager-assignment__actions{
    white-space:nowrap;
}
@media (max-width: 767.98px){
    .duty-manager-card__head{padding:13px 14px;}
    .duty-manager-assignment{
        grid-template-columns:1fr auto;
        gap:8px;
        padding:12px 14px;
    }
    .duty-manager-assignment__place{
        min-width:0;
        flex-direction:column;
        gap:1px;
    }
    .duty-manager-assignment__meta{
        grid-column:1 / -1;
        justify-content:flex-start;
    }
    .duty-manager-assignment__actions{
        grid-column:2;
        grid-row:1;
    }
}

/* Mass check-in checklist */
.checkin-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-bottom:16px}
.checkin-stat{background:#fff;border:1px solid #e6ebf2;border-radius:14px;padding:17px;display:flex;align-items:center;gap:13px;box-shadow:0 3px 12px rgba(20,40,70,.045)}
.checkin-stat-icon{width:46px;height:46px;border-radius:13px;display:grid;place-items:center;color:#fff;font-size:21px;flex:0 0 46px}.checkin-stat-icon.blue{background:#2b82ea}.checkin-stat-icon.purple{background:#7654db}.checkin-stat-icon.green{background:#38b96f}.checkin-stat-icon.orange{background:#ef9e35}
.checkin-stat small{display:block;color:#6e7c90;font-size:11px}.checkin-stat strong{display:block;font-size:25px;line-height:1.1;margin:3px 0}.checkin-stat em{display:block;font-size:10px;color:#97a2b1;font-style:normal}
.checkin-toolbar-panel{margin-bottom:16px}.checkin-search-row{display:flex;align-items:center;gap:12px}.checkin-search{flex:1}.checkin-filter{flex:0 0 auto}.checkin-filter .active{background:#1878e7;border-color:#1878e7;color:#fff}.checkin-progress-wrap{margin-top:15px}.checkin-progress{height:7px;background:#edf1f6}.checkin-progress .progress-bar{background:#38b96f}
.checkin-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.checkin-card{background:#fff;border:1px solid #e0e6ee;border-radius:15px;padding:15px;box-shadow:0 3px 12px rgba(20,40,70,.045);transition:.18s;border-left:4px solid #dbe3ed}.checkin-card.is-arrived{border-color:#cde6d7;border-left-color:#38b96f;background:#fbfffc}.checkin-card.is-saving{opacity:.68}.checkin-card-main{display:flex;justify-content:space-between;gap:14px;align-items:flex-start}.checkin-person{display:flex;align-items:center;gap:11px;min-width:0}.checkin-person a{text-decoration:none;color:inherit}.checkin-avatar{width:40px;height:40px;border-radius:11px;background:#edf4fd;color:#1878e7;display:grid;place-items:center;flex:0 0 40px}.checkin-person h3{font-size:15px;margin:0 0 3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.checkin-person span{font-size:11px;color:#748196}.checkin-place{display:flex;gap:7px;flex-wrap:wrap;justify-content:flex-end}.checkin-place span{background:#f6f8fb;border-radius:8px;padding:6px 8px;color:#607086;font-size:10px}.checkin-place b{color:#17243a;font-size:12px}
.checkin-toggle{margin-top:13px;display:flex;align-items:center;gap:10px;border-top:1px solid #edf1f5;padding-top:12px;cursor:pointer}.checkin-checkbox{position:absolute;opacity:0;pointer-events:none}.checkin-toggle-ui{width:26px;height:26px;border-radius:8px;border:2px solid #c8d2df;display:grid;place-items:center;color:#fff;flex:0 0 26px;background:#fff;transition:.15s}.checkin-checkbox:checked + .checkin-toggle-ui{background:#38b96f;border-color:#38b96f}.checkin-toggle-ui i{font-size:16px;opacity:0}.checkin-checkbox:checked + .checkin-toggle-ui i{opacity:1}.checkin-toggle strong{display:block;font-size:12px}.checkin-toggle small{display:block;color:#8591a2;font-size:10px;margin-top:2px}.checkin-empty{grid-column:1/-1;text-align:center;padding:70px 20px}.checkin-empty i{font-size:40px;color:#b9c5d4}.checkin-empty h3{font-size:16px;margin:12px 0 5px}.checkin-empty p{color:#7f8c9e;font-size:12px}.checkin-grid.is-loading{opacity:.55;pointer-events:none}

/* Public mass check-in monitor */
.monitor-body{margin:0;background:#eef3f8;color:#18263b;min-height:100vh}.checkin-monitor-page{min-height:100vh;padding:26px 30px 40px;max-width:1600px;margin:auto}.monitor-header{display:flex;justify-content:space-between;align-items:flex-end;gap:20px;margin-bottom:20px}.monitor-kicker{font-size:11px;text-transform:uppercase;letter-spacing:.12em;color:#718096;font-weight:800}.monitor-header h1{margin:4px 0;font-size:34px;letter-spacing:-.03em}.monitor-header p{margin:0;color:#8290a2;font-size:12px}.monitor-summary{display:flex;gap:10px}.monitor-summary>div{background:#fff;border:1px solid #e0e7ef;border-radius:14px;padding:12px 17px;min-width:110px;text-align:center}.monitor-summary span{display:block;color:#8390a1;font-size:10px;text-transform:uppercase;letter-spacing:.06em}.monitor-summary strong{display:block;font-size:24px;margin-top:2px}.monitor-tabs{display:flex;gap:8px;margin-bottom:18px}.monitor-tabs button{border:1px solid #d7e0ea;background:#fff;color:#52647a;border-radius:12px;padding:10px 16px;font-weight:700;cursor:pointer}.monitor-tabs button.active{background:#1878e7;border-color:#1878e7;color:#fff}.monitor-tabs b{margin-left:5px;font-size:11px;opacity:.75}.monitor-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px}.monitor-room{background:#fff;border:1px solid #dce4ed;border-radius:17px;padding:16px;box-shadow:0 5px 18px rgba(20,40,70,.06);overflow:hidden}.monitor-room.has-arrived{border-color:#c9e6d4}.monitor-room-head{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;border-bottom:1px solid #edf1f5;padding-bottom:12px}.monitor-room-head span{display:block;font-size:11px;color:#748196}.monitor-room-head small{display:block;color:#52647a;font-weight:700;margin-top:4px}.monitor-room-head strong{font-size:26px;white-space:nowrap}.monitor-room-progress{padding:11px 0}.monitor-room-progress>div:first-child{display:flex;justify-content:space-between;font-size:10px;color:#79879a;margin-bottom:6px}.monitor-room-progress b{color:#17243a}.monitor-room-progress .progress{height:6px;background:#eef2f6}.monitor-room-progress .progress-bar{background:#38b96f}.monitor-students{display:flex;flex-direction:column;gap:6px}.monitor-student{display:grid;grid-template-columns:24px 1fr auto;align-items:center;gap:7px;font-size:11px;padding:7px 8px;background:#fafbfd;border:1px solid #eef1f5;border-radius:9px}.monitor-student.arrived{background:#f1fbf4;border-color:#d8eee0}.monitor-student small{font-size:9px;color:#8a96a6}.monitor-dot{width:21px;height:21px;border-radius:7px;background:#eef2f6;color:#8d99a7;display:grid;place-items:center}.monitor-student.arrived .monitor-dot{background:#38b96f;color:#fff}.monitor-no-students{font-size:11px;color:#8b97a5;padding:12px 0}.monitor-empty{grid-column:1/-1;background:#fff;border:1px solid #dfe6ee;border-radius:18px;text-align:center;padding:90px 20px;color:#7e8b9b}.monitor-empty i{font-size:44px;display:block;margin-bottom:10px}.monitor-empty h2{font-size:19px;margin:0 0 5px}.monitor-empty p{margin:0;font-size:12px}
@media(max-width:1200px){.monitor-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.checkin-stats{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:800px){.checkin-grid{grid-template-columns:1fr}.checkin-search-row{flex-direction:column;align-items:stretch}.checkin-filter{width:100%}.checkin-filter .btn{flex:1}.monitor-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.checkin-monitor-page{padding:18px 14px 30px}.monitor-header{align-items:flex-start;flex-direction:column}.monitor-header h1{font-size:28px}}
@media(max-width:520px){.checkin-stats{grid-template-columns:1fr}.checkin-card-main{flex-direction:column}.checkin-place{justify-content:flex-start}.checkin-filter .btn{font-size:11px;padding:8px 5px}.monitor-grid{grid-template-columns:1fr}.monitor-summary{width:100%}.monitor-summary>div{flex:1}.monitor-room-head strong{font-size:24px}}

/* Менеджер: компактный календарь по образцу календаря студента */
.manager-duty-calendar-panel{padding:20px}
.manager-calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:7px}
.manager-calendar-weekday{text-align:center;color:#7b8798;font-size:11px;font-weight:800;text-transform:uppercase;padding:5px 0}
.manager-calendar-day{position:relative;min-width:0;height:86px;background:#fff;border:1px solid #dce3eb;border-radius:11px;padding:8px;text-align:left;cursor:pointer;transition:.15s;overflow:hidden}
.manager-calendar-day:hover{border-color:#9bbce0;transform:translateY(-1px)}
.manager-calendar-day.today{border:2px solid #5f9ee7;background:#f7fbff}
.manager-calendar-day.selected{box-shadow:0 0 0 2px rgba(22,119,232,.12);border-color:#1677e8}
.manager-calendar-day.empty{background:transparent;border-color:transparent;cursor:default}
.manager-calendar-date{font-size:14px;font-weight:800}
.manager-calendar-count{position:absolute;right:7px;top:6px;min-width:21px;height:21px;padding:0 5px;border-radius:999px;background:#eaf3ff;color:#1677e8;font-size:10px;font-weight:800;display:grid;place-items:center}
.manager-calendar-dots{position:absolute;left:8px;bottom:8px;display:flex;gap:4px}
.manager-calendar-dots i{width:6px;height:6px;border-radius:50%;background:#5f9ee7;display:block}
.manager-calendar-selected{margin-top:18px;border-top:1px solid #e8edf3;padding-top:17px}
.manager-calendar-selected-head{display:flex;justify-content:space-between;align-items:flex-end;gap:12px;margin-bottom:10px}
.manager-calendar-selected-head h3{font-size:17px;margin:2px 0 0}
.manager-calendar-selected-count{font-size:11px;color:#1677e8;background:#eaf3ff;padding:5px 9px;border-radius:999px;font-weight:700}
.manager-calendar-selected-events{display:flex;flex-direction:column;gap:8px}
.manager-calendar-event{display:flex;align-items:center;gap:11px;padding:11px 12px;border:1px solid #e1e7ef;border-radius:11px;background:#fafbfd;text-decoration:none;color:inherit;transition:.15s}
.manager-calendar-event:hover{border-color:#b7cbe1;background:#f6f9fc}
.manager-calendar-event-icon{width:34px;height:34px;border-radius:9px;background:#eaf3ff;color:#1677e8;display:grid;place-items:center;flex:0 0 34px}
.manager-calendar-event-main{min-width:0;flex:1}
.manager-calendar-event-main b{display:block;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.manager-calendar-event-main span{display:block;color:#748196;font-size:11px;margin-top:3px}
.manager-calendar-event-meta{text-align:right;flex:0 0 auto}
.manager-calendar-event-meta strong{display:block;font-size:12px}
.manager-calendar-event-meta small{display:block;margin-top:2px;color:#748196;font-size:10px}
.manager-calendar-no-events{color:#8a96a6;font-size:13px;padding:12px 0}
@media(max-width:800px){
  .manager-duty-calendar-panel{padding:13px}
  .manager-calendar-grid{gap:4px}
  .manager-calendar-weekday{font-size:9px;padding:3px 0}
  .manager-calendar-day{height:64px;border-radius:9px;padding:6px}
  .manager-calendar-date{font-size:13px}
  .manager-calendar-count{right:4px;top:4px;min-width:18px;height:18px;font-size:9px}
  .manager-calendar-dots{left:6px;bottom:6px;gap:3px}
  .manager-calendar-dots i{width:5px;height:5px}
  .manager-calendar-selected{margin-top:14px;padding-top:13px}
}
@media(max-width:520px){
  .manager-calendar-event{align-items:flex-start;padding:10px}
  .manager-calendar-event-main b{font-size:12px}
  .manager-calendar-event-main span{font-size:10px}
}

/* Beta 2.0.29 — linen control */
.linen-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px}.linen-stat{background:#fff;border:1px solid var(--border);border-radius:12px;padding:15px;display:flex;align-items:center;gap:12px;box-shadow:0 3px 12px rgba(20,40,70,.04);text-decoration:none;color:inherit;position:relative;transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease}.linen-stat:hover{color:inherit;transform:translateY(-2px);box-shadow:0 7px 18px rgba(20,40,70,.09);border-color:#cbd8e8}.linen-stat:focus-visible{outline:3px solid rgba(24,120,231,.22);outline-offset:2px}.linen-stat-arrow{margin-left:auto;color:#8a98aa;font-size:14px}.linen-stat-icon{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;background:#eef5ff;color:#1878e7;font-size:19px}.linen-stat-icon.pending{background:#fff5e5;color:#d88900}.linen-stat-icon.today{background:#eaf3ff;color:#1677e8}.linen-stat-icon.overdue{background:#ffeded;color:#d83d46}.linen-stat-icon.done{background:#eaf8ed;color:#2f9b4d}.linen-stat small{display:block;color:#748196}.linen-stat b{display:block;font-size:22px;margin-top:2px}.linen-panel-head{align-items:flex-end}.linen-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-end}.linen-actions .form-control{max-width:150px}.linen-table td,.linen-table th{white-space:nowrap}.linen-history{display:flex;flex-direction:column;gap:9px}.linen-history-item{display:flex;gap:12px;padding:12px;border:1px solid #e1e7ef;border-radius:12px;background:#fafbfd}.linen-history-icon{width:36px;height:36px;flex:0 0 36px;border-radius:10px;background:#eef5ff;color:#1677e8;display:grid;place-items:center}.linen-calendar-event{border-color:#cfe0f4;background:#f7fbff}.linen-calendar-event .calendar-event-icon{background:#eaf8ed;color:#2f9b4d}
@media(max-width:900px){.linen-stats{grid-template-columns:repeat(2,minmax(0,1fr))}.linen-panel-head{align-items:flex-start}.linen-actions{justify-content:flex-start}}
@media(max-width:600px){.linen-stats{grid-template-columns:1fr 1fr;gap:8px}.linen-stat{padding:11px}.linen-stat-icon{width:36px;height:36px}.linen-stat b{font-size:19px}.linen-actions{width:100%}.linen-actions>*{flex:1 1 auto}.linen-actions input[type=date]{min-width:135px}.linen-table{font-size:12px}.linen-history-item{padding:10px}}

/* QR student card / linen scanner */
.student-qr-layout{display:flex;gap:24px;align-items:center;flex-wrap:wrap}.student-qr-code{width:270px;min-height:270px;display:flex;align-items:center;justify-content:center;background:#fff;border-radius:20px;border:1px solid rgba(0,0,0,.08);padding:14px}.student-qr-code canvas{max-width:100%;height:auto!important}.student-qr-name{font-size:1.25rem;font-weight:700}.qr-scanner-wrap{max-width:760px;margin:auto}.qr-video-box{position:relative;overflow:hidden;border-radius:24px;background:#111;min-height:320px;display:flex;align-items:center;justify-content:center}.qr-video-box video{width:100%;height:auto;display:block}.qr-frame{position:absolute;width:210px;height:210px;border:3px solid #fff;border-radius:22px;box-shadow:0 0 0 9999px rgba(0,0,0,.22)}.qr-result{min-height:86px}.scan-mode-btn.active{background:var(--bs-primary);color:#fff;border-color:var(--bs-primary)}@media(max-width:576px){.student-qr-layout{justify-content:center}.student-qr-code{width:240px;min-height:240px}.qr-frame{width:180px;height:180px}}

/* Beta 2.0.36 — compact student QR in page header with fullscreen preview */
.student-qr-thumb{width:58px;height:58px;padding:0;border:1px solid rgba(22,119,232,.14);border-radius:16px;background:linear-gradient(145deg,#fff 0%,#f4f8ff 100%);display:grid;place-items:center;cursor:pointer;box-shadow:0 4px 14px rgba(20,40,70,.09);transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease}.student-qr-thumb:hover{transform:translateY(-1px);box-shadow:0 7px 20px rgba(20,40,70,.13);border-color:rgba(22,119,232,.28)}.student-qr-thumb:active{transform:scale(.96)}.student-qr-thumb:focus-visible{outline:3px solid rgba(24,120,231,.25);outline-offset:2px}.student-qr-thumb-inner{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;background:#eef5ff;color:#1677e8}.student-qr-thumb i{font-size:24px;line-height:1}.student-qr-thumb canvas{display:none}.student-qr-modal{position:fixed;inset:0;z-index:3000;display:none;align-items:center;justify-content:center;padding:16px}.student-qr-modal.show{display:flex}.student-qr-modal-backdrop{position:absolute;inset:0;background:rgba(5,20,35,.86);backdrop-filter:blur(6px)}.student-qr-modal-dialog{position:relative;z-index:1;width:100%;height:100%;max-width:none;max-height:none;overflow:auto;background:transparent;border-radius:0;padding:clamp(20px,5vw,48px);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;box-shadow:none}.student-qr-modal-close{position:absolute;right:clamp(8px,3vw,28px);top:clamp(8px,3vw,28px);width:44px;height:44px;border:0;border-radius:50%;background:rgba(255,255,255,.94);color:#526173;display:grid;place-items:center;font-size:18px;box-shadow:0 6px 24px rgba(0,0,0,.18)}.student-qr-modal-title{font-size:clamp(20px,3vw,28px);font-weight:700;margin:0 45px 18px;color:#fff}.student-qr-full{display:flex;align-items:center;justify-content:center;background:#fff;border:1px solid #e6ebf2;border-radius:22px;padding:14px;margin:0 auto 18px;width:min(520px,82vw,calc(100vh - 170px));aspect-ratio:1;box-shadow:0 20px 70px rgba(0,0,0,.28)}.student-qr-full-image{display:block;width:100%;height:100%;object-fit:contain}.student-qr-modal-name{font-size:clamp(17px,2.4vw,21px);font-weight:700;color:#fff}.student-qr-modal-hint{margin-top:12px;color:rgba(255,255,255,.78);font-size:13px}.qr-modal-open{overflow:hidden}@media(max-width:520px){.student-qr-thumb{width:54px;height:54px;border-radius:15px}.student-qr-thumb-inner{width:36px;height:36px}.student-qr-thumb i{font-size:23px}.student-qr-modal{padding:10px}.student-qr-modal-dialog{width:100%;border-radius:20px;padding:20px}.student-qr-full{width:min(360px,100%)}}

/* Посещаемость и QR-сканер */
.attendance-stat-link{display:block;text-decoration:none;color:inherit;transition:transform .15s ease,box-shadow .15s ease}.attendance-stat-link:hover{transform:translateY(-2px);box-shadow:0 10px 26px rgba(20,40,70,.10)}
.attendance-journal-table th,.attendance-journal-table td{white-space:nowrap}.attendance-journal-table td:nth-child(2){white-space:normal;min-width:220px}.attendance-scanner{position:relative;max-width:720px;margin:auto;overflow:hidden;border-radius:24px;background:#111;min-height:340px;display:flex;align-items:center;justify-content:center}.attendance-scanner #attendanceReader{width:100%}.attendance-scanner video{width:100%!important;height:auto!important;display:block}.attendance-scanner .qr-frame{position:absolute;width:250px;height:250px;border:3px solid rgba(255,255,255,.95);border-radius:24px;box-shadow:0 0 0 9999px rgba(0,0,0,.20);pointer-events:none}.attendance-flash{position:fixed;inset:0;z-index:5000;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s ease;background:rgba(20,30,40,.92);color:#fff}.attendance-flash.show{opacity:1;visibility:visible}.attendance-flash.success{background:rgba(22,155,82,.94)}.attendance-flash.error{background:rgba(190,35,50,.95)}.attendance-flash-icon{width:112px;height:112px;border:6px solid rgba(255,255,255,.9);border-radius:50%;display:grid;place-items:center;font-size:62px;margin-bottom:24px}.attendance-flash-title{font-size:clamp(30px,5vw,56px);font-weight:800}.attendance-flash-sub{font-size:clamp(16px,2.5vw,24px);margin-top:12px;max-width:80vw}.attendance-print-page{padding:24px}.print-toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.attendance-print-table{width:100%;border-collapse:collapse;font-size:11px}.attendance-print-table th,.attendance-print-table td{border:1px solid #222;padding:5px 4px}.attendance-print-table th{font-weight:700}.print-meta{margin-bottom:16px}
@media(max-width:768px){.attendance-scanner{min-height:280px}.attendance-scanner .qr-frame{width:190px;height:190px}.attendance-journal-table{font-size:13px}.attendance-print-page{padding:0}}
@media print{body{background:#fff!important}.print-toolbar{display:none!important}.attendance-print-page{padding:0!important}.attendance-print-page h1{font-size:18px;margin:0 0 6px}.print-meta{font-size:10px;margin-bottom:8px}.attendance-print-table{font-size:9px}.attendance-print-table th,.attendance-print-table td{padding:3px 2px}.attendance-print-table{page-break-inside:auto}.attendance-print-table tr{page-break-inside:avoid;page-break-after:auto}}
