/* Cornfinity UI — every surface follows STYLE.md (32x32 pixel-art conformity). */
@import url('assets/fonts/fonts.css');
:root{--ink:#1d261e;--paper:#f6eed6;--moss:#3f6b3a;--moss-dark:#243d26;--gold:#ffd34d;--red:#b83b2b;--blue:#2e4f8a;--muted:#55543f;--u:2px;
 font:16px/1.5 'Pixelify Sans',monospace;color:var(--ink);-webkit-font-smoothing:none;font-smooth:never}
*{box-sizing:border-box;border-radius:0!important}
body{margin:0;overflow:hidden;background:#667841;image-rendering:pixelated}
#field,#fx{position:fixed;inset:0;width:100%;height:100%;image-rendering:pixelated;touch-action:none}
#fx{pointer-events:none;z-index:9}
.hidden{display:none!important}
.eyebrow,small,kbd,legend,.tag,.arrow,#combo,.reward-pop,.ledger small,#full-alert{font-family:'Silkscreen',monospace;font-weight:400}
.eyebrow{font-size:8px;letter-spacing:1px}
h1{font:700 48px/1 'Pixelify Sans',monospace;margin:16px 0;text-shadow:4px 4px 0 var(--ink)}
h2{font:700 32px/1.1 'Pixelify Sans',monospace;margin:8px 0 12px}
h3{font:600 24px/1.2 'Pixelify Sans',monospace;margin:16px 0 8px}
p{margin:8px 0;color:#4a4a36}
kbd{display:inline-block;font-size:8px;line-height:1;padding:4px 6px;margin-left:6px;background:var(--paper);color:var(--ink);border:2px solid var(--ink);box-shadow:inset -2px -2px 0 #d8c9a0}

/* 32x32 icons from atlases at whole-number scales only: --s is 1, 2, 3 or 4; --i column, --j row */
/* --cell is the atlas cell size: 32px for UI/research art, 40px for tools/vehicles/clothes (32px art with a 4px margin, so nothing touches a frame) */
.ico{--s:1;--i:0;--j:0;--cols:28;--rows:1;--cell:32px;display:inline-block;flex:none;vertical-align:middle;width:calc(var(--cell)*var(--s));height:calc(var(--cell)*var(--s));background-image:url(assets/ui.png);background-repeat:no-repeat;background-size:calc(var(--cell)*var(--s)*var(--cols)) calc(var(--cell)*var(--s)*var(--rows));background-position:calc(var(--cell)*-1*var(--s)*var(--i)) calc(var(--cell)*-1*var(--s)*var(--j));image-rendering:pixelated}
.ico.tool{background-image:url(assets/tools.png);--cols:16;--rows:15;--cell:40px}
.ico.veh{background-image:url(assets/vehicles.png);--cols:16;--rows:8;--cell:40px}
.ico.cloth{background-image:url(assets/clothes_icons.png);--cols:12;--rows:13;--cell:40px}
.ico.nodeart{background-image:url(assets/nodes.png);--cols:30;--rows:16}
.ico.branchart{background-image:url(assets/branches.png);--cols:16;--rows:1}

/* 9-slice chrome cut from 32x32 frames (slice 3 art px, drawn at 2x = 6px). Shadows are hard 4px offsets. */
.frame,.panel,.btn,.slot,.card,#toast,#tip,.offer,.tag,.bubble,.chatline,#full-alert,.modal form,fieldset input,#chat input{border:6px solid transparent;border-image:url(assets/ui/panel.png) 3 fill / 6px / 0 stretch;background:none;image-rendering:pixelated}
.frame,.offer,#toast,.modal form{filter:drop-shadow(4px 4px 0 #1d261e55)}
/* big panels use box-shadow: a drop-shadow filter forces a full repaint of the panel on every animation frame */
.panel{box-shadow:4px 4px 0 #1d261e55}
.slot,fieldset input,#chat input,.modal input{border-image-source:url(assets/ui/slot.png)}
#toast,#tip,.tag,.chatline{border-image-source:url(assets/ui/panel_dark.png);color:#fffbea}
.offer{border-image-source:url(assets/ui/panel_blue.png)}
.bubble{border-image-source:url(assets/ui/bubble.png)}
#full-alert{border-image-source:url(assets/ui/button_red.png);color:#fffbea}

.btn{border-image-source:url(assets/ui/button_light.png);cursor:pointer;font:600 16px/1 'Pixelify Sans',monospace;color:var(--ink);padding:4px 10px;display:inline-flex;align-items:center;gap:8px;position:relative}
.btn:hover:not(:disabled){filter:brightness(1.07)} /* no movement on hover: moving the hit area made buttons flicker */
.btn:active,.btn.pressed{transform:translateY(2px);border-image-source:url(assets/ui/button_down.png);color:#fffbea}
.btn.primary,.btn.active{border-image-source:url(assets/ui/button.png);color:#fffbea}
.btn.danger{border-image-source:url(assets/ui/button_red.png);color:#fffbea}
.btn:disabled{filter:grayscale(1);opacity:.6;cursor:default;transform:none}
.btn.wide{width:100%;justify-content:center;padding:10px;margin:12px 0}

header{position:absolute;top:16px;left:16px;right:16px;display:flex;align-items:center;gap:12px;z-index:4;pointer-events:none}header>*{pointer-events:auto}
.brand{display:flex;gap:8px;align-items:center;color:inherit;text-decoration:none;font:400 16px 'Silkscreen',monospace;padding:0 10px 0 2px}.brand b{font-weight:400;color:var(--moss)}.brand small{display:block;font-size:8px}
.live{margin-left:auto;padding:4px 10px;white-space:nowrap;display:flex;align-items:center;gap:8px}.live i{width:8px;height:8px;background:var(--moss);animation:blink 1s steps(2) infinite}
#help{width:40px;height:40px;justify-content:center;font-family:'Silkscreen',monospace}
.intro{position:absolute;top:120px;left:32px;pointer-events:none;max-width:360px;color:#fffbea;z-index:1;transition:opacity .4s ease}.intro .eyebrow{color:#fffbea;text-shadow:2px 2px 0 var(--ink)}.intro p{color:var(--ink);padding:4px 8px}
body.playing .intro{opacity:0}
.coords{position:absolute;left:16px;top:74px;display:flex;gap:10px;font:8px 'Silkscreen',monospace;align-items:center;padding:2px 8px;z-index:3}.coords span{font-size:16px}

/* HUD */
.hud{position:absolute;bottom:16px;left:16px;display:flex;align-items:center;gap:4px;padding:4px 10px 4px 4px;z-index:4}
.hud small{display:block;font-size:8px;color:var(--muted)}.hud strong{display:block;font:400 16px 'Silkscreen',monospace}
.basket{display:flex;align-items:center;gap:8px;padding-right:8px}.basket .cap{color:var(--muted)}
.bar{width:128px;height:14px;margin-top:4px;border:2px solid var(--ink);background:#e6dcbf;padding:2px}
.bar b{display:block;height:100%;width:0;background:repeating-linear-gradient(90deg,var(--gold) 0 6px,#e8a400 6px 8px)}
.basket.full .bar b{background:repeating-linear-gradient(90deg,#e0674f 0 6px,var(--red) 6px 8px)}.basket.full strong{color:var(--red)}
.stat{border-left:2px solid #d8c9a0;padding:0 8px;display:flex;align-items:center;gap:6px}
.stat.gear strong{font-size:8px;max-width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bump{animation:bump .24s cubic-bezier(.34,1.56,.64,1)}@keyframes bump{50%{transform:translateY(-4px) scale(1.25)}}
#badges{position:absolute;top:128px;left:50%;transform:translateX(-50%);display:flex;gap:6px;z-index:3;pointer-events:none}
.badge{font:8px 'Silkscreen',monospace;color:#fffbea;padding:2px 6px;border:6px solid transparent;border-image:url(assets/ui/button.png) 3 fill / 6px / 0 stretch;animation:blink 1.2s steps(2) infinite}.badge.off{border-image-source:url(assets/ui/panel_dark.png);animation:none}.badge.crowd{border-image-source:url(assets/ui/panel_blue.png);color:var(--blue)}
#full-alert{position:absolute;bottom:96px;left:16px;font-size:8px;padding:4px 8px;z-index:4;animation:blink .6s steps(2) infinite}
@keyframes blink{50%{opacity:.35}}

.actions{position:absolute;right:16px;top:74px;display:flex;flex-direction:column;gap:6px;z-index:4}
.actions .btn{padding:2px 8px 2px 2px}.actions span{flex:1;text-align:left}
#offer-count{position:absolute;top:-10px;left:-10px;background:var(--red);color:#fffbea;font:8px 'Silkscreen',monospace;font-style:normal;padding:2px 4px;border:2px solid var(--ink)}

footer{position:absolute;bottom:16px;right:16px;text-align:right;z-index:4}
.tools{display:inline-flex;padding:2px;gap:4px}.tools .btn{padding:2px 10px 2px 2px}
footer p{font:8px 'Silkscreen',monospace;white-space:nowrap;margin:8px 0 0;padding:0 6px;color:var(--ink)}footer p kbd{margin:0 4px 0 10px}
#toast{position:absolute;bottom:120px;left:50%;transform:translateX(-50%);padding:4px 12px;opacity:0;transition:opacity .3s ease;pointer-events:none;z-index:8;white-space:nowrap}
#combo{position:absolute;top:74px;left:50%;transform:translateX(-50%);font-size:16px;color:var(--gold);text-shadow:2px 2px 0 var(--ink),-2px 0 0 var(--ink),0 -2px 0 var(--ink);z-index:3;pointer-events:none}

/* world overlays (z-sorted by depth in game.js) */
#tags,#arrows{position:fixed;inset:0;pointer-events:none;z-index:2;overflow:hidden}
.tag{position:absolute;transform:translate(-50%,-100%);font-size:8px;padding:0 4px;white-space:nowrap;cursor:pointer;pointer-events:auto}.tag.near{border-image-source:url(assets/ui/button.png)}
.bubble{position:absolute;transform:translate(-50%,-100%);max-width:240px;padding:2px 8px;font-size:16px;line-height:1.25;color:var(--ink);pointer-events:none;overflow-wrap:anywhere}
.bubble::after{content:'';position:absolute;left:50%;bottom:-12px;width:2px;height:2px;background:var(--ink);box-shadow:-2px -2px 0 #fff,0 -2px 0 #fff,2px -2px 0 var(--ink),-4px -4px 0 var(--ink),-2px -4px 0 #fff,0 -4px 0 #fff,2px -4px 0 var(--ink)}
.bubble.mine{opacity:.95}
.arrow{position:absolute;transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;font-size:8px;color:#fffbea;text-shadow:2px 2px 0 var(--ink)}
.reward-pop{position:fixed;z-index:3;pointer-events:none;color:var(--gold);text-shadow:2px 2px 0 var(--ink);font-size:16px}.reward-pop.hot{color:#fffbea}

/* chat */
#chatlog{position:absolute;left:16px;bottom:96px;width:360px;max-width:calc(calc(100vw / var(--ui)) - 32px);display:flex;flex-direction:column;gap:2px;z-index:4;pointer-events:none}
.chatline{padding:0 6px;font-size:16px;line-height:1.3;pointer-events:auto;transition:opacity .5s ease;overflow-wrap:anywhere}
.chatline.old{opacity:0}#chatlog:hover .chatline.old{opacity:.85}
.chatline b{color:var(--gold);cursor:pointer;font-weight:600}.chatline b:hover{text-decoration:underline}.chatline.system{color:#c9d8b8;font-family:'Silkscreen',monospace;font-size:8px}
#chat{position:absolute;left:16px;bottom:96px;width:420px;max-width:calc(calc(100vw / var(--ui)) - 32px);display:flex;gap:6px;align-items:center;padding:2px;z-index:7}
#chat input{flex:1;font:16px 'Pixelify Sans',monospace;padding:2px 6px;color:var(--ink);outline:none}
body.chatting #chatlog{bottom:146px}

/* panels */
.panel{position:absolute;right:136px;top:74px;max-height:calc(calc(100vh / var(--ui)) - 182px); /* ends above the HUD (the shop is centred over it) */width:440px;max-width:calc(calc(100vw / var(--ui)) - 32px);overflow:auto;padding:12px 16px;z-index:6}
.panel.wide{left:50%;right:auto;transform:translateX(-50%);width:min(1080px,calc(calc(100vw / var(--ui)) - 32px));top:64px;max-height:calc(calc(100vh / var(--ui)) - 172px)}
.close{float:right;position:sticky;top:0;width:36px;height:36px;justify-content:center;font-family:'Silkscreen',monospace;z-index:3}
.shopkeeper{display:flex;gap:16px;align-items:center}
.stall{flex:none;padding:32px 6px 0;background:repeating-linear-gradient(90deg,var(--red) 0 16px,#f2ecd8 16px 32px) top/100% 24px no-repeat,#e8dcb6;border:4px solid var(--ink)}
#merchant.gulp{animation:gulp .18s cubic-bezier(.22,1,.36,1)}@keyframes gulp{50%{transform:scale(1.125,.875)}}
.ledger{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-top:12px}.ledger .slot{padding:4px 8px}.ledger small{font-size:8px;color:var(--muted)}.ledger strong{display:flex;gap:4px;align-items:center;font:16px 'Silkscreen',monospace;margin-top:2px}
.card{display:flex;gap:10px;align-items:center;padding:4px 8px;text-align:left;width:100%;font:16px 'Pixelify Sans',monospace;color:var(--ink);border-image-source:url(assets/ui/button_light.png);cursor:pointer}
.card small{display:block;font-size:8px;color:var(--muted);line-height:1.6}.card strong{font-weight:600}.card .cost{margin-left:auto;font:8px 'Silkscreen',monospace;display:flex;align-items:center;gap:2px;white-space:nowrap}
.card.can{border-image-source:url(assets/ui/card_ready.png)}.card.can:hover{filter:brightness(1.04)}
.card.owned{border-image-source:url(assets/ui/card_owned.png)}.card.future{filter:grayscale(.7);opacity:.7}.card:disabled{cursor:default}
.card button.cost{border:2px solid var(--ink);background:var(--paper);padding:4px;cursor:pointer}
.tabs{display:flex;gap:6px;margin:4px 0 12px;flex-wrap:wrap}.tabs .btn{padding:2px 10px 2px 2px}.tabs small{font-size:8px;opacity:.8}
#next-gear{margin-bottom:12px}
#tree-wrap{position:relative;overflow:auto;padding:8px;background:repeating-conic-gradient(#e6dcbf 0 25%,#ece3c8 0 50%) 0 0/8px 8px}
#tree-wrap.slot{border-image:url(assets/ui/slot.png) 3 / 6px / 0 stretch}
#tree-wrap{max-height:calc(calc(100vh / var(--ui)) - 380px);min-height:320px;cursor:grab;user-select:none}#tree-wrap:active{cursor:grabbing}
#tree{position:relative;display:grid;grid-template-columns:repeat(12,120px);gap:12px 8px;width:max-content}
.node.key strong{color:#7a5a14}.node.key>.ico{outline-style:double;outline-width:6px}
#tree-lines{position:absolute;left:0;top:0;pointer-events:none;overflow:visible}
.branch-head{text-align:center;font:8px 'Silkscreen',monospace;color:var(--ink);grid-row:1}
.node{display:flex;flex-direction:column;align-items:center;gap:2px;background:none;border:0;padding:4px;position:relative;z-index:1;cursor:pointer;font-family:inherit;color:inherit}
.node>.ico{outline:4px solid #b7ad8c}.node strong{font:600 16px/1.1 'Pixelify Sans',monospace;text-align:center;max-width:110px}.node small{font-size:8px;color:var(--muted);display:flex;align-items:center;gap:2px}
.node.owned>.ico{outline-color:#e8a400}.node.owned small{color:#7a5a14}
.node.open>.ico{outline-color:var(--moss);animation:pulse-outline 1s steps(2) infinite}.node.locked{filter:grayscale(1);opacity:.55}.node.poor>.ico{outline-color:#9a9478}
@keyframes pulse-outline{50%{outline-color:#8fd06a}}
.node:hover{filter:brightness(1.08)}
.item-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:6px}
.nexts{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:6px}
.family{grid-column:1/-1;font:600 24px 'Pixelify Sans',monospace;margin:8px 0 0;display:flex;gap:8px;align-items:center}.family small{font-size:8px;color:var(--muted)}
#stat-sheet{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:6px}#stat-sheet div{padding:2px 8px;display:flex;justify-content:space-between}#stat-sheet b{font:400 16px 'Silkscreen',monospace}
#tip{position:fixed;z-index:12;padding:4px 10px;max-width:280px;pointer-events:none}#tip small{display:block;color:#c9d8b8;margin-top:2px}

#nearby{display:flex;flex-direction:column;gap:6px}
.swap{display:grid;grid-template-columns:1fr 1fr;gap:8px}fieldset{margin:0;padding:4px 8px}legend{font-size:8px;padding:0 4px;background:var(--paper)}
fieldset label{display:flex;align-items:center;gap:6px;margin:4px 0}fieldset input{width:100%;padding:0 4px;font:16px 'Silkscreen',monospace;color:var(--ink)}
#outgoing .card{margin-top:6px;cursor:default}
#offers{position:absolute;right:16px;top:250px;display:flex;flex-direction:column;gap:8px;z-index:7;width:320px}
.offer{padding:6px 10px;animation:slide .22s cubic-bezier(.22,1,.36,1)}
.offer .goods{display:flex;align-items:center;gap:6px;margin:6px 0;flex-wrap:wrap;font-weight:600}.offer .row{display:flex;gap:6px}.offer .btn{flex:1;justify-content:center}
@keyframes slide{from{transform:translateX(24px)}}
.goods span{display:inline-flex;align-items:center;gap:2px;font-family:'Silkscreen',monospace}

.modal{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:10;background:repeating-conic-gradient(#1d261e88 0 25%,transparent 0 50%) 0 0/4px 4px}
.modal form{width:460px;max-width:calc(92vw / var(--ui));padding:20px 24px}
.modal label{display:block;margin:16px 0 4px}.modal input{width:100%;padding:4px 8px;font:16px 'Pixelify Sans',monospace;outline:none;color:var(--ink)}
.modal small{font-size:8px;color:var(--muted);display:block;line-height:1.8}

::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:#e6dcbf;border:2px solid var(--ink)}::-webkit-scrollbar-thumb{background:var(--moss);border:2px solid var(--ink);box-shadow:inset 2px 2px 0 #6f9c44}::-webkit-scrollbar-corner{background:#e6dcbf}

/* research tree usability */
.tree-tools{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}
.chips{display:flex;gap:4px;overflow-x:auto;padding-bottom:4px;scrollbar-width:thin}
.chip{flex:none;padding:2px 8px 2px 2px;font-size:16px}.chip .ico{--s:1}.chip small{font-size:8px;margin-left:4px;opacity:.85}.chip span{white-space:nowrap}
.tree-search{display:flex;gap:6px;flex-wrap:wrap}.tree-search input{flex:1;min-width:180px;font:16px 'Pixelify Sans',monospace;padding:0 6px;color:var(--ink);outline:none}
.tree-body{display:grid;grid-template-columns:1fr 300px;gap:8px;align-items:start}
#node-detail{padding:8px 10px;position:sticky;top:0;max-height:calc(calc(100vh / var(--ui)) - 360px);overflow:auto}
#node-detail .hint,.hint{color:var(--muted);font-size:16px}
.detail-head{display:flex;gap:8px;align-items:center}.detail-head h3{margin:2px 0}.detail-head small{font-size:8px;color:var(--muted)}
#node-detail .effect{color:var(--ink);font-weight:600}#node-detail>small{display:block;font-size:8px;color:var(--muted);margin-top:8px}
.reqs{display:flex;flex-direction:column;gap:2px;margin-top:2px}
.req{display:flex;align-items:center;gap:6px;background:none;border:0;padding:2px;font:16px 'Pixelify Sans',monospace;color:var(--muted);cursor:pointer;text-align:left}.req.ok{color:var(--moss)}.req:hover{color:var(--ink);text-decoration:underline}
.learned{font:16px 'Silkscreen',monospace;color:#7a5a14}
.node.selected>.ico{outline-color:var(--blue)!important;outline-width:6px}.node.chain>.ico{outline-color:#6f8fd0}
.node.dim{opacity:.25}
#tree.compact{gap:6px 4px;grid-template-columns:repeat(12,48px)}#tree.compact .node strong,#tree.compact .node small,#tree.compact .branch-head{display:none}#tree.compact .node{padding:2px}#tree.compact .node>.ico{--s:1!important}
#tree-list{display:flex;flex-direction:column;gap:4px}
.stage-head{font:8px 'Silkscreen',monospace;color:var(--muted);margin:10px 0 2px}
.node-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border:6px solid transparent;border-image:url(assets/ui/button_light.png) 3 fill / 6px / 0 stretch;cursor:pointer}
.node-row>div{flex:1}.node-row strong{display:block}.node-row small{display:block;font-size:8px;color:var(--muted)}.node-row .state{font:8px 'Silkscreen',monospace;color:var(--muted)}
.node-row.owned{border-image-source:url(assets/ui/card_owned.png)}.node-row.open{border-image-source:url(assets/ui/card_ready.png)}.node-row.locked{filter:grayscale(1);opacity:.6}.node-row.selected{outline:4px solid var(--blue)}
.node-row .btn{padding:2px 6px;font:8px 'Silkscreen',monospace}

/* wardrobe */
.wardrobe-body{display:grid;grid-template-columns:200px 1fr;gap:12px;align-items:start}
.mannequin{display:flex;flex-direction:column;align-items:center;padding:8px;position:sticky;top:0}
#mannequin{position:static;inset:auto;width:128px;height:128px;image-rendering:pixelated;background:repeating-conic-gradient(#e6dcbf 0 25%,#ece3c8 0 50%) 0 0/16px 16px;margin:4px 0 8px}
#worn-effects{display:flex;flex-direction:column;gap:4px;width:100%}#worn-effects div{display:flex;gap:4px;align-items:center}#worn-effects b{display:block;font-weight:600}#worn-effects small{font-size:8px;color:var(--muted)}
#slot-tabs .btn{padding:2px 8px 2px 2px}

/* touch controls + menu drawer (only on coarse pointers) */
#touch{display:none}
body.touch #touch{display:block;position:fixed;inset:auto 0 0 0;height:0;z-index:5}
#joy{position:fixed;left:max(16px,env(safe-area-inset-left));bottom:max(24px,env(safe-area-inset-bottom));width:120px;height:120px;display:grid;place-items:center;touch-action:none;opacity:.9}
#joy>.ico:first-child{position:absolute;left:12px;top:12px}#knob{position:absolute;left:28px;top:28px;filter:drop-shadow(2px 2px 0 #1d261e66)}
#pad{position:fixed;right:max(16px,env(safe-area-inset-right));bottom:max(24px,env(safe-area-inset-bottom));display:grid;grid-template-columns:52px 52px 88px;grid-template-rows:52px 52px;gap:6px;touch-action:none}
#pad .btn{justify-content:center;padding:0}#act-main{grid-column:3;grid-row:1/3;width:88px;height:110px}
#act-menu{grid-column:1;grid-row:1}
.drawer-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.drawer-grid .btn{flex-direction:column;padding:8px 2px;font-size:16px}
.drawer-stats{font:8px 'Silkscreen',monospace;color:var(--muted)}

/* clean mobile layout: only the basket, coins and controls stay on screen; everything else lives in the menu */
body.touch .brand,body.touch .coords,body.touch .live,body.touch #help,body.touch .actions,body.touch footer,body.touch .intro,body.touch .stat.gear{display:none!important}
body.touch .hud{top:max(8px,env(safe-area-inset-top));bottom:auto;left:8px;right:auto;padding:2px 8px 2px 2px}
body.touch .hud .ico#cob-target{--s:1!important}body.touch .bar{width:80px}body.touch .stat:nth-of-type(3){display:none}
body.touch #badges{top:64px}body.touch #combo{top:84px;font-size:8px}
body.touch #full-alert{top:104px;bottom:auto;left:8px}
body.touch #chatlog{left:50%;transform:translateX(-50%);bottom:170px;width:min(340px,calc(calc(100vw / var(--ui)) - 32px))}body.touch #chatlog .chatline:nth-last-child(n+4){display:none}
body.touch #chat{top:max(8px,env(safe-area-inset-top));bottom:auto;left:8px;right:8px;width:auto;max-width:none}
body.touch #toast{top:110px;bottom:auto;white-space:normal;max-width:calc(calc(100vw / var(--ui)) - 32px);text-align:center}
body.touch #offers{top:60px;right:8px;width:min(280px,calc(calc(100vw / var(--ui)) - 16px))}
/* phones: a panel is as tall as its content (up to the screen), anchored at the top; the menu and bag are bottom sheets */
body.touch .panel,body.touch .panel.wide{top:max(8px,env(safe-area-inset-top));left:8px;right:8px;bottom:auto;width:auto;height:auto;max-height:calc(100vh - 16px);max-height:calc(100dvh - 16px);transform:none}
body.touch .tree-body{grid-template-columns:1fr}body.touch #node-detail{position:static;max-height:none}body.touch #tree-wrap{max-height:calc(45vh / var(--ui))}
body.touch .wardrobe-body{grid-template-columns:1fr}body.touch .mannequin{position:static;flex-direction:row;gap:8px}body.touch #mannequin{width:96px;height:96px}
body.touch .ledger{grid-template-columns:1fr 1fr 1fr}body.touch .shopkeeper .ico{--s:2!important}body.touch h2{font-size:24px}
body.touch .reward-pop{font-size:8px}

@media(max-width:900px){.intro{display:none}.coords{top:66px}.hud{right:16px;bottom:96px;flex-wrap:wrap}.stat.gear{display:none}.actions{top:66px}.actions span,.actions kbd{display:none}footer p{display:none}.panel{right:16px;left:16px;width:auto;top:60px}.panel.wide{transform:none;left:16px;width:auto}#offers{width:280px}#chatlog,#chat{bottom:190px}#full-alert{bottom:180px}.tree-body,.wardrobe-body{grid-template-columns:1fr}#node-detail{position:static}}
body.touch #drawer{top:auto!important;bottom:max(8px,env(safe-area-inset-bottom))!important;max-height:calc(70vh / var(--ui))}
body.touch #toast{top:auto;bottom:180px}
body.touch .tabs .btn{font:8px 'Silkscreen',monospace;padding:2px 6px 2px 2px}body.touch .tabs{flex-wrap:nowrap;overflow-x:auto}
body.touch #upgrades[data-tab=tree] #next-gear,body.touch #upgrades[data-tab=stats] #next-gear{display:none}
body.touch .chip span{display:none}body.touch .chip.active span{display:inline}
.wardrobe-body>div,.tree-body>*{min-width:0}

/* selling juice */
.stall{position:relative}
.sell-pop{position:absolute;left:50%;bottom:-14px;transform:translateX(-50%);font:16px 'Silkscreen',monospace;color:var(--gold);text-shadow:2px 2px 0 var(--ink),-2px 0 0 var(--ink),0 -2px 0 var(--ink);white-space:nowrap;opacity:0;pointer-events:none;z-index:2}
.sell-pop.show{opacity:1}
#sold-stamp{position:absolute;left:50%;top:50%;font:24px 'Silkscreen',monospace;color:var(--red);border:4px solid var(--red);padding:2px 8px;background:#fffbeacc;opacity:0;pointer-events:none;transform:translate(-50%,-50%) rotate(var(--r,-8deg));z-index:3}
#sold-stamp.slam{animation:slam 1.6s steps(1) forwards}
@keyframes slam{0%{opacity:1;transform:translate(-50%,-50%) rotate(var(--r)) scale(2.4)}6%{transform:translate(-50%,-50%) rotate(var(--r)) scale(1.6)}12%{transform:translate(-50%,-50%) rotate(var(--r)) scale(.9)}18%{transform:translate(-50%,-50%) rotate(var(--r)) scale(1.05)}24%,85%{opacity:1;transform:translate(-50%,-50%) rotate(var(--r)) scale(1)}100%{opacity:0;transform:translate(-50%,-50%) rotate(var(--r)) scale(1)}}
#shop-upgrades{gap:10px;font-size:24px}#shop-upgrades .ready{font:8px 'Silkscreen',monospace;font-style:normal;background:var(--gold);color:var(--ink);padding:2px 6px;border:2px solid var(--ink);animation:blink 1s steps(2) infinite}

/* character customizer */
.customizer{display:flex;flex-direction:column;gap:8px;grid-column:1/-1}
.look-part small{font-size:8px;color:var(--muted)}.look-opts{display:flex;flex-wrap:wrap;gap:4px;margin-top:2px}
.swatch{width:40px;height:40px;border:4px solid var(--ink);background:var(--c);cursor:pointer;box-shadow:inset -4px -4px 0 #0003,inset 4px 4px 0 #fff3}
.swatch.on{outline:4px solid var(--gold);outline-offset:-2px}
.look-opt{display:flex;flex-direction:column;align-items:center;gap:2px;padding:4px;border:6px solid transparent;border-image:url(assets/ui/button_light.png) 3 fill / 6px / 0 stretch;cursor:pointer;font:inherit;color:inherit}
.look-opt canvas{position:static;inset:auto;width:64px;height:64px;image-rendering:pixelated}.look-opt small{font-size:8px}
.look-opt.on{border-image-source:url(assets/ui/card_owned.png)}
#look-random{align-self:flex-start}

/* ===== usability pass ===== */
.panel{padding:0 16px 16px}
.panel-head{position:sticky;top:0;z-index:4;display:flex;align-items:center;gap:12px;margin:0 -16px 8px;padding:10px 16px 8px;background:var(--paper);border-bottom:2px solid #d8c9a0}
.panel-head h2{margin:2px 0 0;font-size:32px}.panel-head>div:first-child{flex:1;min-width:0}
.panel-head .close{float:none;position:static;flex:none}
.hint{color:var(--muted);font-size:16px;margin:6px 0}
h4{font:8px 'Silkscreen',monospace;color:var(--muted);margin:12px 0 4px;font-weight:400}
.state{font:8px 'Silkscreen',monospace;color:var(--muted);white-space:nowrap}.state.ok{color:#3f6b3a}
.completion{width:180px;text-align:right}.completion small{font-size:8px}.pbar{display:block;height:8px;border:2px solid var(--ink);background:#e6dcbf;margin-top:2px}.pbar b{display:block;height:100%;background:var(--gold);width:0}
.seg{position:sticky;top:64px;z-index:3;background:var(--paper);padding:2px 0 8px;margin:0 0 4px}.seg .btn small{font:8px 'Silkscreen',monospace;opacity:.8;margin-left:4px}
.row-text{flex:1;min-width:0}.row-text strong{display:block;font-weight:600}.row-text span{display:block;color:var(--muted);font-size:16px;line-height:1.3}
.tag-key{font:8px 'Silkscreen',monospace;background:var(--gold);padding:0 4px;border:2px solid var(--ink);vertical-align:middle}

/* research */
.research{display:grid;grid-template-columns:220px minmax(0,1fr) 300px;gap:12px;align-items:start}
.branch-list{display:flex;flex-direction:column;gap:4px;position:sticky;top:118px;max-height:calc(calc(100vh / var(--ui)) - 290px);overflow:auto;padding-right:4px}
.branch{display:grid;grid-template-columns:32px 1fr auto;align-items:center;gap:6px;padding:2px 6px 2px 2px;border:6px solid transparent;border-image:url(assets/ui/button_light.png) 3 fill / 6px / 0 stretch;cursor:pointer;font:16px 'Pixelify Sans',monospace;color:var(--ink);text-align:left;position:relative}
.branch b{display:block;font-weight:600;font-size:16px;line-height:1.1}.branch .pbar{height:6px;border-width:1px;margin-top:3px}.branch small{font:8px 'Silkscreen',monospace;color:var(--muted)}
.branch em{position:absolute;top:-8px;right:-6px;font:8px 'Silkscreen',monospace;font-style:normal;background:var(--moss);color:#fffbea;padding:2px 4px;border:2px solid var(--ink)}
.branch.active{border-image-source:url(assets/ui/button.png);color:#fffbea}.branch.active small{color:#e3efcf}
.branch-bar{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:8px}.branch-heading{flex:1 1 160px}.branch-heading h3{margin:0}.branch-heading small{font-size:16px;color:var(--muted)}
.branch-bar input{flex:1 1 160px;font:16px 'Pixelify Sans',monospace;padding:2px 6px;color:var(--ink);outline:none}
#tree-list{display:flex;flex-direction:column;gap:4px}
.stage-head{font:8px 'Silkscreen',monospace;color:var(--muted);margin:12px 0 2px;padding-bottom:2px;border-bottom:2px dashed #d8c9a0}
.node-row{display:flex;align-items:center;gap:10px;padding:4px 8px;cursor:pointer;outline:none}
.node-row:focus-visible,.node-row.selected{outline:4px solid var(--blue);outline-offset:-2px}
.node-row .btn.buy{font:16px 'Silkscreen',monospace;padding:2px 6px;gap:2px;flex:none}
.node-row.locked .row-text{opacity:.7}
#tree-wrap{max-height:calc(calc(100vh / var(--ui)) - 300px);overflow:auto;cursor:grab}#tree{grid-template-columns:repeat(12,44px);gap:6px}#tree .node{padding:2px}#tree .branch-head{writing-mode:vertical-rl;transform:rotate(180deg);font-size:8px;height:96px;justify-self:center}
#node-detail{position:sticky;top:118px;padding:10px 12px;max-height:calc(calc(100vh / var(--ui)) - 290px);overflow:auto}
#node-detail .sheet-close{display:none}
.detail-head{display:flex;gap:10px;align-items:center}.detail-head h3{margin:2px 0}.detail-head small{font:8px 'Silkscreen',monospace;color:var(--muted)}
#node-detail .effect{font-size:16px;font-weight:600;color:var(--ink);margin:10px 0}
.req{display:flex;align-items:center;gap:6px;width:100%;background:none;border:0;padding:2px;font:16px 'Pixelify Sans',monospace;color:var(--ink);cursor:pointer;text-align:left}.req span{flex:1}.req.ok b{color:var(--moss)}.req:hover span{text-decoration:underline}
.learned{font:16px 'Silkscreen',monospace;color:#7a5a14}

/* tools & garage */
.hero-card{display:flex;align-items:center;gap:14px;padding:10px 14px;margin-bottom:10px;border:6px solid transparent;border-image:url(assets/ui/button_light.png) 3 fill / 6px / 0 stretch}
.hero-card.can{border-image-source:url(assets/ui/card_ready.png)}.hero-card>div{flex:1;min-width:0}.hero-card h3{margin:2px 0}.hero-card p{margin:0;color:var(--muted)}.hero-card small{font:8px 'Silkscreen',monospace;color:var(--muted)}
.hero-card .btn{font:16px 'Silkscreen',monospace;flex:none}
details.family{margin:0 0 6px;border:6px solid transparent;border-image:url(assets/ui/slot.png) 3 fill / 6px / 0 stretch}
details.family summary{display:flex;align-items:center;gap:8px;padding:4px 6px;cursor:pointer;list-style:none;font-size:16px}details.family summary::-webkit-details-marker{display:none}
details.family summary b{flex:1;font-weight:600}details.family summary small{font:8px 'Silkscreen',monospace;color:var(--muted)}
details.family summary::after{content:'+';font:16px 'Silkscreen',monospace}details.family[open] summary::after{content:'-'}
.family-items{display:flex;flex-direction:column;gap:4px;padding:4px}
.item-row{display:flex;align-items:center;gap:10px;padding:4px 8px;background:#fffbea80}
.item-row.owned{background:#f6e7b080}.item-row.next{background:#e3efcf;outline:2px solid #6f9c44}.item-row.future{opacity:.65}
.item-row .btn{font:16px 'Silkscreen',monospace;padding:2px 8px;flex:none}

/* shop scene: basket -> merchant -> purse */
.sell-scene{display:flex;flex-direction:column;align-items:center;gap:6px}
.sell-scene .stall{margin-top:8px}.quote{margin:4px 0 8px;color:var(--ink);font-size:16px}
.counters{display:grid;grid-template-columns:1fr auto 1fr;gap:8px;align-items:center;width:100%}
.counter{display:flex;align-items:center;gap:8px;padding:4px 10px}.counter small{display:block;font:8px 'Silkscreen',monospace;color:var(--muted)}.counter strong{font:16px 'Silkscreen',monospace}
.rate{text-align:center}.rate small{display:block;font:8px 'Silkscreen',monospace;color:var(--muted)}.rate strong{display:inline-flex;align-items:center;gap:2px;font:16px 'Silkscreen',monospace}
#sell{font-size:24px}#sold-stamp{display:none}
.sell-pop{bottom:auto;top:-26px}

/* wardrobe stage */
.stage{background:#cfe6f0;border:4px solid var(--ink);line-height:0}
#mannequin{width:192px;height:192px;margin:0;background:none}
.look-opt canvas{background:#cfe6f0}
.mannequin .hint{text-align:center}

/* floating joystick: faint hint at rest, full strength where your thumb lands */
body.touch #joy{opacity:.35;transition:opacity .2s}body.touch #joy.held{opacity:.95}

/* mobile layout tweaks for the new panels */
body.touch .panel-head h2{font-size:24px}body.touch .seg{top:56px}body.touch .completion{display:none}
body.touch .research{grid-template-columns:1fr}
body.touch .branch-list{flex-direction:row;position:static;max-height:none;overflow-x:auto;padding-bottom:4px}
body.touch .branch{grid-template-columns:32px auto;flex:none}body.touch .branch>span,body.touch .branch small{display:none}body.touch .branch.active>span{display:block}
body.touch #node-detail{display:none;position:fixed;left:8px;right:8px;bottom:8px;top:auto;max-height:calc(60vh / var(--ui));z-index:9;border-image-source:url(assets/ui/panel.png)}
body.touch.detail-open #node-detail{display:block}body.touch #node-detail .sheet-close{display:inline-flex;float:right}
body.touch .hero-card{flex-wrap:wrap}body.touch .counters{grid-template-columns:1fr 1fr}body.touch .rate{grid-column:1/-1;order:3}
@media(max-width:1100px){.research{grid-template-columns:200px minmax(0,1fr)}#node-detail{grid-column:1/-1;position:static;max-height:none}}
.row-text strong .tag-key{display:inline-block;color:var(--ink);font-size:8px;line-height:1.4;margin-left:4px}

/* ===== polish pass 2 ===== */
#open-settings{width:40px;height:40px;justify-content:center;padding:0}
body.no-tags .tag{display:none}body.no-hints footer p{display:none}
/* settings */
.settings-list{display:flex;flex-direction:column;gap:6px}
.setting{display:flex;align-items:center;gap:12px;padding:6px 10px;border:6px solid transparent;border-image:url(assets/ui/slot.png) 3 fill / 6px / 0 stretch}
.setting>span{flex:1}.setting b{display:block;font-weight:600}.setting small{display:block;color:var(--muted);font-size:16px}
.setting .toggle{min-width:96px;justify-content:center;font:16px 'Silkscreen',monospace}
.pixel-range{-webkit-appearance:none;appearance:none;width:160px;height:16px;background:#e6dcbf;border:2px solid var(--ink);cursor:pointer}
.pixel-range::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:24px;background:var(--moss);border:2px solid var(--ink);box-shadow:inset 2px 2px 0 #6f9c44}
.pixel-range::-moz-range-thumb{width:16px;height:24px;background:var(--moss);border:2px solid var(--ink);border-radius:0}
.controls-ref{display:grid;gap:4px}.controls-ref div{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.controls-ref span{color:var(--muted);margin-left:auto}
body.touch .desktop-only{display:none}
/* centered shop with gentle idle motion */
#shop:not(.hidden){left:50%;right:auto;transform:translateX(-50%);width:min(460px,calc(calc(100vw / var(--ui)) - 32px))}
#merchant{animation:idle-bob 2.4s ease-in-out infinite}#shop.selling #merchant{animation-duration:.5s}
@keyframes idle-bob{50%{transform:translateY(-2px)}}
.counter{transition:background-color .2s}.counter.glow{background:#fff1a8}
/* desktop: keep the HUD and the tool bar from overlapping on medium widths */
@media(max-width:1280px){footer p{display:none}}@media(max-width:1060px){.stat.gear{display:none}}
/* ===== mobile controls: big harvest button bottom-centre, everything else stacked top-right ===== */
body.touch #side{position:fixed;top:max(8px,env(safe-area-inset-top));right:max(8px,env(safe-area-inset-right));display:flex;flex-direction:column;gap:6px;z-index:5}
body.touch #side .btn{width:52px;height:52px;justify-content:center;padding:0}
body.touch #act-main{position:fixed;left:50%;transform:translateX(-50%);bottom:max(20px,env(safe-area-inset-bottom));width:104px;height:104px;justify-content:center;z-index:5;touch-action:none}
body.touch #act-main:active{transform:translateX(-50%) translateY(2px)}
#side,#act-main{display:none}body.touch #side{display:flex}body.touch #act-main{display:inline-flex}
body.touch #chatlog{bottom:140px}body.touch #offers{top:auto;bottom:140px;right:8px}
/* toasts (unlocks, purchases) sit at the very top on mobile so they never cover controls or panels' content */
body.touch #toast{top:max(4px,env(safe-area-inset-top));bottom:auto;z-index:20;max-width:calc(calc(100vw / var(--ui)) - 16px);padding:2px 10px}
.setting small{font-family:'Pixelify Sans',monospace;text-transform:none;letter-spacing:0}
details.family{display:block;font:16px 'Pixelify Sans',monospace;grid-column:auto;margin:0 0 6px}
.panel-head{margin-right:0;padding-right:0}
.panel{scrollbar-gutter:stable}
.hero-card>.ico{flex:none}
.sell-pop{top:42%;bottom:auto;left:calc(100% + 10px);transform:none}

/* ===== vertical-only scrolling ===== */
.panel{overflow-x:hidden}
.tabs,.seg,body.touch .tabs{flex-wrap:wrap;overflow-x:visible}
body.touch .seg{display:grid;grid-template-columns:1fr 1fr;gap:4px}body.touch .seg .btn{justify-content:flex-start}
body.touch .branch-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(56px,1fr));gap:4px;overflow:visible}
body.touch .branch{grid-template-columns:1fr;justify-items:center;padding:2px}body.touch .branch>span,body.touch .branch>small{display:none!important}
body.touch .branch-list .overall{grid-column:1/-1}
body.touch #tree-map{display:none}
#slot-tabs{flex-wrap:wrap}
#tree-wrap{overflow-x:hidden}
.research.map{grid-template-columns:minmax(0,1fr) 300px}.research.map .branch-list{display:none}
.row-text,.row-text strong,.row-text span{overflow-wrap:anywhere}

/* ===== milestones ===== */
.overall{padding:4px 6px 6px;border-bottom:2px dashed #d8c9a0;margin-bottom:4px}.overall small{display:block;font:8px 'Silkscreen',monospace;color:var(--muted)}.overall span{font-size:16px;line-height:1.3}
.milestones{display:flex;flex-direction:column;gap:4px;margin-bottom:6px}.milestones>small{font:8px 'Silkscreen',monospace;color:var(--muted)}
.milestone{display:flex;align-items:center;gap:8px;padding:2px 8px;background:#efe5c6;border:2px dashed #c9b98e}
.milestone.done{background:#f6e7b0;border:2px solid #e8a400}
.ms-banner{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:6px 10px;margin:2px 0 6px;background:#efe5c6;border:2px dashed #c9b98e}
.ms-banner small{font:8px 'Silkscreen',monospace;color:var(--muted);width:100%}.ms-banner b{font-weight:600}.ms-banner span{color:var(--muted)}
.ms-banner.done{background:#f6e7b0;border:2px solid #e8a400}

/* ===== big mobile action button: wide HARVEST that turns into SELL when the basket is full ===== */
body.touch #act-main{width:min(220px,calc(60vw / var(--ui)));height:76px;gap:10px;font:16px 'Silkscreen',monospace;color:#fffbea}
body.touch #act-main.sell{border-image-source:url(assets/ui/button_red.png);animation:sell-pulse 1s ease-in-out infinite}
@keyframes sell-pulse{50%{filter:brightness(1.15)}}
body.touch #full-alert{display:none!important}
body.touch .branch-list{grid-template-columns:repeat(auto-fill,minmax(60px,1fr))}body.touch .branch{min-width:0;padding:2px 0}
.branch-heading small{font:16px 'Pixelify Sans',monospace;text-transform:none;letter-spacing:0;display:block}
.stall{overflow:visible;max-width:100%}.sell-scene{overflow:hidden;padding:0 70px}body.touch .sell-scene{padding:0}body.touch .sell-pop{left:auto;right:4px;top:-22px}

/* ===== single-player ===== */
.mp{display:none!important}
.ico.seedpk{background-image:url(assets/seeds.png);--cols:8;--rows:1}
.seed-stat{background:none;border:0;border-left:2px solid #d8c9a0;font:inherit;color:inherit;cursor:pointer}.seed-stat:hover{filter:brightness(1.08)}
.badge.drone{border-image-source:url(assets/ui/panel_blue.png);color:var(--blue)}
#seed-shop{margin-top:10px}#seed-shop h3{margin:6px 0 2px}
.seed-row{flex-wrap:wrap}.seed-row .row-text{min-width:180px}.seed-row small{font:8px 'Silkscreen',monospace;color:var(--muted)}
.seed-buy{display:flex;gap:4px;margin-left:auto}.seed-buy .btn{flex-direction:column;gap:0;padding:2px 8px;font:16px 'Silkscreen',monospace;min-width:64px}.seed-buy .btn small{font-size:8px}
.wb-coins{display:flex;align-items:center;gap:10px;font:24px 'Silkscreen',monospace;color:var(--ink)}
#act-seed{display:none}body.touch.planting #act-seed{display:inline-flex}
.seed-buy .btn small{color:inherit;opacity:.9}

/* Shop tab bar: always one row; labels shrink to icons-plus-8px text on narrow screens. */
.shop-tabs,body.touch .shop-tabs{display:flex;flex-wrap:nowrap;overflow:visible;gap:4px;margin:0 0 10px}
.shop-tabs .btn{flex:1 1 0;min-width:0;justify-content:center;padding:2px 4px 2px 2px;white-space:nowrap}
.shop-tabs em{font:8px 'Silkscreen',monospace;font-style:normal;margin-left:4px}
@media (max-width:420px){.shop-tabs .btn{font:8px 'Silkscreen',monospace;flex-direction:column;gap:0;padding:2px}}
.ico.shopit{background-image:url(assets/shop_items.png);--cols:9;--cell:40px}
.ico.seedpk.tabico{--s:1}
.buff-bar{display:flex;flex-wrap:wrap;gap:6px;margin:4px 0 8px}.buff{display:flex;align-items:center;gap:4px;padding:2px 8px 2px 2px;font:16px 'Silkscreen',monospace}
.item-row .use{min-width:64px}.land-map{display:grid;place-items:center;margin:8px auto}.land-map{width:max-content;padding:8px}.land-map canvas{width:272px;height:144px;max-width:100%;image-rendering:pixelated}
#hud-buffs{display:flex;gap:2px}#hud-buffs .ico{--s:1}#hud-buffs span{font:8px 'Silkscreen',monospace;align-self:flex-end}

/* Before you join, only the field and the welcome card show. */
body:not(.playing) #hud,body:not(.playing) #touch,body:not(.playing) .actions,body:not(.playing) #badges,body:not(.playing) .coords{visibility:hidden}
.touch-only{display:none}body.touch .touch-only{display:block}
/* Mobile pass: the HUD never runs under the side buttons; toasts sit just below the HUD, clear of the side column;
   the joystick only appears where you touch (it floats). */
body.touch .hud{max-width:calc(calc(100vw / var(--ui)) - 84px);overflow:hidden}
body.touch #toast{top:calc(max(8px,env(safe-area-inset-top)) + 62px);left:8px;right:auto;transform:none;max-width:calc(calc(100vw / var(--ui)) - 84px);text-align:left}
body.touch #joy{opacity:0}body.touch #joy.held{opacity:.95}

/* App feel on phones: no text selection, callouts or tap flashes on game UI (inputs stay selectable). */
html,body{-webkit-tap-highlight-color:transparent;overscroll-behavior:none}
body{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}
input,textarea{-webkit-user-select:text;user-select:text}
button,.btn{touch-action:manipulation}
body.returning:not(.playing) #welcome{visibility:hidden}
/* Compact one-row HUD on phones */
body.touch .hud{flex-wrap:nowrap;gap:2px}body.touch .stat{padding:0 4px;gap:2px}body.touch .basket{gap:4px;padding-right:4px}body.touch .bar{width:60px}

#loading{display:none;position:fixed;left:50%;top:45%;transform:translate(-50%,-50%);z-index:30;padding:12px 20px;text-align:center;flex-direction:column;align-items:center;gap:4px}
#loading{white-space:nowrap}#loading b{font:16px 'Silkscreen',monospace}#loading small{font-size:16px;color:var(--muted)}
body.returning:not(.playing) #loading{display:flex}body.returning:not(.playing) #loading .ico{animation:bob 1s ease-in-out infinite alternate}
@keyframes bob{to{translate:0 -6px}}
body.touch #open-settings,body:not(.playing) #open-settings{display:none}
/* The big button is a MOVE pad (it harvests or plants as you walk); it turns into SELL when the basket is full. */
#act-main-label small{display:block;font:8px 'Silkscreen',monospace;opacity:.85;margin-top:2px}
body.touch #act-main.held{filter:brightness(1.12)}
body.touch .hud strong{white-space:nowrap}body.touch .basket .cap{display:none}
/* Side buttons carry a tiny caption so every icon is self-explanatory. */
body.touch #side .btn{flex-direction:column;gap:0;height:56px}body.touch #side .btn small{font:8px 'Silkscreen',monospace;line-height:1;margin-top:1px}
#sell{flex-direction:column;gap:2px}#sell small{font:16px 'Silkscreen',monospace;opacity:.9}
/* (40px-cell icons are trimmed to a 32px footprint at the end of this file, so no compensating margins here) */
body.touch .sell-pop{left:50%;right:auto;top:auto;bottom:6px;transform:translateX(-50%);font-size:24px;z-index:2}
/* Mobile research branches: icon + short label + mini progress, 4 per row */
.branch .bl{display:none}
body.touch .branch-list{grid-template-columns:repeat(4,1fr)}
body.touch .branch .bl{display:block;position:relative;font:8px 'Silkscreen',monospace;font-style:normal;text-transform:uppercase;line-height:1;padding:2px 0 4px;max-width:100%;overflow:hidden;text-overflow:clip;white-space:nowrap}
body.touch .branch .bl u{position:absolute;left:0;bottom:0;height:2px;background:var(--moss);text-decoration:none}
body.touch .branch.active .bl u{background:var(--gold)}
/* Mobile gear lists: icon + text on one line, the buy button drops below when there's no room; words never split. */
body.touch .hero-card{display:grid;grid-template-columns:auto 1fr;gap:6px 10px}body.touch .hero-card>.btn{grid-column:1/-1;justify-content:center}
.row-text,.row-text strong,.row-text span{overflow-wrap:break-word;word-break:normal}
body.touch .item-row{flex-wrap:wrap}body.touch .item-row .row-text{flex:1 1 140px}body.touch .item-row>.ico{--s:1!important}
body.touch .item-row>.btn,body.touch .item-row>.seed-buy{margin-left:auto}
/* Mobile wardrobe: preview centred on top, hint as one line under it */
body.touch .mannequin{flex-direction:column;align-items:center;gap:4px}body.touch #mannequin{width:144px;height:144px}
body.touch .mannequin .hint{font-size:16px;margin:0;max-width:none}body.touch #worn-effects{width:100%}
body.touch #slot-tabs{display:grid;grid-template-columns:1fr 1fr;gap:6px}body.touch #slot-tabs .btn{justify-content:flex-start}

.touch-only-flex{display:none!important}body.touch .touch-only-flex{display:flex!important}
body.touch:has(.panel:not(.hidden)) #toast{top:auto;bottom:calc(max(12px,env(safe-area-inset-bottom)) + 4px);left:50%;transform:translateX(-50%);max-width:calc(calc(100vw / var(--ui)) - 32px);text-align:center}
/* first-session goal chip */
#goal{position:fixed;left:16px;top:96px;z-index:4;display:flex;align-items:center;gap:6px;padding:2px 10px 2px 2px;text-align:left;cursor:pointer;color:var(--ink);max-width:320px}
#goal small{display:block;font:8px 'Silkscreen',monospace;color:var(--muted)}#goal b{display:block;font:600 16px 'Pixelify Sans',monospace;line-height:1.1}
body.touch #goal{left:8px;top:calc(max(8px,env(safe-area-inset-top)) + 60px);max-width:calc(calc(100vw / var(--ui)) - 84px)}
body:not(.playing) #goal{display:none}
body.touch #toast{top:calc(max(8px,env(safe-area-inset-top)) + 112px)}
@media (orientation:landscape) and (max-height:520px){body.touch #act-main{left:max(16px,env(safe-area-inset-left));transform:none;width:200px;height:64px}body.touch #act-main:active{transform:translateY(2px)}}
body.playing .intro{display:none}
#goal{top:auto;bottom:96px}
body.touch #goal{bottom:auto}
body.returning:not(.playing) .intro,body.returning:not(.playing) footer,body.returning:not(.playing) header,body:not(.playing) footer{visibility:hidden}
/* Phones: streak counter and status badges float just above the Move pad, clear of the HUD and goal chip */
body.touch #combo{top:auto;bottom:calc(max(20px,env(safe-area-inset-bottom)) + 88px);font-size:16px}
body.touch #badges{top:auto;bottom:calc(max(20px,env(safe-area-inset-bottom)) + 112px)}
@media (orientation:landscape) and (max-height:520px){body.touch #combo{bottom:96px;left:120px;transform:none}body.touch #badges{bottom:120px;left:16px;transform:none}}
/* tutorial pointer + highlighted control */
#tut-hand{position:fixed;z-index:40;pointer-events:none;rotate:90deg;animation:tut-bob .6s ease-in-out infinite alternate;filter:drop-shadow(2px 2px 0 #1d261e88)}
#tut-hand.up{rotate:-90deg;animation-name:tut-bob-up}
@keyframes tut-bob{to{translate:0 8px}}@keyframes tut-bob-up{to{translate:0 -8px}}
.tut-target{animation:tut-pulse 1s steps(2) infinite}
@keyframes tut-pulse{50%{outline:4px solid var(--gold);outline-offset:2px}}
#goal-skip{font:8px 'Silkscreen',monospace;padding:2px 6px;margin-left:6px;flex:none}
#combo{white-space:nowrap}
/* riding: planting controls go away (planting is done on foot) */
body.riding #act-seed,body.riding [data-tool="plant"]{display:none!important}
/* tutorial spotlight: everything dims except the target and the goal chip */
body.tut-lock::after{content:"";position:fixed;inset:0;background:#1d261e40;z-index:30;pointer-events:none}
body.tut-lock #goal{z-index:36}
body.touch:has(.panel:not(.hidden)) #goal{top:auto;bottom:calc(max(12px,env(safe-area-inset-bottom)) + 4px)}body.touch:has(.panel:not(.hidden)) #toast{bottom:calc(max(12px,env(safe-area-inset-bottom)) + 72px)}
body.touch .arrow span{font-size:16px;text-shadow:2px 2px 0 var(--ink)}
body.touch .hud small{display:none}body.touch .hud strong{font-size:16px}body.touch .hud .ico{--s:1}
/* Phones: drop 8px eyebrows over panel titles (unreadable at phone size); titles carry the meaning */
body.touch .panel-head .eyebrow{display:none}body.touch .panel-head h2{margin:0}
.overall em{font-style:normal}
body.touch .drawer-grid .desktop-only{display:none}
body.touch .drawer-stats{display:none}
/* Phones: readable upgrade tabs (16px names, no counts), no search box, no duplicate research counter */
body.touch #upgrades .tabs.seg{display:grid;grid-template-columns:1fr 1fr;gap:6px}
body.touch #upgrades .tabs.seg .btn{font:16px 'Pixelify Sans',monospace;text-transform:none;letter-spacing:0;justify-content:flex-start;gap:4px;padding:2px 6px 2px 2px}
body.touch #upgrades .tabs.seg small{display:none}
body.touch #tree-search{display:none}body.touch .branch-list .overall small{display:none}
body.touch .branch>.ico{--s:2!important;margin:0 -4px}body.touch .branch{padding:4px 0 2px}
/* Phones: research rows get the full width for text (price stays on the right, compact), and runs of locked or
   already-owned rows collapse to one, so each stage reads as "done / next / locked". */
body.touch .node-row{gap:6px;padding:2px 4px}body.touch .node-row .row-text{min-width:0}
body.touch .node-row .btn.buy{padding:2px 4px;font-size:16px}body.touch .node-row .btn.buy .ico{--s:1}
body.touch #tree-list .node-row.locked+.node-row.locked{display:none}
body.touch #tree-list .node-row.owned:has(+ .node-row.owned){display:none}
body.touch .node-row .state{display:none}
body.touch #tree-list>.milestones{display:none}
/* Phones: the hero card is the one place to buy the next item; the list just shows the ladder */
body.touch .family-items .item-row.next{display:none}
body.touch .family-items .item-row.future .state{display:none}
body.touch .hero-card small{display:none}
body.touch .hero-card h3{font-size:24px}
body.touch .family-items .item-row.future .row-text span{display:none}body.touch .family-items .item-row.future{padding-top:2px;padding-bottom:2px}
/* simpler shop buttons: price with a coin icon, readable sizes, ownership as a badge */
.seed-buy .btn{flex-direction:row;gap:4px;min-width:0}.seed-buy .btn b{font-weight:400;margin-right:4px}.seed-buy .btn .ico{--s:1}
.row-text .have{font:16px 'Silkscreen',monospace;font-style:normal;color:var(--moss)}
body.touch #badge-drone{display:none!important}
/* Phones: readable wardrobe section titles and slot tabs */
body.touch .look-part>small{font:16px 'Silkscreen',monospace;color:var(--ink)}
body.touch #slot-tabs .btn{font:16px 'Pixelify Sans',monospace;text-transform:none;letter-spacing:0}body.touch #slot-tabs small{display:none}
body.touch .look-opt small{font-size:8px}
/* Phones: compact clothing cards with readable bonus and price */
body.touch #cloth-list .card{padding:4px 8px;gap:8px}body.touch #cloth-list .card>.ico{--s:1!important}
body.touch #cloth-list .card small{font:16px 'Pixelify Sans',monospace;text-transform:none;letter-spacing:0;color:var(--muted)}
body.touch #cloth-list .card .cost{font:16px 'Silkscreen',monospace;display:flex;align-items:center;gap:2px}body.touch #cloth-list .card .cost .ico{--s:1}
body.touch .setting>span small:not(#volume-label){display:none}body.touch .setting{padding-top:2px;padding-bottom:2px;min-height:0}
/* buy-button rows share the width and wrap; panels never scroll sideways */
.seed-buy{flex-wrap:wrap;justify-content:flex-end;max-width:100%}
body.touch .seed-buy{width:100%}body.touch .seed-buy .btn{flex:1 1 0;justify-content:center;white-space:nowrap}
.panel{overflow-x:hidden}
body.touch .land-map canvas{width:272px;height:144px}body.touch .land-map{padding:4px;width:auto}
/* Nothing sticks while scrolling: tab bars, headers, lists and previews scroll with the content (sticky bars slid
   down over the content they were meant to label). */
/* tab rows and lists scroll with the content (they used to stick and cover it); the panel head with the close button stays put (see .panel-head) */
.seg,.branch-list,#node-detail,.mannequin,body.touch .seg{position:static!important}
body.touch .family-items .item-row.owned .row-text span{display:none}body.touch .family-items .item-row.owned{flex-wrap:nowrap;padding-top:2px;padding-bottom:2px}body.touch .family-items .item-row.owned .row-text{flex:1 1 auto}
/* Phones: no movement button (drag anywhere); the big button is a SELL pop-up that appears as the basket fills */
body.touch #act-main{display:none}body.touch #act-main.show{display:inline-flex;border-image-source:url(assets/ui/button_red.png);animation:none}
body.touch #act-main.show.full{animation:sell-pulse 1s ease-in-out infinite}
body.touch #combo{bottom:calc(max(20px,env(safe-area-inset-bottom)) + 12px)}body.touch #badges{bottom:calc(max(20px,env(safe-area-inset-bottom)) + 36px)}
body.touch:has(#act-main.show) #combo{bottom:calc(max(20px,env(safe-area-inset-bottom)) + 88px)}body.touch:has(#act-main.show) #badges{bottom:calc(max(20px,env(safe-area-inset-bottom)) + 112px)}
body.touch #badge-auto{display:none!important}
body.touch :is(#item-shop,#extras-shop) .seed-buy{width:auto}body.touch :is(#item-shop,#extras-shop) .seed-buy .btn{flex:none;min-width:96px}
/* Monetization: browser test-mode ad, Extras rows, the 2X side button */
.test-ad{position:fixed;inset:0;z-index:60;background:#1d261ecc;display:grid;place-items:center}
.test-ad .frame{display:flex;flex-direction:column;align-items:center;gap:8px;padding:16px 20px;max-width:300px;text-align:center}
.test-ad small{font:8px 'Silkscreen',monospace;color:var(--muted)}.test-ad b{font:600 16px 'Pixelify Sans',monospace}
.test-ad-bar{display:block;width:220px;height:8px;border:2px solid var(--ink);background:#e6dcbf}.test-ad-bar i{display:block;height:100%;width:0;background:var(--moss);animation:test-ad 3s linear forwards}
@keyframes test-ad{to{width:100%}}
.test-note{border:2px dashed #b98a5a;padding:4px 8px}
#extras-shop h3{margin:10px 0 4px}.item-row.pass{background:#fff3c4;outline:2px solid #e8b830}.item-row.pass.owned{outline-color:var(--moss)}
#extras-shop .hint .btn{display:inline-flex;margin-left:6px;font:16px 'Silkscreen',monospace;padding:0 8px}
#act-frenzy{animation:frenzy-pulse 1.2s ease-in-out infinite}@keyframes frenzy-pulse{50%{filter:brightness(1.25)}}
#wb-double{margin-bottom:6px}
#sale-bonus{margin-top:6px;gap:6px;border-image-source:url(assets/ui/card_owned.png);animation:frenzy-pulse 1.2s ease-in-out infinite}
.ad-ico{--s:1;margin-right:2px}
/* centred without transform, so the bump animation can't push the streak label off screen */
#combo{left:0!important;right:0;transform:none!important;text-align:center}
/* phone: the basket / coins cards share the row without overflowing */
body.touch .counters{grid-template-columns:repeat(2,minmax(0,1fr))}
body.touch .counter{min-width:0;padding:6px 8px;gap:6px}
body.touch .counter .ico{--s:1!important}
body.touch .counter>div{min-width:0}
body.touch .counter strong{display:block;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* phone: each seed is a card: a bigger packet beside its name and stats, buy buttons full width underneath */
body.touch #seed-shop .seed-row{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:6px 10px;padding:8px;margin:0 0 8px;background:#fffbea;box-shadow:inset 0 0 0 2px #e2d3a8}
body.touch #seed-shop .seed-row>.ico{--s:2!important}
body.touch #seed-shop .seed-row .row-text{min-width:0}
body.touch #seed-shop .seed-buy{grid-column:1/-1;margin:0}
body.touch #seed-shop .hint{margin:0 0 8px}
body.touch :is(#item-shop,#extras-shop) :is(.seed-row,.item-row){display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:6px 8px;padding:8px;margin:0 0 8px;background:#fffbea;box-shadow:inset 0 0 0 2px #e2d3a8}
body.touch :is(#item-shop,#extras-shop) :is(.seed-row,.item-row)>.ico{--s:2!important;grid-row:span 2}
body.touch :is(#item-shop,#extras-shop) :is(.seed-row,.item-row) .row-text{min-width:0}
body.touch :is(#item-shop,#extras-shop) .seed-buy{grid-column:2;justify-content:flex-start;margin:0}
/* active buffs: steady (no blink), readable timer; Harvest Frenzy gets a gold frame */
.badge.buff-b{animation:none;display:inline-flex;align-items:center;gap:4px;font-size:16px;padding:0 6px 0 0;border-image-source:url(assets/ui/panel_dark.png)}
.badge.buff-b .ico{--s:1!important;margin:-4px 0}#hud-buffs .badge.buff-b span{font-size:16px;align-self:center}
.badge.buff-b.frenzy{color:#3a2a08;border-image-source:url(assets/ui/card_owned.png)}
/* phone: while the goal chip is showing, toasts drop below it instead of sliding under it */
body.touch:has(#goal:not(.hidden)):not(:has(.panel:not(.hidden))) #toast{top:calc(max(8px,env(safe-area-inset-top)) + 136px)}
/* phone: the goal chip sits at the bottom while a panel is open; keep the panel's last row clear of it */
body.touch:has(#goal:not(.hidden)) .panel{max-height:calc(100vh - 92px);max-height:calc(100dvh - 92px)} /* the goal chip sits below the panel, never over it */
body.touch:has(#goal:not(.hidden)) :is(#drawer,#bag){bottom:calc(max(8px,env(safe-area-inset-bottom)) + 80px)!important}
#tut-hand.side{rotate:0deg;animation-name:tut-bob-side}@keyframes tut-bob-side{to{translate:6px 0}}
/* Icons only ever scale by whole steps (--s 1 or 2): a fractional scale drops or doubles pixels unevenly.
   1x (and up to 1.5x) screens: 64px icon art squeezed into a 32px box loses every other pixel, so use the atlases
   drawn for 32px (assets/lo/, same layout at half the cell size; tools/art_lo.py). 2x and 3x screens keep the
   hi-detail art. */
@media (max-resolution:1.49dppx),(-webkit-max-device-pixel-ratio:1.49){
 .ico{background-image:url(assets/lo/ui.png)}
 .ico.tool{background-image:url(assets/lo/tools.png)}
 .ico.veh{background-image:url(assets/lo/vehicles.png)}
 .ico.cloth{background-image:url(assets/lo/clothes_icons.png)}
 .ico.nodeart{background-image:url(assets/lo/nodes.png)}
 .ico.branchart{background-image:url(assets/lo/branches.png)}
 .ico.seedpk{background-image:url(assets/lo/seeds.png)}
 .ico.shopit{background-image:url(assets/lo/shop_items.png)}
}
/* phone HUD: three stats must fit beside the side column even at 5-character values (99.9K / 9.99M) */
body.touch .hud{max-width:calc(calc(100vw / var(--ui)) - 76px);padding:2px 6px 2px 2px}
body.touch .stat{padding:0 1px}body.touch .basket{padding-right:2px}body.touch .bar{width:48px}
/* Tool, vehicle, clothing and shop-item atlases use 40px cells (32px art + 4px breathing room). Trim that room with a
   negative margin so they take the same footprint as every other 32px icon: labels under them line up and nothing gets
   pushed into a button's edge. */
.ico:is(.tool,.veh,.cloth,.shopit){margin:calc(var(--s) * -4px)}
/* "N READY" badges stay lit: a blink spends half its time looking disabled */
#shop-upgrades .ready,#drawer-ready{animation:none}
/* The shop panel is narrow at every screen size (max ~450px), so its tabs always stack icon over label and the
   basket/coins cards always share one row with the price underneath (this used to apply on phones only). */
.shop-tabs .btn{font:8px 'Silkscreen',monospace;flex-direction:column;gap:0;padding:2px}
.counter{min-width:0;padding:6px 8px;gap:6px}.counter>div{min-width:0}.counter .ico{--s:1!important}
.counter strong{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* ---- phone: the two main corner buttons. Bottom-left switches harvesting/planting (shows the current mode, big);
   bottom-right opens your items. The SELL pop-up sits between them. ---- */
#act-mode,#act-veh{display:none} /* corner buttons: phones only (body.touch shows them); #act-bag lives in the side column */
body.touch #act-mode,body.touch #act-veh{display:inline-flex;position:fixed;bottom:max(16px,env(safe-area-inset-bottom));z-index:5;width:88px;height:108px;
 flex-direction:column;align-items:center;justify-content:center;gap:1px;padding:2px;touch-action:none;color:var(--ink)}
body.touch #act-mode{left:max(8px,env(safe-area-inset-left))}body.touch #act-veh{right:max(8px,env(safe-area-inset-right))}
body.touch :is(#act-mode,#act-veh) b{font:600 16px 'Pixelify Sans',monospace;line-height:1;margin-top:-2px}
body.touch :is(#act-mode,#act-veh) small{font:8px 'Silkscreen',monospace;opacity:.85;line-height:1;white-space:nowrap;max-width:80px;overflow:hidden;text-overflow:ellipsis;flex:none}body.touch :is(#act-mode,#act-veh)>*{flex-shrink:0} /* never squeeze the label lines */
body.touch #act-mode{border-image-source:url(assets/ui/card_owned.png)}
body.touch #act-mode.plant{border-image-source:url(assets/ui/button.png);color:#fffbea}
body.touch #act-mode .swap{position:absolute;top:-10px;right:-10px;--s:1}   /* the loop arrows: tapping switches */
body.touch #act-mode:active,body.touch #act-veh:active{transform:translateY(2px)}
body.touch #act-veh .ico{--s:2!important}body.touch #act-veh.riding{border-image-source:url(assets/ui/button.png);color:#fffbea}body.touch #act-veh.locked{opacity:.8}
#act-bag .count,.bag-item .count{position:absolute;top:-8px;right:-8px;font:16px 'Silkscreen',monospace;font-style:normal;color:#fffbea;background:var(--red,#c8432f);
 border:2px solid var(--ink);padding:0 4px;line-height:18px;min-width:22px;text-align:center}
body.touch #act-main{width:calc(calc(100vw / var(--ui)) - 2 * (max(8px,env(safe-area-inset-left)) + 96px));max-width:220px;bottom:max(28px,env(safe-area-inset-bottom))}
/* items bag: a grid of what you own; tap a tile to use it */
#bag .buff-bar:empty{display:none}
.bag-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(136px,1fr));gap:10px;margin-top:6px}
.bag-item{position:relative;display:flex;flex-direction:column;align-items:center;text-align:center;gap:2px;padding:8px 6px;cursor:pointer;color:var(--ink)}
.bag-item b{font:600 16px 'Pixelify Sans',monospace}.bag-item small{font:12px/1.2 'Pixelify Sans',monospace;color:var(--muted)}
.bag-item .use{margin-top:4px;font:8px 'Silkscreen',monospace;padding:2px 10px;background:var(--moss,#3f6b3a);color:#fffbea;border:2px solid var(--ink)}
.bag-empty{text-align:center;padding:12px 0}.bag-empty .btn{display:inline-flex;gap:6px;align-items:center}
.bag-empty{grid-column:1/-1}
/* phone: the bag is a bottom sheet like the menu, so items are one thumb-reach away */
body.touch #bag{top:auto!important;bottom:max(8px,env(safe-area-inset-bottom))!important;max-height:calc(72vh / var(--ui))}
/* dev (#clean): world only, for store art */
body.clean :is(#hud,#touch,header,footer,nav.actions,#goal,#toast,#badges,#combo,#arrows,.coords,#tip,#full-alert,#tut-hand,#welcome-back,.panel){display:none!important}
/* phone: the streak label and buff badges sit above the corner buttons (and the SELL pop-up), never behind them */
body.touch #combo,body.touch:has(#act-main.show) #combo{bottom:calc(max(16px,env(safe-area-inset-bottom)) + 108px)}
body.touch #badges,body.touch:has(#act-main.show) #badges{bottom:calc(max(16px,env(safe-area-inset-bottom)) + 132px)}

/* No ligatures: Pixelify Sans joins "fi" into one glyph that reads as an "A" ("CornAnity", "Anrst"). */
*,*::before,*::after{font-variant-ligatures:none!important;font-feature-settings:"liga" 0,"clig" 0,"calt" 0!important} /* !important: every font: shorthand resets these */

/* ---- big screens: the UI steps up to 2x (whole steps only, so pixel art stays crisp). Set by game.js from the window
   size; the canvases are never zoomed, and elements that game.js positions in viewport pixels are scaled instead. ---- */
:root{--ui:1}
body>header,.hud,nav.actions,#combo,#full-alert,.panel,#goal,#toast,footer,#welcome-back,#loading,#welcome,#badges{zoom:var(--ui)} /* body>header: panels have their own <header> */
/* viewport units inside those roots are written as calc(Nvw / var(--ui)) so they still mean the real viewport */
.arrow{transform:translate(-50%,-50%) scale(var(--ui))}#tut-hand{scale:var(--ui)}
.coords{display:none} /* tile coordinates: a dev readout, not something players need */
#welcome .frame{max-width:360px;text-align:center}#welcome .btn{margin-top:12px}
#name-input{width:150px;font:16px 'Pixelify Sans',monospace;padding:4px 8px}
#account-row img{width:32px;height:32px;image-rendering:auto;margin-right:6px;vertical-align:middle}
.ad-note{padding:6px 10px;margin:0 0 8px}

/* small buttons (settings toggles, zoom, SKIP, bag USE): a one-pixel ink border instead of the 9-slice frame */
.setting .btn,#goal-skip,.bag-item .use{border:var(--u) solid var(--ink);border-image:none;background:#efe5c6;color:var(--ink);padding:2px 10px;box-shadow:var(--u) var(--u) 0 var(--ink);filter:none;min-height:0;line-height:1.2}
.setting .btn.primary{background:var(--moss);color:#fffbea}.setting .btn:disabled{background:#d8d0b8}
.setting .btn:active,#goal-skip:active{transform:translate(var(--u),var(--u));box-shadow:none}
#zoom-in,#zoom-out{width:28px;padding:2px 0;text-align:center}

/* ---- play together ---- */
#party-chip{position:fixed;left:50%;top:max(8px,env(safe-area-inset-top));transform:translateX(-50%);z-index:4;display:flex;align-items:center;gap:6px;padding:0 8px 0 2px;font:8px 'Silkscreen',monospace;color:var(--muted);pointer-events:none;zoom:var(--ui)}
#party-chip b{font:16px 'Silkscreen',monospace;color:var(--ink);letter-spacing:2px}
body.touch #party-chip{top:calc(max(8px,env(safe-area-inset-top)) + 60px);left:8px;transform:none}
body.touch:has(#goal:not(.hidden)) #party-chip{top:calc(max(8px,env(safe-area-inset-top)) + 116px)}
.party-join{display:flex;gap:8px;margin:12px 0}.party-join input{min-width:0}.party-join .btn{flex:none}#party-code{flex:0 0 118px;font:24px 'Silkscreen',monospace;letter-spacing:6px;text-transform:uppercase;text-align:center;padding:6px}
.party-code{text-align:center;padding:12px 8px;margin-bottom:12px;background:#fffbea80}.party-code b{display:block;font:40px 'Silkscreen',monospace;letter-spacing:8px;margin:4px 0}.party-code small{display:block;font:8px 'Silkscreen',monospace;color:var(--muted)}
.party-list{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}.party-row{display:flex;align-items:center;gap:8px;padding:4px 8px;background:#fffbea80}.party-row span{flex:1}.party-row small{font:8px 'Silkscreen',monospace;color:var(--muted)}
.hint.small{font-size:12px}
.party-host{margin-bottom:10px}.party-host .setting{margin:0 0 6px}#party-pass,#party-join-pass{width:140px;font:16px 'Pixelify Sans',monospace;padding:4px 8px}
#party-join-pass{flex:1 1 60px;width:auto;font:16px 'Pixelify Sans',monospace;padding:6px 8px}
.party-browse h3{display:flex;align-items:center;justify-content:space-between;margin:12px 0 6px}
.btn.small{border:var(--u) solid var(--ink);border-image:none;background:#efe5c6;color:var(--ink);padding:2px 10px;box-shadow:var(--u) var(--u) 0 var(--ink);filter:none;min-height:0;font-size:16px}
.party-row b{font:16px 'Silkscreen',monospace;letter-spacing:2px}

.desktop-only-flex{display:flex}body.touch .desktop-only-flex{display:none}
/* settings rows and list rows: a one-pixel rule instead of the 9-slice frame, so the controls stand out, not the boxes */
.setting,.party-row,.bag-item{border:var(--u) solid #c9b98e;border-image:none;background:#fffbea80;box-shadow:none;filter:none}
.setting{padding:6px 10px}
/* a setting's hint shows only the version for this device (the Zoom row has one for mouse wheel and one for pinch) */
body:not(.touch) .setting small.touch-only{display:none}body.touch .setting small.desktop-only{display:none}

body:not(.touch):has(.panel:not(.hidden)) #goal{top:8px;bottom:auto;left:50%;transform:translateX(-50%);max-width:none;white-space:nowrap} /* one line: it must clear the panel top at 64px */
/* a narrow pixel scrollbar: the reserved gutter is 8px, not the browser's 15px, so panels aren't lopsided when they don't scroll */
.panel::-webkit-scrollbar{width:8px}.panel::-webkit-scrollbar-track{background:#e6dcbf}.panel::-webkit-scrollbar-thumb{background:var(--moss);border:2px solid #e6dcbf}

/* short desktop windows (720p): the Sell tab fits without scrolling; the Upgrades shortcut is in the nav anyway */
@media (max-height:820px){body:not(.touch) #shop-next,body:not(.touch) .sell-scene .quote{display:none}body:not(.touch) #merchant{--s:3!important}}
/* phones: a top-anchored panel hides the corner buttons and the SELL pop-up (they'd peek out under short panels) */
body.touch:has(.panel:not(.hidden):not(#drawer):not(#bag)) :is(#act-mode,#act-veh,#act-main){display:none!important}
