.app { --chat-rail-w: 72px; min-height: 100vh; min-height: 100dvh; display: flex; flex-direction: column; }
.topbar {
  position: sticky; top: 0; z-index: var(--z-header);
  display: flex; align-items: center; flex: none;
  height: var(--header-h);
  border-bottom: 1px solid var(--line);
  background: var(--topbar-bg);
  /* CORESTYLE0928: стекло стиля 0928 (§2, §9) — шапка и нижняя панель единственные стеклянные */
  backdrop-filter: saturate(var(--glass-sat, 140%)) blur(var(--glass-blur, 16px)); -webkit-backdrop-filter: saturate(var(--glass-sat, 140%)) blur(var(--glass-blur, 16px));
}
.topbar__brand { flex: none; display: flex; align-items: center; padding: 0 28px 0 24px; }
.topbar__back { display: none; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: var(--r-pill);
  background: var(--btn-secondary, rgba(255,255,255,.09)); box-shadow: inset 0 0 0 1px var(--btn-secondary-line, rgba(255,255,255,.12)); color: var(--text);
  -webkit-tap-highlight-color: transparent; transition: transform var(--dur-1) var(--ease); }
.topbar__back:active { transform: scale(.97); }
.topbar__logo { position: relative; display: block; border-radius: 8px; }
.topbar__logo::after { content: ""; position: absolute; inset: -9px -6px; }
.topbar__logo img { width: 87px; height: 32px; object-fit: contain; }
.topnav { flex: none; display: flex; align-items: center; gap: 4px; padding-left: 20px; }
.topnav__link {
  display: flex; align-items: center; gap: 8px; height: 40px; padding: 0 14px; border-radius: var(--r-11);
  color: var(--text-2); font-size: 14px; font-weight: 600; white-space: nowrap;
  transition: color var(--dur-1) var(--ease), background-color var(--dur-1) var(--ease);
  position: relative;
}
.topnav__link::after { content: ""; position: absolute; inset: -2px 0; }
/* FREEBADGE1002: out of flow, so tab labels and their hit areas keep their widths. */
.nav-free-badge {
  position: absolute; top: 1px; right: 6px; z-index: 2; pointer-events: none;
  display: block; padding: 1px 4px; border-radius: 6px;
  background: #ffdf65; color: #292313; font-size: 8px; font-weight: 850;
  line-height: 11px; letter-spacing: .025em; text-shadow: none;
  box-shadow: 0 1px 4px rgba(0,0,0,.16);
}
.nav-free-badge[hidden] { display: none; }
.tabbar__link .nav-free-badge { top: -2px; right: 5px; }
.topnav__link:hover { color: var(--text-2); }
.topnav__link:focus-visible { color: var(--text); background: rgba(255,255,255,.04); }
@media (hover: hover) { .topnav__link:hover { color: var(--text); background: rgba(255,255,255,.04); } }
/* S0929: цвет выбранного пункта меню (--nav-capsule, --nav-capsule-ring, --nav-active) — в tokens.css, сине-фиолетовый/белый, не жёлтый */
.topnav__link[aria-current="page"] { background: var(--nav-capsule); box-shadow: var(--nav-capsule-ring); color: var(--nav-active); font-weight: 700; }
.nav-ico { transition: color var(--dur-1) var(--ease), filter var(--dur-2) var(--ease), opacity var(--dur-2) var(--ease), transform var(--dur-2) var(--ease); }
.topnav__link[aria-current="page"] .nav-ico, .tabbar__link[aria-current="page"] .nav-ico { color: var(--nav-active); }
.menu__item:hover .nav-ico, .menu__item:focus-visible .nav-ico { color: var(--nav-active); }
.topnav__link:not([aria-current="page"]) .ico-rb, .tabbar__link:not([aria-current="page"]) .ico-rb { opacity: .9; }
.topnav__link:focus-visible .ico-rb, .tabbar__link:focus-visible .ico-rb { opacity: 1; }
@media (hover: hover) { .topnav__link:hover .ico-rb, .tabbar__link:hover .ico-rb { opacity: 1; } }
.topnav__link .ico-rb { margin: -2px 0; }
.topnav__link[aria-current="page"] .ico-rb, .tabbar__link[aria-current="page"] .ico-rb { filter: none; }
.nav-ibtn .ico-rb, .chat-fab .ico-rb { filter: saturate(.9); }
@media (hover: hover) { .nav-ibtn:hover .ico-rb, .chat-fab:hover .ico-rb { filter: saturate(1.1) brightness(1.06); } }
.menu__item .ico-rb { margin: -2px 0; }
.topbar__spacer { flex: 1; min-width: 8px; }
.topbar__actions { display: flex; align-items: center; gap: 10px; padding-right: 24px; }
.topbar__chat { display: none; }
.balance-wrap { position: relative; }
.balance-btn {
  display: flex; align-items: center; gap: 8px; height: 44px; padding: 0 12px 0 14px;
  border-radius: var(--r-md); background: var(--surface); border: 1px solid var(--line-strong);
  color: var(--text); font-size: 15px; font-weight: 700; white-space: nowrap; font-variant-numeric: tabular-nums;
}
.balance-btn:hover { border-color: var(--line-hover); }
.balance-btn { position: relative; }
.balance-btn::after { content: ""; position: absolute; inset: min(0px, calc(50% - 22px)) 0; }
.balance-btn__chev { color: var(--text-3); transition: transform var(--dur-2) var(--ease); }
.balance-btn[aria-expanded="true"] .balance-btn__chev { transform: rotate(180deg); }
.balance-btn__cur { display: inline-flex; }
.menu {
  position: absolute; right: 0; top: calc(100% + 8px); z-index: 60;
  width: 280px; padding: 8px; border-radius: var(--r-lg);
  background: var(--s1); border: 1px solid var(--s-line-hi); box-shadow: var(--shadow-pop);
  animation: modal-in var(--dur-2) var(--ease);
}
.topbar:has(.menu) { z-index: 60; }
.menu-scrim { position: fixed; left: 0; right: 0; top: 0; height: 100vh; height: 100dvh; z-index: 55; background: transparent; -webkit-tap-highlight-color: transparent; }
.menu__title { padding: 8px 10px 6px; font-size: 13px; font-weight: 600; color: var(--text-3); }   /* REDESIGN0927: без капса */
.menu__item {
  display: flex; align-items: center; gap: 10px; width: 100%; min-height: 44px; padding: 0 10px;
  border-radius: var(--r-10); color: var(--text); font-size: 14.5px; font-weight: 600; text-align: left;
}
.menu__item:hover { background: var(--surface-4); color: var(--text); }
.menu__item[aria-checked="true"] { background: var(--surface-active); }
.menu__item-end { margin-left: auto; color: var(--text-2); font-weight: 600; font-variant-numeric: tabular-nums; }
.menu__sep { height: 1px; margin: 6px 4px; background: var(--line); }
.menu__note { padding: 6px 10px 4px; font-size: 12px; color: var(--text-3); }

