/* Villestruct — storybook HUD. Parchment panels, wood trim, brass accents; layout after classic RTS screens. */
:root{
  color-scheme:light;
  --ink:#3a3022; --soft:#7c6a52; --paper:#fbf4e4; --paper2:#f2e4c4; --line:#d9c49a;
  --wood:#8a5a36; --wood2:#6b4326; --brass:#e0a93c; --teal:#4fa59a; --accent:#e0875a; --era:#e08a5b;
  --good:#4f9b57; --bad:#d4553f; --warn:#d9962f;
  --head:'Fredoka',ui-rounded,'Segoe UI Rounded','Segoe UI',system-ui,sans-serif;
  --body:'Nunito',ui-rounded,'Segoe UI',system-ui,sans-serif;
}
*{box-sizing:border-box}
html,body{margin:0;height:100%;overflow:hidden;background:#cfe8ee;color:var(--ink);font:14px/1.35 var(--body);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}
button{font:inherit;color:inherit;cursor:pointer}
input,select{font:inherit;color:var(--ink)}
#app{position:fixed;inset:0}
#game{position:absolute;inset:0;width:100%;height:100%;display:block;outline:none;touch-action:none}
#ui{position:absolute;inset:0;pointer-events:none;overflow:hidden}
#ui>*{pointer-events:none}
.hud,.hud>*{pointer-events:none}
.hud button,.hud input,.hud select,.hud .card,.hud .topbar,.hud .minimap,.hud .players,.hud .voicePanel,.hud .chat,.hud .goals,.hud .toast,.hud .modalBack,.hud .medal,.hud .ctrls,.hud .raidBar,.hud .eraBanner{pointer-events:auto}
#overlay-grain{position:absolute;inset:0;pointer-events:none;mix-blend-mode:multiply;opacity:.14;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' seed='4'/%3E%3CfeColorMatrix values='0 0 0 0 .55 0 0 0 0 .45 0 0 0 0 .3 0 0 0 .55 0'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E")}
#boot{position:absolute;inset:0;display:grid;place-items:center;background:linear-gradient(#cfe8ee,#fbe9c9);z-index:50;transition:opacity .6s}
#boot.gone{opacity:0;pointer-events:none}
.boot-card{text-align:center;display:grid;gap:10px;justify-items:center}
.boot-logo{font:700 54px var(--head);color:var(--accent);letter-spacing:.02em;text-shadow:0 3px 0 #fff8}
.boot-msg{color:var(--soft)}

/* buttons */
.btn{border:2px solid var(--wood);background:linear-gradient(#fff7e2,#f4e3bd);border-radius:12px;padding:7px 14px;font-weight:700;box-shadow:0 3px 0 var(--wood2);transition:transform .08s,box-shadow .08s}
.btn:hover{transform:translateY(-1px)}.btn:active{transform:translateY(2px);box-shadow:0 1px 0 var(--wood2)}
.btn.primary{background:linear-gradient(#ffb38a,#e8845a);color:#fff;text-shadow:0 1px 0 #0003;border-color:#b85a35;box-shadow:0 3px 0 #9a4526}
.btn.big{padding:12px 22px;font:700 17px var(--head)}
.btn:disabled{opacity:.5;cursor:not-allowed}
.mini{border:2px solid var(--line);background:#fff8e8;border-radius:10px;padding:3px 8px}
.link{background:none;border:0;color:var(--soft);text-decoration:underline;padding:4px 8px}

/* top bar */
.topbar{position:absolute;top:8px;left:10px;display:flex;align-items:center;gap:6px;background:linear-gradient(#fbf4e4,#f0e0bd);border:3px solid var(--wood);border-radius:999px;padding:4px 12px;box-shadow:0 4px 0 var(--wood2),0 10px 24px #0003;max-width:calc(100vw - 340px)}
.topbar .resGroup{display:flex;gap:4px;align-items:center;flex-wrap:nowrap}
.topbar .statGroup{display:flex;gap:4px;align-items:center}
.chip{display:flex;align-items:center;gap:4px;padding:2px 8px 2px 4px;border-radius:999px;background:#fff9ea;border:2px solid var(--line)}
.chip .ico{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;background:#fdeec5;font-size:14px}
.chip .v{display:flex;align-items:baseline;gap:3px;font-family:var(--head)}
.chip b{font-size:15px;font-weight:600}
.chip small{font-size:11px;color:var(--soft);font-weight:500}
.chip small.pos{color:var(--good)}.chip small.neg{color:var(--bad)}
.chip b.neg{color:var(--bad)}
.chip.full{border-color:var(--warn)}.chip.low{border-color:var(--bad);animation:pulseBad 1.2s infinite}
.chip.sci{cursor:pointer}
@keyframes pulseBad{50%{background:#ffe3dc}}
.medal{position:relative;flex:none;margin:-14px 4px -30px;width:84px;height:84px;border-radius:50%;border:4px solid var(--brass);background:radial-gradient(circle at 35% 30%,#fff7d8,var(--era) 70%);box-shadow:0 0 0 3px var(--wood),0 6px 14px #0004;display:grid;align-content:center;justify-items:center;padding:0;text-align:center}
.medal:hover{filter:brightness(1.06)}
.medal.idle{animation:medalPulse 1.6s infinite}
@keyframes medalPulse{50%{box-shadow:0 0 0 3px var(--wood),0 0 0 10px #ffd45a88,0 6px 14px #0004}}
.medalNum{font:700 28px/1 Georgia,'Times New Roman',serif;letter-spacing:.02em;color:#fff;text-shadow:0 2px 0 #0004}
.medalYear{font:600 12px/1 var(--head);color:#fff;margin-top:1px;text-shadow:0 1px 0 #0004}
.medalBar{width:52px;height:5px;border-radius:3px;background:#0003;margin-top:3px;overflow:hidden}.medalBar i{display:block;height:100%;background:#fff}
.medalName{position:absolute;top:96px;left:10px;font:600 12px var(--head);color:#fff;text-shadow:0 1px 3px #000a;white-space:nowrap;pointer-events:none}
.ctrls{position:absolute;top:8px;right:10px;display:flex;gap:6px;align-items:center}
.round{width:36px;height:36px;border-radius:50%;border:3px solid var(--wood);background:linear-gradient(#fff7e2,#f2dfb5);box-shadow:0 3px 0 var(--wood2);font-size:16px;padding:0}
.speed{display:flex;border:3px solid var(--wood);border-radius:999px;overflow:hidden;background:#fbf4e4;box-shadow:0 3px 0 var(--wood2)}
.speed .sp{border:0;background:none;padding:5px 9px}.speed .sp.on{background:var(--era);color:#fff}
.raidBar{position:absolute;top:70px;left:50%;transform:translateX(-50%);display:flex;gap:10px;align-items:center;background:#fff0e0;border:3px solid var(--bad);border-radius:16px;padding:6px 14px;box-shadow:0 4px 0 #8a2f1f;animation:raidShake 1.4s infinite}
.raidBar .rb{font-size:26px}.raidBar b{display:block}.raidBar small{color:var(--soft)}
@keyframes raidShake{0%,100%{transform:translateX(-50%) rotate(0)}10%{transform:translateX(-50%) rotate(-1deg)}20%{transform:translateX(-50%) rotate(1deg)}30%{transform:translateX(-50%) rotate(0)}}

/* left column */
.leftCol{position:absolute;top:112px;left:10px;width:300px;display:flex;flex-direction:column;gap:8px}
.feed{display:flex;flex-direction:column;gap:5px}
.toast{display:flex;gap:8px;align-items:center;background:#fffaf0ee;border:2px solid var(--line);border-left:6px solid var(--teal);border-radius:12px;padding:6px 10px;box-shadow:0 3px 8px #0002;animation:toastIn .25s ease-out;transition:opacity .6s,transform .6s}
.toast.good{border-left-color:var(--good)}.toast.warn{border-left-color:var(--warn);background:#fff3e0}
.toast.out{opacity:0;transform:translateX(-20px)}
.toast .ti{font-size:18px}.toast .tm{font-size:13px;line-height:1.25}
@keyframes toastIn{from{opacity:0;transform:translateX(-20px)}}
.goals{background:#fbf4e4e8;border:3px solid var(--wood);border-radius:14px;padding:8px 10px;box-shadow:0 3px 0 var(--wood2)}
.goalsHead{font:600 14px var(--head);margin-bottom:4px;color:var(--wood2)}
.goal{margin:5px 0}.gt{font-size:13px}
.gp{position:relative;height:14px;border-radius:7px;background:#e9dcc0;overflow:hidden;margin-top:2px}
.gp i{position:absolute;inset:0 auto 0 0;background:linear-gradient(#ffd45a,#f0a93a);border-radius:7px}
.gp span{position:relative;font-size:10px;font-weight:800;display:block;text-align:center;line-height:14px}

/* cards & bottom bar */
.bottomBar{position:absolute;left:10px;right:232px;bottom:10px;display:flex;gap:10px;align-items:flex-end}
.card{background:linear-gradient(#fcf6e6,#f3e5c3);border:3px solid var(--wood);border-radius:16px;box-shadow:0 4px 0 var(--wood2),0 12px 28px #0003;outline:2px dashed #e0cba0;outline-offset:-9px}
.buildCard{flex:0 1 560px;min-width:300px;height:188px;padding:8px 10px;display:flex;flex-direction:column;gap:6px}
.tabs{display:flex;gap:4px;flex-wrap:wrap}
.tab{width:34px;height:30px;border-radius:9px;border:2px solid var(--line);background:#fff8e8;font-size:16px;padding:0;line-height:1}
.tab.on{background:var(--era);border-color:var(--wood);color:#fff;transform:translateY(-2px)}
.tab.tool{margin-left:2px}
.bgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(98px,1fr));gap:6px;overflow-y:auto;padding:2px 4px 2px 2px;flex:1;align-content:start}
.bgrid::-webkit-scrollbar{width:8px}.bgrid::-webkit-scrollbar-thumb{background:#d9c49a;border-radius:4px}
.bbtn{display:flex;flex-direction:column;align-items:center;gap:1px;padding:5px 3px 4px;border-radius:11px;border:2px solid var(--line);background:#fffbf0;text-align:center;line-height:1.15;transition:transform .08s}
.bbtn:hover{transform:translateY(-2px);border-color:var(--wood)}
.bbtn.armed{background:#ffe9b8;border-color:var(--era);box-shadow:0 0 0 2px var(--era)}
.bbtn.poor{opacity:.62}
.bi{font-size:22px;line-height:1}.bn{font:600 11px var(--head)}
.costs{display:flex;flex-wrap:wrap;gap:3px;justify-content:center}
.cost{font-size:10px;font-weight:800;background:#f3e6c6;border-radius:6px;padding:0 4px;white-space:nowrap}.cost.lack{background:#ffd9d0;color:#a3321f}
.empty{grid-column:1/-1;color:var(--soft);padding:10px;text-align:center}
.tooltip{position:fixed;z-index:30;max-width:260px;background:#fffaf0;border:3px solid var(--wood);border-radius:12px;padding:8px 10px;box-shadow:0 6px 18px #0004;pointer-events:none;font-size:12px}
.tooltip b{font:600 14px var(--head)}.tooltip p{margin:3px 0 5px;color:var(--soft)}.tooltip div{margin:1px 0}
.infoCard{flex:1 1 360px;max-width:440px;min-height:124px;max-height:188px;padding:10px 12px;display:flex;flex-direction:column;gap:6px;overflow:hidden auto}
.ihead{display:flex;gap:10px;align-items:center}
.ibig{width:48px;height:48px;border-radius:12px;background:radial-gradient(circle at 30% 25%,#fff8de,var(--era));display:grid;place-items:center;font-size:28px;border:2px solid var(--wood);flex:none}
.it b{font:600 16px var(--head);display:block}.it small{color:var(--soft);display:block}
.lvl{font:600 11px var(--head);background:var(--brass);color:#fff;border-radius:7px;padding:1px 6px;margin-left:6px;vertical-align:middle}
.ip{display:flex;flex-direction:column;gap:3px;font-size:13px}
.ip p{margin:0}.tipline{color:var(--soft)}.hintline{color:var(--soft);display:block;margin-top:2px}
.stat{display:flex;justify-content:space-between;font-size:12.5px;border-bottom:1px dotted var(--line)}.stat.warn b{color:var(--warn)}.stat.good b{color:var(--good)}
.issue{font-size:12px;color:#9a5a1a;background:#fff1d6;border-radius:7px;padding:2px 6px}
.bar{position:relative;height:16px;border-radius:8px;background:#e8dcc0;overflow:hidden}
.bar i{position:absolute;inset:0 auto 0 0;background:linear-gradient(#ffd45a,#f0a93a);border-radius:8px;transition:width .3s}
.bar span{position:relative;display:block;text-align:center;font-size:11px;font-weight:800;line-height:16px}
.acts{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px}
.act{border:2px solid var(--line);background:#fffbf0;border-radius:10px;padding:4px 9px;font-weight:700;font-size:12.5px;display:inline-flex;gap:5px;align-items:center}
.act:hover{border-color:var(--wood)}
.act.primary{background:linear-gradient(#ffd7a8,#f3a56d);border-color:#b8693a}
.act.on{background:#ffe9b8;border-color:var(--brass)}
.act.danger:hover{border-color:var(--bad)}.act.danger.sure{background:#ffd9d0;border-color:var(--bad);color:#8a2111}
.vlist{display:flex;flex-direction:column;gap:3px;max-height:70px;overflow:auto}
.vrow{display:flex;justify-content:space-between;gap:8px;border:2px solid var(--line);background:#fffbf0;border-radius:9px;padding:2px 8px;font-size:12px;text-align:left}
.vrow:hover{border-color:var(--wood)}

/* right column */
.rightCol{position:absolute;top:62px;right:10px;width:244px;display:flex;flex-direction:column;gap:8px;max-height:calc(100% - 330px);overflow:hidden auto;pointer-events:none}
.rightCol>*{pointer-events:auto}
.players{background:#fbf4e4ee;border:3px solid var(--wood);border-radius:14px;padding:6px 8px;box-shadow:0 3px 0 var(--wood2)}
.phead{font:600 12px var(--head);color:var(--wood2);margin-bottom:4px;display:flex;justify-content:space-between}
.pingms{font-weight:500;color:var(--soft)}
.prow{display:flex;align-items:center;gap:7px;border-left:5px solid #ccc;background:#fffbf0;border-radius:9px;padding:3px 6px;margin:3px 0}
.prow.me{background:#fff3d2}.prow.speaking{box-shadow:0 0 0 3px #7fe08a;animation:talk .8s infinite}
@keyframes talk{50%{box-shadow:0 0 0 5px #7fe08a88}}
.pn{flex:1;min-width:0}.pn b{display:block;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pn small{color:var(--soft);font-size:11px}
.pm{font-size:13px}
.avImg{display:grid;place-items:center;border-radius:50%;border:2px solid #fff;box-shadow:0 1px 3px #0003;flex:none;background-position:center;overflow:hidden}
.voicePanel{background:#fbf4e4ee;border:3px solid var(--wood);border-radius:14px;padding:6px 8px;box-shadow:0 3px 0 var(--wood2)}
.vhead{display:flex;justify-content:space-between;align-items:center;font:600 12px var(--head);color:var(--wood2)}
.vbtns{display:flex;gap:4px}
.vbtn{width:30px;height:28px;border-radius:9px;border:2px solid var(--line);background:#fff8e8;padding:0}.vbtn.on{background:#c9f0c0;border-color:var(--good)}.vbtn.off{background:#ffd9d0}
.vbtn:disabled{opacity:.45;cursor:not-allowed}
.vstatus{display:block;color:var(--soft);font-size:11px;margin:3px 0}.vstatus.err{color:var(--bad)}
.vtiles{display:grid;grid-template-columns:1fr 1fr;gap:5px}
.vtile{position:relative;border:3px solid #ccc;border-radius:10px;overflow:hidden;background:#e9dfc6;aspect-ratio:4/3;display:grid;place-items:center}
.vtile video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.vtile .vname{position:absolute;left:0;right:0;bottom:0;background:#0008;color:#fff;font-size:10px;padding:1px 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.vtile.speaking{box-shadow:0 0 0 3px #7fe08a}

/* minimap */
.minimap{position:absolute;right:10px;bottom:10px;display:flex;gap:6px;align-items:flex-end}
.mmFrame{border:4px solid var(--wood);border-radius:14px;background:#cfe8ee;box-shadow:0 4px 0 var(--wood2),0 12px 28px #0003;overflow:hidden;line-height:0}
.mmCanvas{width:196px;height:196px;cursor:crosshair}
.mmBtns{display:flex;flex-direction:column;gap:4px}
.mmBtn{width:28px;height:28px;border-radius:50%;border:2px solid var(--wood);background:linear-gradient(#fff7e2,#f2dfb5);padding:0;font-size:13px;box-shadow:0 2px 0 var(--wood2)}

/* chat */
.chat{position:absolute;left:10px;bottom:208px;width:330px;display:flex;flex-direction:column;gap:4px}
.chatToggle{align-self:flex-start;width:38px;height:34px;border-radius:12px;border:3px solid var(--wood);background:#fbf4e4;box-shadow:0 3px 0 var(--wood2);padding:0;position:relative;font-size:16px}
.chatBadge{position:absolute;top:-8px;right:-6px;background:var(--bad);color:#fff;border-radius:9px;font:700 10px var(--body);padding:1px 5px}.chatBadge:empty{display:none}
.chatLog{max-height:150px;overflow-y:auto;background:#fffaf0ee;border:3px solid var(--wood);border-radius:12px;padding:5px 8px;font-size:12.5px}
.cm{margin:1px 0;line-height:1.3;word-break:break-word}.cm.sys{color:var(--soft);font-style:italic}
.chatRow{display:flex;gap:4px;align-items:center}
.chatInput{flex:1;min-width:0;border:3px solid var(--wood);border-radius:10px;padding:5px 9px;background:#fffdf6;-webkit-user-select:text;user-select:text}
.emotes{display:flex;gap:2px}.emo{border:0;background:#fffaf0;border-radius:8px;padding:2px 3px;font-size:15px;border:2px solid var(--line)}
.chat.collapsed .chatLog,.chat.collapsed .chatRow{display:none}
.chat.collapsed.peek .chatLog{display:block;opacity:.92;max-height:96px;pointer-events:none}

/* ghost tip */
.ghostTip{position:absolute;top:70px;left:50%;transform:translateX(-50%);background:#fffaf0f2;border:3px solid var(--teal);border-radius:14px;padding:6px 14px;text-align:center;box-shadow:0 4px 10px #0003;max-width:360px;margin-top:40px}
.ghostTip.bad{border-color:var(--bad)}.ghostTip small{display:block;color:var(--soft)}.ghostTip small.keys{margin-top:2px;font-size:10.5px}
.netStatus{position:absolute;top:56px;left:50%;transform:translateX(-50%);background:#ffe9c9;border:3px solid var(--warn);border-radius:12px;padding:4px 12px;font-weight:700}

/* world labels */
.worldLabels{position:absolute;inset:0;overflow:hidden;pointer-events:none}
.cursorTag{position:absolute;left:0;top:0;border:2px solid #fff;border-radius:9px;padding:0 7px;font:700 11px var(--body);color:#fff;text-shadow:0 1px 2px #0006;white-space:nowrap;will-change:transform}
.villageTag{position:absolute;left:0;top:0;text-align:center;background:#fffaf0dd;border:2px solid var(--wood);border-radius:12px;padding:2px 10px;box-shadow:0 2px 6px #0003;will-change:transform;white-space:nowrap}
.villageTag b{display:block;font:600 14px var(--head)}.villageTag span{font-size:11px;color:var(--soft)}
.badge{position:absolute;left:0;top:0;font-size:14px;background:#fffaf0e8;border-radius:10px;padding:0 4px;border:2px solid var(--line);will-change:transform;white-space:nowrap}
.floatText{position:absolute;left:0;top:0;font:700 15px var(--head);text-shadow:0 1px 0 #0008,0 0 4px #0008;white-space:nowrap;will-change:transform}

/* era banner */
.eraBanner{position:absolute;inset:0;display:grid;place-content:center;text-align:center;background:radial-gradient(circle,#fff8e0ee,#ffe3b8cc 60%,#0000 100%);transition:opacity 1s;z-index:20;overflow:hidden;pointer-events:none!important}
.eraBanner.out{opacity:0}
.eb1{font:600 18px var(--head);color:var(--wood2);letter-spacing:.2em;text-transform:uppercase}
.eb2{font:700 clamp(36px,7vw,72px) var(--head);color:var(--era);text-shadow:0 3px 0 #fff,0 6px 0 #0002;margin:4px 0}
.eb3{font:600 22px var(--head);color:var(--ink)}.eb4{max-width:520px;margin:8px auto 0;color:var(--soft)}
.confetti{position:absolute;top:-10px;width:10px;height:14px;border-radius:2px;animation:fall linear forwards}
@keyframes fall{to{transform:translateY(110vh) rotate(720deg)}}

/* modals */
.modalBack{position:absolute;inset:0;background:#2b1f1366;display:grid;place-items:center;z-index:40;padding:10px}
.modal{background:linear-gradient(#fdf8ea,#f4e6c6);border:4px solid var(--wood);border-radius:20px;box-shadow:0 8px 0 var(--wood2),0 20px 50px #0006;width:min(560px,100%);max-height:calc(100% - 20px);display:flex;flex-direction:column;overflow:hidden}
.modal.wide{width:min(980px,100%)}
.modalHead{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;border-bottom:2px dashed var(--line)}
.modalHead h2{margin:0;font:600 20px var(--head);color:var(--wood2)}
.x{width:32px;height:32px;border-radius:50%;border:2px solid var(--wood);background:#fff8e8;padding:0}
.modalBody{padding:12px 16px;overflow:auto;-webkit-user-select:text;user-select:text}
.lead{color:var(--soft);margin-top:0}.lead.small{font-size:12px}
.helpGrid{display:grid;grid-template-columns:150px 1fr;gap:6px 14px;font-size:13px}
.srow{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:6px 0;border-bottom:1px dotted var(--line)}
.srow select{border:2px solid var(--line);border-radius:8px;padding:3px 6px;background:#fffdf6}
.inviteInput{width:100%;border:3px solid var(--wood);border-radius:10px;padding:8px;font-size:14px}

/* research */
.researchBody{padding:12px 16px;overflow:auto}
.rhead{margin-bottom:8px}
.rcur{display:flex;gap:12px;align-items:center;background:#fff8e4;border:3px solid var(--brass);border-radius:14px;padding:8px 12px}
.rcur .ri{font-size:30px}.rcur small{display:block;color:var(--soft)}.rcur .bar{flex:1;min-width:120px}.rcur.idle{border-color:var(--era);animation:medalPulse 2s infinite}
.etabs{display:flex;gap:6px;flex-wrap:wrap;margin:8px 0}
.etab{display:flex;gap:6px;align-items:center;border:2px solid var(--line);background:#fffbf0;border-radius:10px;padding:4px 10px;font-weight:700}.etab b{font:700 15px var(--head);color:var(--era)}.etab.on{background:var(--era);border-color:var(--wood);color:#fff}.etab.on b{color:#fff}
.eraNote{color:var(--soft);margin:2px 0 8px}
.techGrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:8px}
.tech{text-align:left;display:flex;flex-direction:column;gap:3px;border:3px solid var(--line);border-radius:14px;background:#fffbf0;padding:8px 10px;font-size:12.5px}
.tech p{margin:0;color:var(--soft)}.tech .th{display:flex;gap:6px;align-items:center}.tech .ti{font-size:20px}.tech b{font:600 14px var(--head);flex:1}.tech .ok{color:var(--good);font-weight:800}
.tech.avail{border-color:var(--brass);cursor:pointer}.tech.avail:hover{transform:translateY(-2px);box-shadow:0 4px 0 var(--wood2)}
.tech.done{background:#eef6e2;border-color:#a9cf8a}.tech.locked{opacity:.55}.tech.active{border-color:var(--era);background:#fff0d6}
.tech.advance{background:linear-gradient(#fff7da,#ffe6ad)}
.unl{font-size:11.5px;color:#6d5a3a}.adv{font-weight:800;color:var(--era)}.tcost{font-weight:800;margin-top:2px}.tcost small{font-weight:500;color:var(--soft)}

/* lobby */
.lobby{position:absolute;inset:0;overflow:auto;pointer-events:auto!important;background:linear-gradient(#bfe3f2,#fdf0d5 70%);z-index:30}
.lobby *{pointer-events:auto}
.lobbySky{position:absolute;inset:0;overflow:hidden;pointer-events:none!important}
.lcloud{position:absolute;left:-200px;width:180px;height:56px;border-radius:60px;background:#fff;opacity:.85;box-shadow:60px -16px 0 -6px #fff,-50px 8px 0 -10px #fff;animation:drift linear infinite}
@keyframes drift{to{transform:translateX(calc(100vw + 500px))}}
.lobbyHills{position:absolute;left:-5%;right:-5%;bottom:0;height:34%;background:radial-gradient(120% 90% at 20% 100%,#8fc66a 55%,#0000 56%),radial-gradient(120% 100% at 75% 100%,#7bb85b 55%,#0000 56%),radial-gradient(90% 70% at 50% 100%,#a6d57d 55%,#0000 56%)}
.lobbyMain{position:relative;max-width:980px;margin:0 auto;padding:22px 16px 40px;display:flex;flex-direction:column;gap:14px;align-items:stretch}
.lobbyTitle{text-align:center}.lobbyTitle h1{margin:0;font:700 clamp(44px,9vw,84px)/1 var(--head);color:var(--accent);text-shadow:0 4px 0 #fff,0 8px 0 #0002;letter-spacing:.01em}.lobbyTitle p{margin:6px 0 0;color:var(--wood2);font:600 17px var(--head)}
.who{display:flex;gap:14px;align-items:center;background:linear-gradient(#fdf8ea,#f4e6c6);border:4px solid var(--wood);border-radius:20px;padding:12px 16px;box-shadow:0 5px 0 var(--wood2);max-width:520px;margin:0 auto;width:100%}
.avatarBtn{position:relative;border:0;background:none;padding:0;border-radius:50%}.avHint{position:absolute;bottom:-4px;left:50%;transform:translateX(-50%);background:var(--brass);color:#fff;border-radius:8px;font-size:10px;font-weight:800;padding:0 7px;white-space:nowrap}
.whoR{flex:1;display:flex;flex-direction:column;gap:3px}.whoR label{font:600 13px var(--head);color:var(--wood2)}.whoR small{color:var(--soft)}
.nameInput,.textIn{border:3px solid var(--wood);border-radius:12px;padding:8px 12px;background:#fffdf6;font:600 16px var(--body);width:100%;-webkit-user-select:text;user-select:text}
.textIn.code{letter-spacing:.2em;text-transform:uppercase;font-family:var(--head)}
.lobbyErr{background:#ffe3dc;border:3px solid var(--bad);border-radius:12px;padding:8px 12px;text-align:center;font-weight:700}
.invite{background:linear-gradient(#fff6cf,#ffe39a);border:4px solid var(--brass);border-radius:20px;padding:12px 16px;text-align:center;box-shadow:0 5px 0 #b8892a;max-width:520px;margin:0 auto;width:100%}.invite p{margin:4px 0 10px}
.lobbyCols{display:grid;grid-template-columns:1.2fr 1fr;gap:14px}
.lcol{display:flex;flex-direction:column;gap:14px}
.lcard{background:linear-gradient(#fdf8ea,#f4e6c6);border:4px solid var(--wood);border-radius:20px;padding:14px 16px;box-shadow:0 5px 0 var(--wood2);display:flex;flex-direction:column;gap:6px}
.lcard h3{margin:0 0 2px;font:600 20px var(--head);color:var(--wood2)}.lcard label{font:600 13px var(--head);color:var(--wood2);margin-top:4px}.lcard p{margin:0;color:var(--soft)}
.rowIn{display:flex;gap:6px;align-items:center}
.chips{display:flex;gap:6px;flex-wrap:wrap}.chipBtn{border:2px solid var(--line);background:#fffbf0;border-radius:999px;padding:4px 12px;font-weight:700}.chipBtn.on{background:var(--teal);border-color:#2f7a70;color:#fff}
.dnote,.modeNote{color:var(--soft)}.friendsRow{display:flex;gap:6px;align-items:center;margin-top:6px;font-weight:700;font-size:13px}
.savedRow{display:flex;gap:6px;align-items:center}.savedRow .btn{flex:1;text-align:left;font-size:13px}
.lobbyLinks{text-align:center}
.avPicker .avFilters{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:8px}.avFilters input,.avFilters select{border:2px solid var(--line);border-radius:9px;padding:4px 8px;background:#fffdf6;flex:1;min-width:110px}
.avMain{display:grid;grid-template-columns:1fr 190px;gap:12px}
.avGrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(66px,1fr));gap:6px;max-height:52vh;overflow-y:auto;padding:4px}
.avCell{border:3px solid transparent;background:none;border-radius:50%;padding:0;aspect-ratio:1;display:grid;place-items:center;transition:transform .1s}.avCell:hover{transform:scale(1.08)}.avCell.on{border-color:var(--era);box-shadow:0 0 0 3px #fff,0 0 0 6px var(--era)}
.avCell .avImg{width:100%;height:100%;font-size:30px}
.avPreview{display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center}.avPreview small{color:var(--soft)}

@media (max-width:1180px){ .chip small{display:none} .topbar{max-width:calc(100vw - 20px);top:52px} .ctrls{top:6px} .medalName{display:none} .leftCol{top:104px} }
@media (max-width:900px){
  .topbar .statGroup{display:none}.chip{padding-right:6px}
  .bottomBar{right:10px;bottom:150px;flex-direction:column;align-items:stretch}
  .buildCard{height:150px;flex:none}.infoCard{max-width:none;max-height:140px}
  .minimap{bottom:10px}.mmCanvas{width:120px;height:120px}.mmBtns{flex-direction:row;position:absolute;right:0;bottom:130px}
  .chat{left:10px;bottom:auto;top:200px;width:calc(100% - 20px);max-width:340px}
  .rightCol{top:56px;width:180px}.leftCol{width:min(300px,calc(100% - 200px))}
  .lobbyCols,.avMain{grid-template-columns:1fr}
  .medalName{display:none}
}
@media (max-width:560px){ .bbtn .costs{display:none}.ctrls .speed .sp{padding:5px 6px}.helpGrid{grid-template-columns:1fr} }

/* market trade popover */
.chip.res.tradable{cursor:pointer}
.chip.res.tradable:hover{border-color:var(--wood)}
.tradePop{position:fixed;z-index:30;width:220px;background:var(--paper);border:3px solid var(--wood);border-radius:14px;padding:8px 10px;box-shadow:0 6px 16px #0003;display:flex;flex-direction:column;gap:6px;animation:toastIn .2s ease-out}
.tradeHead{font-family:'Fredoka',sans-serif;font-weight:600;font-size:14px}
.tradeRow{display:flex;gap:6px}
.tradeRow .act{flex:1;justify-content:space-between}
.tradeRow .act:disabled{opacity:.5;cursor:not-allowed}
.tradePop .price{font-weight:600;color:var(--soft)}
.tradePop small{color:var(--soft);font-size:11.5px;line-height:1.3}

/* latency pill: green bolt when the UDP fast lane carries presence */
.pingms.udp::before{content:'⚡ ';color:var(--good)}
