:root{font-family:Inter,"Noto Sans TC","Microsoft JhengHei",sans-serif;color:#233440;background:#edf1f4;font-synthesis:none}*{box-sizing:border-box}body{margin:0}button{font:inherit;font-size:14px;min-height:44px;border:1px solid #cbd4db;border-radius:8px;background:#fff;color:#233440;padding:0 16px;cursor:pointer;transition:background .15s,box-shadow .15s}button:hover{background:#e7eff3}button:focus-visible,canvas:focus-visible{outline:3px solid #197c99;outline-offset:3px}button:disabled{opacity:.45;cursor:wait}button[aria-pressed=true]{background:#173e50;color:#fff;border-color:#173e50}button[hidden]{display:none}#viewer{height:100vh;height:100dvh;min-height:480px;position:relative;overflow:hidden}canvas{display:block;width:100%;height:100%;touch-action:none}header{position:absolute;left:32px;right:32px;top:28px;display:flex;justify-content:space-between;align-items:center;pointer-events:none;gap:16px}header button{pointer-events:auto;background:#ffffffd9;backdrop-filter:blur(12px)}.identity{display:flex;gap:14px;align-items:center}.mark{font-size:35px;line-height:1;color:#31677c;border-right:1px solid #b7c7d0;padding-right:17px}h1{font-size:22px;letter-spacing:.12em;font-weight:600;margin:0 0 6px}.identity p{font-size:14px;letter-spacing:.07em;margin:0;color:#506675}.identity p span{color:#778b97;font-size:12px;margin-left:10px}footer{position:absolute;bottom:24px;left:20px;right:20px;display:flex;flex-direction:column;align-items:center;pointer-events:none}.toolbar{display:flex;gap:6px;align-items:center;padding:8px;background:#fffffff2;border:1px solid #d8e0e5;border-radius:12px;box-shadow:0 10px 40px #142c4112;pointer-events:auto;backdrop-filter:blur(12px)}.toolbar button{border-color:transparent;background:transparent}.toolbar button:hover{background:#e5edf1}.toolbar button[aria-pressed=true]{background:#173e50}.toolbar button:first-child{background:#173e50;color:white}.divider{height:24px;width:1px;background:#d9e0e4;margin:0 5px}.instructions{font-size:14px;color:#49616f;margin:12px 0 7px;line-height:1.6;text-align:center}.note{font-size:12px;color:#647a87;margin:0;text-align:center}.touch{display:none}.axis{position:absolute;bottom:32px;right:36px;display:grid;text-align:center;color:#5a7484;gap:6px}.axis span{font-size:24px;font-weight:300;letter-spacing:.05em}.axis small{font-size:12px}#loading{position:absolute;left:50%;top:45%;transform:translate(-50%,-50%);padding:28px 32px;border:1px solid #d1dce3;border-radius:12px;background:#ffffffed;display:grid;justify-items:center;gap:14px;min-width:280px;max-width:calc(100% - 32px);box-shadow:0 8px 40px #19344914;text-align:center}#loading[hidden]{display:none}#load-title{font-size:16px}#load-detail{font-size:14px;color:#526975;line-height:1.6}.spinner{width:28px;height:28px;border:2px solid #d9e6ec;border-top-color:#31677c;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}dialog{padding:20px;border:1px solid #cbd4db;border-radius:14px;width:min(1080px,94vw);max-height:90vh;background:#fff;color:#233440;box-shadow:0 24px 100px #0004}dialog::backdrop{background:#152a37aa;backdrop-filter:blur(5px)}.dialog-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:14px}h2{font-size:18px;margin:0}dialog img{display:block;width:100%;max-height:66vh;object-fit:contain;border-radius:5px}dialog p{font-size:14px;margin:14px 0 0;line-height:1.7;color:#526975}#close-reference{min-width:44px;padding:0}@media(pointer:coarse){.desktop{display:none}.touch{display:inline}}@media(max-width:700px){header{left:18px;right:18px;top:20px}.mark{display:none}h1{font-size:19px}.secondary{padding:0 12px}.axis{display:none}footer{bottom:18px;left:10px;right:10px}.toolbar{gap:2px;padding:6px;flex-wrap:wrap;justify-content:center;max-width:100%}.toolbar button{padding:0 10px}.divider{margin:0 1px}.instructions{font-size:13px}.note{max-width:90%}}@media(prefers-reduced-motion:reduce){.spinner{animation:none}button{transition:none}}
.toolbar{flex-wrap:wrap;justify-content:center;max-width:100%}.instructions{max-width:100%;text-wrap:balance}@media(max-width:1100px){.axis{display:none}}
#house-labels{position:absolute;inset:0;pointer-events:none;overflow:hidden}.house-label{position:absolute;left:0;top:0;font-size:14px;font-weight:650;letter-spacing:.03em;color:#743921;background:#fffffff0;padding:5px 9px;border:1px solid #caa998;border-radius:5px;box-shadow:0 3px 12px #1b2d3814;white-space:nowrap}.house-label[hidden]{display:none}.scene-settings{position:absolute;top:108px;left:28px;width:222px;padding:14px 16px;background:#fffffff0;border:1px solid #d2dce2;border-radius:10px;box-shadow:0 6px 24px #1c354514;backdrop-filter:blur(12px);font-size:14px}.scene-settings summary{cursor:pointer;min-height:24px;font-weight:600}.scene-settings summary:focus-visible{outline:3px solid #197c99}.sun-heading{display:flex;justify-content:space-between;margin-top:16px;align-items:center}.sun-heading output{font-variant-numeric:tabular-nums;font-weight:600;color:#8b512b}#sun-time{width:100%;margin:6px 0 0;min-height:32px;accent-color:#aa6839;cursor:pointer}.sun-scale{display:flex;justify-content:space-between;color:#6a7d86;font-size:12px;margin-bottom:12px}#sun-play{width:100%;min-height:38px}.settings-bottom{display:flex;justify-content:space-between;align-items:center;margin-top:5px}.labels-option{display:flex;align-items:center;gap:6px;min-height:44px;cursor:pointer}.labels-option input{width:16px;height:16px;accent-color:#173e50}.compass{position:relative;width:76px;height:76px;color:#6e7e84}.compass span{position:absolute;left:31px;top:28px;font-size:13px;line-height:18px}.compass #north{color:#ab5033;font-weight:700}.compass i{position:absolute;left:31px;top:28px;font-style:normal;color:#a5b3bb}#sun-description{font-size:12px;color:#647a87;line-height:1.5;margin:0}.scene-settings:not([open]){width:auto}@media(max-width:700px){.scene-settings{top:83px;left:16px;width:210px}.house-label{font-size:12px;padding:4px 6px}}
#window-status{font-size:13px;line-height:1.6;color:#8b512b;margin:9px 0 3px}.labels-option #people-motion{accent-color:#173e50}dialog a{color:#225f78;text-underline-offset:3px;margin-left:8px}

#asset-retry{pointer-events:auto;min-height:32px;margin-top:6px;font-size:12px}#house-labels{z-index:1}header,.scene-settings,footer,#loading{z-index:2}

.house-label{background:#fff}

#house-labels.labels-accessible{inset:auto;width:1px;height:1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.minimap{position:absolute;right:28px;top:108px;width:240px;background:#fffffff5;border:1px solid #d2dce2;border-radius:10px;padding:8px;z-index:2;box-shadow:0 6px 24px #1c354514}.map-heading{display:flex;justify-content:space-between;align-items:center;gap:8px}.map-heading button{padding:0 8px;min-height:34px;font-size:13px;border:0;background:transparent}.map-stage{position:relative;overflow:hidden;line-height:0}.map-stage img{display:block;width:100%;height:auto;border-radius:4px}.map-content{margin-top:6px}.map-position-status{font-size:11px;line-height:1.4;color:#526975;margin:7px 3px 2px}.minimap.collapsed{width:auto}.minimap.collapsed .map-content{display:none}.map-position{position:absolute;width:12px;height:12px;border-radius:50%;background:#007bbd;border:2px solid #fff;box-shadow:0 0 0 2px #007bbd,0 1px 7px #0008;transform:translate(-50%,-50%);pointer-events:none}.map-position i{position:absolute;left:-3px;top:-13px;width:14px;height:20px;background:#007bbd99;clip-path:polygon(50% 0,100% 100%,50% 70%,0 100%);transform-origin:50% 17px;transform:rotate(var(--heading))}.map-position.outside{background:#ad5d24}.map-position[hidden]{display:none}#map-dialog{width:min(960px,95vw)}#map-dialog .map-stage{width:min(82vw,calc(70vh * 1.122));margin:auto}#map-dialog .map-stage img{max-height:none}#map-dialog .map-position-status{text-align:center}#walk-controls{position:absolute;left:28px;right:28px;bottom:145px;display:flex;justify-content:space-between;align-items:flex-end;pointer-events:none;z-index:3}#walk-controls[hidden]{display:none}.height-controls{pointer-events:auto;display:grid;gap:6px;padding:8px;background:#fffffff0;border:1px solid #cbd4db;border-radius:12px;box-shadow:0 6px 24px #1c354514}.height-controls>div{display:flex;gap:6px}.height-controls button{padding:0 12px;touch-action:none;user-select:none}.height-controls output{font-size:12px;text-align:center;color:#526975;font-variant-numeric:tabular-nums}#walk-joystick{width:116px;height:116px;border-radius:50%;position:relative;pointer-events:auto;touch-action:none;user-select:none;background:#ffffffb8;border:2px solid #91a7b8;box-shadow:0 4px 22px #10273425}.joystick-knob{position:absolute;left:calc(50% - 21px);top:calc(50% - 21px);width:42px;height:42px;border-radius:50%;background:#173e50dc;border:2px solid #fff;box-shadow:0 2px 8px #142c4140}.joystick-arrow{position:absolute;color:#527082;font-size:12px}.joystick-arrow.up{top:6px;left:50%;transform:translateX(-50%)}.joystick-arrow.down{bottom:6px;left:50%;transform:translateX(-50%)}.joystick-arrow.left{left:6px;top:50%;transform:translateY(-50%)}.joystick-arrow.right{right:6px;top:50%;transform:translateY(-50%)}#scene{touch-action:none}@media(pointer:fine){#walk-joystick{visibility:hidden}}@media(max-width:700px){.minimap{top:83px;right:12px;width:148px;padding:5px}.map-heading{gap:0}.map-heading button{padding:0 3px;font-size:12px;min-height:30px}.map-position-status{font-size:10px}.scene-settings{max-width:calc(100vw - 186px);padding:10px}.scene-settings[open]{z-index:4;max-width:none;width:210px}.toolbar{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));width:100%;gap:3px}.toolbar button{font-size:12px;padding:0 2px;min-height:38px;white-space:nowrap}.toolbar #reset,.toolbar #walk{grid-column:span 2}.toolbar .divider{display:none}.instructions{font-size:11px;margin:7px 0 4px}.note{font-size:10px}#walk-controls{left:12px;right:12px;bottom:205px}.height-controls{padding:6px;gap:4px}.height-controls button{font-size:12px;padding:0 7px;min-height:38px}#walk-joystick{width:106px;height:106px;visibility:visible}.height-controls output{font-size:11px}}@media(max-height:550px){.minimap{width:140px}.map-position-status{display:none}#walk-controls{bottom:120px}#walk-joystick{width:90px;height:90px}.height-controls button{min-height:32px}.instructions,.note{display:none}.scene-settings[open]{max-height:55vh;overflow:auto}}
/* The blue point is the observer; the fading sector points into the view. */
.map-position{--fan-size:116px;background:transparent;border:0;box-shadow:none;width:14px;height:14px;isolation:isolate}
.map-position::after{content:"";position:absolute;inset:0;border-radius:50%;background:#285ba5;border:2px solid #fff;box-shadow:0 1px 5px #18385d55;z-index:1}
.map-position i{left:50%;top:50%;width:var(--fan-size);height:var(--fan-size);clip-path:none;border-radius:50%;background:conic-gradient(from calc(var(--fan-angle,60deg) * -.5),#f07c42e6 0deg,#f07c42e6 var(--fan-angle,60deg),transparent var(--fan-angle,60deg),transparent 360deg);-webkit-mask-image:radial-gradient(circle closest-side,#000 0%,#000c 25%,#0005 62%,transparent 100%);mask-image:radial-gradient(circle closest-side,#000 0%,#000c 25%,#0005 62%,transparent 100%);transform-origin:center;transform:translate(-50%,-50%) rotate(var(--heading,0deg));z-index:0}
.map-position.outside{background:transparent}.map-position.outside::after{background:#ad5d24}
#map-dialog .map-position{--fan-size:180px}
@media(max-width:700px){.map-position{--fan-size:88px}}

/* v14: keep the building as the main surface; controls occupy the edges. */
[hidden]{display:none!important}
#viewer{min-height:0}
header{top:20px;left:24px;right:auto}
.identity{display:block;width:236px;padding:6px 10px;background:#fffffff0;border-radius:8px}
.identity img{display:block;width:100%;height:auto}
.scene-settings{top:138px;left:24px;width:222px;padding:10px 14px}
.scene-settings summary{min-height:32px;display:list-item;align-content:center}
.settings-bottom{margin-top:0}
.right-rail{position:absolute;top:20px;right:24px;width:210px;display:flex;flex-direction:column;align-items:stretch;gap:8px;z-index:2;pointer-events:none}
.right-rail>*{pointer-events:auto}
.right-rail .minimap{position:relative;inset:auto;width:100%;padding:6px}
.right-rail .minimap.collapsed{width:100%}
.map-heading button{font-size:14px;min-height:40px;padding:0 4px}
.map-heading{gap:4px}
.map-position-status{display:none}
#reference{font-size:14px;background:#fffffff0;padding:0 8px}
.orientation{position:absolute;right:30px;top:calc(50% - 42px);z-index:2;pointer-events:none;border-radius:50%;background:#ffffffb8;border:1px solid #d2dce2;padding:4px}
.compass{width:76px;height:76px}
.compass span{font-size:14px}
footer{bottom:max(20px,env(safe-area-inset-bottom));left:16px;right:16px}
.toolbar{flex-wrap:nowrap;gap:4px;padding:7px}
.toolbar button{font-size:14px;padding:0 14px;white-space:nowrap}
.note{position:absolute;bottom:calc(100% + 10px);background:#ffffffeb;padding:8px 12px;border-radius:6px;max-width:90%;font-size:13px}
#asset-retry{position:absolute;bottom:calc(100% + 54px);background:#fff}
#walk-controls{left:24px;right:24px;bottom:calc(max(20px,env(safe-area-inset-bottom)) + 76px)}
.height-controls button{min-height:44px}
.height-controls output{font-size:12px}
@media(max-width:700px){
  header{top:max(10px,env(safe-area-inset-top));left:12px}
  .identity{width:142px;padding:4px 6px}
  .right-rail{top:max(10px,env(safe-area-inset-top));right:12px;width:144px;gap:6px}
  .right-rail .minimap{padding:3px}
  .map-heading{gap:0}
  .map-heading button{font-size:13px;padding:0 2px;min-height:40px}
  #map-enlarge{font-size:12px}
  #reference{font-size:13px;min-height:40px;padding:0 3px}
  .scene-settings,.scene-settings:not([open]){top:calc(max(10px,env(safe-area-inset-top)) + 70px);left:12px;width:142px;max-width:none;padding:5px 10px;font-size:14px}
  .scene-settings summary{min-height:34px}
  .scene-settings[open]{width:min(232px,calc(100vw - 172px));max-width:none;max-height:calc(100dvh - 224px);overflow:auto;padding:8px 12px;z-index:4}
  .sun-heading{margin-top:8px}
  .sun-scale{margin-bottom:8px}
  #sun-play{min-height:40px}
  .labels-option{min-height:40px}
  .orientation{right:12px;top:calc(50% - 48px);padding:0}
  footer{left:10px;right:10px;bottom:max(10px,env(safe-area-inset-bottom))}
  .toolbar{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));width:min(100%,540px);padding:5px;gap:3px}
  .toolbar button{font-size:14px;padding:0 2px;min-height:44px}
  .toolbar #reset,.toolbar #walk{grid-column:auto}
  #walk-controls{left:12px;right:12px;bottom:calc(max(10px,env(safe-area-inset-bottom)) + 114px)}
  .height-controls{padding:5px;gap:4px}
  .height-controls button{font-size:13px;padding:0 6px;min-height:44px}
  .height-controls output{font-size:12px}
  #walk-joystick{width:96px;height:96px;visibility:visible}
  #viewer:has(#scene-settings[open]) #walk-controls{visibility:hidden}
  #viewer:has(#scene-settings[open]) #walk-joystick{visibility:hidden}
  dialog{padding:12px}
}
@media(max-height:550px){
  header{top:10px;left:12px}.identity{width:120px;padding:3px 5px}
  .right-rail{top:10px;right:12px;width:148px;gap:4px}
  .right-rail .map-content{max-height:calc(100dvh - 165px);overflow:auto}
  .scene-settings,.scene-settings:not([open]){top:72px;left:12px;width:148px}
  .scene-settings[open]{width:220px;max-height:calc(100dvh - 145px);overflow:auto}
  .orientation{top:12px;right:174px;transform:scale(.85);transform-origin:top right}
  footer{bottom:max(8px,env(safe-area-inset-bottom))}
  .toolbar{display:grid;width:auto;grid-template-columns:repeat(8,minmax(0,1fr));padding:4px;gap:2px}
  .toolbar button{font-size:13px;min-height:40px;padding:0 6px}
  .toolbar #reset,.toolbar #walk{grid-column:auto}
  #walk-controls{bottom:68px;left:12px;right:12px}
  #walk-joystick{width:88px;height:88px}
  .height-controls button{min-height:36px}
  #viewer:has(#scene-settings[open]) #walk-controls,#viewer:has(#scene-settings[open]) #walk-joystick{visibility:hidden}
}

/* v15: 75% transparent surfaces; text, symbols and controls remain legible. */
.identity{background:transparent;padding:0;border:0;border-radius:0}
.scene-settings,.orientation,#reference,footer .toolbar{
  background:rgba(255,255,255,.25);
  backdrop-filter:none;
  border-color:rgba(150,166,177,.25);
  box-shadow:none;
}
.scene-settings #sun-play{background:rgba(255,255,255,.25)}
.scene-settings #sun-play:hover,#reference:hover{background:rgba(255,255,255,.4)}
.scene-settings,.orientation,#reference,footer .toolbar{color:#233440}

/* v16: independently open panels and a compass ring that follows the map. */
.right-rail .minimap,.height-controls,#walk-joystick{background:rgba(255,255,255,.25);box-shadow:none;backdrop-filter:none}
.height-controls button{background:rgba(255,255,255,.25)}
.minimap img{opacity:1}
.right-rail .orientation{position:relative;inset:auto;align-self:flex-end;width:84px;height:84px;padding:3px;transform:none;background:transparent;box-shadow:inset 0 0 0 9px rgba(255,255,255,.25);pointer-events:none}
.right-rail .orientation .compass{width:76px;height:76px}
.identity{width:260px}
#map-dialog .map-viewport{width:min(82vw,calc(70dvh * 1.122));aspect-ratio:1664/1483;position:relative;overflow:hidden;margin:auto;touch-action:none;cursor:grab;background:#fff;user-select:none}
#map-dialog .map-viewport.dragging{cursor:grabbing}
#map-dialog .map-stage{width:100%;height:100%;margin:0;transform-origin:0 0;overflow:visible;will-change:transform}
#map-dialog .map-stage img{width:100%;height:100%;pointer-events:none;max-height:none}
@media(max-width:700px){
  .identity{width:clamp(148px,45vw,184px)}
  .identity img{transform:translateY(-7px)}
  .scene-settings[open]{width:min(180px,calc(100vw - 172px));max-height:calc(100dvh - 360px);padding:8px 10px}
  .scene-settings{top:calc(max(10px,env(safe-area-inset-top)) + 70px)}
  #viewer:has(#scene-settings[open]) #walk-controls,#viewer:has(#scene-settings[open]) #walk-joystick{visibility:visible}
  .right-rail .orientation{margin-top:2px}
}
@media(max-height:550px){
  .identity{width:148px}.identity img{transform:translateY(-7px)}
  .scene-settings[open]{width:180px;max-height:calc(100dvh - 270px)}
  .right-rail .map-content{max-height:max(60px,calc(100dvh - 300px));overflow:auto}
  .right-rail .orientation{position:absolute;right:160px;bottom:0;top:auto;width:70px;height:70px;padding:0}
  .right-rail .orientation .compass{transform:scale(.86);transform-origin:top left}
  #viewer:has(#scene-settings[open]) #walk-controls,#viewer:has(#scene-settings[open]) #walk-joystick{visibility:visible}
}
.identity img{transform:translateY(-13.4%)}