.profile-wrap { position: relative; }
.topbar__avatar { display: inline-flex; border-radius: var(--r-md); position: relative; transition: transform var(--dur-1) var(--ease); }
.topbar__avatar .avatar { width: 44px; height: 44px; border-radius: var(--r-md); font-size: 16px; transition: box-shadow var(--dur-1) var(--ease); }
.topbar__avatar .avatar, .pmenu__head .avatar {
  background: linear-gradient(180deg, rgba(255,255,255,.07), rgba(255,255,255,0) 60%), var(--surface-active);
  color: var(--text); box-shadow: inset 0 0 0 1px var(--line-btn);
}
.topbar__avatar:hover .avatar, .topbar__avatar[aria-expanded="true"] .avatar { box-shadow: 0 0 0 2px var(--bg), 0 0 0 4px rgba(255,255,255,.22); }   /* REDESIGN0927: без жёлтой рамки */
.topbar__avatar-lvl { position: absolute; right: -6px; bottom: -6px; display: inline-flex; filter: drop-shadow(0 2px 3px rgba(0,0,0,.6)); }
.menu--profile { width: 300px; }
.pmenu__head { display: flex; align-items: center; gap: 12px; padding: 10px; border-radius: var(--r-md); color: var(--text); }
.pmenu__head:hover, .pmenu__head:focus-visible { background: var(--surface-4); color: var(--text); }
.pmenu__head .avatar { width: 44px; height: 44px; border-radius: var(--r-md); }
.pmenu__who { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.pmenu__name { font-weight: 700; font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pmenu__lvl { display: inline-flex; align-items: center; gap: 5px; font-size: 12.5px; font-weight: 700; }
.pmenu__bal { font-family: var(--font-body); font-weight: 700; font-size: 15px; color: var(--text); white-space: nowrap; font-variant-numeric: tabular-nums; }
.menu__item svg { flex: none; color: var(--text-3); }
.menu__item:hover svg { color: var(--text); }
.menu__item--danger { color: var(--danger-text); }
.menu__item--danger svg, .menu__item--danger:hover svg { color: var(--danger-text); }
.shell { flex: 1; display: flex; min-height: 0; }
.shell__aside {
  position: sticky; top: var(--header-h); flex: none; align-self: flex-start; overflow: hidden;
  width: var(--aside-w); height: calc(100vh - var(--header-h)); height: calc(100dvh - var(--header-h));
  order: 2; border-left: 1px solid var(--line); background: var(--bg-aside);
  transition: width var(--dur-3) var(--ease), background-color var(--dur-3) var(--ease), border-color var(--dur-3) var(--ease);
}
.shell__aside-panel {
  position: absolute; top: 0; bottom: 0; right: 0; width: var(--aside-w);
  transition: opacity var(--dur-3) var(--ease), transform var(--dur-3) var(--ease), visibility 0s linear 0s;
}
.shell__rail {
  position: absolute; right: 0; bottom: 20px; width: var(--chat-rail-w);
  display: flex; justify-content: center;
  opacity: 0; visibility: hidden; transform: translateY(8px);
  transition: opacity var(--dur-2) var(--ease), transform var(--dur-2) var(--ease), visibility 0s linear var(--dur-2);
}
.chat-fab {
  position: relative; display: inline-flex; align-items: center; justify-content: center;
  width: 52px; height: 52px; border-radius: 50%;
  background: var(--surface); border: 1px solid var(--line-strong); color: var(--text-2);
  box-shadow: 0 10px 24px rgba(0,0,0,.35);
  transition: color var(--dur-1) var(--ease), background-color var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease), transform var(--dur-1) var(--ease);
}
.chat-fab:hover { color: var(--text); background: var(--surface-4); border-color: var(--line-hover); }
.chat-fab:active { transform: scale(.96); }
/* LAUNCH0928: вечная зелёная точка у кнопки чата снята — непрочитанного не считаем, значит и точки нет */
.app--chat-collapsed .shell__aside { width: var(--chat-rail-w); background: transparent; border-left-color: transparent; }
.app--chat-collapsed .shell__aside-panel {
  opacity: 0; transform: translateX(28px); visibility: hidden;
  transition: opacity var(--dur-2) var(--ease), transform var(--dur-3) var(--ease), visibility 0s linear var(--dur-3);
}
.app--chat-collapsed .shell__rail {
  opacity: 1; visibility: visible; transform: none;
  transition: opacity var(--dur-2) var(--ease) var(--dur-1), transform var(--dur-2) var(--ease) var(--dur-1), visibility 0s linear 0s;
}
.app--chat-instant .shell__aside, .app--chat-instant .shell__aside-panel, .app--chat-instant .shell__rail { transition: none; }
/* LAUNCH0928: чат выключен (боевой режим без чата) — ни колонки, ни полосы с кнопкой, ни кнопки в шапке */
.app--no-chat .shell__aside, .app--no-chat .topbar__chat { display: none !important; }
@media (min-width: 1200px) {
  .shell__main { --page-box: var(--content-max); }
  .page, .footer { position: relative; left: 0; transition: left var(--dur-3) var(--ease); }
  .app--chat-collapsed .page, .app--chat-collapsed .footer {
    left: clamp(0px, (100vw - var(--chat-rail-w) - var(--page-box)) / 2, var(--chat-rail-w) / 2);
  }
  .app--chat-instant .page, .app--chat-instant .footer { transition: none; }
}
@media (min-width: 1600px) { .app { --aside-w: 340px; } }
@media (min-width: 1920px) { .app { --aside-w: 380px; } }
@media (min-width: 2200px) { :root { --content-max: 1880px; } }
@media (min-width: 2400px) { .app { --aside-w: 400px; } :root { --content-max: 1960px; } }
.shell__main { order: 1; flex: 1; min-width: 0; display: flex; flex-direction: column; outline: none; overflow-x: clip; }
.page { width: 100%; max-width: var(--content-max); margin: 0 auto; padding: 24px var(--gutter) 0; flex: 1; }
.page:focus { outline: none; }
.page.is-loading { opacity: .6; transition: opacity var(--dur-2); }
.footer { width: 100%; max-width: var(--content-max); margin: 56px auto 0; padding: 0 var(--gutter); }
/* FOOTPROFILE0930 (владелец 30.09): на телефоне подвал — только в «Профиле»; в играх, кейсах, заданиях и прочих разделах
   он лишь занимал экран над нижней панелью. html[data-route] ставит app.js (markNav). ПК — как было. */
@media (max-width: 767.98px) { html:not([data-route="profile"]) .footer { display: none; } }
/* LAUNCH0928: подвал ПК одной строкой — логотип · 18+ · документы · «Поддержка» · значок Telegram 40×40 · © (было 458 px и четыре колонки) */
.footer__inner { display: flex; align-items: center; flex-wrap: wrap; gap: 12px 20px; padding: 22px 0 26px; border-top: 1px solid var(--line); }
.footer__logo { flex: none; display: inline-flex; align-items: center; min-height: 44px; min-width: 44px; border-radius: 8px; }
.footer__logo img { width: 87px; height: 32px; object-fit: contain; }
/* RESIL0927: логотип не загрузился — на его месте надпись (картинка скрыта классом img-fail, app.js bindImageFallback) */
.footer__logo.is-img-fail { position: relative; }
.topbar__logo.is-img-fail::before, .footer__logo.is-img-fail::before {
  content: "RubUP"; position: absolute; inset: 0; display: flex; align-items: center;
  font-family: var(--font-display); font-weight: 700; font-size: 16px; line-height: 1; color: var(--text); pointer-events: none;
}
.footer__docs { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; flex-wrap: wrap; gap: 4px 20px; }
.footer__link { display: inline-flex; align-items: center; min-height: 36px; color: var(--text-2); font-size: 14px; text-align: left; white-space: nowrap; }
.footer__link:hover { color: var(--text); }
.footer__l-short { display: none; }
.footer__support {
  flex: none; display: inline-flex; align-items: center; min-height: 40px; padding: 0 16px; border-radius: 999px;
  border: 1px solid var(--line-strong); background: var(--surface); color: var(--text); font-size: 14px; font-weight: 600; white-space: nowrap;
}
.footer__support:hover { background: var(--surface-4); border-color: var(--line-hover); }
.footer__tg {
  flex: none; display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 50%;
  background: #2AABEE; color: #fff; transition: filter var(--dur-1) var(--ease), transform var(--dur-1) var(--ease);
}
.footer__tg:hover { filter: brightness(1.08); }
.footer__tg:active { transform: scale(.96); }
.age-mark {
  flex: none; display: flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; border-radius: 50%; border: 2px solid var(--danger); color: var(--danger-text);
  font-family: var(--font-display); font-weight: 700; font-size: 13px;
}
.footer__copy { flex: none; font-size: 13px; color: var(--text-3); white-space: nowrap; }
/* NAVPROFILE0927: the mobile shell is the next Mini App. */
.tabbar {
  position: fixed; left: max(10px, calc((100% - 480px) / 2)); right: max(10px, calc((100% - 480px) / 2));
  bottom: calc(8px + env(safe-area-inset-bottom)); z-index: var(--z-tabbar);
  display: none; grid-template-columns: repeat(4, minmax(0, 1fr));
  height: var(--tabbar-h); padding: 5px;
  /* CORESTYLE0928: стеклянная капсула 0928 (§2, §10): стекло + блик + линия .14 + мягкая тень */
  background: var(--glass-hi, none), var(--tabbar-bg); border: 1px solid var(--glass-line, rgba(255,255,255,.08)); border-radius: 38px;
  backdrop-filter: saturate(var(--glass-sat, 140%)) blur(var(--glass-blur, 18px)); -webkit-backdrop-filter: saturate(var(--glass-sat, 140%)) blur(var(--glass-blur, 18px));
  box-shadow: var(--glass-edge, inset 0 1px 0 rgba(255,255,255,.045)), var(--glass-shadow, 0 8px 26px rgba(5,8,22,.3));
  isolation: isolate;
}
.tabbar__link {
  position: relative; z-index: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
  min-width: 0; min-height: 48px; border-radius: 32px;
  color: var(--text-3); font-size: 12px; font-weight: 650; letter-spacing: -.005em;   /* CORESTYLE0928: не мельче 12 px (просьба агента игр) */
  touch-action: manipulation; -webkit-tap-highlight-color: transparent;
  transition: color 180ms ease;
}
@media (hover: hover) { .tabbar__link:hover { color: var(--text); } }
.tabbar__link:focus-visible { color: var(--text); outline-offset: -2px; }
.tabbar__ico {
  position: relative; display: grid; place-items: center; width: 44px; height: 40px;
  transform: translate3d(0,0,0);
  transition: transform 220ms cubic-bezier(.2,.8,.2,1);
}
.tabbar__ico .nav-ico { width: 34px; height: 34px; }
.tabbar__ico .ico-games { width: 40px; height: 40px; }
.tabbar__ico .ico-coins { width: 36px; height: 36px; }
.tabbar__ico .ico-user { width: 32px; height: 32px; }
.tabbar__label {
  max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: 1.2;
  opacity: .8; transform: translate3d(0,0,0);
  transition: opacity 180ms ease, transform 220ms cubic-bezier(.2,.8,.2,1);
}
.tabbar__link[aria-current="page"] { color: var(--nav-active); }
.tabbar__link[aria-current="page"] .tabbar__ico { transform: translate3d(0,-1px,0) scale(1.045); }
.tabbar__link[aria-current="page"] .tabbar__label { opacity: 1; transform: translate3d(0,-1px,0); }
.tabbar__link[aria-current="page"] .ico-rb { transform: none; }
.tabbar__link:active .tabbar__ico { transform: translate3d(0,0,0) scale(.96); }
.tabbar:not(.has-glider) .tabbar__link[aria-current="page"] { background: var(--nav-capsule); }
.search-results { display: flex; flex-direction: column; gap: 4px; margin-top: 12px; }
.search-hit { display: flex; align-items: center; gap: 14px; min-height: 76px; padding: 8px 12px 8px 8px; border-radius: var(--r-lg); color: var(--text); transition: background-color var(--dur-1) var(--ease); }
.search-hit:hover, .search-hit:focus-visible { background: var(--surface-4); color: var(--text); }
.search-hit__thumb {
  position: relative; flex: none; width: 60px; height: 60px; border-radius: 14px; overflow: hidden;
  background: var(--g, var(--surface-4)); box-shadow: inset 0 0 0 1px rgba(255,255,255,.08), 0 6px 14px rgba(0,0,0,.35);
}
.search-hit__thumb img { width: 100%; height: 100%; object-fit: cover; transition: transform var(--dur-3) var(--ease); }
.search-hit__thumb::after { content: ""; position: absolute; inset: 0; border-radius: inherit; box-shadow: inset 0 0 0 1px rgba(255,255,255,.08); pointer-events: none; }
.search-hit:hover .search-hit__thumb img { transform: scale(1.06); }
.search-hit__thumb--fit { background: radial-gradient(circle at 50% 70%, color-mix(in srgb, var(--g) 70%, #fff 12%), var(--g)); }
.search-hit__thumb--fit img { object-fit: contain; padding: 5px; filter: drop-shadow(0 4px 6px rgba(0,0,0,.4)); }
.search-hit__t { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.search-hit__name { font-family: var(--font-display); font-weight: 700; font-size: 15px; }
.search-hit__tag { font-size: 13px; color: var(--text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.search-hit .badge { flex: none; background: var(--surface-sunk); }
@media (max-width: 1199.98px) {
  .shell__aside { display: none; }
  .topbar__chat { display: inline-flex; }
  .topbar__brand { width: auto; padding-left: var(--gutter); }
  .topbar__actions { padding-right: var(--gutter); }
  .topbar .cur-switch { display: none; }
}
@media (max-width: 1023.98px) {
  .topnav { padding-left: 12px; gap: 2px; }
  .topnav__link { padding: 0 11px; }
  .topnav__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; }
  .topnav__link .ico-rb { width: 22px; height: 22px; margin: 0; }
  .topbar__topup-label { display: none; }
  .topbar__topup { width: 44px; padding: 0; }
}
@media (max-width: 767.98px) {
  body { padding-bottom: calc(var(--tabbar-h) + 16px + env(safe-area-inset-bottom)); }
  /* RESIL0927: прокрутка к полю не прячет его под нижнее меню; открыта клавиатура (app.js bindKeyboard) — меню убираем,
     иначе оно поднимается над клавиатурой и закрывает поле и кнопку отправки */
  html { scroll-padding-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom) + 24px); }
  html.kb-open { scroll-padding-bottom: 12px; }
  html.kb-open .tabbar { display: none; }
  /* N2-tech-kb: поле в открытом окне — страница под ним не укорачивается: у прокрученной до конца страницы iPhone (окно не
     сжимается) срезал прокрутку на высоту меню, и после закрытия клавиатуры страница под окном оставалась сдвинутой на 70 px */
  html.kb-open:not(.is-modal-open) body { padding-bottom: 0; }
  .topbar { padding: 0 var(--gutter); background: var(--topbar-bg-m); }
  /* CORESTYLE0928 §9: на телефоне шапка — плавающая стеклянная капсула. Полоса шапки остаётся высотой --header-h (страница игры,
     меню и прокрутка к полям считают от неё и не сдвигаются), капсула рисуется внутри полосы псевдоэлементом */
  .topbar { padding: 6px calc(var(--gutter) + 6px) 0; background: transparent; border-bottom: 0;
    -webkit-backdrop-filter: none; backdrop-filter: none; }
  .topbar::before {
    content: ""; position: absolute; left: 8px; right: 8px; top: 6px; bottom: 0; z-index: -1; pointer-events: none;
    border: 1px solid var(--glass-line, rgba(255,255,255,.14)); border-radius: var(--r-pill);
    background: var(--glass-hi, none), var(--topbar-bg-m);
    box-shadow: var(--glass-edge, none), var(--glass-shadow, none);
    -webkit-backdrop-filter: saturate(var(--glass-sat, 140%)) blur(var(--glass-blur, 16px)); backdrop-filter: saturate(var(--glass-sat, 140%)) blur(var(--glass-blur, 16px));
  }
  .topbar__brand { padding-left: 0; padding-right: 8px; }
  /* REDESIGN0927: чат — иконка 24 в кнопке 40 без рамки, точка непрочитанного */
  .topbar .nav-ibtn { background: transparent; border-color: transparent; color: var(--text-2); }
  .topbar .nav-ibtn:hover { background: var(--s1); border-color: transparent; color: var(--text); }
  .topbar .nav-ibtn .icon-btn__dot { top: 6px; right: 6px; box-shadow: 0 0 0 2px var(--bg); }
  .topbar__logo img { width: 71px; height: 26px; }
  /* CORESTYLE0928 §9: внутренняя страница — «‹» 40 px вместо логотипа */
  html[data-inner] .topbar__logo { display: none; }
  html[data-inner] .topbar__back { display: inline-flex; }
  .topnav, .topbar__search, .topbar__avatar { display: none; }
  .topbar__actions { gap: 8px; padding-right: 0; }
  .topbar .icon-btn { width: 40px; height: 40px; }
  .balance-btn { height: 40px; padding: 0 10px 0 12px; font-size: 14px; gap: 6px; }
  .topbar__topup { width: 40px; height: 40px; border-radius: var(--r-md); }
  .topbar__topup::after { inset: -3px -3px; }
  .topbar .hwal .topbar__topup::after { inset: -5px; }
  .topbar__login { height: 40px; padding: 0 14px; font-size: 14px; }
  .topbar__login-long { display: none; }
  .tabbar { display: grid; }
  .page { padding-top: 12px; }
  /* REDESIGN0927 + LAUNCH0928: подвал телефона — две строки без логотипа (он в шапке): сверху 18+ · © RubUP, справа
     «Поддержка» и значок @rubup; под ними документы. Ссылки разделены промежутком, а не точкой: перенос не начинает строку с «·». */
  .footer { margin-top: 24px; }
  .footer__inner { gap: 0 10px; padding: 6px 0 10px; }
  .footer__logo { display: none; }
  .age-mark { order: 1; width: 30px; height: 30px; border-width: 1.5px; font-family: var(--font-body); font-size: 12px; }
  .footer__copy { order: 2; font-size: 12.5px; }
  .footer__year { display: none; }
  .footer__support { order: 3; margin-left: auto; min-height: 44px; padding: 0 4px; border: 0; border-radius: 0; background: none; font-size: 12.5px; font-weight: 600; color: var(--text-2); }
  .footer__support:hover { background: none; }
  .footer__tg { order: 4; width: 32px; height: 32px; position: relative; }
  .footer__tg::after { content: ""; position: absolute; inset: -6px; }        /* цель касания 44 */
  .footer__tg .ico { width: 18px; height: 18px; }
  .footer__docs { order: 5; flex: 1 1 100%; gap: 0 16px; }
  .footer__link { min-height: 40px; min-width: 0; font-size: 12.5px; color: var(--text-3); }
  .footer__l-long { display: none; }
  .footer__l-short { display: inline; }
  /* REDESIGN0927: меню шапки на телефоне — во всю ширину под шапкой (правило вернулось из блока 374.98 в телефонный) */
  .menu { position: fixed; left: 16px; right: 16px; top: calc(var(--header-h) + 8px); width: auto; }
  .menu-scrim { background: rgba(5,8,15,.5); animation: rb-scrim-in var(--dur-2) var(--ease) both; }
}
@media (max-width: 374.98px) {
  .footer__inner { gap: 0 8px; }
  .footer__link, .footer__support { font-size: 12px; }
  .footer__docs { gap: 0 14px; }
  .footer__copy { font-size: 12px; }
  .age-mark { width: 28px; height: 28px; }
}
@keyframes rb-scrim-in { from { opacity: 0; } }
.topbar__login-short { display: none; }
@media (max-width: 1599.98px) {
  .topbar .cur-switch__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; }
  .topbar .cur-switch__btn { padding: 0 10px; }
}
@media (max-width: 1599.98px) {
  .topbar__login-long { display: none; }
  .topbar__login-short { display: inline; }
}
/* CORESTYLE0928: узкий телефон — капсула шапки не должна выпускать «+» за край при длинном балансе (10 000 000 на 360 заходил на 4 px) */
@media (max-width: 389.98px) {
  .topbar { padding-left: calc(var(--gutter) + 2px); padding-right: calc(var(--gutter) + 2px); }
  .topbar__brand { padding-right: 4px; }
  .topbar__actions { gap: 6px; }
  .topbar .nav-ibtn { width: 36px; }
}
@media (max-width: 359.98px) {
  .topbar__logo img { width: 60px; }
  .balance-btn { padding: 0 8px; }
  .topbar__brand { padding-right: 6px; }
  .topbar__actions { gap: 6px; }
}
/* CORESTYLE0928: 320–339 px — после правила 359.98, иначе оно перебивает */
@media (max-width: 339.98px) {
  .topbar__logo img { width: 54px; }
  .topbar__actions { gap: 4px; }
  .topbar .balance-btn { font-size: 13px; gap: 4px; padding: 0 7px; }
}
@media (max-width: 1279.98px) {
  .topnav { gap: 2px; padding-left: 12px; }
  .topnav__link { padding: 0 10px; gap: 7px; }
  .topbar__topup-label { display: none; }
  .topbar__topup { width: 44px; padding: 0; }
  .topbar__actions { gap: 8px; }
}
@media (min-width: 1024px) and (max-width: 1149.98px) {
  .topnav { padding-left: 8px; }
  .topnav__link { padding: 0 8px; gap: 5px; }
  .topnav__link .ico-rb { width: 20px; height: 20px; margin: 0; }
}
@media (min-width: 768px) and (max-width: 1023.98px) {
  .topnav { padding-left: 8px; }
  .topnav__link { padding: 0 7px; }
}
@media (prefers-reduced-motion: no-preference) {
  .topbar { view-transition-name: rb-topbar; }
  .tabbar { view-transition-name: rb-tabbar; }
  .shell__aside { view-transition-name: rb-chat; }
}
::view-transition-old(rb-topbar), ::view-transition-old(rb-tabbar), ::view-transition-old(rb-chat) { display: none; }
::view-transition-new(rb-topbar), ::view-transition-new(rb-tabbar), ::view-transition-new(rb-chat),
::view-transition-group(rb-topbar), ::view-transition-group(rb-tabbar), ::view-transition-group(rb-chat) { animation: none; }
::view-transition-old(root), ::view-transition-new(root) { mix-blend-mode: normal; animation-fill-mode: both; }
::view-transition { pointer-events: none; }
html[data-nav="fade"]::view-transition-old(root) { animation: rb-vt-out 130ms cubic-bezier(.4,0,1,1) both; }
html[data-nav="fade"]::view-transition-new(root) { animation: rb-vt-rise 280ms cubic-bezier(.2,.8,.2,1) 70ms both; }
html[data-nav="tab-next"]::view-transition-old(root) { animation: rb-vt-to-left 140ms cubic-bezier(.4,0,1,1) both; }
html[data-nav="tab-next"]::view-transition-new(root) { animation: rb-vt-from-right 290ms cubic-bezier(.2,.8,.2,1) 80ms both; }
html[data-nav="tab-prev"]::view-transition-old(root) { animation: rb-vt-to-right 140ms cubic-bezier(.4,0,1,1) both; }
html[data-nav="tab-prev"]::view-transition-new(root) { animation: rb-vt-from-left 290ms cubic-bezier(.2,.8,.2,1) 80ms both; }
html[data-nav="fwd"]::view-transition-old(root) { animation: rb-vt-push-under 360ms cubic-bezier(.3,.7,.2,1) both; }
html[data-nav="fwd"]::view-transition-new(root) { animation: rb-vt-push-in 360ms cubic-bezier(.2,.85,.2,1) both; box-shadow: -18px 0 40px rgba(0,0,0,.45); }
html[data-nav="back"]::view-transition-old(root) { z-index: 2; animation: rb-vt-pop-out 320ms cubic-bezier(.4,0,.8,.6) both; box-shadow: -18px 0 40px rgba(0,0,0,.45); }
html[data-nav="back"]::view-transition-new(root) { z-index: 1; animation: rb-vt-pop-under 340ms cubic-bezier(.2,.8,.2,1) both; }

@keyframes rb-vt-out { to { opacity: 0; } }
@keyframes rb-vt-rise { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: none; } }
@keyframes rb-vt-to-left { to { opacity: 0; transform: translateX(-4%); } }
@keyframes rb-vt-to-right { to { opacity: 0; transform: translateX(4%); } }
@keyframes rb-vt-from-right { from { opacity: 0; transform: translateX(7%); } to { opacity: 1; transform: none; } }
@keyframes rb-vt-from-left { from { opacity: 0; transform: translateX(-7%); } to { opacity: 1; transform: none; } }
@keyframes rb-vt-push-under { to { transform: translateX(-22%); filter: brightness(.55); } }
@keyframes rb-vt-push-in { from { transform: translateX(100%); } to { transform: none; } }
@keyframes rb-vt-pop-out { to { transform: translateX(100%); } }
@keyframes rb-vt-pop-under { from { transform: translateX(-22%); filter: brightness(.55); } to { transform: none; filter: none; } }
@media (prefers-reduced-motion: no-preference) {
  .page.page-enter { animation: rb-page-rise 300ms cubic-bezier(.2,.8,.2,1) both; }
  .page.page-enter[data-enter="tab-next"], .page.page-enter[data-enter="fwd"] { animation-name: rb-page-from-right; }
  .page.page-enter[data-enter="tab-prev"], .page.page-enter[data-enter="back"] { animation-name: rb-page-from-left; }
}
@keyframes rb-page-rise { from { opacity: 0; translate: 0 12px; } to { opacity: 1; translate: none; } }
@keyframes rb-page-from-right { from { opacity: 0; translate: 24px 0; } to { opacity: 1; translate: none; } }
@keyframes rb-page-from-left { from { opacity: 0; translate: -24px 0; } to { opacity: 1; translate: none; } }
@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*) { animation: none !important; }
}
.page.page-preparing {
  position: fixed; top: 0; left: var(--prepare-left); width: var(--prepare-width);
  margin: 0; max-height: 100vh; overflow: hidden; visibility: hidden;
  pointer-events: none; contain: layout paint;
}

