:root{--graphite: #101418;--graphite-2: #1b2127;--graphite-3: #2a323a;--teal: #0fa88a;--teal-strong: #0b8a71;--teal-soft: #e7f7f3;--mint: #5ed6be;--bg: #f6f8f8;--surface: #ffffff;--surface-alt: #f0f3f3;--text: #171b1f;--text-2: #667078;--text-3: #8a949b;--border: #e3e8e7;--border-strong: #cdd5d4;--ok: #139b72;--warn: #d99520;--bad: #d84b4b;--info: #3678c8;--r-sm: 6px;--r-md: 8px;--r-lg: 10px;--font-ui: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-brand: "Manrope", "Inter", system-ui, sans-serif}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;font:400 14px/1.55 var(--font-ui);color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased}button,input,select,textarea{font:inherit;color:inherit}a{color:var(--teal-strong);text-decoration:none;font-weight:500}a:hover{text-decoration:underline}:focus-visible{outline:2px solid var(--teal);outline-offset:2px}@media (prefers-reduced-motion: reduce){*{transition:none!important;animation:none!important}}.num{font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}.muted{color:var(--text-2)}.small{font-size:12.5px}.shell{display:grid;grid-template-columns:232px 1fr;height:100%}.side{background:var(--graphite);color:#c8d0d4;display:flex;flex-direction:column;padding:18px 12px;gap:18px;overflow-y:auto}.brand{display:flex;align-items:center;gap:10px;padding:0 8px;color:#fff}.brand-mark{width:26px;height:26px}.brand-name{font:800 17px/1 var(--font-brand);letter-spacing:.02em}.nav-group{display:flex;flex-direction:column;gap:2px}.nav-label{font-size:12px;color:#7f8a91;padding:0 10px 4px}.nav a{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:var(--r-sm);color:#c8d0d4;text-decoration:none;font-weight:500}.nav a:hover{background:var(--graphite-2);color:#fff}.nav a.active{background:var(--graphite-3);color:#fff;box-shadow:inset 2px 0 0 var(--teal)}.side-foot{margin-top:auto;padding:0 8px;font-size:12.5px;color:#7f8a91}.side-foot button{background:none;border:0;color:#c8d0d4;padding:6px 0;cursor:pointer}.main{display:flex;flex-direction:column;min-width:0;height:100%}.top{height:52px;flex:none;display:flex;align-items:center;gap:16px;padding:0 24px;background:var(--surface);border-bottom:1px solid var(--border)}.top select{border:1px solid var(--border);border-radius:var(--r-sm);padding:5px 8px;background:var(--surface)}.day{color:var(--text-2);font-size:13px}.status-dot{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text-2);margin-left:auto}.status-dot:before{content:"";width:7px;height:7px;border-radius:50%;background:var(--ok)}.status-dot.off:before{background:var(--warn)}.content{flex:1;overflow-y:auto;padding:24px 28px 160px}.page-head{display:flex;align-items:flex-end;gap:16px;margin-bottom:18px;flex-wrap:wrap}.page-head h1{font:700 22px/1.2 var(--font-brand);margin:0;letter-spacing:-.01em}.page-head p{margin:4px 0 0;color:var(--text-2);max-width:70ch}.page-head .actions{margin-left:auto;display:flex;gap:8px;flex-wrap:wrap}.toolbar{display:flex;gap:10px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.tabs{display:flex;gap:2px;border-bottom:1px solid var(--border);margin-bottom:14px}.tabs button{border:0;background:none;padding:8px 12px;color:var(--text-2);cursor:pointer;font-weight:500;border-bottom:2px solid transparent;margin-bottom:-1px}.tabs button.on{color:var(--text);border-bottom-color:var(--teal)}.btn{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 12px;border-radius:var(--r-md);border:1px solid var(--border-strong);background:var(--surface);cursor:pointer;font-weight:500}.btn:hover{border-color:var(--text-3)}.btn.primary{background:var(--teal);border-color:var(--teal);color:#fff}.btn.primary:hover{background:var(--teal-strong);border-color:var(--teal-strong)}.btn.danger{color:var(--bad)}.btn.ghost{border-color:transparent;background:none}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.sm{height:28px;padding:0 9px;font-size:13px}.field{display:flex;flex-direction:column;gap:4px;min-width:0}.field label{font-size:12.5px;color:var(--text-2);font-weight:500}.input,.select{height:34px;padding:0 10px;border:1px solid var(--border-strong);border-radius:var(--r-sm);background:var(--surface);min-width:0}.input:focus,.select:focus{outline:none;border-color:var(--teal);box-shadow:0 0 0 3px var(--teal-soft)}.input.num{text-align:right}.grid-2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.grid-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.check{display:inline-flex;align-items:center;gap:6px;font-size:13px}.table-wrap{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);overflow-x:auto}table{width:100%;border-collapse:collapse}th{text-align:left;font-weight:600;font-size:12.5px;color:var(--text-2);padding:9px 12px;border-bottom:1px solid var(--border);background:var(--surface-alt);white-space:nowrap}td{padding:9px 12px;border-bottom:1px solid var(--border);vertical-align:middle}tr:last-child td{border-bottom:0}tbody tr.clickable{cursor:pointer}tbody tr.clickable:hover{background:#fafbfb}tfoot td{font-weight:600;background:var(--surface-alt)}td input.input{height:30px}.pill{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:500;padding:2px 8px;border-radius:999px;background:var(--surface-alt);color:var(--text-2);white-space:nowrap}.pill:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}.pill.ok{color:var(--ok);background:#e8f6f0}.pill.warn{color:#a86e0d;background:#fbf2e1}.pill.bad{color:var(--bad);background:#fbeaea}.pill.info{color:var(--info);background:#e9f1fa}.neg{color:var(--bad)}.callout{border:1px solid var(--border);border-left:3px solid var(--teal);background:var(--surface);padding:10px 14px;border-radius:var(--r-sm)}.callout.bad{border-left-color:var(--bad)}.error-text{color:var(--bad);font-size:13px}.empty{padding:40px 20px;text-align:center;color:var(--text-2)}.empty strong{display:block;color:var(--text);font-size:15px;margin-bottom:4px}.figures{display:flex;gap:32px;flex-wrap:wrap;margin-bottom:18px;padding:14px 18px;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg)}.figure .k{font-size:12.5px;color:var(--text-2)}.figure .v{font:700 20px/1.3 var(--font-ui);font-variant-numeric:tabular-nums}.figure .v.neg{color:var(--bad)}.scrim{position:fixed;top:0;right:0;bottom:0;left:0;background:#10141847;z-index:40;animation:fade .16s ease-out}.sheet{position:fixed;left:232px;right:0;bottom:0;z-index:41;background:var(--surface);border-radius:14px 14px 0 0;box-shadow:0 -12px 40px #1014182e;display:flex;flex-direction:column;animation:rise .22s cubic-bezier(.2,.8,.2,1);transition:height .2s ease}.sheet.half{height:58vh}.sheet.full{height:92vh}.sheet-grip{display:flex;justify-content:center;padding:8px 0 2px;cursor:ns-resize}.sheet-grip span{width:40px;height:4px;border-radius:2px;background:var(--border-strong)}.sheet-head{display:flex;align-items:flex-start;gap:12px;padding:6px 24px 12px;border-bottom:1px solid var(--border)}.sheet-head h2{font:700 18px/1.3 var(--font-brand);margin:0}.sheet-head .sub{color:var(--text-2);font-size:13px;margin-top:2px}.sheet-head .tools{margin-left:auto;display:flex;gap:6px}.sheet-body{flex:1;overflow-y:auto;padding:16px 24px 24px;display:flex;flex-direction:column;gap:16px}.sheet-foot{display:flex;gap:8px;justify-content:flex-end;padding:12px 24px;border-top:1px solid var(--border);flex-wrap:wrap}.sheet-foot .error-text{margin-right:auto;align-self:center}@keyframes rise{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes fade{0%{opacity:0}to{opacity:1}}.kv{display:grid;grid-template-columns:max-content 1fr;gap:6px 18px;font-size:13.5px}.kv dt{color:var(--text-2)}.kv dd{margin:0}.toast{position:fixed;bottom:20px;left:50%;transform:translate(-50%);z-index:60;background:var(--graphite);color:#fff;padding:9px 16px;border-radius:var(--r-md);font-size:13.5px;animation:fade .16s}.login{min-height:100%;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,460px)}.login-art{background:var(--graphite);color:#fff;padding:48px;display:flex;flex-direction:column;justify-content:space-between}.login-art h1{font:800 40px/1.1 var(--font-brand);margin:0;max-width:14ch;letter-spacing:-.02em}.login-art p{color:#9aa5ab;max-width:42ch}.login-form{padding:48px 40px;display:flex;flex-direction:column;justify-content:center;gap:14px;background:var(--surface)}.login-form h2{font:700 22px/1.2 var(--font-brand);margin:0 0 6px}.menu-btn{display:none}@media (max-width: 860px){.shell{grid-template-columns:1fr}.side{display:none}.side.open{display:flex;position:fixed;inset:0 auto 0 0;width:260px;z-index:50;box-shadow:8px 0 30px #0000004d}.menu-btn{display:inline-flex}.top{padding:0 12px;gap:10px}.sheet{left:0}.content{padding:18px 14px 160px}.grid-2,.grid-3,.login{grid-template-columns:1fr}.login-art{display:none}}.rack{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}.room{text-align:left;background:var(--surface);border:1px solid var(--border);border-left:4px solid var(--border-strong);border-radius:var(--r-md);padding:9px 11px;cursor:pointer;display:flex;flex-direction:column;gap:2px;min-height:86px}.room:hover{border-color:var(--text-3)}.room .no{font:700 17px/1.2 var(--font-ui);font-variant-numeric:tabular-nums}.room .meta{font-size:12.5px;color:var(--text-2)}.room.clean,.room.inspected{border-left-color:var(--ok)}.room.dirty{border-left-color:var(--warn)}.room.blocked{border-left-color:var(--bad);background:#fdf6f6}.room.occupied .no:after{content:" ●";color:var(--info);font-size:11px;vertical-align:2px}.legend{display:flex;gap:16px;flex-wrap:wrap;font-size:12.5px;color:var(--text-2);margin-bottom:12px}.legend span:before{content:"";display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:6px;vertical-align:-1px}.legend .l-clean:before{background:var(--ok)}.legend .l-dirty:before{background:var(--warn)}.legend .l-blocked:before{background:var(--bad)}.legend .l-occ:before{background:var(--info);border-radius:50%}.checklist{display:flex;flex-direction:column;gap:1px;background:var(--border);border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden}.checklist>div{background:var(--surface);padding:12px 16px;display:flex;gap:12px;align-items:center}.checklist .state{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:13px;flex:none}.checklist .state.ok{background:var(--ok)}.checklist .state.todo{background:var(--warn)}.checklist .what{flex:1}.checklist .what small{display:block;color:var(--text-2)}.shift-btn{height:30px}
