
:root{--ink:#241824;--pink:#ff65a7;--pink2:#ffc7dc;--cream:#fff1df;--cream2:#ffe3cf;--paper:#fff8ee;--shadow:#160e19;--muted:#796873;}
*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:#5fc6e9;color:var(--ink);font-family:"Trebuchet MS",Arial,sans-serif}
button,input,select{font:inherit}button{color:inherit}
#app{position:relative;width:100%;height:100%;overflow:hidden;background:#5fc6e9}
#viewport{position:absolute;inset:0;overflow:hidden;touch-action:none;cursor:grab}#viewport.dragging{cursor:grabbing}
#world{position:absolute;left:0;top:0;width:1536px;height:1024px;transform-origin:0 0;will-change:transform}
#mapimg{position:absolute;inset:0;width:1536px;height:1024px;object-fit:cover;pointer-events:none;user-select:none}
/* cover baked day/night UI from the approved concept art without touching the map art */
.day-cover{position:absolute;left:1245px;top:8px;width:275px;height:104px;border-radius:0 0 0 26px;background:linear-gradient(135deg,rgba(116,201,226,.96),rgba(155,226,242,.98));z-index:3;display:flex;align-items:flex-start;justify-content:flex-end;padding:20px 22px;pointer-events:none}
.day-cover span{background:var(--pink);border:3px solid var(--ink);box-shadow:0 4px 0 var(--ink);padding:9px 14px;border-radius:14px;font-weight:1000;font-size:13px}
/* mask baked player/status controls with ocean-toned paint so the fixed HUD remains persistent */
.bottom-mask-left{position:absolute;left:0;bottom:0;width:390px;height:110px;background:linear-gradient(180deg,rgba(68,180,221,.3),rgba(28,151,204,.97));z-index:3;pointer-events:none}
.bottom-mask-mid{position:absolute;left:535px;bottom:0;width:430px;height:112px;background:linear-gradient(180deg,rgba(56,183,224,.3),rgba(26,152,207,.97));z-index:3;pointer-events:none}
.hotspot{position:absolute;transform:translate(-50%,-50%);border:0;background:transparent;cursor:pointer;z-index:10;border-radius:28%;outline:0}
.hotspot::before{content:"";position:absolute;inset:10%;border-radius:30%;box-shadow:0 0 0 0 rgba(255,101,167,0);transition:.18s ease}
.hotspot:hover::before,.hotspot:focus-visible::before{box-shadow:0 0 0 4px rgba(255,255,255,.86),0 0 0 9px rgba(255,101,167,.82),0 0 34px 14px rgba(255,101,167,.38);background:rgba(255,255,255,.05)}
.hotspot.locked:hover::before,.hotspot.locked:focus-visible::before{box-shadow:0 0 0 4px rgba(255,255,255,.74),0 0 0 9px rgba(88,78,89,.65)}
.tip{position:absolute;left:50%;top:-12px;transform:translate(-50%,-100%) translateY(6px);opacity:0;pointer-events:none;white-space:nowrap;background:var(--cream);border:3px solid var(--ink);border-radius:12px;box-shadow:0 4px 0 var(--ink);padding:6px 9px;font-size:12px;font-weight:1000;transition:.16s;z-index:4}
.hotspot:hover .tip,.hotspot:focus-visible .tip{opacity:1;transform:translate(-50%,-100%)}
.tip small{font-size:9px;color:var(--muted);margin-left:5px}
.road-hit{position:absolute;z-index:9;border:0;background:transparent;cursor:pointer}
.road-hit:focus-visible{outline:3px solid #fff;box-shadow:0 0 0 7px var(--pink);border-radius:999px}
.hud{position:absolute;z-index:60}
.brand-card{left:18px;top:14px;width:174px;padding:8px 9px 11px;border:3px solid var(--ink);border-radius:17px;background:rgba(36,24,36,.92);box-shadow:0 5px 0 var(--ink);color:#fff}
.brand-card b{display:block;color:var(--pink2);font-family:Arial Black,Arial,sans-serif;font-size:17px;letter-spacing:-.5px}
.brand-card span{font-size:9px;opacity:.8;letter-spacing:.8px}
.nav{left:18px;top:92px;width:174px;display:grid;gap:6px}
.nav button{border:3px solid var(--ink);border-radius:13px;background:#ffd9e7;box-shadow:0 4px 0 var(--ink);font-weight:1000;padding:10px 11px;text-align:left;cursor:pointer}
.nav button:hover,.nav button.active{background:#ff9ec2;transform:translateY(-1px)}
.top-right{right:18px;top:18px;display:flex;gap:7px;align-items:center;padding:7px;border:3px solid var(--ink);background:rgba(35,26,40,.94);border-radius:16px;box-shadow:0 5px 0 rgba(20,12,22,.55);color:white}
.top-right .day{background:var(--pink);color:var(--ink);border:2px solid var(--ink);padding:8px 11px;border-radius:10px;font-weight:1000}
.top-right button{border:2px solid var(--ink);background:#ffd8e7;padding:8px 10px;border-radius:10px;font-weight:1000;cursor:pointer}
.player{left:50%;bottom:18px;transform:translateX(-50%);width:min(430px,calc(100vw - 390px));min-width:300px;border:3px solid var(--ink);border-radius:17px;background:#241b29;color:#fff;box-shadow:0 6px 0 #140e18;overflow:hidden}
.player-main{display:flex;align-items:center;gap:11px;padding:9px 11px;background:linear-gradient(90deg,#ff79ae,#ff5b9f);color:var(--ink)}
.cover{width:44px;height:44px;border:2px solid var(--ink);border-radius:8px;background:radial-gradient(circle at 35% 35%,#ff99c1,#a7225f 46%,#27131f 47%);display:grid;place-items:center;color:white;font-family:Arial Black;font-size:18px;flex:none}
.track{flex:1;min-width:0}.track b{display:block;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.track span{font-size:9px;opacity:.72}
.play{width:36px;height:36px;border:2px solid var(--ink);border-radius:50%;background:var(--cream);font-weight:1000;cursor:pointer}
.player-sub{display:flex;justify-content:space-between;align-items:center;padding:7px 11px;color:#e7cfdb;font-size:9px}
.zoom{right:18px;bottom:18px;display:flex;gap:5px;padding:5px;border:3px solid var(--ink);border-radius:14px;background:rgba(255,241,223,.92);box-shadow:0 4px 0 var(--ink)}
.zoom button{width:40px;height:38px;border:2px solid var(--ink);border-radius:9px;background:#ffd8e7;font-weight:1000;cursor:pointer}
.start{left:18px;bottom:18px;display:flex;align-items:center;gap:7px;padding:6px 7px 6px 12px;border:3px solid var(--ink);border-radius:15px;background:rgba(35,27,41,.95);box-shadow:0 5px 0 var(--ink);color:#fff;font-size:10px}
.start button{border:2px solid var(--ink);border-radius:999px;background:var(--pink);padding:8px 12px;font-weight:1000;cursor:pointer}
.panel{position:absolute;z-index:80;top:16px;bottom:16px;width:min(410px,calc(100vw - 32px));background:rgba(255,247,238,.97);border:4px solid var(--ink);border-radius:22px;box-shadow:0 10px 0 rgba(25,15,28,.65);backdrop-filter:blur(18px);overflow:auto;padding:17px;transform:translateX(-115%);opacity:0;pointer-events:none;transition:.24s ease}
.panel.left{left:204px}.panel.right{right:16px;transform:translateX(115%)}.panel.open{transform:translateX(0);opacity:1;pointer-events:auto}
.panel h2{font-family:Arial Black,Arial,sans-serif;margin:0 40px 4px 0;font-size:25px;letter-spacing:-1px}.sub{font-size:11px;color:var(--muted);margin-bottom:13px;line-height:1.35}
.close{position:absolute;right:11px;top:10px;width:35px;height:35px;border:2px solid var(--ink);border-radius:50%;background:#ffd6e5;font-weight:1000;cursor:pointer}
.row{width:100%;border:2px solid #786473;border-radius:12px;background:#fff;padding:10px;margin:7px 0;text-align:left;cursor:pointer}.row:hover{background:#ffe1eb}.rowtop{display:flex;justify-content:space-between;gap:8px}.tiny{font-size:10px;color:var(--muted);line-height:1.35}.badge{display:inline-block;border-radius:999px;background:var(--ink);color:white;padding:2px 6px;font-size:9px;font-weight:1000}.badge.lock{background:#857680}
.story-hero{margin:-3px -3px 13px;border:3px solid var(--ink);border-radius:15px;background:linear-gradient(135deg,#ffd0e1,#ffe7d5);min-height:115px;padding:18px;display:flex;flex-direction:column;justify-content:flex-end;overflow:hidden}
.story-hero h2{margin:0 0 4px;font-size:25px}.story-hero .kind{align-self:flex-start;background:var(--ink);color:white;border-radius:999px;padding:4px 8px;font-size:9px;font-weight:1000}
.story p{font-size:13px;line-height:1.48}.locked-card{padding:18px 5px;text-align:center}.lockmark{font-size:46px}.actionbar{display:flex;flex-wrap:wrap;gap:7px;margin:12px 0}.action{border:2px solid var(--ink);border-radius:10px;background:var(--pink);padding:8px 10px;font-weight:1000;cursor:pointer}.action.alt{background:var(--cream)}.related{display:flex;gap:6px;flex-wrap:wrap}.related button{border:1px solid #786473;background:white;border-radius:999px;padding:5px 8px;font-size:10px;cursor:pointer}
.filters{display:flex;gap:5px;flex-wrap:wrap;margin:8px 0 12px}.filters button{border:2px solid var(--ink);border-radius:999px;background:#ffd8e7;padding:5px 8px;font-size:9px;font-weight:1000;cursor:pointer}.filters button.active{background:var(--ink);color:white}
#interior{position:absolute;z-index:110;inset:0;display:none;align-items:center;justify-content:center;background:rgba(18,11,20,.78);backdrop-filter:blur(8px);padding:18px}
.ibox{position:relative;width:min(980px,96vw);max-height:94vh;overflow:auto;background:var(--cream);border:4px solid var(--ink);border-radius:20px;box-shadow:0 10px 0 #120c16;padding:12px}
.iwrap{position:relative;border:3px solid var(--ink);border-radius:14px;overflow:hidden;background:#f7dfcf}.iwrap img{display:block;width:100%;height:auto;max-height:74vh;object-fit:contain}
.ihot{position:absolute;width:30px;height:30px;border-radius:50%;border:2px solid white;background:rgba(255,93,155,.3);box-shadow:0 0 0 4px rgba(255,93,155,.18),0 0 20px rgba(255,93,155,.35);transform:translate(-50%,-50%);cursor:pointer;opacity:.18;transition:.15s}.iwrap:hover .ihot,.ihot:focus-visible{opacity:.92}.ihot:hover{transform:translate(-50%,-50%) scale(1.15)}
.icopy{display:flex;justify-content:space-between;gap:14px;align-items:flex-start;padding:10px 3px 0}.icopy h3{margin:0;font-family:Arial Black}#prop-copy{font-size:12px;color:#6a5664;min-height:34px;line-height:1.35}.modal-close{position:absolute;right:20px;top:20px;z-index:4;width:38px;height:38px;border:2px solid var(--ink);border-radius:50%;background:#ffd6e5;font-weight:1000;cursor:pointer}
.toast{position:absolute;z-index:130;left:50%;top:18px;transform:translate(-50%,-20px);opacity:0;background:var(--ink);color:white;border:2px solid white;border-radius:999px;padding:9px 13px;font-size:10px;font-weight:1000;pointer-events:none;transition:.18s}.toast.show{opacity:1;transform:translate(-50%,0)}
@media(max-width:820px){
.brand-card{display:none}.nav{left:8px;right:8px;top:8px;width:auto;display:flex;gap:4px;padding:4px;background:rgba(35,27,41,.94);border:2px solid var(--ink);border-radius:14px;overflow:auto}.nav button{min-width:43px;padding:8px;font-size:0;box-shadow:none;border-width:2px;text-align:center}.nav button::first-letter{font-size:14px}.top-right{right:8px;top:61px}.top-right .day{padding:6px 9px;font-size:10px}.top-right button{padding:6px 8px;font-size:10px}.start{display:none}.player{left:8px;right:8px;bottom:58px;transform:none;width:auto;min-width:0}.zoom{right:8px;bottom:8px}.panel.left,.panel.right{left:8px;right:8px;top:108px;bottom:8px;width:auto;transform:translateY(110%)}.panel.open{transform:translateY(0)}.day-cover{display:none}}
@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}


/* v3 layered landmark architecture */
.day-cover,.bottom-mask-left,.bottom-mask-mid{display:none!important}
#mapimg{filter:saturate(1.02) contrast(1.015);}
#spots{position:absolute;inset:0;z-index:10;pointer-events:none}
.landmark-sprite{position:absolute;transform:translate(-50%,-58%);border:0;background:transparent;padding:0;cursor:pointer;z-index:12;outline:0;pointer-events:auto;overflow:visible;transition:transform .18s ease,filter .18s ease,opacity .18s ease}
.landmark-sprite img{display:block;width:100%;height:100%;object-fit:contain;pointer-events:none;filter:drop-shadow(0 10px 5px rgba(30,18,29,.26));transition:filter .18s ease,transform .18s ease}
.landmark-sprite:hover,.landmark-sprite:focus-visible{transform:translate(-50%,-61%) scale(1.055);z-index:28}
.landmark-sprite:hover img,.landmark-sprite:focus-visible img{filter:drop-shadow(0 13px 7px rgba(30,18,29,.36)) saturate(1.07)}
.landmark-sprite:focus-visible::before{content:"";position:absolute;inset:8%;border-radius:34%;box-shadow:0 0 0 4px rgba(255,255,255,.88),0 0 0 9px rgba(255,101,167,.82),0 0 32px rgba(255,101,167,.44)}
.landmark-sprite.locked img{filter:grayscale(.62) saturate(.68) brightness(.88) opacity(.72) drop-shadow(0 8px 4px rgba(30,18,29,.22))}
.landmark-sprite.locked:hover img,.landmark-sprite.locked:focus-visible img{filter:grayscale(.30) saturate(.82) brightness(.95) opacity(.91) drop-shadow(0 10px 5px rgba(30,18,29,.28))}
.landmark-sprite.visited::after{content:"★";position:absolute;right:-1px;top:7px;width:23px;height:23px;display:grid;place-items:center;border:2px solid var(--ink);border-radius:50%;background:var(--pink);color:#fff;font-size:11px;box-shadow:0 3px 0 var(--ink);z-index:5}
.sprite-label{position:absolute;left:50%;top:calc(100% - 12px);transform:translateX(-50%);min-width:max-content;max-width:215px;padding:5px 8px;border:3px solid var(--ink);border-radius:11px;background:var(--cream);box-shadow:0 4px 0 var(--ink);font-size:11px;font-weight:1000;line-height:1.05;white-space:nowrap;pointer-events:none;z-index:6}
.landmark-sprite.locked .sprite-label{background:#e4dce2;color:#6e626d}.sprite-label small{color:#8b7683;font-size:8px;margin-left:3px}
/* hotspot rules from v2 are retained only for interior prop hotspots; location buttons now use the sprite geometry above. */
@media(max-width:820px){.sprite-label{font-size:9px;padding:4px 6px;border-width:2px;box-shadow:0 3px 0 var(--ink)}.landmark-sprite.visited::after{width:18px;height:18px;font-size:9px;border-width:1.5px}}


#roads{position:absolute;inset:0;z-index:11;pointer-events:none}
.road-label-ui{position:absolute;transform:translate(-50%,-50%) rotate(-2deg);pointer-events:auto;border:2px solid var(--ink);border-radius:9px;background:#ffc5db;padding:4px 7px;box-shadow:0 3px 0 var(--ink);font-size:9px;font-weight:1000;white-space:nowrap;cursor:pointer;z-index:11}
.road-label-ui:hover,.road-label-ui:focus-visible{transform:translate(-50%,-50%) rotate(0deg) scale(1.06);outline:2px solid #fff}
.story-hero-art{min-height:170px;position:relative;justify-content:flex-end;padding-left:155px}
.story-hero-art>img{position:absolute;left:14px;bottom:8px;width:135px;height:145px;object-fit:contain;filter:drop-shadow(0 7px 4px rgba(30,18,29,.25))}
.story-hero-art>.locked-story-art{filter:grayscale(.6) opacity(.68)}
.story-copy{position:relative;z-index:2}
@media(max-width:820px){.road-label-ui{font-size:8px;padding:3px 5px}.story-hero-art{padding-left:118px}.story-hero-art>img{width:105px;height:125px}}



/* v4 physical overscan architecture */
#world{width:4096px!important;height:4096px!important;transform-origin:0 0;will-change:transform;}
#bleedimg{position:absolute;inset:0;width:4096px;height:4096px;object-fit:cover;pointer-events:none;user-select:none;z-index:0}
#town{position:absolute;left:1280px;top:1536px;width:1536px;height:1024px;z-index:2}
#town #mapimg{position:absolute;inset:0;width:1536px;height:1024px;object-fit:cover;pointer-events:none;user-select:none;z-index:0}
#town #roads{position:absolute;inset:0;z-index:9}
#town #spots{position:absolute;inset:0;z-index:10;pointer-events:none}
/* No blank fallback should ever be visible; viewport itself uses painted-ocean base. */
#viewport{background:#58bee1}

