@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Manrope:wght@400;500;600;700;800&display=swap');
/* CampusFlow — the building is the interface. Graphite panels, cream type, signal-yellow accent
   (the yellow of the bridge kerbs and of the selected door frames). */
:root{
  --ink:#13171a;--panel:rgba(22,26,29,.9);--panel-solid:#1a1f23;--raise:rgba(241,237,224,.06);--raise-2:rgba(241,237,224,.11);
  --cream:#f1ede0;--muted:#a9a99c;--faint:#7d7f76;--line:rgba(241,237,224,.13);--yellow:#f2c230;--yellow-ink:#2a2208;--blue:#7fb2d6;--ok:#8fc29a;
  --radius:18px;--ease:cubic-bezier(.22,.8,.24,1);
  font-family:'DM Sans',Arial,sans-serif;color:var(--cream);background:var(--ink);font-synthesis:none;
}
*{box-sizing:border-box}html,body{height:100%}body{margin:0;background:var(--ink);overflow:hidden}
button,a,input,select{-webkit-tap-highlight-color:transparent}button{font:inherit;color:inherit;cursor:pointer}a{color:var(--yellow)}
button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible{outline:2px solid var(--yellow);outline-offset:3px}
.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.stage{position:relative;height:100vh;height:100svh;overflow:hidden}
.map-card{position:absolute;inset:0;background:#dfe3e3}
#scene{position:absolute;inset:0;touch-action:none}#scene canvas{display:block;width:100%;height:100%}

/* top bar */
.topbar{position:absolute;z-index:5;top:16px;left:16px;right:16px;display:flex;align-items:center;gap:16px;pointer-events:none}
.topbar>*{pointer-events:auto}
.brand{display:flex;align-items:center;gap:12px;text-decoration:none;padding:8px 18px 8px 10px;background:var(--panel);backdrop-filter:blur(16px);border:1px solid var(--line);border-radius:999px;color:var(--cream)}
.brand-mark{position:relative;width:38px;height:38px;border-radius:50%;background:var(--yellow);color:var(--yellow-ink);display:grid;place-items:center;font:800 19px Manrope,Arial,sans-serif;letter-spacing:-1px}
.brand-text{display:grid}.brand strong{font:700 15px Manrope,Arial,sans-serif;letter-spacing:-.2px}.brand small{font-size:11px;color:var(--muted);margin-top:1px}
.search{position:relative;display:flex;align-items:center;margin-left:auto;margin-right:calc(412px - 16px)}
.search svg{position:absolute;left:14px;width:16px;height:16px;fill:none;stroke:var(--muted);stroke-width:1.8;stroke-linecap:round;pointer-events:none}
.search input{width:min(340px,34vw);height:44px;padding:0 16px 0 40px;border-radius:999px;border:1px solid var(--line);background:var(--panel);backdrop-filter:blur(16px);color:var(--cream);font-size:13px;transition:border-color .2s,width .3s var(--ease)}
.search input::placeholder{color:var(--faint)}.search input:focus{border-color:var(--yellow);width:min(400px,40vw)}
.top-meta{display:none}

/* scene overlays */
.scene-heading{position:absolute;z-index:3;left:30px;top:96px;pointer-events:none;color:#1d2427;text-shadow:0 1px 0 rgba(255,255,255,.4)}
.eyebrow{font-size:10px;letter-spacing:1.6px;text-transform:uppercase;font-weight:700;margin:0 0 10px;color:var(--muted)}
.scene-heading .eyebrow{color:#4f5b5e}
.scene-heading h1{font:700 clamp(36px,4.2vw,64px)/.92 Manrope,Arial,sans-serif;letter-spacing:-3px;margin:0 0 14px}
.scene-heading>p:last-child{font-size:13px;margin:0;color:#4f5b5e}
.floor-controls{position:absolute;z-index:4;left:20px;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;align-items:stretch;gap:8px;padding:8px;background:var(--panel);backdrop-filter:blur(16px);border:1px solid var(--line);border-radius:26px;margin-top:70px}
.floor-bar{display:flex;flex-direction:column-reverse;gap:4px}
.floor-controls button{width:44px;height:38px;border:0;border-radius:14px;background:transparent;font:600 12px Manrope,Arial,sans-serif;color:var(--muted);transition:background .2s,color .2s,transform .2s var(--ease)}
.floor-controls button:hover{background:var(--raise-2);color:var(--cream)}
.floor-controls button.active{background:var(--yellow);color:var(--yellow-ink)}
.floor-controls button.conference:not(.active){color:var(--yellow)}
#allFloors{background:var(--raise);color:var(--cream)}
.cut{display:flex;flex-direction:column;align-items:center;gap:5px;font-size:9px;line-height:1.2;text-align:center;color:var(--muted);padding:6px 2px 4px;border-top:1px solid var(--line);cursor:pointer;width:44px}
.cut input{accent-color:var(--yellow);margin:0}
.view-tools{position:absolute;z-index:4;left:96px;right:432px;bottom:44px;margin:auto;width:fit-content;max-width:calc(100% - 528px);display:flex;gap:2px;padding:5px;background:var(--panel);backdrop-filter:blur(16px);border:1px solid var(--line);border-radius:999px;overflow-x:auto;scrollbar-width:none}
.view-tools::-webkit-scrollbar{display:none}
.view-tools button{flex:none;border:0;border-radius:999px;padding:10px 14px;background:none;font-size:12px;color:var(--muted);white-space:nowrap;transition:background .2s,color .2s}
.view-tools button:hover{color:var(--cream);background:var(--raise)}
.view-tools button[aria-pressed=true]{background:var(--cream);color:var(--ink)}
#lightingMode{margin-left:4px;border-left:1px solid var(--line);border-radius:0 999px 999px 0}
.scene-hint{position:absolute;z-index:3;left:96px;right:432px;bottom:14px;margin:0;text-align:center;font-size:11px;color:#4f5b5e}

/* side panel */
.sidebar{position:absolute;z-index:4;top:76px;right:16px;bottom:16px;width:396px;overflow:auto;scrollbar-width:thin;scrollbar-color:var(--raise-2) transparent;padding:26px 24px 22px;background:var(--panel);backdrop-filter:blur(22px);border:1px solid var(--line);border-radius:24px;box-shadow:0 30px 80px rgba(10,14,16,.28)}
.sidebar h2{font:600 24px/1.1 Manrope,Arial,sans-serif;letter-spacing:-.8px;margin:0 0 12px}
.location{padding-bottom:20px;border-bottom:1px solid var(--line)}.location p:last-child{font-size:13px;line-height:1.65;color:var(--muted);margin:0}.location strong{color:var(--cream)}
.room-picker{padding:20px 0;border-bottom:1px solid var(--line)}.room-picker .eyebrow{display:block}
#roomList{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:6px;margin:8px 0 10px}
#roomList button,#spaceList button{background:var(--raise);border:1px solid transparent;padding:9px 4px;border-radius:10px;font-size:12px;color:var(--cream);transition:background .2s,border-color .2s,transform .2s var(--ease)}
#roomList button:hover,#spaceList button:hover,#roomList button:focus-visible,#spaceList button:focus-visible{border-color:var(--yellow);transform:translateY(-1px)}
#roomList button[aria-pressed=true],#spaceList button[aria-pressed=true]{background:var(--yellow);color:var(--yellow-ink);font-weight:600}
.room-picker small{font-size:11px;color:var(--faint)}
.layout-picker{padding:20px 0 4px}#spaceList{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-top:10px}#spaceList button{text-align:left;padding:10px 12px}
#layoutNote{font-size:11px;color:var(--faint);line-height:1.6;margin:10px 0 0}
.details{padding:22px 0;animation:rise .4s var(--ease)}
@keyframes rise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.detail-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.detail-tag{font-size:10px;letter-spacing:1.4px;color:var(--yellow);font-weight:700;text-transform:uppercase}
.estimate-tag{font-size:10px;padding:3px 8px;border-radius:999px;border:1px dashed var(--yellow);color:var(--yellow)}
.details h2{font-size:34px;letter-spacing:-1.4px;margin:12px 0 6px}
.room-code{font-size:12px;color:var(--muted);margin:0}
.room-identity{font-size:13px;line-height:1.6;color:var(--cream);padding:12px 14px;background:var(--raise);border-radius:12px;margin:14px 0 0}
.notice{font-size:12px;line-height:1.65;padding:12px 14px;background:var(--raise);border-radius:12px;margin-top:14px;color:var(--muted)}
.week-selector,.day-filter{display:block;font-size:11px;color:var(--muted);margin-top:16px}
.week-selector select,.day-filter select{width:100%;margin-top:6px;padding:11px 12px;background:var(--panel-solid);border:1px solid var(--line);border-radius:10px;color:var(--cream);font-size:12px}
.schedule-tabs{display:flex;gap:4px;margin-top:14px;padding:3px;background:var(--raise);border-radius:12px}
.schedule-tabs button{flex:1;font-size:12px;padding:8px 10px;border:0;border-radius:9px;background:none;color:var(--muted)}
.schedule-tabs button[aria-pressed=true]{background:var(--cream);color:var(--ink);font-weight:600}.schedule-tabs button:disabled{opacity:.35;cursor:default}
.schedule-head{display:flex;align-items:center;justify-content:space-between;margin-top:18px}.schedule-head h3{font-size:13px;font-weight:600;margin:0}.schedule-head a{font-size:11px}
.photo-button{position:relative;display:block;padding:0;width:100%;margin-top:10px;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:#e5e5de}
.photo-button img{display:block;width:100%;max-height:300px;object-fit:cover;object-position:top;transition:transform .5s var(--ease)}.photo-button:hover img{transform:scale(1.02)}
.photo-button span{position:absolute;right:8px;bottom:8px;background:rgba(19,23,26,.85);color:var(--cream);padding:6px 10px;border-radius:999px;font-size:11px}
.source-note,.microcopy{font-size:11px;line-height:1.65;color:var(--faint);margin:10px 0 0}
.chip-list{display:flex;flex-wrap:wrap;gap:5px}.chip-list span{background:var(--raise);border-radius:999px;font-size:11px;padding:6px 10px;color:var(--cream)}
.courses{margin-top:16px}.empty .schedule-content{display:none}
.schedule-table-wrap{max-height:300px;overflow:auto;margin-top:12px;border:1px solid var(--line);border-radius:12px}
.schedule-table-wrap table{border-collapse:collapse;font-size:11px;width:100%}
.schedule-table-wrap th{position:sticky;top:0;background:var(--panel-solid);text-align:left;padding:9px;color:var(--muted);font-weight:600}
.schedule-table-wrap td{vertical-align:top;padding:10px 9px;border-top:1px solid var(--line)}.schedule-table-wrap td:first-child{width:96px;color:var(--muted)}
.schedule-table-wrap small{display:block;color:var(--faint);margin-top:4px;font-size:10px;line-height:1.5}
.device-panel{padding:18px;margin-top:20px;background:var(--raise);border:1px solid var(--line);border-radius:16px}.device-panel[hidden]{display:none}
.device-panel h3{font-size:14px;font-weight:600;margin:6px 0 14px}
.device-readings{margin:0;display:grid;gap:10px}.device-readings>div{display:flex;justify-content:space-between;gap:14px;font-size:12px;padding-bottom:10px;border-bottom:1px solid var(--line)}
.device-readings dt{color:var(--muted)}.device-readings dd{margin:0;text-align:right;color:var(--cream)}
.device-row{display:flex;justify-content:space-between;padding:11px;background:var(--raise);margin-top:8px;border-radius:10px;font-size:11px}.device-row span{color:var(--muted)}
#focusRoomButton{margin-top:14px;border:0;background:var(--yellow);border-radius:999px;padding:12px;width:100%;color:var(--yellow-ink);font-weight:700;font-size:12px;transition:transform .2s var(--ease)}#focusRoomButton:hover{transform:translateY(-1px)}
#backToBuilding{background:none;border:0;color:var(--yellow);padding:0 0 14px;font-size:12px}#backToBuilding[hidden]{display:none}
.sidebar.focused .location,.sidebar.focused .room-picker,.sidebar.focused .layout-picker,.sidebar.focused .model-note,.sidebar.focused .pending-sources{display:none}
.sidebar.focused .details{padding:0}.sidebar.focused .photo-button img{max-height:170px;object-fit:contain}.sidebar.focused .courses,.sidebar.focused #focusRoomButton{display:none}
.pending-sources{padding:18px 0;border-top:1px solid var(--line)}#pendingPhotos{display:grid;gap:10px;font-size:12px}
.photo-button[hidden],#scheduleReading[hidden],.room-identity[hidden],.estimate-tag[hidden]{display:none}
.model-note{border-top:1px solid var(--line);padding-top:18px;color:var(--muted);font-size:12px;line-height:1.65}.model-note>span{font-size:10px;letter-spacing:1.5px;text-transform:uppercase;font-weight:700}.model-note p{margin:8px 0}.model-note a{font-size:12px}
dialog{background:var(--panel-solid);border:1px solid var(--line);border-radius:16px;padding:12px;max-width:95vw;max-height:95vh}
dialog::backdrop{background:rgba(10,13,15,.82);backdrop-filter:blur(6px)}dialog img{max-width:85vw;max-height:87vh;display:block;border-radius:8px}
#closeDialog{position:sticky;top:0;float:right;border:0;background:var(--cream);color:var(--ink);border-radius:50%;width:34px;height:34px;font-size:22px;line-height:1}

/* medium screens: narrower panel */
@media(max-width:1180px){
  .sidebar{width:340px}.search{margin-right:calc(356px - 16px)}
  .view-tools{right:372px;max-width:calc(100% - 468px)}.scene-hint{right:372px}
}
/* small screens: scene on top, panel below as normal flow */
@media(max-width:900px){
  body{overflow:auto}.stage{height:auto;overflow:visible;display:block}
  .map-card{position:relative;inset:auto;height:76svh;min-height:520px}
  .topbar{top:10px;left:10px;right:10px;gap:8px}.brand{padding:6px 12px 6px 6px}.brand-text small{display:none}
  .search{margin:0 0 0 auto;flex:1;max-width:none}.search input{width:100%;height:40px}.search input:focus{width:100%}
  .scene-heading{left:18px;top:70px}.scene-heading h1{font-size:44px;letter-spacing:-2px}.scene-heading>p:last-child{display:none}
  .floor-controls{left:50%;top:auto;bottom:62px;transform:translateX(-50%);flex-direction:row;margin-top:0;border-radius:999px;max-width:calc(100% - 20px);overflow-x:auto;scrollbar-width:none}
  .floor-bar{flex-direction:row}.floor-controls button{width:36px;height:34px}.cut{border-top:0;border-left:1px solid var(--line);flex-direction:row;width:auto;padding:0 8px;gap:6px}.cut span{display:none}
  .view-tools{left:10px;right:10px;bottom:10px;max-width:none;width:auto;margin:0;border-radius:18px}
  .scene-hint{display:none}
  .sidebar{position:relative;inset:auto;width:auto;margin:0;border-radius:24px 24px 0 0;border-bottom:0;max-height:none;overflow:visible;backdrop-filter:none;background:var(--panel-solid);margin-top:-16px;z-index:6;padding:24px 18px 28px}
  #roomList{grid-template-columns:repeat(6,minmax(0,1fr))}
}
@media(max-width:520px){#roomList{grid-template-columns:repeat(4,minmax(0,1fr))}.details h2{font-size:30px}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;animation:none!important;transition:none!important}}

/* schedule: day chips + agenda cards, and the full-week timeline */
.day-chips{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px;margin-top:14px}
.day-chips button{display:grid;gap:2px;justify-items:center;padding:8px 0 7px;border:1px solid transparent;border-radius:12px;background:var(--raise);color:var(--cream);transition:background .2s,transform .2s var(--ease)}
.day-chips button span{font:700 13px Manrope,Arial,sans-serif}.day-chips button small{font-size:9px;color:var(--muted)}
.day-chips button:hover:not(:disabled){border-color:var(--yellow);transform:translateY(-1px)}
.day-chips button[aria-pressed=true]{background:var(--yellow);color:var(--yellow-ink)}.day-chips button[aria-pressed=true] small{color:#5d4b10}
.day-chips button:disabled{opacity:.3;cursor:default}
.agenda{display:grid;gap:8px;margin-top:12px;max-height:340px;overflow:auto;padding-right:2px;scrollbar-width:thin;scrollbar-color:var(--raise-2) transparent}
.sidebar.focused .agenda{max-height:none}
.block{position:relative;display:grid;gap:3px;padding:11px 12px 11px 16px;background:var(--raise);border-radius:12px;animation:rise .35s var(--ease) backwards}
.block::before{content:'';position:absolute;left:0;top:9px;bottom:9px;width:4px;border-radius:0 4px 4px 0;background:hsl(var(--hue) 62% 62%)}
.block time{font:700 15px Manrope,Arial,sans-serif;letter-spacing:-.3px;color:hsl(var(--hue) 70% 78%)}
.block strong{font-size:13px;font-weight:600;line-height:1.35}.block span{font-size:11px;color:var(--muted);line-height:1.5}
.ghost{width:100%;margin-top:12px;padding:11px;border:1px solid var(--line);background:transparent;border-radius:999px;font-size:12px;color:var(--cream);transition:border-color .2s,background .2s}
.ghost:hover{border-color:var(--yellow);background:var(--raise)}
.pending-note{font-size:12px;line-height:1.6;color:var(--muted);padding:12px 14px;border:1px dashed var(--line);border-radius:12px;margin:14px 0 0}
.schedule-head h3{color:var(--muted)}
#weekDialog{width:min(1240px,96vw);height:min(900px,94vh);padding:0;display:none;flex-direction:column;background:var(--panel-solid);color:var(--cream)}
#weekDialog[open]{display:flex}
#weekDialog>header{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;padding:22px 26px 14px}
#weekDialog h2{font:600 26px/1.1 Manrope,Arial,sans-serif;letter-spacing:-.8px;margin:0}
#weekDialog>header button{flex:none;border:0;background:var(--cream);color:var(--ink);border-radius:50%;width:36px;height:36px;font-size:22px;line-height:1}
#weekDialog>.microcopy{padding:0 26px 16px;margin:0}
.week-grid{flex:1;overflow:auto;padding:0 18px 8px 26px;scrollbar-width:thin}
.week-head,.week-body{display:grid;grid-template-columns:52px repeat(7,minmax(130px,1fr));gap:6px;min-width:1000px}
.week-head{position:sticky;top:0;z-index:2;background:var(--panel-solid);padding-bottom:8px}
.week-head span{display:grid;gap:2px;padding:4px 2px}.week-head b{font:700 13px Manrope,Arial,sans-serif}.week-head small{font-size:10px;color:var(--muted)}
.week-hours{position:relative}.week-hours span{position:absolute;right:6px;transform:translateY(-6px);font-size:10px;color:var(--faint)}
.week-col{position:relative;border-left:1px solid var(--line);background-image:linear-gradient(var(--line) 1px,transparent 1px);background-size:100% 63px}
.week-block{position:absolute;left:3px;right:3px;overflow:hidden;padding:5px 7px;border-radius:8px;background:hsl(var(--hue) 40% 24%);border-left:3px solid hsl(var(--hue) 65% 62%);display:grid;align-content:start;gap:1px}
.week-block i{font:700 10px Manrope,Arial,sans-serif;font-style:normal;color:hsl(var(--hue) 75% 80%)}.week-block strong{font-size:11px;line-height:1.25;font-weight:600}.week-block small{font-size:9.5px;color:hsl(var(--hue) 20% 76%);line-height:1.3}
@media(max-width:700px){#weekDialog{width:100vw;height:100svh;max-width:100vw;max-height:100svh;border-radius:0}}

.scene-heading{transition:opacity .6s var(--ease)}.stage:has(.sidebar.focused) .scene-heading{opacity:0}

/* nodos IoT piloto (datos en vivo del servicio central) */
.nodes{padding:20px 0;border-bottom:1px solid var(--line)}.nodes .eyebrow{display:block}
#nodeList{display:grid;gap:8px;margin:10px 0 4px}
.node-card{background:var(--raise);border:1px solid transparent;border-radius:14px;padding:0}
.node-card[data-state=connected]{border-color:rgba(143,194,154,.45)}
.node-card summary{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 14px;cursor:pointer;list-style:none}
.node-card summary::-webkit-details-marker{display:none}.node-card summary strong{font-size:13px;font-weight:600;line-height:1.3}
.pill{font-size:10px;padding:4px 9px;border-radius:999px;background:rgba(241,237,224,.1);color:var(--muted);white-space:nowrap}
.node-card[data-state=connected] .pill{background:rgba(143,194,154,.18);color:var(--ok)}
.node-card dl{margin:0;padding:0 14px 12px;display:grid;gap:7px}.node-card dl>div{display:flex;justify-content:space-between;gap:12px;font-size:12px}
.node-card dt{color:var(--muted)}.node-card dd{margin:0;text-align:right}
.sidebar.focused .nodes{display:none}
