:root{--ink:#172033;--muted:#68758b;--line:#dfe5ec;--paper:#f4f7f5;--blue:#2f62df;--green:#23845f;--amber:#b87513;--coral:#c95f57;--lawn:#dfeeda;--lawn-dark:#b8d9ae;--water:#b9def0;--road:#f7f6f1;--road-edge:#d9d8d2}
*{box-sizing:border-box}body{margin:0;overflow-x:hidden;color:var(--ink);background:var(--paper);font-family:"Noto Sans SC","Microsoft YaHei",system-ui,sans-serif}button,input{font:inherit}button{cursor:pointer}
.site-header{position:sticky;z-index:40;top:0;border-bottom:1px solid rgba(223,229,236,.94);background:rgba(255,255,255,.94);backdrop-filter:blur(14px)}.header-inner,.map-main{width:min(1440px,calc(100% - 32px));margin:0 auto}.header-inner{min-height:64px;display:flex;align-items:center;justify-content:space-between;gap:20px}.brand{display:flex;align-items:center;gap:11px;color:inherit;text-decoration:none}.brand-mark{width:36px;height:36px;display:grid;place-items:center;border-radius:8px;color:#fff;background:var(--blue);font-size:13px;font-weight:800}.brand strong,.brand small{display:block}.brand strong{font-size:15px}.brand small{margin-top:2px;color:#8b95a6;font-size:10px}.back-link{color:#59657a;text-decoration:none;font-size:13px}
.map-main{padding:26px 0 44px}.title-row{display:flex;align-items:end;justify-content:space-between;gap:24px;margin-bottom:16px}.title-row h1{margin:0;font-size:clamp(25px,3vw,38px);line-height:1.2}.title-row p{max-width:760px;margin:8px 0 0;color:var(--muted);font-size:13px;line-height:1.7}.verified{flex:0 0 auto;color:var(--green);font-size:12px;font-weight:700}
.toolbar{display:grid;grid-template-columns:auto minmax(220px,1fr) auto auto;gap:10px;margin-bottom:10px}.campus-tabs,.zoom-controls{display:flex;align-items:center;gap:4px;padding:4px;border:1px solid var(--line);border-radius:8px;background:#fff}.campus-tabs button,.zoom-controls button{min-height:36px;border:0;border-radius:6px;color:#667187;background:transparent}.campus-tabs button{padding:0 14px;font-size:12px}.campus-tabs button.active{color:#fff;background:var(--blue);font-weight:700}.zoom-controls button{width:36px;font-size:18px;font-weight:800}.zoom-controls button:hover{color:var(--blue);background:#edf3ff}.location-button{min-height:44px;padding:0 14px;border:0;border-radius:8px;color:#fff;background:var(--green);font-size:12px;font-weight:700}.location-button.active{background:var(--coral)}.location-button:disabled{cursor:wait;opacity:.65}.search-box{min-width:0;display:flex;align-items:center;gap:9px;padding:0 13px;border:1px solid var(--line);border-radius:8px;background:#fff}.search-box span{color:#8993a5}.search-box input{width:100%;height:44px;border:0;outline:0;color:var(--ink);background:transparent;font-size:13px}
.location-status{margin:-1px 0 10px;padding:10px 13px;border:1px solid #cfe8dc;border-radius:8px;color:#22694d;background:#eff9f4;font-size:11px;line-height:1.6}.location-status.error{border-color:#f0cfcb;color:#9a4d47;background:#fff4f2}.campus-meta{display:flex;align-items:center;justify-content:space-between;gap:18px;margin-bottom:10px;padding:11px 14px;border:1px solid var(--line);border-radius:8px;background:#fff}.campus-address strong{display:block;font-size:13px}.campus-address span{display:block;margin-top:3px;color:var(--muted);font-size:11px}.map-badge{display:inline-flex;margin-left:7px;padding:3px 6px;border-radius:5px;color:#246148;background:#e4f3e9;font-size:9px;font-weight:800}.nav-links{display:flex;gap:8px}.nav-links a{padding:8px 11px;border-radius:7px;color:#fff;background:var(--blue);text-decoration:none;font-size:11px;font-weight:700}.nav-links a.secondary{color:var(--blue);border:1px solid #ccd9fb;background:#edf3ff}
.workspace{display:grid;grid-template-columns:300px minmax(0,1fr);height:calc(100vh - 310px);min-height:540px;overflow:hidden;border:1px solid var(--line);border-radius:8px;background:#fff}.place-panel{min-width:0;height:100%;display:flex;flex-direction:column;overflow:hidden;border-right:1px solid var(--line);background:#fff}.category-list{display:flex;flex-wrap:wrap;gap:7px;padding:14px;border-bottom:1px solid var(--line)}.category-list button{min-height:30px;padding:0 10px;border:1px solid transparent;border-radius:7px;color:#677286;background:#f2f4f7;font-size:11px}.category-list button.active{border-color:#cbd8ff;color:var(--blue);background:#edf3ff;font-weight:700}.place-results{flex:1;min-height:0;overflow:auto;padding:7px}.place-result{width:100%;display:grid;grid-template-columns:32px minmax(0,1fr);gap:10px;padding:10px;border:1px solid transparent;border-radius:7px;text-align:left;color:inherit;background:#fff}.place-result:hover,.place-result.active{border-color:#d8e1f7;background:#f7f9fe}.result-icon{width:32px;height:32px;display:grid;place-items:center;border-radius:7px;color:var(--blue);background:#edf3ff;font-size:11px;font-weight:800}.place-result strong,.place-result small{display:block}.place-result strong{overflow:hidden;font-size:13px;text-overflow:ellipsis;white-space:nowrap}.place-result small{margin-top:4px;color:var(--muted);font-size:10px}.place-empty{padding:32px 16px;color:var(--muted);text-align:center;font-size:12px}.place-detail{min-height:148px;padding:15px;border-top:1px solid var(--line);background:#fafbfd}.detail-label{color:var(--blue);font-size:10px;font-weight:800}.place-detail h2{margin:6px 0 5px;font-size:17px}.detail-location{color:var(--amber);font-size:11px;font-weight:700}.place-detail p{margin:9px 0 0;color:var(--muted);font-size:11px;line-height:1.7}
.map-viewport{position:relative;min-width:0;min-height:0;overflow:hidden;background:#dbe7dd}.campus-scene{width:100%;height:100%;display:block;background:#eaf1e9;touch-action:none;cursor:grab}.scene-boundary{fill:var(--lawn);stroke:#8ebd84;stroke-width:3}.scene-water{fill:var(--water);stroke:#91c6dd;stroke-width:2}.scene-road-edge{fill:none;stroke:var(--road-edge);stroke-linecap:round;stroke-linejoin:round}.scene-road{fill:none;stroke:var(--road);stroke-linecap:round;stroke-linejoin:round}.scene-road-label{fill:#697386;font-size:15px;font-weight:700;letter-spacing:2px}.scene-path{fill:none;stroke:rgba(255,255,255,.82);stroke-width:8;stroke-linecap:round}.scene-tree{fill:#77af70;stroke:#4f8e55;stroke-width:1}.scene-tree-shadow{fill:rgba(55,102,65,.16)}.scene-building{cursor:pointer;outline:none}.scene-building .top{fill:#f4e7cf;stroke:#bfae94;stroke-width:1.5;transition:filter 160ms ease}.scene-building .front{fill:#d8bea0;stroke:#ad9477;stroke-width:1.2}.scene-building .side{fill:#c5a887;stroke:#a3886b;stroke-width:1.2}.scene-building.kind-study .top{fill:#e9e2d2}.scene-building.kind-study .front{fill:#cdbfa9}.scene-building.kind-service .top{fill:#e4eef4}.scene-building.kind-service .front{fill:#b8cdd9}.scene-building.kind-dining .top{fill:#f4dcae}.scene-building.kind-dining .front{fill:#d7ad68}.scene-building.kind-dorm .top{fill:#e8ddd7}.scene-building.kind-dorm .front{fill:#cbb9ae}.scene-building.kind-sports .top{fill:#d9eadc}.scene-building.kind-sports .front{fill:#a9c8ad}.scene-building:hover .top,.scene-building.active .top{filter:brightness(1.08) saturate(1.25);stroke:var(--blue);stroke-width:3}.scene-building-label{pointer-events:none;fill:#263349;font-size:12px;font-weight:800;text-anchor:middle;paint-order:stroke;stroke:rgba(255,255,255,.92);stroke-width:4px;stroke-linejoin:round}.scene-point{cursor:pointer}.scene-point circle{fill:#fff;stroke:var(--blue);stroke-width:4}.scene-point.active circle,.scene-point:hover circle{fill:#fff0ed;stroke:var(--coral)}.scene-point text{pointer-events:none;fill:#263349;font-size:11px;font-weight:800;text-anchor:middle;paint-order:stroke;stroke:#fff;stroke-width:4px}.scene-track-outer{fill:#cb665f}.scene-track-inner{fill:#9fd08c;stroke:#fff;stroke-width:3}.scene-field-label{fill:#fff;font-size:12px;font-weight:800;text-anchor:middle;paint-order:stroke;stroke:rgba(34,72,43,.6);stroke-width:3px}.scene-courts{fill:#8ab9a6;stroke:#fff;stroke-width:3}.scene-court-line{fill:none;stroke:rgba(255,255,255,.75);stroke-width:2}.scene-square{fill:#eadfbe;stroke:#c7b98c;stroke-width:2}.scene-compass{fill:#fff;stroke:#bbc6d2;stroke-width:2}.scene-compass-text{fill:#42516a;font-size:12px;font-weight:800;text-anchor:middle}.map-hint{position:absolute;right:12px;bottom:12px;padding:7px 9px;border-radius:7px;color:#526178;background:rgba(255,255,255,.9);font-size:10px;box-shadow:0 4px 14px rgba(29,49,68,.09);pointer-events:none}.source-note{margin:11px 2px 0;color:#8993a5;font-size:11px;line-height:1.7}
@media(max-width:900px){.map-main{padding-top:20px}.title-row{align-items:start;flex-direction:column;gap:8px}.toolbar{grid-template-columns:minmax(0,1fr)}.campus-tabs,.search-box,.location-button,.zoom-controls{grid-column:1;min-width:0}.campus-tabs button,.zoom-controls button{min-width:0;flex:1}.campus-meta{min-width:0;align-items:flex-start;flex-direction:column}.workspace{display:flex;width:100%;height:auto;min-width:0;flex-direction:column}.map-viewport{order:1;min-height:470px}.campus-scene{min-height:470px}.place-panel{order:2;min-width:0;height:auto;border-top:1px solid var(--line);border-right:0}.place-results{max-height:250px}}
@media(max-width:520px){.header-inner,.map-main{width:min(100% - 24px,1440px)}.header-inner{min-height:58px}.brand small{display:none}.back-link{font-size:11px}.title-row h1{font-size:25px}.campus-tabs button{padding:0 8px}.search-box input{height:40px}.map-viewport,.campus-scene{min-height:360px}.nav-links{width:100%}.nav-links a{flex:1;text-align:center}.scene-building-label{font-size:10px}.scene-point text{font-size:9px}.map-hint{display:none}}

/* ===== 官方图底图模式 ===== */
.campus-scene.has-basemap{background:#f4f6f3}
.has-basemap .scene-basemap{opacity:.97}
.has-basemap .scene-track-outer{fill-opacity:.16;stroke-opacity:.55}
.has-basemap .scene-track-inner{fill-opacity:.10;stroke-opacity:.35}
.has-basemap .scene-courts{fill-opacity:.16;stroke-opacity:.55}
.has-basemap .scene-court-line{stroke-opacity:.35}
.has-basemap .scene-building .front{fill-opacity:.30;stroke-width:2}
.has-basemap .scene-building:hover .front,.has-basemap .scene-building.active .front{fill-opacity:.5;stroke:var(--blue);stroke-width:3}
/* ===== 标签描边（防叠印） ===== */
.scene-point text{paint-order:stroke;stroke:rgba(255,255,255,.92);stroke-width:3px;stroke-linejoin:round}
.scene-field-label{paint-order:stroke;stroke:rgba(255,255,255,.9);stroke-width:3px;stroke-linejoin:round}.campus-scene.dragging{cursor:grabbing}
.detail-nav{display:flex;gap:8px;margin-top:12px}
.detail-nav a{flex:1;padding:9px 0;border-radius:7px;text-align:center;text-decoration:none;font-size:12px;font-weight:700}
.detail-nav .nav-amap{color:#fff;background:#0086f6}
.detail-nav .nav-baidu{color:#fff;background:#3385ff}
