/* The city page (docs/FRONTEND_SPEC.md §3), from design/mockups/city.html — unchanged. */
:root{
  --card:#fffaf0; --ink:#2e2748; --muted:#645c80; --edge:#2e2748;
  --gold:#f5b72f; --gold-ink:#3a2a05; --mint:#2f9e6a; --coral:#ff7a6b; --page:#cfe8f6;
  box-sizing:border-box;
  padding-top:env(safe-area-inset-top,0px);
  padding-bottom:env(safe-area-inset-bottom,0px);
}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]){ --card:#241f3b; --ink:#f7f2ff; --muted:#b9b0d6; --edge:#0f0c1c; --mint:#5fd49a; --page:#1c2244; }
}
:root[data-theme="dark"]{ --card:#241f3b; --ink:#f7f2ff; --muted:#b9b0d6; --edge:#0f0c1c; --mint:#5fd49a; --page:#1c2244; }
*,*::before,*::after{box-sizing:inherit}
html{height:100%;scroll-padding-top:env(safe-area-inset-top,0px)}
body{margin:0;height:100%;overflow:hidden;background:var(--page);color:var(--ink);font-family:Fredoka,"Trebuchet MS","Segoe UI",system-ui,sans-serif}
#game{position:fixed;inset:0;overflow:hidden}
#stage{position:absolute;inset:0;touch-action:none;cursor:grab}
#stage:active{cursor:grabbing}
#stage canvas{display:block}
.card{background:var(--card);border:2px solid var(--edge);border-radius:18px;box-shadow:0 5px 0 var(--edge)}
.who{position:absolute;top:calc(16px + env(safe-area-inset-top,0px));left:16px;padding:14px 18px;display:flex;flex-direction:column;gap:8px;max-width:calc(100vw - 32px)}
.who-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.who h1{margin:0;font-size:22px;font-weight:600;line-height:1.2}
.chip{background:var(--gold);color:var(--gold-ink);border:2px solid var(--edge);border-radius:999px;padding:2px 10px;font-size:14px;font-weight:600}
.scores{display:flex;gap:18px}
.scores div{display:flex;flex-direction:column}
.scores b{font-size:22px;font-weight:600}
.scores span{font-size:13px;color:var(--muted)}
.controls{position:absolute;top:calc(16px + env(safe-area-inset-top,0px));right:16px;display:flex;flex-direction:column;gap:10px;align-items:flex-end}
.seg{display:flex;padding:4px;gap:4px}
.seg button{font:inherit;font-size:15px;font-weight:500;color:var(--ink);background:transparent;border:0;border-radius:12px;min-height:44px;padding:0 16px;cursor:pointer}
.seg button[aria-pressed="true"]{background:var(--gold);color:var(--gold-ink);font-weight:600}
.seg button:focus-visible{outline:3px solid var(--coral);outline-offset:2px}
.shop{position:fixed;right:16px;bottom:calc(16px + env(safe-area-inset-bottom,0px));width:340px;padding:16px;display:flex;flex-direction:column;gap:6px;height:calc(100vh - 210px);max-height:620px}
#shopList{overflow:auto;flex:1;min-height:0;padding-right:4px}
.shop h2{margin:0;font-size:19px;font-weight:600}
.cat{margin:10px 0 2px;font-size:14px;font-weight:600;color:var(--muted)}
.item{display:grid;grid-template-columns:14px 1fr auto;gap:10px;align-items:center;padding:6px 4px;border-bottom:1px dashed var(--muted)}
.dot{width:14px;height:14px;border-radius:5px;border:2px solid var(--edge)}
.item .n{font-size:15px;font-weight:500}
.item .p{font-size:13px;color:var(--muted)}
.item .r{font-size:14px;font-weight:600;text-align:right;color:var(--mint)}
.item .s{font-size:13px;text-align:right;color:var(--muted)}
.ltd{font-size:12px;color:var(--coral);font-weight:600}
.hint{font-size:14px;color:var(--muted)}
.back{font:inherit;font-size:14px;font-weight:600;min-height:44px;border-radius:12px;border:2px solid var(--edge);background:var(--gold);color:var(--gold-ink);cursor:pointer;padding:0 14px;align-self:flex-start}
.feed{position:absolute;left:16px;bottom:calc(16px + env(safe-area-inset-bottom,0px));width:340px;padding:14px 16px}
.rain{display:flex;align-items:center;gap:10px}
.rain span{font-size:15px;color:var(--muted)}
.rain b{font-size:24px;font-weight:600;flex:1}
.rain button{font:inherit;font-size:14px;font-weight:600;min-height:44px;padding:0 14px;border-radius:12px;border:2px solid var(--edge);background:var(--gold);color:var(--gold-ink);cursor:pointer}
#feed{list-style:none;margin:10px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}
#feed li{font-size:14px;line-height:1.35;padding-left:12px;border-left:3px solid var(--gold)}
#feed li:first-child{font-weight:600}
.demo{font-size:12px;color:var(--muted);margin:10px 0 0;line-height:1.35}
.board{position:fixed;right:16px;top:calc(16px + 186px + env(safe-area-inset-top,0px));width:320px;padding:16px}
.board h2{margin:0 0 10px;font-size:19px;font-weight:600}
.you{margin-top:12px;padding:10px 12px;border-radius:12px;background:var(--gold);color:var(--gold-ink);display:flex;justify-content:space-between;font-size:15px;font-weight:600}
.tabs{display:flex;gap:4px;flex-wrap:wrap}
.tabs button{font:inherit;font-size:13px;font-weight:500;min-height:40px;padding:0 10px;border-radius:10px;border:2px solid var(--edge);background:transparent;color:var(--ink);cursor:pointer}
.tabs button[aria-pressed="true"]{background:var(--gold);color:var(--gold-ink);font-weight:600}
#boardList{margin:12px 0 0;padding-left:22px;display:flex;flex-direction:column;gap:8px}
#boardList li{font-size:15px}#boardList li span{display:inline-block;min-width:120px}#boardList li b{color:var(--mint);font-weight:600}
.toast{position:absolute;left:50%;transform:translateX(-50%);top:calc(124px + env(safe-area-inset-top,0px));padding:12px 18px;max-width:min(520px,calc(100vw - 32px));font-size:15px;font-weight:500;text-align:center;background:var(--gold);color:var(--gold-ink)}
.back:focus-visible,.rain button:focus-visible,.tabs button:focus-visible{outline:3px solid var(--coral);outline-offset:2px}
@media (max-width:720px){
  .feed{left:12px;right:12px;width:auto;bottom:calc(76px + env(safe-area-inset-bottom,0px));padding:10px 12px}
  #feed li:nth-child(n+2){display:none}.demo{display:none}
  .controls{left:12px;right:12px;overflow-x:auto;justify-content:flex-start}
  .board{left:12px;right:12px;width:auto;top:auto;bottom:calc(210px + env(safe-area-inset-bottom,0px))}
  .toast{top:auto;bottom:calc(220px + env(safe-area-inset-bottom,0px))}
}
.boards{max-width:1120px;margin:0 auto;padding:56px 20px 72px;text-align:center}
.boards h2{margin:0;font-size:36px;font-weight:700}
.lead{margin:10px auto 32px;max-width:60ch;color:var(--muted);font-size:17px;line-height:1.5}
.lb-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px;text-align:left}
.lb{padding:20px 20px 16px;display:flex;flex-direction:column}
.lb h3{margin:0 0 14px;font-size:21px;font-weight:600}
.lb ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}
.lb li{display:grid;grid-template-columns:34px 1fr auto;align-items:center;gap:8px;padding:9px 4px;border-bottom:1px dashed var(--muted);font-size:16px}
.lb li:last-child{border-bottom:0}
.rk{width:28px;height:28px;border-radius:9px;display:grid;place-items:center;font-size:14px;font-weight:700;border:2px solid var(--edge);background:var(--card)}
.lb li:nth-child(1) .rk{background:#f5b72f;color:#3a2a05}.lb li:nth-child(2) .rk{background:#d9dbe8;color:#2e2748}.lb li:nth-child(3) .rk{background:#e0a06a;color:#2e2748}
.val{font-weight:600;color:var(--mint)}
.lb .you{margin-top:12px}
.center{text-align:center}
#bIn,#bOut{font-size:22px;min-width:48px;padding:0}
@media (max-width:900px){.lb-grid{grid-template-columns:1fr}.boards h2{font-size:28px}}
.lblink{font:inherit;cursor:pointer;min-height:52px;align-items:center;padding:0 18px;text-decoration:none;color:var(--ink);font-weight:600;font-size:15px}
.lblink:focus-visible{outline:3px solid var(--coral);outline-offset:2px}
.sky{position:absolute;inset:0;overflow:hidden;pointer-events:none}
.sky-day,.sky-night{position:absolute;inset:0;transition:opacity 1.4s ease}
.sky-day{background:linear-gradient(180deg,#1f6fc4 0%,#3d8fdc 22%,#6fb2ea 48%,#a9d3f3 72%,#dcecf7 100%)}
.haze{position:absolute;left:0;right:0;bottom:0;height:34%;background:linear-gradient(180deg,rgba(255,255,255,0),rgba(255,255,255,.55))}
.sky-night{opacity:0;background:linear-gradient(180deg,#070a24 0%,#141a47 40%,#2a2766 75%,#4a3570 100%)}
#game.night .sky-day{opacity:0}#game.night .sky-night{opacity:1}
.sun{position:absolute;left:12%;top:12%;width:520px;height:520px;margin:-260px 0 0 -260px;border-radius:50%;background:radial-gradient(circle,rgba(255,255,255,.95) 0 3.5%,rgba(255,250,225,.9) 5%,rgba(255,238,190,.55) 9%,rgba(255,228,170,.25) 18%,rgba(255,225,170,.08) 34%,rgba(255,225,170,0) 60%)}
.sun i{position:absolute;left:50%;top:50%;width:46px;height:46px;margin:-23px 0 0 -23px;border-radius:50%;background:#fffef6;box-shadow:0 0 18px 6px rgba(255,255,255,.9),0 0 60px 24px rgba(255,236,180,.55)}
.flare{position:absolute;border-radius:50%;pointer-events:none}
.f1{left:24%;top:24%;width:60px;height:60px;background:radial-gradient(circle,rgba(255,236,190,.22),rgba(255,236,190,0) 70%)}
.f2{left:33%;top:33%;width:24px;height:24px;background:rgba(190,225,255,.18)}
.f3{left:47%;top:46%;width:90px;height:90px;border:2px solid rgba(255,255,255,.08);background:radial-gradient(circle,rgba(255,255,255,0) 55%,rgba(170,215,255,.12) 70%,rgba(255,255,255,0) 72%)}
.cl{position:absolute;height:34px;border-radius:40px;background:#fff;opacity:.92;box-shadow:0 8px 0 -2px #e3eef7}
.cl::before,.cl::after{content:"";position:absolute;background:#fff;border-radius:50%}
.cl::before{width:56px;height:56px;left:18px;top:-28px}.cl::after{width:40px;height:40px;left:60px;top:-18px}
.cl1{width:150px;top:16%;left:-12%;animation:drift 95s linear infinite}
.cl2{width:120px;top:30%;left:-20%;transform:scale(.8);animation:drift 120s linear infinite;animation-delay:-40s}
.cl3{width:180px;top:8%;left:-25%;transform:scale(1.2);animation:drift 140s linear infinite;animation-delay:-90s}
.cl4{width:110px;top:52%;left:-15%;opacity:.7;animation:drift 110s linear infinite;animation-delay:-20s}
@keyframes drift{from{translate:0 0}to{translate:135vw 0}}
.stars{position:absolute;left:0;top:0;width:2px;height:2px;border-radius:50%;background:transparent}
.st2{animation:twinkle 3.2s ease-in-out infinite alternate}
@keyframes twinkle{from{opacity:.25}to{opacity:1}}
.moon{position:absolute;left:30%;top:9%;width:74px;height:74px;border-radius:50%;background:#fff6d8;box-shadow:0 0 40px 10px rgba(255,240,190,.35),inset -14px -8px 0 0 #e8dbb0}
.moon::before{content:"";position:absolute;width:12px;height:12px;border-radius:50%;background:#eadfb9;left:20px;top:22px;box-shadow:24px 16px 0 -3px #eadfb9,10px 34px 0 -4px #eadfb9}
.shoot{position:absolute;top:14%;left:60%;width:130px;height:2px;border-radius:2px;background:linear-gradient(90deg,rgba(255,255,255,0),#fff);opacity:0;transform:rotate(-24deg);animation:shoot 9s ease-in infinite}
@keyframes shoot{0%,86%{opacity:0;translate:0 0}88%{opacity:1}100%{opacity:0;translate:-420px 190px}}
.aurora{position:absolute;left:-10%;right:-10%;top:-8%;height:40%;background:radial-gradient(60% 50% at 30% 40%,rgba(110,224,166,.18),transparent 70%),radial-gradient(50% 45% at 70% 30%,rgba(184,164,236,.2),transparent 70%)}
@media (prefers-reduced-motion:reduce){.cl,.st2,.shoot{animation:none}}
body.onboarding .who,body.onboarding .feed{opacity:0;pointer-events:none}
.who,.controls,.feed{transition:opacity .5s ease}
.ob{position:fixed;inset:0;z-index:20;display:grid;place-items:center;padding:20px;background:linear-gradient(180deg,rgba(24,20,48,0) 0%,rgba(24,20,48,.22) 100%)}
.ob[hidden]{display:none}
.ob .card{position:relative;width:min(460px,100%);padding:30px 28px 26px;text-align:center;border-radius:26px;box-shadow:0 7px 0 var(--edge)}
.ob h2{margin:6px 0 10px;font-size:30px;font-weight:700;line-height:1.15}
.ob p{margin:0 auto 18px;max-width:38ch;font-size:17px;line-height:1.45;color:var(--muted)}
.ob p b{color:var(--ink)}
.ob .fine{font-size:14px;margin:14px auto 0}
.badge{display:inline-block;background:var(--gold);color:var(--gold-ink);border:2px solid var(--edge);border-radius:99px;padding:3px 12px;font-weight:700;font-size:14px}
.btn{font:inherit;font-weight:600;font-size:17px;min-height:52px;padding:0 24px;border-radius:16px;border:2px solid var(--edge);background:var(--gold);color:var(--gold-ink);box-shadow:0 4px 0 var(--edge);cursor:pointer;transition:transform .08s}
.btn:active{transform:translateY(3px);box-shadow:0 1px 0 var(--edge)}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn.big{width:100%}
.ghost{font:inherit;font-weight:500;font-size:16px;min-height:48px;padding:0 16px;border-radius:14px;border:2px solid transparent;background:transparent;color:var(--ink);cursor:pointer}
.btn:focus-visible,.ghost:focus-visible,.wallet:focus-visible,.x:focus-visible,#obInput:focus-visible{outline:3px solid var(--coral);outline-offset:3px}
.x{position:absolute;left:14px;top:14px;width:44px;height:44px;border-radius:12px;border:2px solid var(--edge);background:var(--card);color:var(--ink);font-size:20px;cursor:pointer}
.wallets{display:flex;flex-direction:column;gap:10px;margin:8px 0 4px}
.wallet{font:inherit;display:flex;align-items:center;gap:14px;min-height:60px;padding:0 16px;border-radius:16px;border:2px solid var(--edge);background:var(--card);color:var(--ink);font-size:18px;font-weight:600;cursor:pointer;box-shadow:0 4px 0 var(--edge);text-align:left}
.wallet:hover{background:color-mix(in srgb,var(--gold) 18%,var(--card))}
.wi{width:36px;height:36px;border-radius:11px;border:2px solid var(--edge);display:grid;place-items:center;color:#fff;font-weight:700;overflow:hidden;flex:none}
.wi img{width:100%;height:100%;object-fit:contain;display:block}
.wi.pad img{width:78%;height:78%}
/* The account corner: Connect wallet, or the connected Mayor with a small menu. */
.acct [hidden],.acct[hidden]{display:none!important}
.acct{position:relative;display:flex;flex-direction:column;align-items:flex-end;gap:8px}
.btn.hdr{min-height:46px;font-size:16px;padding:0 20px;border-radius:14px}
.acct-me{font:inherit;display:flex;align-items:center;gap:8px;min-height:46px;padding:0 14px;color:var(--ink);font-size:15px;font-weight:600;cursor:pointer}
.acct-me img{width:22px;height:22px;border-radius:6px}
.acct-menu{position:absolute;top:calc(100% + 8px);right:0;z-index:15;display:flex;flex-direction:column;gap:6px;padding:12px;min-width:200px}
.acct-menu .muted{font-size:13px;color:var(--muted);word-break:break-all}
.acct-menu .ghost{text-align:left}
.tag{margin-left:auto;font-size:13px;font-weight:600;color:var(--gold-ink);background:var(--gold);border-radius:99px;padding:2px 10px;border:2px solid var(--edge)}
.spinner{width:56px;height:56px;margin:4px auto 8px;border-radius:50%;border:6px solid color-mix(in srgb,var(--gold) 30%,transparent);border-top-color:var(--gold);animation:spin .9s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.linked{display:inline-flex;align-items:center;gap:8px;font-size:14px;color:var(--muted);border:2px solid var(--edge);border-radius:99px;padding:4px 12px;margin-bottom:6px}
.linked .dot{width:10px;height:10px;border-radius:50%;background:#35c27a;border:2px solid var(--edge)}
.ob label{display:block;text-align:left;font-weight:600;font-size:15px;margin:4px 0 6px}
#obInput{font:inherit;width:100%;min-height:54px;padding:0 16px;font-size:20px;font-weight:600;border-radius:16px;border:2px solid var(--edge);background:#fff;color:#2e2748}
.help{text-align:left;font-size:14px;color:var(--muted);margin:8px 2px 0}
.help.err{color:#c2412f;font-weight:600}
.preview{margin:16px 0 18px;font-size:18px;font-weight:600}
.preview span{background:var(--gold);color:var(--gold-ink);border:2px solid var(--edge);border-radius:10px;padding:2px 10px}
.welcome{overflow:hidden}
.welcome h2{font-size:32px}
.sunburst{position:absolute;left:50%;top:-160px;width:420px;height:420px;margin-left:-210px;border-radius:50%;background:repeating-conic-gradient(from 0deg,rgba(245,183,47,.16) 0 10deg,rgba(245,183,47,0) 10deg 20deg);pointer-events:none}
.facts{list-style:none;margin:0 0 22px;padding:0;display:flex;flex-direction:column;gap:12px;text-align:left;position:relative}
.facts li{display:flex;gap:14px;align-items:center}
.fi{flex:none;width:44px;height:44px;border-radius:13px;border:2px solid var(--edge);display:grid;place-items:center}
.facts b{display:block;font-size:17px}.facts span{font-size:15px;color:var(--muted)}
.confetti{position:absolute;inset:0;pointer-events:none;overflow:hidden}
.confetti i{position:absolute;top:-20px;width:10px;height:16px;border-radius:3px;animation:fall 2.6s cubic-bezier(.3,.6,.5,1) forwards}
@keyframes fall{to{transform:translate3d(var(--dx),110vh,0) rotate(var(--r));opacity:.9}}
.tip{position:fixed;z-index:15;left:50%;bottom:calc(24px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);width:min(430px,calc(100vw - 24px));padding:18px 20px;display:flex;flex-direction:column;gap:6px}
.tip b{font-size:19px}.tip span{font-size:15px;color:var(--muted);line-height:1.4}
.tipRow{display:flex;gap:8px;margin-top:10px;align-items:center}
.tip[hidden]{display:none}
@media (prefers-reduced-motion:no-preference){.pop{animation:pop .45s cubic-bezier(.2,1.2,.4,1) both}@keyframes pop{from{transform:scale(.86);opacity:0}to{transform:none;opacity:1}}}
@media (prefers-reduced-motion:reduce){.confetti{display:none}.spinner{animation:none}}
@media (max-width:720px){.ob h2{font-size:25px}.welcome h2{font-size:26px}.ob .card{padding:26px 20px 22px}}
.note{font-size:13px;color:var(--muted);margin:10px 2px 0;line-height:1.4}
@media (max-width:720px){
  .who{padding:10px 14px}.who h1{font-size:18px}.scores b{font-size:18px}
  .controls{top:auto;bottom:calc(16px + env(safe-area-inset-bottom,0px));flex-direction:row}
  .seg button{padding:0 12px;font-size:14px}
  .shop{left:12px;right:12px;width:auto;bottom:calc(12px + env(safe-area-inset-bottom,0px));height:38vh}
}

/* ---- additions for the real page (not visual changes) ---- */
/* The mockup's .seg sets display:flex, which would override [hidden]: the
   dev-only Built / Empty lots toggle must really disappear without ?dev=1. */
#devLots[hidden]{display:none}
.chip small{font-size:11px;font-weight:500;opacity:.75}