/* MINIAPPNAV0927: одна лёгкая плашка меню и маска только видимой области. */
.tabbar__glider {
  position: absolute; z-index: 0; top: 0; left: 0; border-radius: 32px; pointer-events: none;
  background: var(--nav-capsule); box-shadow: var(--nav-capsule-ring);
  transition: transform 290ms cubic-bezier(.32,.72,0,1);
  will-change: transform;
}
.tabbar__glider::after { content: none; }
.tabbar__glider.is-instant { transition: none; }
@media (prefers-reduced-motion: reduce) {
  .tabbar__glider, .tabbar__link, .tabbar__ico, .tabbar__label { transition: none; }
  .tabbar__link[aria-current="page"] .tabbar__ico,
  .tabbar__link[aria-current="page"] .tabbar__label,
  .tabbar__link:active .tabbar__ico { transform: none; }
}
.route-veil {
  position: fixed; z-index: 40; background: var(--bg); opacity: 0;
  pointer-events: none; transition: opacity 180ms cubic-bezier(.2,.8,.2,1);
  contain: strict;
}
.route-veil.is-covering { opacity: 1; transition-duration: 100ms; transition-timing-function: ease-out; }
/* CORESTYLE0928H: шторка — как в мини-приложении: непрозрачная (WKWebView не смешивает два слоя), но с фоном страницы
   (свечение графита), мягким светом от места касания (--route-x ставит app.js), а не плоский «чёрный экран». */
