:root{
  --bg:#0b100d;
  --bg-2:#121915;
  --panel:#161f19;
  --panel-border:#2b3a31;
  --ink:#eef3ec;
  --ink-dim:#8fa294;
  --accent:#ffb01f;
  --accent-ink:#221602;
  --danger:#ff4d4d;
  --good:#8bd450;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;}
html,body{height:100%;margin:0;overflow:hidden;overscroll-behavior:none;background:var(--bg);color:var(--ink);font-family:'Manrope',system-ui,sans-serif;position:fixed;width:100%;touch-action:none;}
#app{position:fixed;inset:0;height:100dvh;user-select:none;-webkit-user-select:none;touch-action:none;}
canvas#game{position:absolute;inset:0;width:100%;height:100%;display:block;touch-action:none;background:var(--bg);}
.hidden{display:none !important;}

/* ---- Стартовый экран ---- */
/* Раньше это была одна центрированная карточка; теперь на ней же ещё
   список карт и топ игроков — контента стало больше, чем влезает в один
   экран на мобильном, поэтому сам #startScreen теперь скроллится, а не
   центрирует содержимое жёстко по вертикали. */
#startScreen{position:absolute;inset:0;overflow-y:auto;background:radial-gradient(ellipse at center, #16211a 0%, #0b100d 75%);}
.landingWrap{width:100%;max-width:480px;margin:0 auto;padding:2rem 1rem 2.5rem;display:flex;flex-direction:column;gap:1.1rem;box-sizing:border-box;}
.card{background:var(--panel);border:1px solid var(--panel-border);padding:2rem 2.4rem;border-radius:10px;width:92vw;max-width:420px;text-align:center;box-shadow:0 20px 60px rgba(0,0,0,.5);}
.landingWrap .card{width:100%;max-width:none;margin:0 auto;}

/* ---- Панели «Онлайн карты» и «Топ игроков» под карточкой входа ---- */
.panel{background:var(--panel);border:1px solid var(--panel-border);border-radius:10px;padding:1.1rem 1.3rem;text-align:left;}
.panel h2{margin:0 0 .7em;font-size:.78rem;letter-spacing:.04em;color:var(--ink-dim);text-transform:uppercase;font-weight:800;}
.panelHint{color:var(--ink-dim);font-size:.85rem;padding:.3em 0;}

.matchList{display:flex;flex-direction:column;gap:.5em;}
.matchRow{display:flex;align-items:center;gap:.7em;background:var(--bg-2);border:1px solid var(--panel-border);border-radius:6px;padding:.55em .8em;}
.matchRow .swatch{width:48px;height:48px;border-radius:6px;border:1px solid var(--panel-border);flex-shrink:0;box-shadow:0 0 8px rgba(0,0,0,.5);image-rendering:pixelated;}
.matchRow .matchInfo{flex:1 1 auto;min-width:0;}
.matchRow .matchName{font-weight:800;font-size:.9rem;}
.matchRow .matchOnline{color:var(--ink-dim);font-size:.78rem;}
.matchRow .matchTimer{color:var(--ink-dim);font-size:.72rem;margin-top:.15em;}
.matchRow button{flex-shrink:0;padding:.45em .9em;border-radius:4px;border:2px solid #8a5900;background:var(--accent);color:var(--accent-ink);font-weight:800;font-size:.8rem;cursor:pointer;}
.matchRow button:active{transform:translateY(1px);}
.matchRow.full button, .matchRow.down button{opacity:.5;cursor:not-allowed;}

.mainLbList{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.4em;}
.mainLbList li.panelHint{background:none;border:none;padding:.3em 0;box-shadow:none;}
.mainLbList .lbRow{display:flex;align-items:center;gap:.6em;font-size:.85rem;background:var(--bg-2);border:1px solid var(--panel-border);border-radius:8px;padding:.45em .65em;}
.mainLbList .pos{width:1.5em;text-align:center;color:var(--ink-dim);font-weight:800;font-size:.8rem;flex-shrink:0;}
.mainLbList .lbMedal{width:1.5em;text-align:center;font-size:1.1rem;line-height:1;flex-shrink:0;}
.mainLbList .avatar{width:1.9em;height:1.9em;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:.8rem;background:linear-gradient(135deg,#8b9990,#4c584e);color:#182019;}
.mainLbList .lbInfo{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:.08em;}
.mainLbList .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:700;}
.mainLbList .rank{color:var(--ink-dim);font-size:.72rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.mainLbList .lbSuperBadge{color:var(--accent);font-weight:800;}
.mainLbList .kills{display:flex;align-items:center;gap:.3em;color:var(--accent);font-weight:800;flex-shrink:0;}
.mainLbList .killIcon{font-size:.78rem;opacity:.85;}

/* Бейджи по бракету звания — от новичка до легендарного сверх-уровня */
.mainLbList .lbBronze .avatar{background:linear-gradient(135deg,#c8834a,#7a4b23);color:#2a1704;}
.mainLbList .lbSilver .avatar{background:linear-gradient(135deg,#d9e0e3,#8b98a0);color:#1c2226;}
.mainLbList .lbGold .avatar{background:linear-gradient(135deg,#ffd76b,#c98f1c);color:#2a1c02;}
.mainLbList .lbPlat .avatar{background:linear-gradient(135deg,#cdbaff,#7b5fd1);color:#170d30;}
.mainLbList .lbLegend .avatar{background:linear-gradient(135deg,#ff6a5e,#ff2f92);color:#2a0410;box-shadow:0 0 8px rgba(255,60,120,.55);}
.mainLbList .lbLegend{border-color:rgba(255,60,120,.45);}
.mainLbList .lbLegend .lbSuperBadge{color:#ff7fae;}

/* Подиум — топ-3 подсвечены каймой независимо от бракета */
.mainLbList .lbRank1{box-shadow:0 0 0 1px rgba(255,215,90,.55) inset,0 0 14px rgba(255,176,31,.2);}
.mainLbList .lbRank2{box-shadow:0 0 0 1px rgba(206,215,222,.45) inset;}
.mainLbList .lbRank3{box-shadow:0 0 0 1px rgba(205,144,86,.45) inset;}

@media (max-width:420px){
  .panel{padding:.9rem 1rem;}
  .matchRow{flex-wrap:wrap;}
  .mainLbList .rank{display:none;} /* на совсем узких экранах ранг прячем — имя и киллы важнее */
}

/* ---- Блочно-танковый вход: полосы гусениц сверху и снизу — тот же язык,
   что и у ящиков/танков в игре (рамка и заклёпки убраны). ---- */
#startScreen .card{
  position:relative;
  border:1px solid var(--panel-border);
  box-shadow:none;
  border-radius:14px;
  background:linear-gradient(180deg, #1b241d 0%, #141c17 100%);
  overflow:visible;
}
.treadStrip{height:10px;margin:0 -2.4rem 1.2rem;
  background-image:repeating-linear-gradient(90deg, #2b2116 0 10px, #4a3a22 10px 20px);
  border-top:1px solid rgba(0,0,0,.4); border-bottom:1px solid rgba(0,0,0,.4);}
/* Нижняя полоса — последний div в карточке (:first-of-type тут не подходит,
   первый div вообще заклёпка, а не полоса). Без зазора сверху она вплотную
   лепится к кнопке «Играть», и её объёмный box-shadow (4px снизу) наезжает
   прямо на полосу — добавляем отступ. */
.treadStrip:last-of-type{margin-top:1rem;}
@media (max-width:420px){
  .card{padding:1.4rem 1.3rem;} #startScreen h1{font-size:.85rem;}
  .treadStrip{margin-left:-1.3rem;margin-right:-1.3rem;}
}
#logo{width:128px;height:128px;margin-bottom:.7rem;}
#startScreen h1{font-family:'Press Start 2P',monospace;font-size:1.15rem;letter-spacing:.03em;margin:.4rem 0 .8rem;color:var(--accent);line-height:1.5;text-shadow:0 2px 0 rgba(0,0,0,.5);}
.tagline{color:var(--ink-dim);font-size:.92rem;line-height:1.5;margin-bottom:1.2rem;}
#nameInput{width:100%;padding:.7rem .9rem;border-radius:4px;border:2px solid var(--panel-border);background:var(--bg-2);color:var(--ink);font-size:1rem;margin-bottom:.8rem;box-shadow:inset 0 2px 4px rgba(0,0,0,.35);box-sizing:border-box;}
#nameInput:focus{outline:2px solid var(--accent);}
#playBtn{width:100%;padding:.8rem;border-radius:4px;border:2px solid #8a5900;background:var(--accent);color:var(--accent-ink);font-weight:800;font-size:1.05rem;cursor:pointer;
  box-shadow:0 4px 0 #8a5900, 0 4px 12px rgba(0,0,0,.4);}
#playBtn:active{transform:translateY(3px);box-shadow:0 1px 0 #8a5900, 0 2px 6px rgba(0,0,0,.4);}

/* ---- Валидация ника: подсветка + «кивок» тряской при ошибке ---- */
.fieldError{color:var(--danger);font-size:.78rem;margin:-.5rem 0 .8rem;text-align:left;}
input.invalid{border-color:var(--danger) !important;box-shadow:0 0 0 2px rgba(255,77,77,.3), inset 0 2px 4px rgba(0,0,0,.35) !important;}
@keyframes shakeX{
  10%,90%{transform:translateX(-2px);}
  20%,80%{transform:translateX(4px);}
  30%,50%,70%{transform:translateX(-7px);}
  40%,60%{transform:translateX(7px);}
}
.shake{animation:shakeX .5s;}

/* ---- Модалка «введи ник», когда выбираешь конкретную карту ---- */
#nameModal{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(6,9,7,.65);z-index:10;}
#nameModal .modalCard{background:var(--panel);border:1px solid var(--panel-border);border-radius:10px;padding:1.6rem;width:92vw;max-width:360px;text-align:center;box-shadow:0 20px 60px rgba(0,0,0,.5);box-sizing:border-box;}
#nameModal h3{margin:0 0 1rem;font-size:.95rem;color:var(--ink);line-height:1.4;}
#nameModal input{width:100%;padding:.7rem .9rem;border-radius:4px;border:2px solid var(--panel-border);background:var(--bg-2);color:var(--ink);font-size:1rem;box-shadow:inset 0 2px 4px rgba(0,0,0,.35);box-sizing:border-box;}
#nameModal .fieldError{margin:.5rem 0 0;}
.modalActions{display:flex;gap:.6rem;margin-top:1rem;}
.modalActions button{flex:1;padding:.65rem;border-radius:4px;font-weight:800;font-size:.9rem;cursor:pointer;}
#modalCancelBtn{background:var(--bg-2);border:2px solid var(--panel-border);color:var(--ink);}
#modalJoinBtn{background:var(--accent);border:2px solid #8a5900;color:var(--accent-ink);}
#modalJoinBtn:active{transform:translateY(2px);}

/* ---- HUD ---- */
#hud{position:absolute;inset:0;pointer-events:none;font-variant-numeric:tabular-nums;}
/* topLeft/topRight — теперь flex-соседи в одной строке, а не независимо
   спозиционированные абсолютные блоки: topLeft получает весь ОСТАВШИЙСЯ
   после topRight простор (flex:1 1 auto; min-width:0) и сам ужимается —
   поэтому при любой ширине экрана они физически не могут наехать друг на
   друга, что бы ни было в киллфиде и какого бы размера ни стала панель тира. */
#hudTop{position:absolute;left:16px;right:16px;top:calc(14px + env(safe-area-inset-top));
  display:flex;justify-content:space-between;align-items:flex-start;gap:10px;}
#topLeft{flex:1 1 auto;min-width:0;}
#topRight{flex:0 0 auto;display:flex;flex-direction:column;gap:10px;align-items:flex-end;}
/* Кнопка выхода — маленькая, ненавязчивая, тем же языком, что и остальной
   HUD (полупрозрачная тёмная плашка); стоит первой в topRight, поэтому
   всегда над панелью тира и не мешает ни ей, ни киллфиду слева. */
#exitBtn{pointer-events:auto;padding:.4em .9em;border-radius:20px;background:rgba(17,24,20,.72);
  border:1px solid var(--panel-border);color:var(--ink-dim);font-size:.78rem;font-weight:700;cursor:pointer;}
#exitBtn:active{background:rgba(255,77,77,.3);color:var(--ink);}
@media (max-width:480px){ #exitBtn{font-size:.68rem;padding:.32em .7em;} }
#online{display:flex;align-items:center;gap:.5em;background:rgba(17,24,20,.72);border:1px solid var(--panel-border);padding:.35em .8em;border-radius:20px;font-size:.85rem;width:max-content;max-width:100%;}
.dot{width:8px;height:8px;border-radius:50%;background:var(--good);box-shadow:0 0 8px var(--good);flex-shrink:0;}
/* align-items:flex-start — иначе flex-колонка растягивает каждое сообщение
   на всю ширину доступного топлефта (а на широком десктопе это чуть ли не
   весь экран); нужно, чтобы плашка была по размеру своего текста. */
#killfeed{margin-top:8px;display:flex;flex-direction:column;align-items:flex-start;gap:3px;max-width:100%;}
#killfeed div{background:rgba(17,24,20,.6);padding:.3em .7em;border-radius:4px;font-size:.78rem;color:var(--ink-dim);animation:fadein .2s ease;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
@keyframes fadein{from{opacity:0;transform:translateY(-4px);}to{opacity:1;transform:none;}}

#tierInfo{width:190px;max-width:100%;background:rgba(17,24,20,.72);border:1px solid var(--panel-border);border-radius:8px;padding:.7em .9em;}
#tierName{font-weight:800;margin-bottom:.4em;font-size:.9rem;}
/* Сверх-уровни после последнего именного ранга (Левиафан II, III...) —
   подсветка отдельным пульсирующим градиентом, чтобы было видно с первого
   взгляда: это не рядовой ранг, а рост «за пределом шкалы». */
#tierName.maxRank{
  background:linear-gradient(90deg, var(--accent), var(--danger));
  -webkit-background-clip:text; background-clip:text; color:transparent;
  animation:maxRankPulse 1.6s ease-in-out infinite;
}
@keyframes maxRankPulse{
  0%,100%{filter:drop-shadow(0 0 2px rgba(255,77,77,.35));}
  50%{filter:drop-shadow(0 0 7px rgba(255,77,77,.85));}
}
.bar{height:12px;background:var(--bg-2);border:1px solid var(--panel-border);border-radius:3px;overflow:hidden;margin-top:.3em;}
.bar.small{height:7px;}
.fill{height:100%;width:0%;transition:width .12s linear;}
.fill.hp{background:var(--good);}
.fill.ore{background:var(--accent);}
#oreLabel{font-size:.72rem;color:var(--ink-dim);margin-top:.25em;}

/* ---- Мобильная адаптация HUD на узких экранах ---- */
@media (max-width:480px){
  #online{font-size:.72rem;padding:.3em .65em;}
  #killfeed div{font-size:.68rem;padding:.25em .55em;}
  #tierInfo{width:38vw;min-width:130px;padding:.5em .6em;}
  #tierName{font-size:.72rem;}
  #oreLabel{font-size:.62rem;}
}
/* На совсем узких экранах даже урезанный tierInfo и киллфид могут начать
   спорить за место — killfeed сжимается первым (min-width:0 у topLeft),
   но дополнительно чуть сузим саму панель тира, чтобы ей хватало места. */
@media (max-width:360px){
  #tierInfo{width:34vw;min-width:112px;}
}

/* ---- Обратный отсчёт до смены карты — последние 10 секунд, видно у всех
   на этой карте (считается локально от общего nextRotateAt). ---- */
#mapCountdown{position:absolute;top:calc(14px + env(safe-area-inset-top));left:50%;transform:translateX(-50%);
  pointer-events:none;z-index:4;}
#mapCountdownText{display:block;font-family:'Press Start 2P',monospace;font-size:.72rem;letter-spacing:.03em;
  color:var(--accent);background:rgba(17,24,20,.78);border:1px solid var(--panel-border);border-radius:20px;
  padding:.45em 1em;white-space:nowrap;}
@media (max-width:480px){ #mapCountdownText{font-size:.6rem;padding:.35em .8em;} }

#deathScreen{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(6,9,7,.55);}
.cardTitle{font-family:'Press Start 2P',monospace;font-size:1rem;color:var(--danger);margin-bottom:.6em;}

/* ---- Экран загрузки карты — перекрывает всё, пока не пришли первые
   реальные данные новой карты (см. reallyStartGame/onState в game.js).
   Без этого на медленной связи/телефоне было видно тир/HP/чат с прошлой
   карты, пока новая ещё не прогрузилась. ---- */
#loadingScreen{position:absolute;inset:0;z-index:8;display:flex;align-items:center;justify-content:center;background:rgba(6,9,7,.72);}
.loaderCard{display:flex;flex-direction:column;align-items:center;gap:1rem;}
.spinner{width:44px;height:44px;border-radius:50%;border:4px solid rgba(255,176,31,.25);border-top-color:var(--accent);animation:spin .8s linear infinite;}
@keyframes spin{to{transform:rotate(360deg);}}
.loaderText{font-family:'Press Start 2P',monospace;font-size:.85rem;color:var(--ink-dim);}
#loadingCancelBtn{padding:.5em 1.2em;border-radius:4px;background:var(--bg-2);border:2px solid var(--panel-border);color:var(--ink);font-weight:700;font-size:.85rem;cursor:pointer;}
#loadingCancelBtn:active{transform:translateY(2px);}

/* ---- Тач-управление: оба виджета фиксированы на экране, не «плавают» ----
   Джойстик движения — справа (он же задаёт направление взгляда), кнопка
   огня — слева, тап/удержание стреляет в текущем направлении. */
#touchControls{position:absolute;inset:0;pointer-events:none;}

/* Джойстик (130px) и кнопка огня (82px) разного диаметра — если у обоих
   просто одинаковый bottom, кнопка огня визуально сидит НИЖЕ (центр меньшего
   круга ближе к низу экрана). Чтобы они были «на одном уровне», центры
   обоих виджетов выравниваем по одной горизонтали: смещаем bottom кнопки
   огня на половину разницы диаметров вверх. */
#moveBase{position:fixed;right:calc(24px + env(safe-area-inset-right));bottom:calc(24px + env(safe-area-inset-bottom));
  width:130px;height:130px;border-radius:50%;pointer-events:auto;touch-action:none;
  background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.18);}
.stickKnob{position:absolute;left:50%;top:50%;width:54px;height:54px;margin:-27px 0 0 -27px;
  border-radius:50%;background:rgba(255,176,31,.6);border:1px solid rgba(255,176,31,.95);}

/* Кнопка огня теперь того же вида, что и джойстик: полупрозрачное кольцо-
   основание (как #moveBase), внутри — подвижная «костяшка» (.fireKnob, как
   .stickKnob), которая при нажатии проседает и даёт вспышку-кольцо. */
#fireBtnTouch{position:fixed;left:calc(24px + env(safe-area-inset-left));bottom:calc(48px + env(safe-area-inset-bottom));
  width:82px;height:82px;border-radius:50%;pointer-events:auto;touch-action:none;
  display:flex;align-items:center;justify-content:center;padding:0;-webkit-appearance:none;appearance:none;
  border:1px solid rgba(255,255,255,.18);
  background:rgba(255,255,255,.07);
  color:var(--ink);}
.fireKnob{position:relative;width:54px;height:54px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at 35% 30%, rgba(255,140,120,.55), rgba(120,30,25,.55) 70%);
  border:1px solid rgba(255,140,120,.95);
  box-shadow:0 2px 8px rgba(0,0,0,.35);
  transition:transform .1s ease, box-shadow .1s ease, background .1s ease;
}
.fireKnob::after{content:'';position:absolute;inset:-8px;border-radius:50%;
  border:2px solid rgba(255,140,120,.65);opacity:0;pointer-events:none;}
#fireBtnTouch.pressed .fireKnob{transform:scale(.84);
  background:radial-gradient(circle at 35% 30%, rgba(255,175,155,.85), rgba(160,45,32,.75) 70%);
  box-shadow:0 0 14px rgba(255,90,70,.75), inset 0 0 8px rgba(0,0,0,.35);}
#fireBtnTouch.pressed .fireKnob::after{animation:fireRipple .35s ease-out;}
@keyframes fireRipple{from{opacity:.75;transform:scale(.7);}to{opacity:0;transform:scale(1.35);}}
/* Прицел вместо кирки: гэпы у центра, чтобы читался как реальный reticle. */
.fireKnob .crosshair{position:relative;width:30px;height:30px;}
.fireKnob .ch-seg{position:absolute;background:rgba(255,255,255,.9);border-radius:1px;}
.fireKnob .ch-t{left:50%;top:0;width:2px;height:10px;transform:translateX(-50%);}
.fireKnob .ch-b{left:50%;bottom:0;width:2px;height:10px;transform:translateX(-50%);}
.fireKnob .ch-l{top:50%;left:0;height:2px;width:10px;transform:translateY(-50%);}
.fireKnob .ch-r{top:50%;right:0;height:2px;width:10px;transform:translateY(-50%);}
.fireKnob .ch-dot{position:absolute;left:50%;top:50%;width:6px;height:6px;border-radius:50%;
  background:var(--accent);transform:translate(-50%,-50%);box-shadow:0 0 6px rgba(255,176,31,.85);}

@media (min-width:900px){ #touchControls{display:none !important;} }
@media (max-width:480px){
  #moveBase{width:110px;height:110px;}
  .stickKnob{width:46px;height:46px;margin:-23px 0 0 -23px;}
  #fireBtnTouch{width:70px;height:70px;bottom:calc(44px + env(safe-area-inset-bottom));}
  .fireKnob{width:46px;height:46px;}
  .fireKnob .crosshair{width:25px;height:25px;}
}
