*{box-sizing:border-box}[hidden]{display:none!important}body{margin:0;background:#f3f6f2;color:#172b23;font:14px/1.6 "Microsoft YaHei",sans-serif}main{max-width:1400px;padding:28px;margin:auto}header{display:flex;justify-content:space-between;align-items:center;gap:15px;margin-bottom:22px}small{color:#177052;letter-spacing:.08em;font-weight:700}h1{font-size:30px;margin:4px 0}p{margin:6px 0;color:#63776b}button,input{font:inherit}button{min-height:40px;padding:8px 16px;border:1px solid #ccddd2;border-radius:9px;background:white;color:#176b4a;cursor:pointer;font-weight:700}button:hover{border-color:#176b4a}button:disabled{opacity:.5;cursor:not-allowed}.primary{background:#176b4a;color:white;border-color:#176b4a}.danger{color:#b52c2c}input{padding:10px;border:1px solid #ccddd2;border-radius:8px;min-width:0;background:white}input:focus,button:focus-visible{outline:3px solid #91cbb3;outline-offset:2px}.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.metric,.toolbar{background:white;border:1px solid #dce7df;border-radius:14px;padding:16px 20px}.metric strong{display:block;font-size:30px;color:#173d31}.metric span{color:#63776b}.toolbar{display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap;margin:18px 0}label{display:block;font-weight:700;margin-bottom:6px}#query{flex:1;min-width:230px}#query>div{display:flex;gap:8px}#search{flex:1;width:100%}.rooms{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-top:16px}.room{display:flex;flex-direction:column;min-width:0;border:1px solid #dce7df;border-radius:14px;background:white;overflow:hidden}.room.mine{border:2px solid #19814e;box-shadow:0 0 0 3px #d9efdf}.room-head{display:flex;justify-content:space-between;align-items:start;gap:8px;padding:16px 16px 8px}.room h2{margin:0;font-size:21px;overflow-wrap:anywhere}.badge{white-space:nowrap;padding:3px 8px;border-radius:20px;background:#e8f6eb;color:#177044;font-size:12px}.badge.full{background:#fff1dc;color:#9b6100}.capacity{padding:0 16px}.bar{height:5px;background:#edf2ee;margin:12px 16px;border-radius:4px;overflow:hidden}.bar>i{display:block;height:100%;background:#45a36f}.people{display:flex;gap:6px;flex-wrap:wrap;padding:0 16px 16px;min-height:63px;align-content:start}.person{border-radius:7px;background:#f0f5f2;padding:5px 8px;overflow-wrap:anywhere}.person.me{background:#d9efdf;color:#105f38;font-weight:700}.person mark{background:#ffe68b}.room-actions{margin-top:auto;padding:12px 16px;border-top:1px solid #edf2ee;display:flex;gap:8px}.room-actions button{flex:1}.empty{grid-column:1/-1;padding:45px 20px;text-align:center;background:white;border:1px dashed #c9d9ce;border-radius:12px;color:#63776b}.results:empty{display:none}.results{background:#fff9e9;border:1px solid #eddaad;border-radius:12px;padding:12px;margin:10px 0}.result{display:flex;justify-content:space-between;gap:10px;padding:8px;border-bottom:1px solid #efe5c9;overflow-wrap:anywhere}.result:last-child{border:0}.result span{color:#63776b}footer{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-top:28px}footer span{color:#74847a;font-size:12px}dialog{width:min(480px,94vw);border:0;border-radius:16px;padding:24px;box-shadow:0 20px 70px #0004}dialog::backdrop{background:#10201999}dialog input{width:100%;margin-bottom:15px}h2{margin-top:0}.actions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}#error,#formError{color:#ad3028}#error:empty{display:none}#toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:#173d31;color:white;border-radius:10px;padding:12px 20px;max-width:90vw;display:none}#toast.show{display:block}@media(max-width:1050px){.rooms{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:760px){main{padding:18px 12px}.rooms{grid-template-columns:repeat(2,minmax(0,1fr))}h1{font-size:24px}.metrics{grid-template-columns:repeat(2,1fr)}}@media(max-width:430px){.rooms{grid-template-columns:1fr}.toolbar{padding:13px}#query>div{flex-wrap:wrap}#search{flex-basis:100%}.metric strong{font-size:27px}}

/* Compact dormitory board: keep names visible without fixed card heights. */
body{font-size:13px;line-height:1.5}main{padding:16px;max-width:1500px}header{gap:10px;margin-bottom:12px}small{font-size:11px}h1{font-size:24px;margin:2px 0}p{margin:4px 0}button{min-height:32px;padding:5px 11px;border-radius:7px}input{padding:7px 9px}label{margin-bottom:4px}.metrics{gap:8px}.metric,.toolbar{border-radius:10px;padding:10px 13px}.metric{display:flex;align-items:center;gap:10px}.metric strong{font-size:25px;line-height:1.2}.metric span{font-size:12px}.toolbar{gap:12px;margin:10px 0}#query{display:flex;align-items:center;gap:12px}#query label{margin:0;white-space:nowrap}#query>div{flex:1;gap:6px}.rooms{grid-template-columns:repeat(5,minmax(0,1fr));gap:9px;margin-top:10px}.room{border-radius:10px}.room-head{gap:6px;padding:10px 11px 4px}.room h2{font-size:18px}.badge{font-size:11px;padding:2px 7px}.capacity{padding:0 11px;font-size:12px}.bar{height:4px;margin:7px 11px}.people{gap:4px;padding:0 11px 9px;min-height:32px}.person{font-size:12px;padding:3px 6px;border-radius:5px}.room-actions{padding:7px 10px;gap:6px}.room-actions button{font-size:12px;min-height:30px;padding:4px 8px}.room-actions:empty{display:none}.empty{padding:26px 14px}.results{padding:8px 10px;margin:7px 0}.result{padding:6px;gap:8px}footer{gap:10px;margin-top:16px}dialog{padding:18px;border-radius:12px}
@media(max-width:1199px){.rooms{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media(max-width:899px){.rooms{grid-template-columns:repeat(3,minmax(0,1fr))}#query{display:block}#query label{margin-bottom:5px}}
@media(max-width:649px){main{padding:12px 10px}header{align-items:flex-start}h1{font-size:21px}.rooms{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.metrics{grid-template-columns:repeat(2,1fr);gap:7px}.metric{padding:9px 11px}.metric strong{font-size:23px}.toolbar{padding:10px}#query>div{flex-wrap:nowrap}#search{flex-basis:auto;width:100%}.room-head{flex-wrap:wrap}.room h2{font-size:17px}}
@media(max-width:359px){.rooms{grid-template-columns:1fr}#query>div{flex-wrap:wrap}#search{flex-basis:100%}}