.route-veil { background-color: var(--bg); background-image: var(--page-glow, none); }
.route-veil::before {
  content: ""; position: absolute; left: var(--route-x, 50%); bottom: -12vh; width: min(390px, 86vw); height: 68vh; pointer-events: none;
  opacity: 0; transform: translate3d(-50%, 12%, 0) scale(.72); transform-origin: 50% 100%;
  background: radial-gradient(ellipse at 50% 100%, rgba(108,102,250,.14) 0%, rgba(108,102,250,.05) 38%, transparent 72%);
  transition: opacity .16s ease-out, transform .38s cubic-bezier(.2,.8,.2,1);
}
.route-veil.is-covering::before { opacity: 1; transform: translate3d(-50%, -2%, 0) scale(1.08); }
@media (prefers-reduced-motion: reduce) { .route-veil::before { transition: none; } }
@media (prefers-reduced-motion: reduce) {
  .route-veil, .tabbar__glider { transition: none; }
}

/* MINIMALICONS0928: optical sizes for compact filled navigation symbols. */
.topnav__link .nav-ico { width: 32px; height: 32px; }
.topnav__link .ico-games { width: 38px; height: 38px; }
.topnav__link { height: 48px; gap: 10px; }
@media (min-width: 768px) and (max-width: 1199.98px) {
  .topnav__link { padding-left: 9px; padding-right: 9px; gap: 7px; }
  .topnav { padding-left: 8px; }
  .topnav__link .nav-ico { width: 28px; height: 28px; }
  .topnav__link .ico-games { width: 34px; height: 34px; }
}
@media (min-width: 768px) and (max-width: 1119.98px) {
  .topnav__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; }
}
@media (min-width: 768px) and (max-width: 899.98px) {
  .topbar__brand { padding-right: 12px; }
  .topnav { padding-left: 0; }
  .topnav__link { padding-left: 5px; padding-right: 5px; }
}

/* Colour follows selection, as in the current Mini App. */
.nav-ico { transition: color 200ms ease, opacity 200ms ease; }
.tabbar__link { color: rgba(229,233,245,.7); }
.topnav__link[aria-current="page"] { font-weight: 600; }

@media (prefers-reduced-motion: reduce) { .nav-ico { transition: none; } }

