:root{--ink:#2a2620;--gold:#D4952A;--gold-hi:#F0B23E;--parch:#f4ecd2;--parch2:#efe3c2;--sea:#9cc6b8;--cream:#fbf6e7;
--display:"Cinzel Decorative",serif;--map:"Cinzel",serif;--body:"Spectral",Georgia,serif;}
*{box-sizing:border-box}html,body{margin:0;height:100%;overflow:hidden;background:var(--sea);font-family:var(--body);color:var(--ink);-webkit-font-smoothing:antialiased;user-select:none}
button{font-family:inherit}
.viewport{position:fixed;inset:0;overflow:hidden;cursor:grab;background:var(--sea);touch-action:none}.viewport.drag{cursor:grabbing}
.map{position:absolute;top:0;left:0;width:2600px;height:1700px;transform-origin:0 0;will-change:transform}
.mapart{position:absolute;inset:0;width:100%;height:100%;display:block}
.token{position:absolute;transform:translate(-50%,-100%);background:none;border:none;padding:0;cursor:pointer;display:flex;flex-direction:column;align-items:center;filter:drop-shadow(0 8px 8px rgba(0,0,0,.25))}
.token .disc{width:88px;height:88px;border-radius:50%;overflow:hidden;border:4px solid var(--gold);box-shadow:0 0 0 3px var(--ink);background:#fff;transition:transform .2s}
.token .disc img{width:100%;height:100%;object-fit:cover;display:block}
.token .peg{width:4px;height:13px;background:var(--ink);margin-top:-2px}
.token .nameb{margin-top:2px;background:var(--parch);border:2.5px solid var(--ink);border-radius:4px;padding:2px 9px;font-family:var(--map);font-weight:700;font-size:12.5px;letter-spacing:.5px;color:#6c4f18;white-space:nowrap}
.token .bob{animation:bob 5s ease-in-out infinite}
.token:hover .disc{transform:scale(1.12) translateY(-4px)}.token:hover .nameb{background:var(--gold-hi);color:#3a2a08}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}
.topbar{position:fixed;top:0;left:0;right:0;z-index:30;display:flex;align-items:center;justify-content:space-between;padding:14px 22px;pointer-events:none}
.wordmark{pointer-events:auto;font-family:var(--display);font-weight:900;font-size:20px;letter-spacing:2px;color:var(--cream);text-shadow:0 2px 0 var(--ink),0 0 14px rgba(0,0,0,.4)}.wordmark b{color:var(--gold-hi)}
.topnav{pointer-events:auto;display:flex;gap:8px}
.topnav button{font-family:var(--map);font-weight:700;font-size:12px;letter-spacing:1px;text-transform:uppercase;background:var(--parch);border:2.5px solid var(--ink);border-radius:5px;padding:8px 13px;cursor:pointer;color:#5c451a;box-shadow:0 3px 0 var(--ink)}
.topnav button:active{transform:translateY(3px);box-shadow:0 0 0 var(--ink)}.topnav .mint{background:var(--gold);color:#3a2a08}
.cartouche{position:fixed;top:60px;left:50%;transform:translateX(-50%);z-index:25;text-align:center;pointer-events:none;background:radial-gradient(120% 140% at 50% 0,rgba(244,236,210,.95),rgba(244,236,210,0) 78%);padding:10px 60px 26px}
.cartouche .sub{font-family:var(--map);font-size:11px;letter-spacing:5px;color:#6c4f18;text-transform:uppercase}
.cartouche h1{font-family:var(--display);font-weight:900;color:#5c3f12;margin:2px 0 0;font-size:clamp(26px,4.6vw,46px);letter-spacing:1px;text-shadow:0 2px 0 rgba(255,255,255,.5)}
.cartouche .lvl{font-family:var(--map);font-size:11px;letter-spacing:3px;color:#8a6a28;margin-top:4px}
@media(max-width:680px){
 .topbar{padding:8px 10px}
 .wordmark{font-size:15px;letter-spacing:1px}
 .topnav{gap:5px}
 .topnav button{font-size:9.5px;letter-spacing:.2px;padding:6px 8px;border-width:2px;border-radius:4px;box-shadow:0 2px 0 var(--ink)}
 .topnav #btnTown{display:none}
 .cartouche{top:44px;padding:6px 12px 14px}
 .cartouche .sub{font-size:9px;letter-spacing:2px}
 .cartouche h1{font-size:21px;letter-spacing:.5px}
 .cartouche .lvl{font-size:9px;letter-spacing:1.5px;margin-top:2px}
 .compass{width:58px;height:58px;right:12px;bottom:12px}
 .zoom{right:12px;bottom:80px;gap:5px}
 .zoom button{width:40px;height:40px}
 .hint{font-size:10px;letter-spacing:1px;padding:6px 13px;bottom:14px}
}
.compass{position:fixed;right:20px;bottom:20px;z-index:25;width:92px;height:92px;pointer-events:none;filter:drop-shadow(0 4px 6px rgba(0,0,0,.3))}
.legend{position:fixed;left:18px;bottom:18px;z-index:25;background:var(--parch);border:3px solid var(--ink);border-radius:6px;padding:11px 13px;box-shadow:0 4px 0 var(--ink);max-width:208px}
.legend h4{font-family:var(--map);font-weight:700;margin:0 0 7px;font-size:12px;letter-spacing:2px;color:#5c451a;text-transform:uppercase}
.legend .row{display:flex;align-items:center;gap:8px;font-size:12px;color:#5c451a;margin:3px 0}
.legend .dot{width:12px;height:12px;border-radius:50%;border:2px solid var(--ink);flex:0 0 auto}
@media(max-width:640px){.legend{display:none}}
.lore{position:fixed;left:18px;top:92px;z-index:24;width:250px;background:var(--parch);border:3px solid var(--ink);border-radius:6px;padding:12px 15px;box-shadow:0 4px 0 var(--ink)}
.lore h4{font-family:var(--display);font-weight:900;margin:0 0 7px;font-size:15px;letter-spacing:1px;color:#5c3f12}
.lore p{font-family:var(--body);font-size:12.5px;line-height:1.5;color:#5c451a;margin:0 0 8px}
.lore p:last-child{margin-bottom:0}
.lore .q{font-style:italic;color:#8a6a28}
@media(max-width:1040px),(max-height:760px){.lore{display:none}}
.zoom{position:fixed;right:20px;bottom:124px;z-index:25;display:flex;flex-direction:column;gap:6px}
.zoom button{width:40px;height:40px;font-size:22px;line-height:1;background:var(--parch);border:3px solid var(--ink);border-radius:6px;cursor:pointer;color:#5c451a;box-shadow:0 3px 0 var(--ink)}
.zoom button:active{transform:translateY(3px);box-shadow:0 0 0 var(--ink)}
.hint{position:fixed;bottom:22px;left:50%;transform:translateX(-50%);z-index:24;background:rgba(42,38,32,.85);color:var(--cream);font-family:var(--map);font-size:12px;letter-spacing:2px;padding:8px 18px;border-radius:20px;transition:opacity .6s;pointer-events:none}
/* focus (grow) */
.flayer{position:fixed;inset:0;z-index:60;display:none;align-items:center;justify-content:center;background:rgba(28,40,46,0);transition:background .35s}
.flayer.on{display:flex}.flayer.show{background:rgba(28,40,46,.66);backdrop-filter:blur(3px)}
.flyer{position:fixed;object-fit:cover;border:4px solid var(--gold);box-shadow:0 0 0 3px var(--ink),0 24px 60px rgba(0,0,0,.5);transition:left .45s cubic-bezier(.2,.85,.25,1),top .45s cubic-bezier(.2,.85,.25,1),width .45s cubic-bezier(.2,.85,.25,1),height .45s cubic-bezier(.2,.85,.25,1),border-radius .45s;z-index:62}
.card{position:relative;z-index:61;width:min(720px,94vw);max-height:90vh;display:grid;grid-template-columns:46% 54%;background:var(--parch);border:3px solid var(--ink);border-radius:8px;box-shadow:0 30px 80px rgba(0,0,0,.5);opacity:0;transform:translateY(14px);transition:opacity .3s .12s,transform .3s .12s}
.flayer.show .card{opacity:1;transform:none}
.card::before{content:"";position:absolute;top:0;bottom:0;left:46%;width:2px;background:repeating-linear-gradient(180deg,var(--ink) 0 6px,transparent 6px 12px);opacity:.3}
.plate{padding:20px;display:flex;align-items:center;justify-content:center}
.pslot{width:100%;aspect-ratio:1/1;border:3px solid var(--ink);border-radius:6px;overflow:hidden;background:#fff}
.pslot img{width:100%;height:100%;object-fit:cover;display:block}
.entry{padding:24px 26px;overflow-y:auto}
.entry .where{font-family:var(--map);font-size:11px;letter-spacing:3px;text-transform:uppercase;color:#8a6a28}
.entry h2{font-family:var(--display);font-weight:900;color:#4a3410;margin:4px 0 0;font-size:32px;line-height:1}
.entry .role{font-family:var(--map);font-weight:700;font-size:12.5px;letter-spacing:2px;text-transform:uppercase;color:var(--gold);margin-top:6px}
.stars{margin-top:9px;color:var(--gold);font-size:17px;letter-spacing:3px}.stars .o{color:#cdbf9c}
.stars span.r{font-family:var(--map);font-size:11px;letter-spacing:2px;color:#8a6a28;text-transform:uppercase;margin-left:6px}
.tale{font-style:italic;font-size:16.5px;line-height:1.45;color:#5c451a;margin:14px 0 16px}
.tags{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:18px}
.tag{font-family:var(--map);font-size:11px;letter-spacing:.5px;border:2px solid var(--ink);border-radius:4px;padding:4px 9px;color:#5c451a;background:#fbf3da}
.actions{display:flex;gap:10px;flex-wrap:wrap}
.act{font-family:var(--map);font-weight:700;font-size:12px;letter-spacing:1px;text-transform:uppercase;padding:11px 16px;border:2.5px solid var(--ink);border-radius:6px;cursor:pointer;box-shadow:0 3px 0 var(--ink);color:#4a3410;background:var(--parch2)}
.act.prime{background:var(--gold);color:#3a2a08}.act:active{transform:translateY(3px);box-shadow:0 0 0 var(--ink)}
.pclose{position:absolute;top:10px;right:12px;z-index:6;width:34px;height:34px;border-radius:50%;border:2.5px solid var(--ink);background:var(--parch);cursor:pointer;font-size:18px;color:#4a3410}
.turn{position:absolute;bottom:12px;z-index:65;font-family:var(--map);font-weight:700;font-size:11px;letter-spacing:1px;color:#5c451a;background:var(--parch2);border:2px solid var(--ink);border-radius:18px;padding:5px 12px;cursor:pointer;box-shadow:0 2px 0 var(--ink)}
.turn.prev{left:14px}.turn.next{right:14px}.turn:hover{background:var(--gold);color:#3a2a08}.turn:active{transform:translateY(2px);box-shadow:0 0 0 var(--ink)}
@media(max-width:620px){.card{grid-template-columns:1fr;max-height:92vh}.card::before{display:none}.entry h2{font-size:26px}}
@media(prefers-reduced-motion:reduce){.token .bob{animation:none}.flyer{transition:none}}
/* villains */
.token.villain .disc{border-color:#c0392b;background:#15171a;box-shadow:0 0 0 3px #140f0d,0 0 18px rgba(192,57,43,.55)}
.token.villain .nameb{background:#2a1416;border-color:#140f0d;color:#f3d6cf}
.token.villain:hover .nameb{background:#c0392b;color:#fff}
.card.evil{background:#241b1b;border-color:#0e0b0a;color:#f0e0da}
.card.evil::before{background:repeating-linear-gradient(180deg,#0e0b0a 0 6px,transparent 6px 12px);opacity:.5}
.card.evil .where{color:#d98b80}
.card.evil .entry h2{color:#f6e9e5}
.card.evil .role{color:#e0563f}
.card.evil .stars{color:#e0563f}.card.evil .stars .o{color:#5a4a47}.card.evil .stars span.r{color:#d98b80}
.card.evil .tale{color:#e7cfc9}
.card.evil .tag{background:#3a2a2a;border-color:#0e0b0a;color:#f0d8d2}
.card.evil .pslot{border-color:#0e0b0a;background:#15171a}
.card.evil .act{background:#3a2a2a;border-color:#0e0b0a;color:#f0d8d2;box-shadow:0 3px 0 #0e0b0a}
.card.evil .act.prime{background:#c0392b;color:#fff}
.card.evil .pclose{background:#3a2a2a;border-color:#0e0b0a;color:#f0d8d2}
.card.evil .turn{background:#3a2a2a;border-color:#0e0b0a;color:#f0d8d2}.card.evil .turn:hover{background:#c0392b;color:#fff}
/* mint modal */
.modal{position:fixed;inset:0;z-index:80;display:none;align-items:center;justify-content:center;background:rgba(28,40,46,.66);backdrop-filter:blur(3px);padding:20px}
.modal.on{display:flex}
.msheet{position:relative;width:min(420px,92vw);background:var(--parch);border:3px solid var(--ink);border-radius:10px;box-shadow:0 30px 80px rgba(0,0,0,.5);padding:30px 26px 22px;text-align:center}
.msheet .mlogo{font-family:var(--display);font-weight:900;font-size:19px;letter-spacing:2px;color:#5c3f12}.msheet .mlogo b{color:var(--gold)}
.msheet h2{font-family:var(--display);font-weight:900;color:#4a3410;margin:10px 0 6px;font-size:29px;line-height:1.05}
.msheet .mlead{font-family:var(--body);font-size:18px;color:#5c451a;margin:0 0 6px}
.msheet p{font-family:var(--body);font-size:14.5px;line-height:1.5;color:#5c451a;margin:0 0 8px}
.msheet .mactions{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin:18px 0 12px}
.msheet .mactions .act{text-decoration:none}
.msheet .mnote{font-family:var(--map);font-size:10.5px;letter-spacing:1px;text-transform:uppercase;color:#8a6a28;margin:8px 0 0}
.mclose{position:absolute;top:10px;right:12px;width:34px;height:34px;border-radius:50%;border:2.5px solid var(--ink);background:var(--parch);cursor:pointer;font-size:18px;color:#4a3410}
/* worlds */
.world{position:absolute;inset:0}
.islehit{cursor:pointer}
.islepulse{pointer-events:none;animation:islepulse 2.4s ease-in-out infinite}
@keyframes islepulse{0%,100%{opacity:.05}50%{opacity:.32}}
/* Quant Stream — flowing power */
.qflow{stroke-dasharray:14 30;animation:qflow 1.1s linear infinite}
@keyframes qflow{to{stroke-dashoffset:-88}}
.qsource{transform-box:fill-box;transform-origin:center;animation:qpulse 1.9s ease-in-out infinite}
@keyframes qpulse{0%,100%{opacity:.35;transform:scale(1)}50%{opacity:.85;transform:scale(1.4)}}
.qripple{animation:qrip 2.4s ease-in-out infinite}
@keyframes qrip{0%,100%{opacity:.45}50%{opacity:1}}
.qspark{animation:qtw 2s ease-in-out infinite}
.qspark2{animation:qtw 2s ease-in-out infinite;animation-delay:1s}
@keyframes qtw{0%,100%{opacity:.2}50%{opacity:1}}
.qflow,.qspark,.qspark2,.islepulse{pointer-events:none}
/* sea & river shimmer */
.wavetw{pointer-events:none;animation:wavetw 3.2s ease-in-out infinite}
.wavetw.b{animation-delay:1.4s}.wavetw.c{animation-delay:.7s}
@keyframes wavetw{0%,100%{opacity:.1}50%{opacity:.72}}
/* rising smoke — thick industrial plume */
.smoke{pointer-events:none;transform-box:fill-box;transform-origin:center bottom;animation:smoke 4.4s ease-out infinite}
@keyframes smoke{0%{opacity:0;transform:translateY(0) scale(.5)}16%{opacity:.72}55%{opacity:.55}100%{opacity:0;transform:translateY(-230px) scale(2.4)}}
/* magic crystal pulse */
.crystpulse{pointer-events:none;transform-box:fill-box;transform-origin:center;animation:crystpulse 2.4s ease-in-out infinite}
@keyframes crystpulse{0%,100%{opacity:.16;transform:scale(.85)}50%{opacity:.62;transform:scale(1.22)}}
/* lake ripples */
.lakerip{pointer-events:none;transform-box:fill-box;transform-origin:center;animation:lakerip 3.8s ease-out infinite}
@keyframes lakerip{0%{opacity:0;transform:scale(.25)}25%{opacity:.65}100%{opacity:0;transform:scale(1.9)}}
/* drifting clouds */
.cloud{pointer-events:none;transform-box:fill-box;animation:clouddrift 24s ease-in-out infinite alternate}
.cloud.c2{animation-duration:31s;animation-delay:-7s}
.cloud.c3{animation-duration:19s;animation-delay:-13s}
@keyframes clouddrift{from{transform:translateX(-34px)}to{transform:translateX(64px)}}
@media(prefers-reduced-motion:reduce){.islepulse,.qflow,.qsource,.qripple,.qspark,.qspark2,.wavetw,.smoke,.crystpulse,.lakerip,.cloud{animation:none}.islepulse{opacity:.16}}
.token .raidtag{position:absolute;top:-13px;left:50%;transform:translateX(-50%);background:#c0392b;color:#fff;font-family:var(--map);font-weight:700;font-size:8.5px;letter-spacing:1.5px;padding:1px 5px;border:2px solid #140f0d;border-radius:3px;white-space:nowrap}
.token.raider .disc{animation:raidpulse 2.2s ease-in-out infinite}
@keyframes raidpulse{0%,100%{box-shadow:0 0 0 3px #140f0d,0 0 10px rgba(192,57,43,.5)}50%{box-shadow:0 0 0 3px #140f0d,0 0 22px rgba(192,57,43,.95)}}
.topnav .sail{background:#2a1416;color:#f3d6cf;border-color:#140f0d}
.topnav .sail{display:none}
body.grey{background:#10131a}
body.grey .viewport{background:#10131a}
body.grey .wordmark{color:#e8c36a}body.grey .wordmark b{color:#f0b23e}
body.grey .topnav .sail{background:#243b2a;color:#dff0e4}
body.grey .cartouche{background:radial-gradient(120% 140% at 50% 0,rgba(16,19,26,.92),rgba(16,19,26,0) 78%)}
body.grey .cartouche .sub{color:#b89a5a}
body.grey .cartouche h1{color:#e8c36a;text-shadow:0 2px 0 rgba(0,0,0,.5)}
body.grey .cartouche .lvl{color:#a98e57}
body.grey .lore{background:#1f1b16;border-color:#0a0c10;box-shadow:0 4px 0 #0a0c10}
body.grey .lore h4{color:#e8c36a}
body.grey .lore p{color:#cdbf9c}
body.grey .lore .q{color:#b89a5a}
body.grey .legend{background:#1f1b16;border-color:#0a0c10;box-shadow:0 4px 0 #0a0c10}
body.grey .legend h4{color:#e8c36a}body.grey .legend .row{color:#cdbf9c}
body.grey .legend .dot{border-color:#0a0c10}
