
:root{
  --bg:#f3f5f7;--panel:#fff;--line:#dfe5ec;--text:#1b2634;--muted:#697586;
  --door:#465468;--window:#78a7c8;--barrier:#1e2732;--accent:#2f6fed;--soft:#f7f9fb;
}
*{box-sizing:border-box}
html,body{margin:0;min-height:100%;background:var(--bg);font-family:Inter,system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;color:var(--text)}
button,input,select{font:inherit}
button{cursor:pointer}
.hidden{display:none!important}
.login-screen{position:fixed;inset:0;display:grid;place-items:center;background:#edf1f5;z-index:300}
.login-card{width:min(360px,90vw);background:#fff;border:1px solid #dfe5ec;border-radius:16px;padding:26px;box-shadow:0 20px 60px rgba(25,35,48,.14)}
.login-mark{width:48px;height:48px;border-radius:14px;background:#1e2a38;color:#fff;display:grid;place-items:center;font-weight:900;font-size:22px}
.login-card h1{margin:14px 0 4px;font-size:22px}.login-card p{margin:0 0 18px;color:#7a8491;font-size:12px}
.login-card input{width:100%;height:42px;border:1px solid #d6dde6;border-radius:9px;padding:0 12px;outline:none}
.login-card input:focus{border-color:#91a7d7;box-shadow:0 0 0 3px rgba(47,111,237,.08)}
.login-card button{width:100%;height:42px;border:0;border-radius:9px;background:#1f2b39;color:#fff;font-weight:800;margin-top:10px}
.form-error{min-height:18px;margin-top:8px;font-size:11px;color:#b42318}

.topbar{min-height:66px;background:#fff;border-bottom:1px solid #e3e7ec;display:flex;align-items:center;padding:10px 18px;gap:10px;position:sticky;top:0;z-index:50}
.brand{font-size:18px;font-weight:900;white-space:nowrap}
.year-switch{display:flex;align-items:center;gap:5px;background:#f3f5f7;border:1px solid #e0e5eb;border-radius:9px;padding:2px 7px}
.year-switch span{font-size:10px;color:#7a8491}.year-switch select{height:30px;border:0;background:transparent;font-size:12px;font-weight:700;outline:none}
.ghost-btn,.logout-btn{height:34px;border:1px solid #d9e0e8;background:#fff;border-radius:8px;padding:0 10px;color:#4b5868;font-size:11px}
.logout-btn{margin-left:auto}
.search{position:relative;flex:1;min-width:260px;max-width:440px}
.search input{width:100%;height:36px;border:1px solid #d8dee7;border-radius:9px;padding:0 12px 0 34px;background:#f8fafc;outline:none}
.search-icon{position:absolute;left:11px;top:8px;color:#7a8491}
.search-results{display:none;position:absolute;left:0;right:0;top:42px;background:#fff;border:1px solid #dfe5ec;border-radius:10px;box-shadow:0 14px 34px rgba(0,0,0,.14);max-height:340px;overflow:auto;z-index:90}
.search-results.open{display:block}.search-result{padding:9px 11px;border-bottom:1px solid #f0f2f5;font-size:12px}.search-result:hover{background:#f5f7fa}
.search-result b{display:block}.search-result small{color:#7b8695}
.segment{display:flex;gap:3px;background:#f1f3f6;border-radius:9px;padding:3px}
.segment button{border:0;background:transparent;padding:7px 9px;border-radius:7px;color:#596474;font-size:11px}
.segment button.active{background:#fff;color:#111827;box-shadow:0 1px 4px rgba(0,0,0,.08);font-weight:800}

.main{max-width:1840px;margin:0 auto;padding:14px 18px 30px}
.system-banner{display:none;margin-bottom:10px;padding:9px 11px;border-radius:9px;font-size:11px;line-height:1.6}
.system-banner.show{display:block}.system-banner.warn{background:#fff8e8;border:1px solid #ecd8a6;color:#765214}.system-banner.error{background:#fff0ee;border:1px solid #efc5bf;color:#922b21}
.stats-wrap{display:grid;grid-template-columns:1.4fr 1fr;gap:10px;margin-bottom:10px}
.stats-group{background:#fff;border:1px solid var(--line);border-radius:12px;padding:10px 11px}
.stats-title{display:flex;align-items:center;justify-content:space-between;margin-bottom:7px;font-size:12px}.stats-title small{font-size:10px;color:#8a94a3}
.stats-grid{display:grid;gap:6px}.stats-grid.five{grid-template-columns:repeat(5,1fr)}.stats-grid.four{grid-template-columns:repeat(4,1fr)}
.stat{background:#f7f9fb;border:1px solid #e8ecf1;border-radius:8px;padding:7px 8px}.stat strong{display:block;font-size:20px;line-height:1.1}.stat span{font-size:9px;color:#84909e}.stat.warn strong{color:#a45b0a}

.filterbar{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-bottom:10px;padding:9px 10px;background:#fff;border:1px solid var(--line);border-radius:11px}
.filter-label{font-size:11px;font-weight:800;color:#536071}
.multi{position:relative;min-width:132px}.multi summary{list-style:none;height:32px;display:flex;align-items:center;justify-content:space-between;border:1px solid #d8dee7;border-radius:8px;background:#fff;padding:0 9px;font-size:11px;color:#344054;cursor:pointer}
.multi summary::-webkit-details-marker{display:none}.multi summary:after{content:"⌄";color:#87919e}.multi[open] summary{border-color:#94a8c8}
.multi-menu{position:absolute;top:37px;left:0;z-index:80;width:230px;max-height:310px;background:#fff;border:1px solid #dce2e9;border-radius:9px;box-shadow:0 12px 30px rgba(25,35,48,.15);overflow:hidden}
.multi-head{height:36px;display:flex;align-items:center;justify-content:space-between;padding:0 9px;border-bottom:1px solid #eef1f4;font-size:11px}.multi-head button{border:0;background:transparent;color:#2f6fed;font-size:10px}
.multi-options{max-height:270px;overflow:auto;padding:4px}.multi-option{display:flex;gap:7px;align-items:flex-start;padding:6px 7px;border-radius:6px;font-size:11px}.multi-option:hover{background:#f5f7fa}.multi-option input{margin-top:2px}
.clear-all{height:32px;border:1px solid #dde3ea;background:#f8fafc;border-radius:8px;padding:0 9px;font-size:11px;color:#596474}.filter-summary{margin-left:auto;background:#f6f8fa;border-radius:999px;padding:5px 9px;font-size:10px;color:#687485}

.map-panel{background:#fff;border:1px solid var(--line);border-radius:14px;padding:13px;box-shadow:0 10px 28px rgba(38,50,66,.04)}
.map-head{display:flex;justify-content:space-between;align-items:end;margin-bottom:8px}.map-head h2{margin:0;font-size:16px}.map-head small{color:#7a8491;font-size:10px}
.view-tabs{display:flex;gap:5px}.view-tabs button{height:30px;border:1px solid #dde3ea;background:#fff;border-radius:7px;padding:0 9px;color:#5d6877;font-size:10px}.view-tabs button.active{background:#1e2a38;color:#fff;border-color:#1e2a38}
.viewport{overflow:auto;padding:10px 7px 18px}.all-floors{display:flex;flex-direction:column;gap:16px}.floor-wrap{min-width:1280px}.floor-caption{font-size:13px;font-weight:850;margin:0 0 5px 2px}
.floor{position:relative;min-width:1280px;height:320px;background:#eef1f4;border:1px solid #c7d0da;border-radius:10px;padding:10px;box-shadow:inset 0 0 0 1px #fbfcfd}
.upper,.lower{position:absolute;left:10px;right:10px;display:grid;grid-template-columns:repeat(22,minmax(52px,1fr));gap:3px}.upper{top:10px;height:120px}.lower{bottom:10px;height:96px}
.corridor{position:absolute;left:10px;right:10px;top:142px;height:58px;background:linear-gradient(180deg,rgba(255,255,255,.23),rgba(226,232,238,.34));display:flex;align-items:center;justify-content:center;color:#8b95a2;font-size:10px;letter-spacing:12px}
.corridor:before,.corridor:after{content:"";height:1px;background:#d3d9e0;flex:1;margin:0 22px}
.item{border:1px solid #c5ced8;border-radius:4px;min-width:0;overflow:visible;position:relative}.room{background:linear-gradient(145deg,#fff,#f3f6f9);box-shadow:2px 3px 0 #dbe1e8;display:flex;cursor:pointer;transition:.12s}.room:hover{transform:translateY(-1px);border-color:#97a5b5}.room.facility{background:#e8edf2}.room.dim{opacity:.16;filter:grayscale(.5)}.room.match{box-shadow:0 0 0 2px rgba(47,111,237,.18),2px 3px 0 #dbe1e8}.room.highlight{background:#fff0b9;border-color:#d2a31c;box-shadow:0 0 0 3px rgba(210,163,28,.18)}
.space{background:#f8fafb;color:#657080;display:flex;align-items:center;justify-content:center;text-align:center;font-size:10px;padding:5px}.space.circulation{background:#edf1f5}.space.service{background:#f4f6f8}.space.entrance{font-weight:800}.space.open-bottom{border-bottom-color:transparent}
.ri{width:100%;padding:5px 4px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}.rno{font-weight:850;font-size:12px}.rsub{font-size:9px;color:#6d7785;line-height:1.25;margin-top:2px;max-height:23px;overflow:hidden}.rmeta{font-size:9px;color:#354253;margin-top:2px}
.door{position:absolute;z-index:8;width:16px;height:6px;background:#fff;border-left:2px solid var(--door);border-right:2px solid var(--door)}.door:after{content:"";position:absolute;width:11px;height:11px;border:1.3px solid var(--door);border-left:0;border-bottom:0;border-radius:0 10px 0 0;opacity:.75}
.upper .door{bottom:-3px;left:50%;transform:translateX(-50%)}.upper .door:after{left:1px;top:-9px;transform:rotate(180deg);transform-origin:6px 6px}.lower .door{top:-3px;left:50%;transform:translateX(-50%)}.lower .door:after{left:1px;top:3px}
.window{position:absolute;z-index:7;width:24px;height:4px;background:#eaf5fb;border-top:2px solid var(--window)}.upper .window{top:-2px;left:50%;transform:translateX(-50%)}.lower .window{bottom:-2px;left:50%;transform:translateX(-50%)}
.facade-door{position:absolute;z-index:9;width:15px;height:5px;background:#fff;border-left:2px solid var(--door);border-right:2px solid var(--door)}.facade-door:after{content:"";position:absolute;width:9px;height:9px;border:1.2px solid var(--door);border-left:0;border-bottom:0;border-radius:0 9px 0 0}.facade-door.main{width:18px}.upper .facade-door{top:-3px;left:50%;transform:translateX(-50%)}.lower .facade-door{bottom:-3px;left:50%;transform:translateX(-50%)}
.barrier{position:absolute;top:-12px;bottom:-12px;width:17px;transform:translateX(-8.5px);background:linear-gradient(90deg,#414b56,var(--barrier),#414b56);z-index:25;display:flex;align-items:center;justify-content:center}.barrier span{color:#fff;font-size:9px;writing-mode:vertical-rl;text-orientation:upright;letter-spacing:1px;font-weight:800}

.drawer-back{display:none;position:fixed;inset:0;background:rgba(20,28,38,.18);z-index:100}.drawer-back.open{display:block}.drawer{position:fixed;right:-440px;top:0;width:420px;max-width:92vw;height:100vh;background:#fff;z-index:110;box-shadow:-14px 0 40px rgba(0,0,0,.14);transition:.18s;padding:20px;overflow:auto}.drawer.open{right:0}.drawer-close{position:absolute;right:14px;top:14px;border:0;background:#f0f2f5;border-radius:7px;padding:6px 9px}.drawer h3{margin:0 0 4px;font-size:21px}.drawer .sub{font-size:11px;color:#7a8491;margin-bottom:13px}.kv{display:grid;grid-template-columns:78px 1fr;gap:8px;padding:8px 0;border-bottom:1px solid #eef1f4;font-size:11px}.kv b{color:#596474}.person-list{margin-top:14px}.person-list h4{margin:0 0 7px;font-size:12px}.person{background:#f7f9fb;border:1px solid #e5e9ee;border-radius:7px;padding:6px 8px;font-size:11px;margin-bottom:5px}

.modal-back{display:none;position:fixed;inset:0;background:rgba(18,27,38,.35);z-index:180}.modal-back.open{display:block}.modal{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%) scale(.98);width:min(1050px,94vw);max-height:90vh;overflow:auto;background:#f6f8fa;border-radius:15px;z-index:190;opacity:0;pointer-events:none;box-shadow:0 24px 70px rgba(0,0,0,.25);transition:.16s}.modal.open{opacity:1;pointer-events:auto;transform:translate(-50%,-50%) scale(1)}
.modal-head{position:sticky;top:0;z-index:3;background:#fff;border-bottom:1px solid #e5e9ee;display:flex;align-items:center;padding:14px 16px}.modal-head h2{margin:0;font-size:17px}.modal-head p{margin:2px 0 0;color:#7a8491;font-size:10px}.modal-head button{margin-left:auto;border:0;background:#f0f2f5;border-radius:7px;padding:6px 9px}.modal-body{padding:12px}
.setup-panel,.year-admin,.publish-row,.history-panel{background:#fff;border:1px solid #e0e5eb;border-radius:10px;padding:10px 11px;margin-bottom:10px}.setup-panel{display:flex;align-items:center;gap:12px}.setup-panel div{flex:1}.setup-panel b{font-size:12px}.setup-panel p,.publish-row p{margin:3px 0 0;font-size:10px;color:#7b8695}
.year-admin{display:flex;align-items:center;gap:8px}.year-admin label{font-size:11px;font-weight:700}.year-admin select{height:32px;border:1px solid #d8dee7;border-radius:7px;padding:0 8px}.status-pill{display:inline-flex;padding:4px 7px;border-radius:999px;background:#f1f3f5;color:#5f6b79;font-size:9px;font-weight:800}
.import-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.import-card{background:#fff;border:1px solid #e0e5eb;border-radius:11px;padding:11px}.import-title{display:flex;align-items:center;justify-content:space-between}.import-title h3{margin:0;font-size:14px}.file-name{font-size:10px;color:#7b8695;margin-top:4px;word-break:break-all}.import-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:5px;margin:9px 0}.import-kpis div{background:#f6f8fa;border-radius:7px;padding:6px}.import-kpis b{display:block;font-size:14px}.import-kpis span{font-size:8px;color:#8993a0}.import-actions{display:flex;gap:5px;flex-wrap:wrap}.import-actions button,.primary-btn{height:31px;border:1px solid #d8dfe7;background:#fff;border-radius:7px;padding:0 8px;font-size:10px}.primary-btn{background:#253243!important;color:#fff!important;border-color:#253243!important}.import-actions button:disabled,.primary-btn:disabled{opacity:.4;cursor:not-allowed}.import-status{margin-top:7px;font-size:9px;color:#7b8695;line-height:1.5}
.publish-row{display:flex;align-items:center;gap:10px}.publish-row>div{flex:1}.history-panel h3{margin:0 0 6px;font-size:12px}.year-row{display:flex;align-items:center;gap:7px;padding:6px 0;border-top:1px solid #f0f2f5;font-size:10px}.year-row:first-child{border-top:0}.year-row .grow{flex:1}

@media(max-width:1100px){.stats-wrap{grid-template-columns:1fr}.topbar{flex-wrap:wrap}.search{order:3;max-width:none;min-width:300px}.logout-btn{margin-left:0}.import-grid{grid-template-columns:1fr}}
@media(max-width:760px){.stats-grid.five{grid-template-columns:repeat(2,1fr)}.stats-grid.four{grid-template-columns:repeat(2,1fr)}.view-tabs{flex-wrap:wrap}.filter-summary{margin-left:0}.search{min-width:100%}}

.person-major{margin-left:6px;padding:2px 5px;border-radius:999px;background:#eef3f8;color:#526377;font-size:10px;font-weight:600}