/* MOBILENAVCOLOR0928: filter the HTML icon wrapper, not an SVG image. */
.ico__color-art { opacity: 1; }
@media (min-width: 768px) {
  .topnav__link .ico__silhouette [stroke-width] { stroke-width: 1.7; }
  .topnav__link .ico__color-art { filter: none; opacity: 1; }
}
/* The bottom bar always follows selection, independently of viewport width. */
.tabbar__link:not([aria-current="page"]) { color: #cbd2e4; }
.tabbar__link:not([aria-current="page"]) .tabbar__label { opacity: .9; }
.tabbar .tabbar__ico {
  -webkit-filter: grayscale(1) brightness(1.12);
  filter: grayscale(1) brightness(1.12);
  opacity: .8;
  transition: -webkit-filter 300ms cubic-bezier(.2,.7,.2,1), filter 300ms cubic-bezier(.2,.7,.2,1), opacity 240ms ease, transform 320ms cubic-bezier(.2,.8,.2,1);
}
.tabbar__link[aria-current="page"] .tabbar__ico {
  -webkit-filter: grayscale(0) brightness(1);
  filter: grayscale(0) brightness(1);
  opacity: 1;
}
.tabbar__label { transition: color 240ms ease, opacity 240ms ease, transform 320ms cubic-bezier(.2,.8,.2,1); }
.tabbar__glider { transition-duration: 320ms; }
.tabbar__glider.is-instant { transition: none; }
@media (prefers-reduced-motion: reduce) {
  .tabbar .tabbar__ico, .tabbar__label, .tabbar__glider { transition: none; }
}

/* SMOOTHNAV0928: Mini App timing, a viewport-sized fade instead of a page layer. */
@media (max-width: 767.98px) {
  .route-veil {
    transition: opacity 260ms cubic-bezier(.22,1,.36,1);
    will-change: opacity;
  }
  .route-veil.is-covering {
    pointer-events: auto;
    touch-action: none;
    transition-duration: 100ms;
    transition-timing-function: cubic-bezier(.32,0,.67,0);
  }
  .tabbar__ico { will-change: transform, filter, opacity; }
}
@media (prefers-reduced-motion: reduce) {
  .route-veil { transition: none; will-change: auto; }
  .tabbar__ico { will-change: auto; }
}

/* TABFX0930 (жалоба владельца 30.09 «0 плавности»; разбор tabfx0930 D1/D2): смена вкладки на телефоне — как в мини-приложении.
   · .is-full (ставит app.js только на телефоне): шторка во весь экран и ПОД шапкой (40) и нижней панелью (45) — старая страница
     не просвечивает сквозь стекло панели и под прозрачной шапкой; фон — снимок фона страницы (app.js пишет его в style).
   · Накрытие 100 мс линейно (было ease-in: почти всё изменение в последних 2–3 кадрах — «рывок в темноту»).
   · Растворение те же 260 мс, но по мягкой кривой ease (было cubic-bezier(.22,1,.36,1), как в мини-приложении: ~64 % изменения
     за первые ~50 мс — новая страница «выпрыгивала» за 2–3 кадра; D1 cr-remote-a revealSeq). Шаг кадра — ~10 % вместо ~29 %.
   · ::after — полоска загрузки (как routePulse мини-приложения, цвета сайта), пока раздел собирается: вместо мёртвого экрана.
   · .is-releasing (280 мс после раскрытия): свет улетает вверх и гаснет, полоска замирает и уходит вместе со шторкой.
   · rb-img-wait: картинка, не успевшая к раскрытию, ждёт загрузки невидимой и проявляется за 220 мс (app.js softImages).
   ПК и планшет (≥ 768 px) — без изменений. */
@media (max-width: 767.98px) {
  .route-veil.is-full { z-index: calc(var(--z-header) - 1); background: var(--bg); transition: opacity 260ms cubic-bezier(.25,.1,.25,1); }
  .route-veil.is-full.is-covering { transition-duration: 100ms; transition-timing-function: linear; }
  .route-veil.is-full::before { bottom: calc(var(--veil-nav-gap, 0px) - 12vh); }
  .route-veil.is-full::after {
    content: ""; position: absolute; top: calc(var(--veil-head, 0px) + 18px); left: 50%; width: 56px; height: 3px;
    border-radius: 999px; opacity: 0; pointer-events: none; transform: translate3d(-50%, 0, 0) scaleX(.55);
    background: linear-gradient(90deg, var(--primary-top, #5B74FE), var(--primary-deep, #7B5CF0));
    box-shadow: 0 0 12px rgba(96,100,250,.42);
    transition: opacity .2s ease;
  }
  .route-veil.is-full.is-covering::after { opacity: 1; animation: rb-route-pulse .72s ease-in-out infinite; }
  .route-veil.is-full.is-releasing::after { opacity: .38; animation: rb-route-pulse .72s ease-in-out infinite paused; }
  .route-veil.is-full.is-releasing::before {
    opacity: 0; transform: translate3d(-50%, -13%, 0) scale(1.28);
    transition: opacity .24s ease-out, transform .34s cubic-bezier(.2,.8,.2,1);
  }
  img.rb-img-wait { opacity: 0 !important; }
}
@keyframes rb-route-pulse {
  0%, 100% { opacity: .46; transform: translate3d(-50%, 0, 0) scaleX(.55); }
  50% { opacity: 1; transform: translate3d(-50%, 0, 0) scaleX(1); }
}
@media (prefers-reduced-motion: reduce) {
  .route-veil.is-full { transition: none; }
  .route-veil::after, .route-veil::before { display: none; }
  img.rb-img-wait { opacity: 1 !important; }
}

/* TABFXPC0930 (владелец 30.09: «нужно для ПК между вкладками такие же плавные нежные переключения, щас как в миниаппе»,
   «ток полоску не такую как на мобилке, мб логотип рубап»). ПК и планшет (≥ 768): смена раздела — как у телефона (TABFX0930),
   класс .is-pc ставит app.js (beginPageChange) только при ширине ≥ 768; телефонные правила выше не тронуты.
   · Шторка над областью #main (без колонки чата) и ПОД стеклянной шапкой (z 39): выбранная вкладка в шапке видна сразу.
     Фон — снимок body::before, выровненный по окну (app.js пишет размер и сдвиг в style).
   · Накрытие 100 мс линейно, растворение 260 мс, «уход» .is-releasing 280 мс — те же цифры, что у телефона. Кривая растворения —
     ease-in-out (у телефона ease): наибольший шаг кадра тот же (~10 %), но старт мягче — раскрытие, которое перебил следующий
     клик в первые ~60 мс, почти не видно (шторка ≥ 0,9; с ease — 0,6–0,7: страница «мигала» сквозь шторку, замер rapid).
   · Свет (::before) — от вкладки в шапке (сверху, по x клика --route-x); при «уходе» улетает вверх и гаснет.
   · Знак RubUP (.route-veil__logo; маски .rl__layer — loader.css в index.html) по центру видимой части шторки. Переходы на ПК
     быстрые, поэтому знак ждёт: проявление (0,5 с) начинается через 250 мс после начала накрытия, и первые ~90 мс его почти не
     видно (кривая с медленным стартом: ≤ 4 %) — при раскрытии раньше ~350 мс от клика знака нет. Замеры (Chromium 1366,
     tabfxpc0930/evidence): раскрытие вкладки из памяти — 150–280 мс от клика при CPU×1, 180–350 мс при CPU×4; «Кейсы» впервые —
     ~380 мс (CPU×1) и 0,5–1,4 с (CPU×4): там знак и нужен. Дальше — мягкое «дыхание» (прозрачность и
     масштаб) и тихое свечение цветом кнопок. При «уходе» гаснет вместе со шторкой.
     r1 (скептик motion: знак пропадал за 1–2 кадра при ещё тёмной шторке). Причина (замер fix-r1, главный поток против
     кадров): проявление знака идёт на компоновщике, а главный поток, занятый сборкой раздела, видит его устаревшим — после
     долгой задачи время анимаций в первом кадре отстаёт на её длину (знак на экране 0,4–1, а по главному потоку 0–0,07).
     Любое изменение бегущей анимации знака в кадре раскрытия (r0: свой переход прозрачности 0,2 с, подъём на 10 px, пауза
     «дыхания») начиналось от этого устаревшего значения — компоновщик бросал свою анимацию, знак обрывался (у r0 ещё и
     укороченный обратный переход). Теперь «уход» бегущие анимации знака не трогает, а гасит знак отдельный внешний слой
     (ниже). Сброс знака — когда «уход» кончился (шторка уже прозрачна); новый клик во время «ухода» продолжает знак.
   · rb-img-wait — картинка, не успевшая к раскрытию, ждёт загрузки невидимой и проявляется за 220 мс (app.js softImages). */
.route-veil__logo, .route-veil__mark { display: none; }
@media (min-width: 768px) {
  .route-veil.is-pc { z-index: calc(var(--z-header) - 1); transition: opacity 260ms cubic-bezier(.42,0,.58,1); will-change: opacity; }
  .route-veil.is-pc.is-covering { pointer-events: auto; transition-duration: 100ms; transition-timing-function: linear; }
  .route-veil.is-pc::before {
    top: calc(var(--veil-head, 0px) - 12vh); bottom: auto; width: min(640px, 56vw); height: 66vh;
    transform: translate3d(-50%, -14%, 0) scale(.72); transform-origin: 50% 0;
    background: radial-gradient(ellipse at 50% 0%, rgba(108,102,250,.15) 0%, rgba(108,102,250,.055) 40%, transparent 72%);
  }
  .route-veil.is-pc.is-covering::before { opacity: 1; transform: translate3d(-50%, 0, 0) scale(1.06); }
  .route-veil.is-pc.is-releasing::before {
    opacity: 0; transform: translate3d(-50%, -20%, 0) scale(1.1);
    transition: opacity .24s ease-out, transform .34s cubic-bezier(.2,.8,.2,1);
  }
  /* r1: знак — три слоя (app.js pcVeilLogo). Внешний .route-veil__mark — место и «уход»: при накрытии он просто 1 (без
     анимации), при «уходе» гаснет сам, за 260 мс по кривой с быстрым стартом — начинается от честной 1 (у него нет бегущей
     анимации), поэтому без обрыва. .route-veil__logo — проявление с задержкой (как в r0); .route-veil__breath — «дыхание».
     Эти два при «уходе» НЕ трогаются (те же правила для .is-covering и .is-releasing) — см. комментарий в начале блока.
     Кривая «ухода» (.15,.4,.45,1) подобрана расчётом: знак гаснет плавно (шаг ≤ 0,16 за кадр), чуть раньше шторки (~175
     против ~235 мс до 2 %) и не «разгорается» во время растворения, если раскрытие застало проявление на подъёме (рост ≤ 0,03).
     Видимость знака = шторка × mark × logo × breath (замерам по главному потоку — перемножать все три слоя). */
  .route-veil__mark {
    display: block; position: absolute; left: 50%; top: calc(var(--veil-head, 0px) + (100% - var(--veil-head, 0px)) / 2);
    width: 140px; aspect-ratio: 1088 / 401; pointer-events: none;
    transform: translate3d(-50%, -50%, 0);
    opacity: 1; transition: opacity .1s linear; will-change: opacity;
  }
  .route-veil.is-pc.is-releasing .route-veil__mark { opacity: 0; transition: opacity .26s cubic-bezier(.15,.4,.45,1); }
  .route-veil__logo {
    --rl-white: #EEF1FC; --rl-yellow: #F9CC52;   /* цвета знака — как у заставки (loader.css) */
    display: block; position: absolute; inset: 0; pointer-events: none;
    opacity: 0; transform: scale(.94); will-change: opacity, transform;
  }
  .route-veil__logo::before {   /* тихое свечение за знаком — цвет кнопок сайта */
    content: ""; position: absolute; left: -45%; right: -45%; top: -110%; bottom: -110%; pointer-events: none;
    background: radial-gradient(closest-side, rgba(108,102,250,.20), rgba(108,102,250,.07) 55%, rgba(108,102,250,0));
  }
  .route-veil.is-pc.is-covering .route-veil__logo,
  .route-veil.is-pc.is-releasing .route-veil__logo {
    opacity: 1; transform: scale(1);
    transition: opacity .5s cubic-bezier(.6,0,.35,1) .25s, transform .7s cubic-bezier(.2,.8,.2,1) .25s;
  }
  .route-veil__breath { position: absolute; inset: 0; }
  .route-veil.is-pc.is-covering .route-veil__breath,
  .route-veil.is-pc.is-releasing .route-veil__breath { animation: rb-veil-breathe 1.2s ease-in-out .75s infinite alternate; }
  img.rb-img-wait { opacity: 0 !important; }
}
@media (min-width: 1600px) { .route-veil__mark { width: 156px; } }
@keyframes rb-veil-breathe {
  from { opacity: 1; transform: none; }
  to { opacity: .76; transform: scale(1.035); }
}
@media (prefers-reduced-motion: reduce) {
  .route-veil.is-pc, .route-veil.is-pc.is-covering, .route-veil__logo, .route-veil__mark { transition: none; }
  .route-veil__breath { animation: none !important; }
  img.rb-img-wait { opacity: 1 !important; }
}

/* FOOTERPOLISH0928: 18+ — тихая плашка-бейдж вместо красного круга; Telegram — монохромный самолётик
   в тёмной кнопке, как «Поддержка», фирменный голубой только при наведении. */
.footer .age-mark--quiet {
  display: inline-flex; align-items: center; justify-content: center; flex: none;
  width: auto; height: 26px; padding: 0 8px; border-radius: 8px;
  border: 1px solid rgba(255,255,255,.14); background: rgba(255,255,255,.04); box-shadow: none;
  color: var(--text-3); font: 700 12px/1 var(--font-body); letter-spacing: .03em;
}
.footer .footer__tg--quiet {
  display: inline-grid; place-items: center; flex: none;
  width: 40px; height: 40px; border-radius: 12px;
  background: var(--s2, rgba(255,255,255,.06)); border: 1px solid rgba(255,255,255,.08); box-shadow: none;
  color: var(--text-2); transition: color 160ms ease, background-color 160ms ease, border-color 160ms ease;
}
.footer .footer__tg--quiet .footer__tg-ico { width: 20px; height: 20px; }
@media (hover: hover) {
  .footer .footer__tg--quiet:hover { color: #2AABEE; background: rgba(42,171,238,.10); border-color: rgba(42,171,238,.32); }
}
.footer .footer__tg--quiet:focus-visible { outline: 2px solid #2AABEE; outline-offset: 2px; }
@media (max-width: 767.98px) {
  .footer .age-mark--quiet { height: 26px; padding: 0 7px; font-size: 12px; }
  .footer .footer__tg--quiet { width: 36px; height: 36px; border-radius: 11px; }
  .footer .footer__tg--quiet .footer__tg-ico { width: 18px; height: 18px; }
}
@media (prefers-reduced-motion: reduce) { .footer .footer__tg--quiet { transition: none; } }

/* CORESTYLE0928H (слово владельца 28.09: «значки оставить, а кнопки нижней панели — как в проде»): нижняя панель — ОДНА
   стеклянная капсула с бегущей плашкой (MINIAPPNAV0927, как в мини-приложении), без отдельных кнопок и без жёлтой капсулы
   за значком. Значки — линейные из макета партнёра (app.js TAB_SVG), «Игры» — корова на ракете; выбранный — --nav-active. */
.tabbar__ico--line svg { width: 26px; height: 26px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.tabbar .tabbar__ico.tabbar__ico--line:not(.tabbar__ico--art) { -webkit-filter: none; filter: none; opacity: 1; }
.tabbar .tabbar__ico--art .nav-ico { width: 36px; height: 36px; }

/* CORESTYLE0928E (DAY-PLAN-0928 п. 2–3, макет v2 партнёра): стекло — не одной большой панелью, а отдельными пилюлями и кругами.
   «Пополнить» в шапке — жёлтая пилюля ТЕКСТОМ на всех ширинах (плюса больше нет — пустой квадрат недопустим).
   Телефон: шапка без капсулы — логотип без подложки, стеклянный круг чата, стеклянная пилюля баланса (нижняя панель — см. CORESTYLE0928H). */
.topbar__topup-label { display: inline; }
.topbar .topbar__topup, .topbar .hwal .topbar__topup { width: auto; padding: 0 18px; border-radius: var(--r-pill); font-weight: 700; }
@media (max-width: 767.98px) {
  .topbar::before { content: none; }
  /* капсулы нет — внутренний отступ капсулы (+6/+2 px) больше не нужен, край как у страницы */
  .topbar, .topbar.topbar { padding: 6px var(--gutter) 0; }
  .topbar__spacer { min-width: 0; }
  .topbar .nav-ibtn, .topbar .balance-btn {
    background: var(--glass-bg); border: 1px solid var(--glass-line); box-shadow: var(--glass-edge);
    -webkit-backdrop-filter: saturate(var(--glass-sat, 160%)) blur(var(--glass-blur, 20px)); backdrop-filter: saturate(var(--glass-sat, 160%)) blur(var(--glass-blur, 20px));
  }
  .topbar .nav-ibtn { width: 38px; height: 38px; border-radius: 50%; color: var(--text); }
  .topbar .nav-ibtn:hover { background: var(--glass-bg); border-color: var(--glass-line); }
  .topbar .balance-btn { height: 40px; border-radius: var(--r-pill); padding: 0 11px 0 6px; }
  .topbar .balance-btn__chev { display: none; }
  .topbar .topbar__topup, .topbar .hwal .topbar__topup { height: 40px; padding: 0 13px; font-size: 14px; }
  .hwal { display: flex; align-items: center; gap: 6px; }

}
@media (max-width: 767.98px) {
  .topbar__logo img { width: 58px; height: 22px; }
  .topbar__brand { padding-right: 4px; }
  .topbar__actions { gap: 6px; }
  .topbar .balance-btn { gap: 5px; font-size: 13.5px; }
  .topbar .balance-btn .cur-mark { width: 22px; height: 22px; }
}
@media (max-width: 389.98px) {
  .topbar .topbar__topup, .topbar .hwal .topbar__topup { padding: 0 11px; font-size: 13.5px; }
  .topbar .balance-btn { padding: 0 9px 0 5px; font-size: 12.5px; }
  .topbar__logo img { width: 54px; height: 20px; }
  .topbar .nav-ibtn { width: 36px; height: 36px; }
}
@media (max-width: 374.98px) {
  .topbar .balance-btn .cur-mark { width: 18px; height: 18px; }
  .topbar .balance-btn { padding: 0 7px 0 5px; gap: 4px; }
  .topbar .topbar__topup, .topbar .hwal .topbar__topup { padding: 0 9px; }
  .topbar__actions, .hwal { gap: 4px; }
}
@media (max-width: 339.98px) {
  .topbar__logo img { width: 46px; height: 17px; }
  .topbar .nav-ibtn { width: 34px; height: 34px; }
  .topbar .topbar__topup, .topbar .hwal .topbar__topup { padding: 0 9px; font-size: 13px; height: 36px; }
  .topbar .balance-btn { height: 36px; font-size: 12.5px; }
}

/* ── S0929 (сборщик S, закон DESIGN-0929): оболочка в едином стиле.
   Шапка ПК: пилюля баланса и «Пополнить» — пилюли (как на телефоне), без жёлтого. Нижняя панель — стеклянная капсула как была;
   выбранный пункт — сине-фиолетовая стеклянная плашка, белые значок и подпись. Правая колонка чата — фон страницы, линии --s-line. ── */
.topbar { border-bottom-color: var(--s-line); }
.balance-btn { border-radius: var(--r-pill); background: var(--s2); border-color: var(--s-line-hi); }
.topbar__avatar .avatar, .topbar__avatar { border-radius: 50%; }
.topbar .topbar__topup { color: var(--on-fill); }
.topnav__link { border-radius: var(--r-pill); }
.tabbar__link[aria-current="page"], .tabbar__link[aria-current="page"] .tabbar__label { color: var(--nav-active); }
.tabbar__link[aria-current="page"] .tabbar__label { font-weight: 700; }
.shell__aside { border-left-color: var(--s-line); background: var(--bg-aside); }
.chat-fab { background: var(--s2); border-color: var(--s-line-hi); }
.footer__inner { border-top-color: var(--s-line); }
.footer__support { background: var(--s2); border-color: var(--s-line-hi); }
.footer .age-mark--quiet { border-color: var(--s-line-hi); background: var(--s2); }
.footer .footer__tg--quiet { background: var(--s2); border-color: var(--s-line-hi); }
@media (max-width: 767.98px) {
  .footer__support { background: none; }
}

/* NAVART0929 (закон §7 «одна система значков», находки S1 / S-01): нижняя панель — объёмные мультяшные значки одной отделки,
   как «Игры» (корова на ракете) и «Кейсы» (сундук). «Заработок» — билет-задание с монетой ₽, «Профиль» — мультяшный аватар
   (assets/img/ui-icons0927, тот же рендер). Линейные SVG из app.js TAB_SVG скрыты, картинка ставится фоном по data-tab-link.
   Одно поле --tab-art для всех четырёх и одна общая тень; неактивные — лёгкая прозрачность, выбранный — полная яркость. */
.tabbar { --tab-art: 32px; }
.tabbar .tabbar__ico { -webkit-filter: none; filter: none; opacity: .86; }
.tabbar__link[aria-current="page"] .tabbar__ico { -webkit-filter: none; filter: none; opacity: 1; }
.tabbar .tabbar__ico--line:not(.tabbar__ico--art) svg { display: none; }
.tabbar .tabbar__ico--line:not(.tabbar__ico--art)::before {
  content: ""; width: var(--tab-art); height: var(--tab-art);
  background: center / contain no-repeat; pointer-events: none;
}
.tabbar .tabbar__ico--line::before, .tabbar .tabbar__ico--art .nav-ico { filter: drop-shadow(0 2px 3px rgba(8,10,28,.45)); }
.tabbar .tabbar__ico.tabbar__ico--line:not(.tabbar__ico--art) { opacity: .86; }
.tabbar__link[aria-current="page"] .tabbar__ico.tabbar__ico--line:not(.tabbar__ico--art) { opacity: 1; }
.tabbar [data-tab-link="cases"] .tabbar__ico--line::before { background-image: url("../img/nav-color0928/case-03218f43117e-128.webp"); }
.tabbar [data-tab-link="tasks"] .tabbar__ico--line::before { background-image: url("../img/ui-icons0927/earn-fbdb8c870d55.webp"); }
.tabbar [data-tab-link="profile"] .tabbar__ico--line::before { background-image: url("../img/ui-icons0927/profile-add1daf5e67f.webp"); }
.tabbar [data-tab-link="tournaments"] .tabbar__ico--line::before { background-image: url("../img/nav-status0928/trophy-94d7c11e2648-128.webp"); }
.tabbar [data-tab-link="vip"] .tabbar__ico--line::before { background-image: url("../img/nav-status0928/vip-e6ec9fe80b47-128.webp"); }
.tabbar .tabbar__ico--art .nav-ico { width: calc(var(--tab-art) + 4px); height: calc(var(--tab-art) + 4px); }

/* F2-S U-03 (5): шапка телефона — пилюли стекла стоят отдельно, но при прокрутке контент больше не просвечивает в промежутках:
   под пилюлями — размытая подложка цвета фона с мягким нижним краем (без полосы-«ленты»). Появляется по мере прокрутки
   первых 48 px (scroll-driven), наверху страницы её не видно — там свечение фона. Без поддержки — просто видна всегда. */
@keyframes topbar-veil-in { from { opacity: 0; } to { opacity: 1; } }
@media (max-width: 767.98px) {
  .topbar::after {
    content: ""; position: absolute; left: 0; right: 0; top: 0; bottom: -12px; z-index: -1; pointer-events: none;
    background: linear-gradient(180deg, rgba(25,29,46,.94) 0%, rgba(25,29,46,.88) 72%, rgba(25,29,46,0) 100%);
    -webkit-backdrop-filter: blur(18px); backdrop-filter: blur(18px);
    -webkit-mask-image: linear-gradient(180deg, #000 76%, transparent); mask-image: linear-gradient(180deg, #000 76%, transparent);
  }
  @supports (animation-timeline: scroll()) {
    .topbar::after { animation: topbar-veil-in linear both; animation-timeline: scroll(root); animation-range: 0 48px; }
  }
}

/* HEADER0929 (слово владельца 28.09 ~23:00): шапка одинаковая во всех разделах и играх — логотип RubUP ВЕЗДЕ (на внутренних
   страницах и в играх слева маленькая «‹»), баланс и «Пополнить» одной стеклянной группой справа (расположение как у Wingram,
   в нашем стиле), монета ₽ синяя (tokens.css HEADER0929). Чат в шапке — только на главных разделах; на внутренних страницах
   и в играх убран, чтобы влез логотип (на ПК чат — справа, как был). */
@media (max-width: 767.98px) {
  .topbar__brand { gap: 2px; }
  html[data-inner] .topbar__logo { display: block; }
  html[data-inner] .topbar__back { display: inline-flex; width: 30px; height: 38px; margin-left: -6px; border-radius: 12px;
    background: transparent; border: 0; box-shadow: none; -webkit-backdrop-filter: none; backdrop-filter: none; color: var(--text); }
  html[data-inner] .topbar__chat { display: none !important; }
  .topbar .hwal { gap: 0; padding: 3px; border-radius: var(--r-pill);
    background: var(--glass-bg); border: 1px solid var(--glass-line); box-shadow: var(--glass-edge);
    -webkit-backdrop-filter: saturate(var(--glass-sat, 160%)) blur(var(--glass-blur, 20px)); backdrop-filter: saturate(var(--glass-sat, 160%)) blur(var(--glass-blur, 20px)); }
  .topbar .hwal .balance-btn { height: 36px; background: transparent; border: 0; box-shadow: none; -webkit-backdrop-filter: none; backdrop-filter: none;
    padding: 0 10px 0 3px; }
  .topbar .hwal .balance-btn .cur-mark { width: 26px; height: 26px; }
  .topbar .hwal .topbar__topup { height: 36px; }
}
@media (max-width: 389.98px) {
  .topbar .hwal .balance-btn { padding: 0 8px 0 2px; }
  .topbar .hwal .balance-btn .cur-mark { width: 24px; height: 24px; }
}
@media (max-width: 374.98px) {
  .topbar .hwal .balance-btn .cur-mark { width: 20px; height: 20px; }
}

/* HEADER0929 narrow v2: на 320–359 px длинный баланс не выталкивает общую группу за край.
   Специфичность учитывает поздние стили .hwal из ui.js; новый логотип, стрелка, чат и стеклянная группа сохранены. */
@media (max-width: 359.98px) {
  .topbar .hwal .balance-btn { font-size: 13.5px; gap: 4px; padding-right: 6px; }
}
@media (max-width: 339.98px) {
  .topbar .hwal .balance-btn { font-size: 12.5px; }
}

/* A4V6B: значок 32 px — 128 px хватает и на DPR 3; 256 px (+40 КБ до «готово» на телефоне) не грузим.
   NAVV3-0929 (владелец 28.09: v1 «слишком мультяшные», v2 «слишком строгие» → серия C Codex): «Кейсы» — мини-кейс с подарками,
   «Заработок» — монеты ₽ с подарком, «Профиль» — глянцевый медальон. «Игры» — прежняя корова. */
/* NAV0930 (разбор №11): Кейсы, Заработок, Профиль — серия nav0930 Codex в стиле icons0930. */
.tabbar [data-tab-link="cases"] .tabbar__ico--line::before { background-image: url("../img/nav0930/cases-128.webp"); }
.tabbar [data-tab-link="tasks"] .tabbar__ico--line::before { background-image: url("../img/nav0930/earnings-128.webp"); }
.tabbar [data-tab-link="profile"] .tabbar__ico--line::before { background-image: url("../img/nav0930/profile-128.webp"); }

/* DC-0929 (EDGE-1): страховка длинного баланса — число сжимается и режется многоточием, «Пополнить» и аватар не выезжают за край */
.topbar .hwal { min-width: 0; flex: 0 1 auto; }
.topbar .hwal .balance-btn { min-width: 0; }
.topbar .hwal [data-balance] { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.topbar .hwal .topbar__topup, .topbar .profile-wrap { flex: none; }
/* DC-0929 (R2): 768–859 px (iPad mini, планшеты) — «Пополнить» текстом + меню из 5 значков не влезают; поиск остаётся на «Играх» и по Ctrl+K */
@media (min-width: 768px) and (max-width: 859.98px) {
  .topbar .topbar__search { display: none; }
}

/* CODEX-V7: blur группы баланса создаёт containing block для fixed-меню и прячет его под scrim.
   Пока меню открыто, его фиксированные координаты считаются от окна; строки валют доступны касанию. */
.topbar .balance-wrap:has(.menu) {
  z-index: 56; -webkit-backdrop-filter: none; backdrop-filter: none;
}

/* R6-0929 (разбор владельца №6, D2): шапка.
   1) Логотип крупнее: ПК 87×32 → 104×38, телефон 58×22 → 70×26 (390), узкие — ниже. Картинка 261×96 — хватает на DPR 2–3.
      Страховка: если справа не влезает (длинный баланс до «999 999 999» на 320–360 px), ужимается только логотип
      (до --logo-min); группа баланса на телефоне не сжимается — WebKit ставил многоточие в сумме уже при доле пикселя.
   2) Баланс — видно, что это кнопка выбора валюты: шеврон ▾ на всех ширинах (на телефоне раньше был скрыт) и своя подложка
      у суммы внутри группы [сумма ▾ | Пополнить]; нажатие открывает прежнее меню валют (data-action="balance-menu").
   3) Чат в шапке — только на главной (html[data-home] ставит app.js markBack); на ПК чат — колонка справа, как был.
   4) Телефон: аватар в шапке скрыт, а его пустая ячейка съедала 6 px промежутка — убрана, место отдано логотипу и шеврону.
   Размеры рассчитаны на худший случай демо: главная с чатом и баланс «10 000 000». */
html:not([data-home]) .topbar__chat { display: none !important; }
.topbar__logo img { width: 104px; height: 38px; }
.topbar .balance-wrap .balance-btn .balance-btn__chev { display: inline-block; flex: none; width: 16px; height: 16px; margin-left: -2px;
  stroke-width: 2.7; color: var(--text-2); }
.topbar .balance-btn:hover .balance-btn__chev, .topbar .balance-btn[aria-expanded="true"] .balance-btn__chev { color: var(--text); }
/* ревью R6 п.4: подложка суммы на ПК — такая же явная, как на телефоне (--s2 почти сливался с группой --s1) */
.topbar .hwal .balance-btn { background: rgba(255,255,255,.07); }
.topbar .hwal .balance-btn:hover, .topbar .hwal .balance-btn[aria-expanded="true"] { background: rgba(255,255,255,.11); }
/* ревью R6 п.1: ПК ≥1200 — логотип 120×44 (шапка 64 px; между меню и поиском ~300 px свободно) */
@media (min-width: 1200px) { .topbar__logo img { width: 120px; height: 44px; } }
@media (max-width: 767.98px) {
  .topbar { --logo-w: 70px; --logo-min: 54px; }
  .topbar .profile-wrap { display: none; }
  .topbar__brand { flex: 0 1 auto; min-width: 0; }
  .topbar__actions { flex-shrink: 0; }
  .topbar__logo { flex: 0 1 auto; min-width: var(--logo-min); }
  .topbar__logo img { width: var(--logo-w); max-width: 100%; height: auto; }
  .topbar .nav-ibtn { width: 36px; height: 36px; }
  .topbar .hwal .balance-btn { gap: 4px; padding: 0 8px 0 3px; font-size: 14.5px; }
  .topbar .hwal .balance-btn .cur-mark { width: 24px; height: 24px; }
  .topbar .balance-wrap .balance-btn .balance-btn__chev { width: 13px; height: 13px; margin-left: 0; stroke-width: 3.2; }
  .topbar .hwal .topbar__topup { padding: 0 10px; font-size: 14px; }
}
@media (max-width: 389.98px) {
  .topbar { --logo-w: 66px; --logo-min: 50px; }
  .topbar .hwal .balance-btn { font-size: 14px; padding-right: 7px; }
  .topbar .hwal .balance-btn .cur-mark { width: 22px; height: 22px; }
  .topbar .hwal .topbar__topup { padding: 0 9px; font-size: 13.5px; }
}
/* ревью R6 п.2–3: сумма на 360–389 не мельче 14 px, логотип не уже 46 px даже на 320 с чатом. Место берём у промежутков,
   отступов группы, кнопки чата (36 → 32 px; зона касания 44 — .icon-btn::after) и «Пополнить», а не у суммы и логотипа. */
@media (max-width: 374.98px) {
  .topbar { --logo-w: 60px; --logo-min: 50px; }
  .topbar__actions { gap: 5px; }
  .topbar .hwal { padding: 2px; }
  .topbar .hwal .balance-btn { gap: 3px; padding: 0 6px 0 3px; font-size: 14px; }
  .topbar .balance-wrap .balance-btn .balance-btn__chev { width: 12px; height: 12px; }
  .topbar .hwal .topbar__topup { padding: 0 8px; }
}
@media (max-width: 359.98px) {
  .topbar { --logo-w: 56px; --logo-min: 46px; }
  .topbar__brand { padding-right: 2px; }
  .topbar__actions { gap: 4px; }
  .topbar .nav-ibtn { width: 32px; height: 32px; }
  .topbar .hwal .balance-btn { gap: 2px; padding: 0 5px 0 2px; font-size: 13.5px; }
  .topbar .hwal .balance-btn .cur-mark { width: 20px; height: 20px; }
  .topbar .balance-wrap .balance-btn .balance-btn__chev { width: 11px; height: 11px; }
  .topbar .hwal .topbar__topup { padding: 0 7px; font-size: 13px; }
}
@media (max-width: 339.98px) {
  .topbar { --logo-w: 52px; --logo-min: 46px; }
  .topbar .hwal .balance-btn { font-size: 13px; }
  .topbar .hwal .topbar__topup { padding: 0 6px; }
}

/* R9-0929 (C4, разбор владельца №9: «логотип RubUP стоит неровно по соотношению ко всему, как-то в стороне»).
   1) По вертикали. В картинке логотипа под буквами «UP» — стрелка, поэтому коробка картинки стоит по оси шапки, а ось букв
      (тело «Rub» 2–82 % высоты, с хвостом «R» — 1–91 %, т. е. ≈ 42–46 %) — на 1–3 px выше оси цифр баланса, «Пополнить», «‹»
      и пунктов меню ПК. Опускаем картинку на --logo-dy: 3 px на ПК ≥1200 (логотип 44 px), 2 px на 768–1199 (38 px), 1 px на
      телефоне (18–26 px) — ось букв ложится между осью цифр и центром пилюль (±0,6 px по замеру чернил на 320–1920).
   2) По горизонтали на ПК ≥1200: логотип стоял на 24 px, а край страницы — на 32 (--gutter) — теперь на одной линии с контентом;
      промежуток логотип → меню 48 → 32 px, логотип больше не «отдельно» от ряда меню.
   3) Телефон, внутренние страницы и игры («‹ RubUP»): «‹» встаёт ровно по краю страницы (12 px, как баннеры и игра),
      логотип — через ровные ~10 px от стрелки; зона нажатия «‹» — до края экрана и по высоте шапки (≥ 40 × 44). */
.topbar { --logo-dy: 3px; }
.topbar__logo img { position: relative; top: var(--logo-dy); }
@media (min-width: 1200px) {
  .topbar__brand { padding-left: var(--gutter); padding-right: 24px; }
  .topnav { padding-left: 8px; }
}
@media (min-width: 768px) and (max-width: 1199.98px) {
  .topbar { --logo-dy: 2px; }
}
@media (max-width: 767.98px) {
  .topbar { --logo-dy: 1px; }
  html[data-inner] .topbar__brand { gap: 0; }
  html[data-inner] .topbar__back { position: relative; width: 28px; margin-left: -9px; }
  html[data-inner] .topbar__back::after { content: ""; position: absolute; inset: -3px 0 -3px -3px; }
  html[data-inner] .topbar__logo::after { left: 0; }   /* зона логотипа не заходит на «‹» */
}
/* R9-0929 (ревью п.5): 1120–1159 px, главная (чат в шапке) — меню с подписями + баланс «10 000 000» занимали 1151 px,
   на 1120 шапка выезжала за окно на 31 px (аватар обрезан, прокрутка вбок), на 1150 — на 1 px. Чуть ужимаем промежутки меню. */
@media (min-width: 1120px) and (max-width: 1159.98px) {
  .topbar__brand { padding-right: 14px; }
  .topnav__link { padding-left: 7px; padding-right: 7px; gap: 5px; }
}

/* R12-0930 (C1, разбор владельца №12: «давай попробуем просто без смайликов, просто текстом: Игры, Кейсы, Заработок, Профиль»).
   Телефонная нижняя панель — одни подписи. ПЕРЕКЛЮЧАТЕЛЬ ОДИН: класс .tabbar--text на <nav class="tabbar"> (app.js, TABBAR_TEXT);
   без него панель снова со значками прежней высоты 68 — весь блок ниже работает только при этом классе.
   · Панель ниже: --tabbar-h 68 → 54 (капсула 42 px). Отступ страницы снизу, игры «на один экран», тосты, «Играть в …» турниров,
     сводка батла считают от --tabbar-h, поэтому переменная переопределяется на корне — классом html.tabbar-text (ставит app.js
     по тому же TABBAR_TEXT; не :has() — его нет в старых Android WebView, Chrome < 105) — все подстраиваются сами.
   · Подписи 15 px (от 380 px — 16), выбранная — жирная 800 и белая, остальные — 650, светло-серые. Плашка выбранного — прежняя
     градиентная пилюля (.tabbar__glider, --nav-capsule), теперь по ширине слова: колонки «auto» — слово + поровну свободного
     места, «Заработок» шире «Игр». Чтобы жирная подпись не меняла ширину колонок (плашка меряет их один раз), каждая подпись
     заранее занимает место своего жирного варианта (невидимая копия ::after из data-t).
   · Зона нажатия — вся высота панели. ПК-меню (шапка) не меняется: панель видна только до 767 px. */
:root.tabbar-text { --tabbar-h: 54px; }
.tabbar.tabbar--text { grid-template-columns: none; grid-auto-flow: column; grid-auto-columns: auto; gap: 0;
  /* без значков панель — одни слова: стекло чуть плотнее (.58 → .76), чтобы крупные заголовки под ней не спорили с подписями */
  background: var(--glass-hi, none), rgba(25,29,46,.76); }
.tabbar--text .tabbar__ico { display: none; }
.tabbar--text .tabbar__link { min-height: 0; padding: 0 8px; gap: 0; border-radius: var(--r-pill, 999px); }
.tabbar--text .tabbar__link::after { content: ""; position: absolute; inset: -6px 0; }
.tabbar--text .tabbar__label {
  display: grid; justify-items: center; max-width: 100%;
  font-size: 15px; font-weight: 650; line-height: 20px; letter-spacing: -.01em;
  transform: none; transition: color 200ms ease, opacity 200ms ease, transform 160ms ease;
}
.tabbar--text .tabbar__label::after {
  content: attr(data-t); height: 0; overflow: hidden; visibility: hidden; pointer-events: none; user-select: none;
  font-weight: 800;
}
.tabbar--text .tabbar__link:not([aria-current="page"]) { color: #cbd2e4; }
/* B2-0930 (замечание Агента-4: над яркой лентой бонусов профиля неактивные подписи бледноваты): .8 → .88 и лёгкая тёмная тень
   под буквами. Выбранный пункт по-прежнему отличается сразу: белый, 800, на градиентной плашке. */
.tabbar--text .tabbar__link:not([aria-current="page"]) .tabbar__label { opacity: .88; text-shadow: 0 1px 2px rgba(5,8,22,.35); }
.tabbar--text .tabbar__link[aria-current="page"] .tabbar__label { font-weight: 800; opacity: 1; transform: none; color: var(--nav-active); }
.tabbar--text .tabbar__link:active .tabbar__label { transform: scale(.96); }
.tabbar--text .tabbar__glider { border-radius: var(--r-pill, 999px); }
/* плашка едет и меняет ширину вместе (слова разной длины); первая отрисовка и поворот экрана — без анимации (.is-instant) */
@media (prefers-reduced-motion: no-preference) {
  .tabbar--text .tabbar__glider:not(.is-instant) { transition-property: transform, width; }
}
@media (min-width: 380px) {
  .tabbar--text .tabbar__label { font-size: 16px; }
}
/* 320–359 px: слова 15 px влезают, если сузить поля пунктов (8 → 4) и края панели (10 → 8) */
@media (max-width: 359.98px) {
  .tabbar.tabbar--text { left: 8px; right: 8px; }
  .tabbar--text .tabbar__link { padding: 0 4px; }
}
@media (prefers-reduced-motion: reduce) {
  .tabbar--text .tabbar__link:active .tabbar__label { transform: none; }
}

/* CORE0930B (сверка S1): 320–339 px, главная с чатом и баланс «10 000 000» — группе справа не хватало 5 px, логотип (не уже 46 px)
   вылезал из своей ячейки, и круг чата закрывал край «P» на 3 px. Берём 6 px у промежутков, а не у суммы и логотипа:
   чат → группа 4 → 3, поля «Пополнить» 6 → 4, правое поле суммы 5 → 4. Сумма, её кегль и логотип прежние.
   Только главная (html[data-home]): круг чата в шапке есть только там, на других страницах место есть и шапка прежняя. */
@media (max-width: 339.98px) {
  html[data-home] .topbar__actions { gap: 3px; }
  html[data-home] .topbar .hwal .balance-btn { padding-right: 4px; }
  html[data-home] .topbar .hwal .topbar__topup { padding: 0 4px; }
}
/* HEADGAP0930 (владелец 30.09: «пространство между кнопками — будто слитые, но не очень; просто небольшой пробел»):
   баланс и «Пополнить» — две отдельные капсулы с зазором, без общей стеклянной подложки. После тапа баланс
   на телефоне больше не залипает тёмной заливкой наведения. */
.topbar .hwal { gap: 6px; padding: 0; background: none; border: 0; box-shadow: none; -webkit-backdrop-filter: none; backdrop-filter: none; }
.topbar .hwal .balance-btn { background: var(--glass-bg, var(--s1)); border: 1px solid var(--glass-line, var(--s-line-hi)); box-shadow: var(--glass-edge, none);
  -webkit-backdrop-filter: saturate(var(--glass-sat, 160%)) blur(var(--glass-blur, 20px)); backdrop-filter: saturate(var(--glass-sat, 160%)) blur(var(--glass-blur, 20px)); }
@media (hover: none) { .topbar .hwal .balance-btn:hover { background: var(--glass-bg, var(--s1)); } }
@media (max-width: 767.98px) {
  .topbar .hwal .balance-btn, .topbar .hwal .topbar__topup { height: 40px; }
  .topbar .hwal .balance-btn { padding: 0 10px 0 5px; }
}
@media (max-width: 389.98px) { .topbar .hwal { gap: 4px; } .topbar .hwal .balance-btn { padding: 0 8px 0 4px; } }

/* CODEXCHATHOME1001 — ПК: чат только на главной. data-home уже ставит markBack().
   Внутренним разделам отдаём всю ширину; выбор «свёрнут» на главной хранит прежний store.
   Шторка, телефон и обработчики чата остаются под управлением существующего ядра. */
@media (min-width: 1200px) {
  html:not([data-home]) .shell__aside { display: none; }
  html:not([data-home]) .shell__main > .page,
  html:not([data-home]) .shell__main > .footer { left: 0; }
}

/* PCFIX1001 */
/* Internal desktop pages use the same outer gutters as the header. */
@media (min-width: 1024px) {
  html:not([data-home]):not([data-route="login"]) .app:not(.app--game) .shell__main > :is(.page, .footer) {
    max-width: none;
  }
}
/* PCFIX1001 END */

/* SITEQA-C1001: 1 — readable sticky phone header; 25 — profile menu. */
@media (max-width: 767.98px) {
  .topbar {
    background: var(--bg, #191D2E);
    -webkit-backdrop-filter: saturate(1.6) blur(20px);
    backdrop-filter: saturate(1.6) blur(20px);
    border-bottom: 1px solid var(--line);
  }
  .topbar::before { display: none; }
}
.menu--profile .pmenu__head {
  display: grid; grid-template-columns: 44px minmax(0, 1fr);
  column-gap: 12px; row-gap: 4px;
}
.menu--profile .pmenu__head > .avatar { grid-column: 1; grid-row: 1 / span 3; align-self: center; }
.menu--profile .pmenu__who { display: contents; }
.menu--profile .pmenu__name {
  grid-column: 2; grid-row: 1; white-space: normal;
  overflow: visible; text-overflow: clip; overflow-wrap: anywhere;
}
.menu--profile .pmenu__bal { grid-column: 2; grid-row: 2; }
.menu--profile .pmenu__lvl { grid-column: 2; grid-row: 3; }
/* /SITEQA-C1001 */

/* HEADERPC1002 — шапка и колонка чата на ПК (от 1280 px): крупнее и ровно. Шапка 72 px (через --header-h, по ней считаются
   чат и поле игр), лого 131×48, значки меню одного размера 36 px, подписи 15 px; поиск, баланс, «Пополнить» и аватар — по
   48 px. Чат: текст сообщений 15 px, имена 14 px, заголовок 18 px. Телефонная шапка и нижнее меню не тронуты. */
@media (min-width: 1280px) {
  :root { --header-h: 72px; }
  html body .topbar .topbar__logo img { width: 131px; height: 48px; }
  html body .topbar .topnav { gap: 4px; }
  html body .topbar .topnav__link { height: 52px; padding: 0 14px; gap: 8px; }
  html body .topbar .topnav__label { font-size: 15px; }
  html body .topbar .topnav__link .nav-ico { width: 36px; height: 36px; margin: 0; }
  html body .topbar .topbar__search { width: 48px; height: 48px; }
  html body .topbar .topbar__search .nav-ico { width: 26px; height: 26px; }
  html body .topbar .balance-btn { height: 48px; font-size: 16px; }
  html body .topbar .topbar__topup { height: 48px; padding: 0 22px; font-size: 16px; }
  html body .topbar .topbar__avatar .avatar { width: 48px; height: 48px; font-size: 18px; }
  .chat .chat__title { font-size: 18px; }
  .chat .chat-msg__meta { font-size: 14px; }
  .chat .chat-msg__text { font-size: 15px; }
  .chat .chat__pinned p { font-size: 14px; }
}
/* /HEADERPC1002 */

/* >>> MINI1002-wallet-header: плавный край телефонной шапки.
   Фон, высота и кнопки прежние; исчезает только разделительная линия.
   Затухание отдельной подложки не обрезает кнопки и меню шапки. */
@media (max-width: 767.98px) {
  html .topbar { border-bottom-color: transparent; }
  html .topbar::after {
    top: 100%; bottom: auto; height: 24px;
    background: linear-gradient(180deg, var(--bg, #191D2E), transparent);
    -webkit-backdrop-filter: blur(18px); backdrop-filter: blur(18px);
    -webkit-mask-image: linear-gradient(180deg, #000, transparent);
    mask-image: linear-gradient(180deg, #000, transparent);
    animation: none;
    pointer-events: none;
  }
}
/* <<< MINI1002-wallet-header */

/* MINI1002-footer: документы по центру, нижняя строка на одной линии; только телефон. */
.footer__support > .footer__tg-ico { display:none; }
@media (max-width:767.98px) {
  .footer .footer__inner { display:grid; grid-template-columns:auto auto minmax(0,1fr);
    grid-template-areas:"docs docs docs" "age copy support"; align-items:center; gap:10px 8px; padding:14px 0; }
  .footer .footer__docs { grid-area:docs; order:0; justify-content:center; flex-wrap:nowrap; gap:0; }
  .footer .footer__link { min-height:44px; font-size:12.5px; text-align:center; }
  .footer .footer__link + .footer__link::before { content:"·"; margin-inline:8px; color:var(--text-3); }
  .footer .age-mark--quiet { grid-area:age; order:0; }
  .footer .footer__copy { grid-area:copy; order:0; justify-self:start; font-size:12.5px; }
  .footer .footer__support { grid-area:support; order:0; justify-self:end; margin:0; gap:8px;
    min-height:44px; padding:0 12px; border:1px solid var(--s-line-hi); border-radius:12px;
    background:var(--s2); color:var(--text-2); font-size:13px; }
  .footer .footer__support > .footer__tg-ico { display:block; flex:none; width:18px; height:18px; }
  .footer .footer__tg.footer__tg--quiet { display:none; }
}

/* N2-chat-3: шапка мини-аппа — прежний цвет кнопки без свечения при наведении. */
@media (max-width: 1023.98px) {
  .topbar .topbar__topup:hover:not(:disabled) {
    background: var(--grad-deposit);
    box-shadow: var(--deposit-edge);
  }
}

/* LEGAL1002 — подвал на телефоне без мелкого текста: ссылки «Правила / Конфиденциальность / Честная игра», «Поддержка»
   и «© RubUP» — 14 px, «18+» — 13 px. ПК не тронут. */
@media (max-width: 767.98px) {
  html body .footer :is(.footer__link, .footer__support, .footer__copy) { font-size: 14px; }
  html body .footer .age-mark { font-size: 13px; }
}
/* /LEGAL1002 */

/* BONUSTAB1005 (владелец 05.10): «Профиль» ушёл из нижней панели — на телефоне он открывается аватаркой справа в шапке
   (нажатие сразу ведёт в профиль, без меню). Аватар 36 px, медаль уровня меньше; не влезает — ужимается логотип (--logo-min). */
@media (max-width: 1023.98px) {
  .topbar .profile-wrap { display: flex; align-items: center; }
  .topbar .topbar__avatar { display: inline-flex; }
  .topbar .topbar__avatar .avatar { width: 36px; height: 36px; font-size: 14px; }
  .topbar .topbar__avatar-lvl { right: -5px; bottom: -5px; transform: scale(.8); transform-origin: 100% 100%; }
}
@media (max-width: 767.98px) {
  .topbar .profile-wrap { display: flex; }
  .topbar { --logo-min: 44px; }
  .topbar__actions { gap: 6px; }
}

/* BONUSTAB1006 (аудит): счетчик новых бонусов за пополнение на вкладке «Бонусы» (раньше — на кнопке в профиле) */
.nav-bonus-badge {
  position: absolute; top: 2px; right: 4px; z-index: 2; pointer-events: none;
  min-width: 17px; height: 17px; padding: 0 5px; border-radius: 999px;
  background: linear-gradient(135deg, #ff5f6d, #ff2e55); color: #fff; font-size: 10.5px; font-weight: 800; line-height: 17px; text-align: center;
  box-shadow: 0 0 0 2px var(--bg, #141a2b), 0 0 10px rgba(255, 46, 85, .55);
}
.nav-bonus-badge[hidden] { display: none; }
.tabbar__link .nav-bonus-badge { top: -3px; right: 2px; }
/* BONUSTAB1006 (аудит): шесть пунктов меню (Бонусы + Турниры) не влезали на 1280–1439 — шапка шире экрана, аватарка срезана */
@media (min-width: 1024px) and (max-width: 1439.98px) {
  .topnav { padding-left: 6px; gap: 0; }
  .topnav__link { padding: 0 7px; gap: 6px; }
  .topnav__link .nav-ico { width: 28px; height: 28px; }
  .topnav__link .ico-games { width: 32px; height: 32px; }
  .topbar__actions { gap: 6px; }
}
/* …и в диапазоне HEADERPC1002 (от 1280 px его правила сильнее — html body .topbar …): там же ужимаем до 1440 */
@media (min-width: 1280px) and (max-width: 1439.98px) {
  html body .topbar .topnav { gap: 0; padding-left: 6px; }
  html body .topbar .topnav__link { padding: 0 8px; gap: 6px; }
  html body .topbar .topnav__label { font-size: 14px; }
  html body .topbar .topnav__link .nav-ico { width: 30px; height: 30px; }
}
