/* ZAPlayGuide - стилі публічного сайту.
   Пишемо mobile-first: базові правила = телефон, десктоп додається медіа-
   запитом. Android це 85%+ мобільного трафіку ZA, і саме він має отримувати
   найкоротший шлях до першого екрана, без перевизначень. */

/* ШРИФТИ З НАШОГО Ж ДОМЕНУ (SEO-аудит, крок 5).
   Syne і Manrope - змінні шрифти: один файл на гарнітуру покриває всі
   накреслення, тож замість сімох файлів з Google - два наших. Лише
   латиниця: сайт англійською. Шлях відносний (від site.css), щоб
   працював і на домені, і в статичному знімку. swap: текст видно одразу
   системним шрифтом, і він підміняється, щойно файл доїде. Ліцензія OFL,
   тексти ліцензій лежать поруч, у static/fonts/. */
@font-face {
  font-family: 'Syne'; font-style: normal; font-weight: 400 800;
  font-display: swap; src: url('fonts/syne-latin.woff2') format('woff2');
}
@font-face {
  font-family: 'Manrope'; font-style: normal; font-weight: 200 800;
  font-display: swap; src: url('fonts/manrope-latin.woff2') format('woff2');
}

:root {
  /* Палітра з CLAUDE.md */
  --ground: #f4f2ea;
  --ink: #15201a;
  --green: #1d6b46;
  --green-dark: #134a30;
  --accent: #e3b23c;
  --muted: #58645c;
  --card: #ffffff;
  /* Похідні відтінки з макета */
  --band: #e6e2d3;
  --ink-dim: #4a5a50;
  --body-text: #3a4a40;
  --hairline: #ebe8dc;
  --chip-green-bg: #d9eadd;
  --on-dark: #b9c3bc;

  /* КОЛІР ЗА ТИПОМ ГРИ.
     Сітка з чотирнадцяти однакових плиток не читається: око не має за що
     зачепитись, і всі ігри зливаються в одну. Тип - найсильніша ознака,
     за якою гравець обирає (crash і слот це різні заняття), тож саме він
     і отримує колір. Пари підібрані так, щоб текст на плашці лишався
     контрастним, а жодна з них не сперечалась із золотою кнопкою Play:
     вона має бути найяскравішим, що є на екрані. */
  --crash-bg: #fde4d8;   --crash-ink: #9c3d16;
  --slot-bg: #e8e0fb;    --slot-ink: #55349b;
  --table-bg: #d9e8f5;   --table-ink: #1f5478;
  --lottery-bg: #d5efe9; --lottery-ink: #14675a;

  /* Тони міток. Ті самі шість, що в app/rules.py GAME_MARKERS. */
  --tone-gold-bg: #fbeccb;   --tone-gold-ink: #7d5606;
  --tone-green-bg: #d9eadd;  --tone-green-ink: #145236;
  --tone-blue-bg: #d9e8f5;   --tone-blue-ink: #1f5478;
  --tone-red-bg: #fbdcd8;    --tone-red-ink: #93301f;
  --tone-teal-bg: #d5efe9;   --tone-teal-ink: #14675a;
  --tone-purple-bg: #e8e0fb; --tone-purple-ink: #55349b;

  --font-display: 'Syne', system-ui, sans-serif;
  --font-body: 'Manrope', system-ui, sans-serif;

  --gutter: 16px;
  --radius: 12px;
  --radius-lg: 14px;
}

*, *::before, *::after { box-sizing: border-box; }

body {
  margin: 0;
  font-family: var(--font-body);
  background: var(--ground);
  color: var(--ink);
  font-size: 16px;
  line-height: 1.55;
  /* Цифри однієї висоти. Syne за замовчуванням малює "старі" цифри: 1 і 2
     заввишки з малу літеру, 3-9 звисають нижче рядка, і номер 1 у рейтингу
     читався як прапорець (перевірка на телефоні, 26.09.2026). */
  font-variant-numeric: lining-nums;
  /* Футер унизу екрана і на короткій сторінці (404, /payments/, /terms/ на
     високому моніторі): під ним лишалась бежева смуга до 390 px, а між
     футером і нижньою панеллю - порожнеча. Росте <main>, а не відступи. */
  display: flex; flex-direction: column; min-height: 100vh; min-height: 100dvh;
}
body > main { flex: 1 0 auto; }
/* Обгортка банера над футером - прямий нащадок <body>: у колонці flex її
   margin-inline: auto стискав би її до ширини вмісту. */
body > .wrap { width: 100%; }
/* 404: уся сторінка - темна смуга, до самого футера (на високому екрані
   під нею лишалось 72-390 px бежевого і 32 px смужки над футером). */
.main--band { display: flex; flex-direction: column; }
.main--band > .hero-band { flex: 1 0 auto; }
body:has(> .main--band) > .site-footer { margin-top: 0; }
/* Місце під липку нижню панель, щоб вона не накривала футер: її висота
   (10 + 52 + 10 і смуга iPhone) мінус 1 px. Було 76 на всіх сторінках: між
   футером і панеллю світлішала смужка 4 px, а на сторінках без панелі
   (trust, 404) під футером лишалась порожня бежева смуга 76 px. Рівно 72
   лишало світлу лінію в 1 фізичний піксель на екранах з дробовим
   масштабом (2.625, 2.75 - більшість Android): краї футера і панелі
   згладжувались на тлі сторінки. 1 px заходу панелі на футер її ховає. */
body:has(.sticky-cta) { padding-bottom: calc(71px + env(safe-area-inset-bottom, 0px)); }

a { color: var(--green); text-decoration: none; }
a:hover { color: var(--green-dark); }

img { max-width: 100%; height: auto; }

h1, h2, h3 { font-family: var(--font-display); letter-spacing: -0.02em; margin: 0; }
/* На 390px заголовок у 30px займає чотири рядки і сам собою витісняє
   кадр гри за межі першого екрана. 25px читається так само, а екран
   лишається під те, заради чого людина прийшла. */
h1 { font-weight: 800; font-size: 25px; line-height: 1.15; text-wrap: balance; }
h2 { font-weight: 700; font-size: 23px; letter-spacing: -0.01em; }
h2, h3 { text-wrap: pretty; }
h3 { font-weight: 700; font-size: 18px; }

p { margin: 0; color: var(--body-text); }

.wrap { padding-inline: var(--gutter); }
.stack { display: flex; flex-direction: column; }
.gap-8 { gap: 8px; } .gap-12 { gap: 12px; } .gap-16 { gap: 16px; }
.gap-20 { gap: 20px; } .gap-28 { gap: 28px; }

/* ШАПКА. Закріплена вгорі (вимога власника: навігація завжди під рукою).
   sticky, а не fixed: шапка лишається в потоці сторінки, тож під неї не
   треба підкладати відступ, який розійшовся б з її висотою на різних
   екранах, і нічого не стрибає, коли вона стає "липкою". Смуга розкриття
   під нею прокручується: вона потрібна до контенту, а не над ним завжди. */
:root { --header-h: 56px; }
.site-header {
  background: var(--ink); color: var(--ground);
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; padding: 6px var(--gutter); min-height: var(--header-h);
  position: sticky; top: 0; z-index: 40;
  box-shadow: 0 1px 0 rgba(244, 242, 234, 0.06);
}
/* Якорі змісту ("On this page") не мають ховатись під шапкою. */
html { scroll-padding-top: calc(var(--header-h) + 12px); }
[id] { scroll-margin-top: calc(var(--header-h) + 12px); }
.logo { font-family: var(--font-display); font-weight: 800; font-size: 17px; color: var(--ground); }
.logo span { color: var(--accent); }
.site-nav { display: none; gap: 20px; font-size: 14px; font-weight: 600; }
.site-nav a { color: var(--ground); }
.site-nav a[aria-current] { color: var(--accent); }

/* МЕНЮ НА ТЕЛЕФОНІ (SEO-аудит, крок 5)
   details/summary: відкривається браузером, без JavaScript. Панель
   лягає поверх сторінки під шапкою на всю ширину, пункти заввишки 52px -
   більше за мінімальні 48, бо в них цілять великим пальцем на ходу. */
.menu > summary {
  list-style: none; cursor: pointer; user-select: none;
  display: inline-flex; align-items: center; gap: 6px;
  min-height: 44px; padding: 0 10px;
  border: 1px solid var(--ink-dim); border-radius: 10px;
  color: var(--ground); font-weight: 700; font-size: 14px;
}
.menu > summary::-webkit-details-marker { display: none; }
/* На 320 px (малі телефони, або 360 px з великим масштабом екрана) лого і
   Menu не вміщались, і вся сторінка гортались убік. Звичні розміри - з 360. */
@media (min-width: 360px) {
  .logo { font-size: 20px; }
  .menu > summary { gap: 9px; padding: 0 14px; }
}
.menu > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.menu__icon {
  width: 16px; height: 12px; flex: none;
  background:
    linear-gradient(currentColor 0 0) top / 100% 2px no-repeat,
    linear-gradient(currentColor 0 0) center / 100% 2px no-repeat,
    linear-gradient(currentColor 0 0) bottom / 100% 2px no-repeat;
}
.menu__close { display: none; }
.menu[open] .menu__open { display: none; }
.menu[open] .menu__close { display: inline; }
.menu[open] > summary { border-color: var(--accent); }
.menu__panel {
  position: absolute; left: 0; right: 0; top: 100%; z-index: 30;
  background: var(--ink); border-top: 1px solid var(--ink-dim);
  padding: 4px var(--gutter) 14px;
  display: flex; flex-direction: column;
  box-shadow: 0 14px 28px rgba(21, 32, 26, 0.3);
  /* Шапка закріплена, тож панель теж: довге меню на низькому екрані
     прокручується всередині себе, а не з'їжджає за край. */
  max-height: calc(100vh - var(--header-h)); overflow-y: auto;
}
.menu__panel a {
  color: var(--ground); font-family: var(--font-display);
  font-weight: 700; font-size: 18px;
  min-height: 52px; display: flex; align-items: center;
  border-bottom: 1px solid rgba(244, 242, 234, 0.08);
}
.menu__panel a:last-child { border-bottom: 0; }
.menu__panel a[aria-current] { color: var(--accent); }

/* СМУГА РОЗКРИТТЯ. Вимога trust-шару: видно до контенту, не в футері. */
.disclosure {
  background: var(--band); color: var(--ink-dim);
  font-size: 12px; line-height: 1.4;
  padding: 8px var(--gutter);
  display: flex; flex-wrap: wrap; gap: 6px;
}
.disclosure a { font-weight: 600; }

/* ХЛІБНІ КРИХТИ */
.breadcrumb { font-size: 13px; color: var(--muted); display: flex; flex-wrap: wrap; gap: 6px; }
.breadcrumb .current { color: var(--ink); font-weight: 600; }

/* ЧІПИ */
.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip {
  font-size: 12px; font-weight: 700; padding: 6px 10px;
  border-radius: 999px; background: var(--band); color: var(--ink-dim);
  text-transform: uppercase; letter-spacing: 0.02em;
}
.chip--game { background: var(--chip-green-bg); color: var(--green); }
/* Ярлик-посилання на сторінці гри: тип і провайдер ведуть у свої категорії. */
a.chip { text-decoration: none; }
a.chip:hover, a.chip:focus-visible { text-decoration: underline; }

/* КАТЕГОРІЇ ІГОР (app/categories.py, partials/game_categories.html).
   Два рядки: за типом і за провайдером. Кнопки не нижчі за 40px, щоб у
   них влучав палець; поточна категорія - темна, як пункт меню в шапці. */
.cat-nav { display: grid; gap: 10px; }
.cat-nav__row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.cat-nav__label {
  font-size: 12px; font-weight: 700; color: var(--muted);
  text-transform: uppercase; letter-spacing: .04em; min-width: 92px;
}
.cat-link {
  display: inline-flex; align-items: center; gap: 7px; min-height: 40px; padding: 6px 14px;
  border-radius: 999px; border: 1px solid var(--hairline); background: var(--card);
  color: var(--ink); font-size: 14px; font-weight: 600; text-decoration: none;
}
.cat-link:hover { border-color: var(--ink-dim); }
.cat-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.cat-link[aria-current] { background: var(--ink); border-color: var(--ink); color: var(--ground); }
.cat-link__count { font-size: 12px; font-weight: 700; color: var(--muted); }
.cat-link[aria-current] .cat-link__count { color: var(--accent); }
.cat-link__dot { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.cat-link__dot--crash   { background: var(--crash-ink); }
.cat-link__dot--slot    { background: var(--slot-ink); }
.cat-link__dot--table   { background: var(--table-ink); }
.cat-link__dot--lottery { background: var(--lottery-ink); }
@media (max-width: 560px) {
  .cat-nav__label { flex-basis: 100%; }
}
/* Де підпис стоїть у рядку з кнопками, перенесені кнопки починаються під
   першою кнопкою, а не під підписом "BY TYPE" (100 = 92 підпису + 8). */
@media (min-width: 561px) {
  .cat-nav > .cat-nav__row { padding-left: 100px; }
  .cat-nav > .cat-nav__row > .cat-nav__label { margin-left: -100px; }
}

/* КНОПКИ */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  height: 52px; padding: 0 22px; border-radius: 10px;
  font-weight: 800; font-size: 16px; border: 2px solid transparent;
  /* <button> не бере шрифт сторінки сам ("Send" на /contact/ був Arial), а
     напис у два рядки стояв зліва з міжрядком тексту, впритул до країв. */
  font-family: inherit; text-align: center; line-height: 1.2;
}
.btn--play { background: var(--accent); color: var(--ink); }
.btn--play:hover { color: var(--ink); }
.btn--app { background: var(--card); border-color: var(--ink); color: var(--ink); }
.btn--app:hover { color: var(--ink); }
.btn--sm { height: 44px; padding: 0 16px; font-size: 14px; width: 100%; }
.btn--dark { background: var(--ink); color: var(--ground); }
.btn--dark:hover { color: var(--ground); }

.cta-row { display: flex; flex-wrap: wrap; gap: 10px; }
/* Дві кнопки діляться рядом, поки обидва написи вміщаються; інакше друга
   переходить на свій рядок. На 360 px "Full Sweet Bonanza guide" ставав
   трьома рядками в кнопці 52 px і вилазив за її рамку. */
.cta-row .btn { flex: 1 1 0; min-width: fit-content; padding-inline: 16px; }

.byline { font-size: 13px; color: var(--muted); display: flex; flex-wrap: wrap; gap: 8px; }

/* МЕДІА-ЗАГЛУШКА І ШВИДКІ ФАКТИ */
.hero-media {
  border-radius: var(--radius-lg); background: var(--ink); color: var(--on-dark);
  border: 1px dashed var(--ink-dim);
  min-height: 180px; display: flex; align-items: center; justify-content: center;
  font-size: 13px; text-align: center; padding: 16px;
}
.quick-facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
.quick-facts div {
  background: var(--card); border-radius: 10px; padding: 12px;
  display: flex; flex-direction: column; gap: 4px;
}
.quick-facts .label { font-size: 12px; color: var(--muted); }
.quick-facts .value {
  font-family: var(--font-display); font-weight: 700; font-size: 17px;
  /* Довгі значення (і плейсхолдери на кшталт [MAX MULTIPLIER]) мусять
     переноситись, а не вилазити за картку: ширина колонки тут фіксована. */
  overflow-wrap: anywhere; line-height: 1.2;
}
/* Довге значення (діапазон RTP "... depending on the bet") дрібніше, щоб
   слова вміщались цілими: у плитці на телефоні близько 90 px тексту. */
.quick-facts .value--long { font-size: 14px; }

/* РЕЙТИНГ ОПЕРАТОРІВ */
.rank-list { display: flex; flex-direction: column; gap: 10px; }
.rank-card {
  background: var(--card); border-radius: var(--radius); padding: 14px 16px;
  display: grid; gap: 10px;
  /* 42px, а не 28: двозначний номер (10-28) у шрифті Syne 800 на 19px має
     до 40px і вилазив за колонку (перевірка верстки, 25.09.2026). */
  grid-template-columns: 42px minmax(0, 1fr);
  grid-template-areas: "pos brand" "info info" "meta meta" "cta cta";
  align-items: center;
  border: 2px solid transparent;
}
.rank-card--top { border-color: var(--accent); }
.rank-card .pos { grid-area: pos; font-family: var(--font-display); font-weight: 800; font-size: 19px; color: var(--muted); }
.rank-card .brand { grid-area: brand; display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 15px; }
.rank-card .logo-box { width: 36px; height: 36px; border-radius: 8px; background: var(--band); flex: none; object-fit: contain; }
.rank-card .info { grid-area: info; display: flex; flex-direction: column; gap: 2px; }
.rank-card .bonus { font-size: 14px; font-weight: 600; }
.rank-card .terms { font-size: 12px; color: var(--muted); }
/* Рядок "чому саме він": ліміти ставок або ексклюзив у цього оператора.
   Дрібніший за офер навмисно - це уточнення, а не головна обіцянка. */
.rank-card .op-note { display: block; font-size: 12px; color: var(--muted); margin-top: 3px; }
.rank-card .meta { grid-area: meta; font-size: 12px; color: var(--ink-dim); }
.rank-card .cta { grid-area: cta; }

/* Розкладка картки залежить від ширини самого списку, а не екрана. На
   сторінці гри поруч стоїть бокова панель, і на ноутбуці з екраном 1280 px
   список має лише ~820 px. Коли п'ять колонок ставились за шириною екрана,
   колонці бонусу лишалось ~90 px: кілька слів у рядку, картка 530 px
   заввишки (при 1024 px - понад 1000). Знайшла це теплова карта, вересень
   2026. Тепер: до 520 px - картка стовпчиком, як на телефоні; далі кнопка
   переходить праворуч від назви; з 780 px - бонус і ліцензія поруч; п'ять
   колонок - лише коли для них справді є місце. Старий браузер без
   container queries отримує картку стовпчиком - довгу, але цілу. */
.rank-list { container-type: inline-size; }
@container (min-width: 520px) {
  .rank-card {
    grid-template-columns: 42px minmax(0, 1fr) 140px;
    /* Номер лише в першому ряду, поруч з назвою: коли він займав усі ряди,
       то стояв посередині картки, до 119 px нижче назви (26.09.2026). */
    grid-template-areas: "pos brand cta" ". info info" ". meta meta";
    padding: 16px 18px; gap: 10px 16px;
  }
}
@container (min-width: 780px) {
  .rank-card {
    grid-template-columns: 42px minmax(0, 1.25fr) minmax(0, 1fr) 140px;
    grid-template-areas: "pos brand brand cta" ". info meta cta";
  }
}
@container (min-width: 960px) {
  .rank-card {
    /* Колонка бренду тримає лого, назву і пігулку оцінки. На 180px назва
       з двох слів ламалась на два рядки, і рядок починав стрибати; на 250px
       "World Sports Betting" обрізалась трикрапкою (перевірка верстки,
       25.09.2026), тож 290. */
    grid-template-columns: 42px 290px minmax(0, 1fr) 210px 140px;
    grid-template-areas: "pos brand info meta cta";
    padding: 16px 20px; gap: 16px;
  }
}

/* Позначка для офшорних брендів. Ставиться кодом, не редактором:
   див. app/rules.py. */
.offshore-note {
  background: var(--band); border-left: 3px solid var(--muted);
  padding: 12px 14px; border-radius: 8px; font-size: 13px; color: var(--ink-dim);
}

/* БЛОКИ ТЕКСТУ */
.block { display: flex; flex-direction: column; gap: 12px; }
.block p + p { margin-top: 4px; }
.prose ul { margin: 0; padding-left: 20px; color: var(--body-text); }
.prose li + li { margin-top: 6px; }

.callout {
  background: #fdf6e3; border-left: 4px solid var(--accent);
  padding: 14px 16px; border-radius: 8px;
}
.callout h3 { margin-bottom: 8px; }
/* Абзаци в колауті стояли за 4 px один від одного і читались одним: 4 px -
   це доплата до проміжку 12 px секції, а колаут - звичайний блок без нього. */
.callout p + p { margin-top: 16px; }

/* КАРТКА ФАКТІВ І БІЧНА КОЛОНКА */
.card {
  background: var(--card); border-radius: var(--radius-lg); padding: 18px;
  display: flex; flex-direction: column; gap: 12px;
}
.card-title { font-family: var(--font-display); font-weight: 700; font-size: 16px; }
.facts { display: flex; flex-direction: column; font-size: 13px; }
.facts .row { display: flex; justify-content: space-between; gap: 12px; padding: 9px 0; border-bottom: 1px solid var(--hairline); }
.facts .row:last-child { border-bottom: none; }
.facts .k { color: var(--muted); }
.facts .v { font-weight: 600; text-align: right; }

.toc { display: flex; flex-direction: column; gap: 8px; font-size: 14px; }

/* FAQ. Перший відкритий - решта згорнуті, але всі в HTML: пошуковик
   бачить відповіді незалежно від того, розгорнув їх користувач чи ні. */
.faq details {
  background: var(--card); border-radius: 10px; padding: 0 14px;
}
.faq details + details { margin-top: 8px; }
/* Питання - уся біла картка, не лише рядок тексту, і плюс/мінус, як у
   "On this page" і "Studios". З рідним трикутником другий рядок довгого
   питання починався під трикутником, а не під текстом. */
.faq summary {
  list-style: none; display: flex; align-items: center; gap: 12px;
  min-height: 44px; padding: 10px 0;
  font-weight: 700; cursor: pointer; font-size: 15px;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after { content: "+"; margin-left: auto; font-size: 22px; line-height: 1; color: var(--green); flex: none; }
.faq details[open] > summary::after { content: "\2212"; }
.faq details p { padding-bottom: 12px; font-size: 14px; }

/* ЛИПКА ПАНЕЛЬ CTA НА МОБІЛЬНОМУ */
.sticky-cta {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 20;
  background: var(--ink); padding: 10px var(--gutter);
  display: flex; gap: 8px; align-items: center;
  box-shadow: 0 -2px 12px rgba(21, 32, 26, 0.18);
}
/* 52px, як основна кнопка вгорі сторінки (власник, 25.09.2026: "різний розмір
   кнопок"): було 48 тут, 52 угорі на телефоні і 56 на десктопі. */
.sticky-cta .btn { flex: 1 1 auto; height: 52px; font-size: 16px; }
.sticky-cta .btn--app, .sticky-cta .btn--dark { background: transparent; border-color: var(--on-dark); color: var(--ground); }

/* ФУТЕР */
.site-footer {
  background: var(--ink); color: var(--on-dark);
  padding: 28px var(--gutter); margin-top: 32px;
  display: flex; flex-direction: column; gap: 18px; font-size: 13px;
}
.site-footer a { color: var(--ground); }
.footer-links { display: flex; flex-wrap: wrap; gap: 10px 18px; }
.rg-note { border-top: 1px solid var(--ink-dim); padding-top: 16px; line-height: 1.6; }
.rg-note strong { color: var(--ground); }
/* Номер гарячої лінії і номери ліцензій не розриваються між рядками
   (rules.helpline_link, rules.keep_numbers). */
.nowrap, .rg-note strong { white-space: nowrap; }
.rg-note a[href^="tel:"] { color: var(--ground); }

/* Колонка тексту і бічна панель. До 900 px вони стоять одна під одною, і без
   проміжку остання картка тексту (FAQ, список казино, кнопка форми) торкалась
   першої картки панелі (скрін власника, 26.09.2026). З 900 px - сітка, нижче. */
.body-grid { display: flex; flex-direction: column; gap: 28px; }
/* Зміст у бічній панелі - лише з 900 px, де панель поруч з текстом. Нижче вона
   стоїть після всього тексту, а той самий зміст, згорнутий, уже є під смугою
   (partials/toc_mobile.html): внизу, після FAQ, він лише повторював верх.
   Панель без нічого, крім змісту (або порожня), ховається цілком, щоб
   проміжок не лишав дірки внизу сторінки. */
.toc-card { display: none; }
.body-grid > .sidebar:not(:has(> :not(.toc-card))) { display: none; }
.body-grid > .sidebar--landing { display: none; }

/* Перший екран: текст смуги і картка (кадр гри, "At a glance") під ним. До
   900 px проміжку не було зовсім, і рядок "Reviewed by" лежав на верхньому
   краї картки (перевірка на телефоні, 26.09.2026). */
.hero { display: flex; flex-direction: column; gap: 24px; }

/* ДЕСКТОП */
@media (min-width: 900px) {
  :root { --gutter: 48px; }
  h1 { font-size: 44px; line-height: 1.05; }
  h2 { font-size: 28px; }
  :root { --header-h: 64px; }
  .site-nav { display: flex; }
  .menu { display: none; }
  .hero { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 40px; align-items: start; }
  .hero-media { min-height: 300px; }
  .quick-facts .value { font-size: 20px; }
  .quick-facts .value--long { font-size: 16px; }
  .body-grid { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 40px; align-items: start; }
  /* Панель, вища за екран, ховала нижні картки (гайди, "Compare it",
     "More ...") до кінця статті: на Aviator 1634 px при екрані 800. Тепер
     вона не вища за екран і гортається сама (повторна перевірка, 26.09.2026). */
  .sidebar {
    position: sticky; top: calc(var(--header-h) + 20px);
    max-height: calc(100vh - var(--header-h) - 100px); overflow-y: auto;
    scrollbar-width: thin;
  }
  /* Інакше колонка flex стискала б картки, а не гортала панель. */
  .sidebar > * { flex-shrink: 0; }
  .toc-card { display: flex; }
  .body-grid > .sidebar:has(> .toc-card) { display: flex; }
  .body-grid > .sidebar--landing { display: flex; }
  .cta-row .btn { flex: 0 0 auto; height: 52px; padding: 0 28px; font-size: 16px; }
  .rank-card .btn--sm { width: auto; padding: 0 20px; }
  .sticky-cta { display: none; }
}

/* КАРТКИ ІГОР (головна, хаб, сторінка оператора) */
.game-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 12px; }
.game-card {
  background: var(--card); border-radius: var(--radius); padding: 16px;
  display: flex; flex-direction: column; gap: 8px;
  /* stretch, а не flex-start: інакше тіло картки має ширину свого
     вмісту, і пігулка оцінки притискається не до краю картки, а до
     кінця найдовшого рядка. */
  align-items: stretch;
  color: var(--ink); border: 2px solid transparent;
}
.game-card__name { font-family: var(--font-display); font-weight: 700; font-size: 19px; }
.game-card__meta { font-size: 12px; color: var(--muted); }

.chip--offshore { background: #f3e2c8; color: #8a5a10; }

/* ТАБЛИЦІ В КОНТЕНТІ
   Горизонтальна прокрутка обгорткою, а не самою таблицею: на 390px
   таблиця з пʼяти колонок інакше розсуває всю сторінку. */
.table-wrap {
  overflow-x: auto; -webkit-overflow-scrolling: touch; border-radius: var(--radius);
  /* Тінь біля краю, за яким таблиця ще триває: колонка, обрізана краєм
     телефона посеред слова ("97.10% o", "1 to 5 business d"), читалась як
     ціле значення (повторна перевірка, 26.09.2026). Без JavaScript: білі
     "кришки" їдуть разом з таблицею (local) і ховають тінь, коли дійшли до
     краю; таблиця, що вміщається, тіні не має взагалі. Фон картки тому
     на обгортці, а не на таблиці. */
  background:
    linear-gradient(to right, var(--card) 30%, rgba(255, 255, 255, 0)) left center / 40px 100% no-repeat local,
    linear-gradient(to left, var(--card) 30%, rgba(255, 255, 255, 0)) right center / 40px 100% no-repeat local,
    radial-gradient(farthest-side at 0 50%, rgba(21, 32, 26, .3), rgba(21, 32, 26, 0)) left center / 16px 100% no-repeat scroll,
    radial-gradient(farthest-side at 100% 50%, rgba(21, 32, 26, .3), rgba(21, 32, 26, 0)) right center / 16px 100% no-repeat scroll,
    var(--card);
}
.data-table {
  width: 100%; border-collapse: collapse; background: transparent;
  font-size: 13px; min-width: 460px;
}
/* На телефоні 13 px і 8 px з боків: чотири колонки по 28 px полів - це 112 px
   із 328, і таблиці на 4 колонки з одним довгим словом у кожній
   ("Visa/Mastercard", "DRAWBACK") виходили за край на 7-35 px на 360. */
.data-table th, .data-table td { text-align: left; padding: 10px 8px; border-bottom: 1px solid var(--hairline); }
@media (min-width: 480px) {
  .data-table { font-size: 14px; }
  .data-table th, .data-table td { padding: 11px 14px; }
}
.data-table th { font-size: 12px; text-transform: uppercase; letter-spacing: .03em; color: var(--muted); }
.data-table tbody tr:last-child td { border-bottom: none; }
/* 460 px потрібні таблиці з 5+ колонок. Таблиця на 2-4 колонки вміщається в
   телефон і без них, а з ними гортається вбік, і за краєм лишалась саме
   колонка з рандами ("AT A R2 STAKE" показувало лише "R", 26.09.2026). */
.data-table:not(:has(tr > :nth-child(5))) { min-width: 0; }
/* ...крім таблиці на 4 колонки з реченнями в клітинках (blocks/table.html):
   вона гортається, як широка, з підказкою над нею. */
table.data-table.data-table--wide { min-width: 460px; }
/* Довгий текст у вузькій колонці (RTP "about 86%, 92%... set by the operator",
   строк виплати) ставав стовпчиком з 1-2 слів, і рядок - утричі вищим за
   сусідів. Таблиця все одно гортається, тож колонка може бути ширшою. */
.data-table .data-table__long { min-width: 190px; }
/* Мініатюра гри в таблиці всіх ігор (/games/, 27.09.2026): та сама картка,
   що в сітці, зменшена (app/images.py, THUMB_BOX 160x78). Картинка і назва -
   одне посилання, тож і торкатись можна будь-куди в клітинці.
   Ширина мініатюри жорстка: max-width: none і min-width. Картинку з max-width
   у відсотках (загальне img { max-width: 100% }) Safari не рахує в мінімальну
   ширину колонки, і на iPhone колонка стискалась, а назва наїжджала на оцінку
   (знімок власника, 27.09.2026; усі браузери на iPhone - WebKit). Відступ -
   маржею, а не gap: старіші Safari gap у flex не знають. */
.game-row { display: inline-flex; align-items: center; vertical-align: middle; }
.game-row__thumb {
  flex: none; width: 64px; min-width: 64px; max-width: none; height: auto;
  aspect-ratio: 160 / 78; margin-right: 10px;
  border-radius: 6px; background: var(--ink); object-fit: cover;
}
@media (min-width: 480px) { .game-row__thumb { width: 80px; min-width: 80px; } }

/* Таблиця бонусів на вузькому: кожен рядок - картка. Назва і кнопка вгорі,
   під ними офер, умови і ліцензія; заголовки таблиці лишаються для читалок
   екрана. Звичайна таблиця - коли сама колонка тексту має 640 px (запит до
   контейнера, а не до екрана: на 900-1020 px бічна панель лишала колонці
   444 px, і рядок BetXchange був 607 px заввишки, кнопка - за краєм). */
.table-wrap--offers { container-type: inline-size; }
.data-table--offers { min-width: 0; }
.data-table--offers, .data-table--offers tbody { display: block; }
.data-table--offers thead {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.data-table--offers tr {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 6px 12px;
  grid-template-areas: "op cta" "offer offer" "notes notes" "lic lic";
  padding: 14px 16px; border-bottom: 1px solid var(--hairline);
}
.data-table--offers tbody tr:last-child { border-bottom: none; }
.data-table--offers td { display: block; padding: 0; border: 0; }
.data-table--offers .offers__op { grid-area: op; align-self: center; font-weight: 700; font-size: 15px; }
.data-table--offers .offers__cta { grid-area: cta; }
.data-table--offers .offers__offer { grid-area: offer; font-weight: 600; }
.data-table--offers .offers__notes { grid-area: notes; font-size: 13px; color: var(--body-text); }
.data-table--offers .offers__licence { grid-area: lic; font-size: 12px; color: var(--muted); }
.data-table--offers .offers__licence::before { content: attr(data-label) ": "; }
@container (min-width: 640px) {
  .data-table--offers { display: table; }
  .data-table--offers thead {
    display: table-header-group; position: static; width: auto; height: auto;
    overflow: visible; clip: auto; clip-path: none; white-space: normal;
  }
  .data-table--offers tbody { display: table-row-group; }
  .data-table--offers tr { display: table-row; padding: 0; border: 0; }
  .data-table--offers td {
    display: table-cell; padding: 11px 14px; border-bottom: 1px solid var(--hairline);
    font-size: 14px; font-weight: 400; color: inherit; vertical-align: middle;
  }
  .data-table--offers tbody tr:last-child td { border-bottom: none; }
  .data-table--offers .offers__licence::before { content: none; }
}

/* КРОКИ */
.steps { margin: 0; padding-left: 22px; color: var(--body-text); }
.steps li { margin-bottom: 10px; }
.steps strong { color: var(--ink); }

/* ПЛЮСИ І МІНУСИ */
.pros-cons { display: grid; grid-template-columns: 1fr; gap: 12px; }
.pros-cons__col { background: var(--card); border-radius: var(--radius); padding: 16px; }
.pros-cons__col ul { margin: 8px 0 0; padding-left: 20px; color: var(--body-text); }
.pros-cons__col li + li { margin-top: 6px; }
.pros-cons__col--pro { border-left: 4px solid var(--green); }
.pros-cons__col--con { border-left: 4px solid var(--muted); }
.verdict { margin-top: 12px; font-size: 16px; }

@media (min-width: 700px) {
  .pros-cons { grid-template-columns: 1fr 1fr; }
}

/* RTP оператора в рейтингу. Окремий рядок, бо це найважливіше число на
   сторінці і воно різне в різних операторів. */
.meta-rtp { font-weight: 700; color: var(--green); }
.meta-date { font-weight: 500; color: var(--muted); font-size: 12px; }

.hero-shot {
  border-radius: var(--radius-lg); width: 100%; height: auto;
  display: block; background: var(--ink);
}

/* Походження чисел у панелі фактів. Дрібний, але присутній: редакційна
   політика сайту обіцяє джерело на кожен факт. */
.facts-note {
  font-size: 12px; line-height: 1.45; color: var(--muted);
  margin: 0; padding-top: 2px;
}

.muted-inline { color: var(--muted); font-size: 13px; }

/* Оператори без даних для порівняльного рядка. Дрібним, але присутні:
   огляд у них є, і посилання корисне. */
.also-covered { font-size: 13px; color: var(--muted); line-height: 1.6; margin: 0; }

/* ═══════════════════════════════════════════════════════════════════════
   КОЛІР, МІТКИ І ПОСТІЙНИЙ CTA
   Правки вересня 2026. Сайт був технічно правильний і візуально рівний:
   білі картки на бежевому, один акцент, жодної ознаки, за яку чіпляється
   око. Нижче - те, що додає різницю між елементами, не додаючи ваги
   сторінці: ні шрифтів, ні зображень, ні JavaScript.
   ═══════════════════════════════════════════════════════════════════ */

/* ЧІПИ ТИПУ ГРИ */
.chip--type { letter-spacing: .06em; }
.chip--crash   { background: var(--crash-bg);   color: var(--crash-ink); }
.chip--slot    { background: var(--slot-bg);    color: var(--slot-ink); }
.chip--table   { background: var(--table-bg);   color: var(--table-ink); }
.chip--lottery { background: var(--lottery-bg); color: var(--lottery-ink); }

.chip--sa      { background: var(--chip-green-bg); color: var(--green); text-transform: none; letter-spacing: 0; }
.chip--foreign { background: var(--tone-gold-bg);  color: var(--tone-gold-ink); text-transform: none; letter-spacing: 0; }
.chip--score   { background: var(--ink); color: var(--accent); }

/* МІТКИ НА КАРТЦІ ГРИ */
.markers { display: flex; flex-wrap: wrap; gap: 5px; }
.marker {
  font-size: 11px; font-weight: 800; letter-spacing: .04em;
  text-transform: uppercase; padding: 4px 7px; border-radius: 6px;
  white-space: nowrap;
}
.marker--gold   { background: var(--tone-gold-bg);   color: var(--tone-gold-ink); }
.marker--green  { background: var(--tone-green-bg);  color: var(--tone-green-ink); }
.marker--blue   { background: var(--tone-blue-bg);   color: var(--tone-blue-ink); }
.marker--red    { background: var(--tone-red-bg);    color: var(--tone-red-ink); }
.marker--teal   { background: var(--tone-teal-bg);   color: var(--tone-teal-ink); }
.marker--purple { background: var(--tone-purple-bg); color: var(--tone-purple-ink); }

/* КАРТКА ГРИ З ОБКЛАДИНКОЮ
   Обкладинка робить сітку сканованою: гравець упізнає crash-криву і
   барабани слота швидше, ніж читає назву. */
.game-card { padding: 0; overflow: hidden; gap: 0; }
.game-card__art {
  width: 100%; aspect-ratio: 620 / 300; object-fit: cover;
  display: block; background: var(--ink);
}
.game-card__body { display: flex; flex-direction: column; gap: 7px; padding: 13px 14px 15px; }
.game-card__top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.game-card__score {
  font-family: var(--font-display); font-weight: 800; font-size: 14px;
  background: var(--ink); color: var(--accent);
  padding: 3px 8px; border-radius: 7px; flex: none;
}
.game-card__name { font-size: 18px; line-height: 1.2; }
.game-card__meta { font-size: 12px; color: var(--muted); }

/* Ліва кольорова грань за типом гри: тонка, але ставить сітку в порядок. */
.game-card { border-left: 4px solid transparent; }
.game-card--crash   { border-left-color: var(--crash-ink); }
.game-card--slot    { border-left-color: var(--slot-ink); }
.game-card--table   { border-left-color: var(--table-ink); }
.game-card--lottery { border-left-color: var(--lottery-ink); }
/* Підсвітка при наведенні НЕ чіпає ліву межу: там колір типу гри, і
   замінювати його золотим означає втрачати єдину ознаку, за якою сітка
   читається. Тільки для пристроїв зі справжнім наведенням: на тачскріні
   :hover залипає після тапа, і картка лишалась обведеною золотим. */
@media (hover: hover) {
  .game-card:hover {
    border-top-color: var(--accent);
    border-right-color: var(--accent);
    border-bottom-color: var(--accent);
  }
}

/* РЕЙТИНГ: ОЦІНКА, ЛІЦЕНЗІЯ, ОЗНАКИ */
.rank-card .logo-box { width: 44px; height: 44px; border-radius: 12px; }
.rank-card .score {
  margin-left: auto; font-family: var(--font-display);
  display: inline-flex; align-items: baseline; gap: 1px; flex: none;
}
.rank-card .score strong { font-size: 17px; font-weight: 800; color: var(--ink); }
.rank-card .score-max { font-size: 11px; color: var(--muted); font-weight: 600; }

.rank-card .meta { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.licence {
  font-size: 12px; font-weight: 600; line-height: 1.35;
  padding: 4px 8px; border-radius: 6px;
  /* Номер ліцензії довгий і має переноситись, а не розпирати картку. */
  overflow-wrap: anywhere;
}
.licence--sa      { background: var(--chip-green-bg); color: var(--green); }
.licence--foreign { background: var(--tone-gold-bg);  color: var(--tone-gold-ink); }

.meta-tag {
  font-size: 11px; font-weight: 800; text-transform: uppercase;
  letter-spacing: .04em; padding: 4px 7px; border-radius: 6px;
  background: var(--band); color: var(--ink-dim);
}
.meta-tag--ok { background: var(--tone-green-bg); color: var(--tone-green-ink); }

/* Звідки оцінка. Рядок обовʼязковий: без нього число на сторінці
   читається як наша рекомендація, а це поки що чужа думка. */
.rating-basis {
  font-size: 13px; color: var(--ink-dim); background: var(--card);
  border-left: 3px solid var(--accent);
  padding: 10px 13px; border-radius: 8px; margin: 0;
}
.rating-basis strong { color: var(--ink); }

/* ЛИД НА ХАБАХ */
.lead { font-size: 16px; max-width: 62ch; }
@media (min-width: 900px) { .lead { font-size: 17px; } }

/* ЛИПКА ПАНЕЛЬ НА ВСЬОМУ САЙТІ
   Вимога власника: кнопка на екрані завжди. Виняток - trust-сторінки,
   де пропозиція грати суперечила б тому, що на них написано
   (див. _NO_STICKY_CTA в app/routers/public.py). */
.sticky-cta {
  /* Панель не має накривати системну смугу на iPhone. */
  padding-bottom: calc(10px + env(safe-area-inset-bottom, 0px));
}
.sticky-cta--plain { justify-content: space-between; }
.sticky-cta__note {
  color: var(--on-dark); font-size: 12px; line-height: 1.3;
  /* На вузькому екрані текст поступається кнопці, а не навпаки. */
  flex: 1 1 auto; min-width: 0;
  /* Нижче 360 px підпис ставав чотирма рядками, панель - 82 px замість 72,
     і вона накривала низ футера. Кнопка каже те саме. */
  display: none;
}
@media (min-width: 360px) { .sticky-cta__note { display: block; } }
.sticky-cta--plain .btn { flex: 0 0 auto; padding-inline: 18px; }

@media (min-width: 900px) {
  /* На десктопі панель лишається, але тонша: вона не має зʼїдати екран,
     з якого читають довгий текст. */
  body:has(.sticky-cta) { padding-bottom: 67px; }
  .sticky-cta { display: flex; padding-block: 8px; }
  /* Та сама висота 52px, що в кнопок угорі сторінки: два розміри на весь сайт -
     основна 52 і компактна 44 (.btn--sm у рядках рейтингу). */
  .sticky-cta .btn { height: 52px; font-size: 16px; flex: 0 0 auto; }
  .sticky-cta__note { font-size: 13px; }
}

/* ГЕРОЙ СТОРІНКИ ГРИ: темна підкладка замість плоского бежевого.
   Перший екран - єдине місце, де контраст важливіший за спокій. */
.hero-shot { box-shadow: 0 8px 28px rgba(21, 32, 26, .18); }

/* ЗАГОЛОВКИ РОЗДІЛІВ */
.block > h2 {
  /* Коротка золота риска перед H2: дешевий спосіб розбити довгу
     сторінку на частини без зайвих рамок. */
  border-left: 4px solid var(--accent);
  padding-left: 12px; margin-left: -16px;
}
@media (min-width: 900px) { .block > h2 { margin-left: -16px; } }

/* ═══════════════════════════════════════════════════════════════════════
   ЗОБРАЖЕННЯ ІГОР
   Офіційні плитки і кадри з сайтів провайдерів
   (scripts/fetch_game_media.py). Плитки здебільшого прозорі PNG під темне
   лобі, тому підкладка темна: інакше Pragmatic-плитка на білій картці
   читається як дірка у верстці.
   ═══════════════════════════════════════════════════════════════════ */

.game-card__art-wrap {
  display: block; background: var(--ink);
  aspect-ratio: 620 / 300; overflow: hidden;
}
.game-card__art {
  width: 100%; height: 100%; display: block;
  /* contain, а не cover: плитка провайдера це готова композиція з назвою
     гри, і обрізати її означає відрізати половину напису. */
  object-fit: contain;
}

/* СТАНДАРТНІ РАМКИ (25.09.2026, власник: "Всі фото повинні бути
   стандартизовані по розміру"). Одна рамка на роль: обкладинка вгорі
   сторінки гри і кадри в тексті - 16:9, картки в сітці - 620:300 (вище),
   скріни казино - 390:844, як телефон, з якого вони зняті. Зображення
   вписується в рамку цілком (contain), нічого не обрізається: плитка
   студії - готова композиція з назвою гри, а вертикальний скрін телефона,
   обрізаний до 16:9, втратив би пів екрана. Порожнє місце - темна
   підкладка рамки. Обкладинки студій бувають від 0.8:1 до 3.1:1, кадри -
   від 0.47:1 до 2.1:1: без рамки висота картинки гуляла від сторінки до
   сторінки і між двома кадрами в одному ряду. */
.hero-shot, .shot img { aspect-ratio: 16 / 9; object-fit: contain; }
.phone-shot img { aspect-ratio: 390 / 844; object-fit: contain; }
.shot a { display: block; }
/* Найширший банер (від 3:1: NetEnt 2560x820, Red Tiger 1028x329), вписаний
   цілком, - смужка на третину рамки. Логотип у них посередині, тож рамку
   заповнює середина банера, краї обрізаються. Поріг 3, а не нижче: у
   банерах EGT Digital (2.8:1) назва ширша за середину. */
.shot .hero-shot--banner, .game-card__art--banner { object-fit: cover; }

/* КАДРИ В ТІЛІ СТОРІНКИ */
.shots { display: flex; flex-direction: column; gap: 18px; }
.shot { margin: 0; display: flex; flex-direction: column; gap: 8px; }
.shot img {
  width: 100%; height: auto; display: block;
  border-radius: var(--radius); background: var(--ink);
  box-shadow: 0 6px 20px rgba(21, 32, 26, .14);
}
.shot figcaption { font-size: 13px; color: var(--ink-dim); line-height: 1.5; }
/* Анімація раунду (анімований WebP 480 px). Поруч з кадром вона й так
   вужча за себе; сама в ряду - не ширша за 560 px: розтягнута вдвічі,
   вона розпливається. */
.shot--anim picture { display: block; max-width: 560px; }

/* Скріни оператора на телефоні: портретні, тож по два в ряд і не ширші
   за екран телефона, з якого зняті. Клік відкриває файл повністю. */
.phone-shots { display: grid; grid-template-columns: repeat(2, minmax(0, 260px)); gap: 14px; }
.phone-shot { margin: 0; display: flex; flex-direction: column; gap: 6px; }
.phone-shot img {
  width: 100%; height: auto; display: block; border-radius: 14px;
  border: 1px solid rgba(21, 32, 26, .12); background: var(--ink);
}
.phone-shot figcaption { font-size: 12.5px; color: var(--ink-dim); line-height: 1.45; }
/* Картка гри в огляді бренду: примітка пари і дата в лобі. */
.game-card__pair, .game-card__seen { display: block; font-size: 12px; line-height: 1.4; }
.game-card__pair { color: var(--body-text); margin-top: 4px; }
.game-card__seen { color: var(--muted); margin-top: 2px; }
/* "Бачили в лобі ... дата" у рядку оператора на сторінці гри. */
.rank-card .op-seen { display: block; font-size: 12px; color: var(--ink-dim); }
/* Компактні рядки після перших п'яти на сторінці гри: назва з оцінкою,
   примітка і дата, коротка ліцензія, кнопка. */
.rank-more { margin: 8px 0 0; font-size: 13px; color: var(--muted); }
.rank-card--compact { padding: 10px 14px; gap: 6px 12px; }
.rank-card--compact .pos { font-size: 15px; }
.rank-card--compact .info:empty { display: none; }
.rank-card--compact .cta { min-height: 36px; }
@container (min-width: 520px) {
  .rank-card--compact {
    grid-template-columns: 42px minmax(0, 1fr) 140px;
    grid-template-areas: "pos brand cta" ". info cta" ". meta cta";
  }
}
@container (min-width: 960px) {
  .rank-card--compact {
    grid-template-columns: 42px 290px minmax(0, 1fr) 210px 140px;
    grid-template-areas: "pos brand info meta cta";
    padding: 10px 20px;
  }
}
.phone-shot__credit { display: block; margin-top: 4px; font-size: 11.5px; opacity: .85; }

/* Авторство. Зображення лишаються власністю провайдерів, і назвати
   автора - те саме правило, що джерело на кожен факт. */
.shot__credit {
  font-size: 12px; color: var(--muted); margin: 0;
}

@media (min-width: 900px) {
  /* Два кадри поруч там, де є місце: вони читаються як пара. */
  .shots { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
  .shots .shot:only-child { grid-column: 1 / -1; }
}

/* ═══════════════════════════════════════════════════════════════════════
   ПІГУЛКА ОЦІНКИ
   Один елемент на весь сайт (partials/score.html). Колір за смугою, а не
   градієнтом: пігулка має читатись боковим зором у списку з двадцяти
   восьми рядків, а градієнт там не читається взагалі.
   ═══════════════════════════════════════════════════════════════════ */

.score-pill {
  display: inline-flex; align-items: baseline; gap: 1px; flex: none;
  font-family: var(--font-display); font-weight: 800;
  padding: 4px 9px; border-radius: 999px; line-height: 1.1;
  border: 1.5px solid transparent;
  /* Цифри в колонці мають стояти одна під одною. */
  font-variant-numeric: lining-nums tabular-nums;
}
.score-pill__value { font-size: 15px; }
/* "/5" повним кольором пігулки: з прозорістю .85 він мав 4.1:1 на трьох
   з чотирьох пігулок, нижче порогу WCAG AA для дрібного тексту. */
.score-pill__max { font-size: 11px; font-weight: 700; }

.score-pill--sm { padding: 3px 7px; }
.score-pill--sm .score-pill__value { font-size: 13px; }
.score-pill--sm .score-pill__max { font-size: 10px; }

.score-pill--high { background: var(--tone-green-bg); color: var(--tone-green-ink); border-color: #9bcdae; }
.score-pill--good { background: var(--tone-teal-bg);  color: var(--tone-teal-ink);  border-color: #8fcfc2; }
.score-pill--fair { background: var(--tone-gold-bg);  color: var(--tone-gold-ink);  border-color: #ddba76; }
.score-pill--low  { background: var(--band);          color: var(--ink-dim);        border-color: #cfcab6; }

/* У рядку рейтингу пігулка притискається до правого краю імені бренду. */
.rank-card .brand .score-pill { margin-left: auto; }

/* На темній картці гри пігулка стоїть поруч із чіпом типу. */
.game-card__top .score-pill { margin-left: auto; }

/* У заголовку картки фактів - дрібна, з відступом від тексту. */
.card-title .score-pill { margin-left: 8px; vertical-align: middle; }

/* У порівняльній таблиці колонка з оцінкою не має розтягуватись. */
.data-table td .score-pill { white-space: nowrap; }

/* Назва бренду в рядку рейтингу не переноситься, якщо вміщається:
   пігулка стоїть після неї, а не під нею. */
.rank-card .brand > a { min-width: 0; }
/* Нижче 360 px довга назва одним словом (SuperSportBet, Hollywoodbets) не
   вміщалась поруч із пігулкою і йшла під неї: пігулка тоді переходить на
   свій рядок праворуч (повторна перевірка, 26.09.2026). */
.rank-card .brand { flex-wrap: wrap; }
@media (min-width: 900px) {
  .rank-card .brand { flex-wrap: nowrap; }
  .rank-card .brand > a { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
}

/* ═══════════════════════════════════════════════════════════════════════
   ВИРІВНЮВАННЯ КАРТОК У СІТЦІ
   Сітка розтягує картки по висоті рядка, але вміст усередині стояв на
   різній висоті: назва в один рядок і в два зсували мітки й рядок
   провайдера по-різному, а картка без міток підтягувала все вгору. У
   двоколонковій сітці на телефоні це видно одразу.

   Рішення: зарезервувати місце під назву і мітки, а рядок провайдера
   притиснути до низу. Тоді в сусідніх картках збігаються і верх, і низ.
   ═══════════════════════════════════════════════════════════════════ */

.game-card__body {
  /* Тіло займає всю висоту, що лишилась під обкладинкою: без цього
     притиснути щось до низу картки нема до чого. */
  flex: 1 1 auto;
}

.game-card__name {
  /* Дуже довга назва не має розпирати картку нескінченно. */
  overflow-wrap: anywhere;
}

.game-card__meta {
  /* Притиснутий до низу: у сусідніх картках рядки провайдера стоять на
     одній лінії незалежно від того, скільки міток вище. */
  margin-top: auto;
  /* RTP буває довгим ("86%, 92%, 94%, 97% or 98%, set by the operator").
     Два рядки - стеля; повний рядок є на сторінці гри. */
  line-height: 1.45;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}

/* Місце, яке рівняє картки одного ряду: два рядки під назву (однорядкова
   лишає 22 px порожніх, а рівний ряд коштує дорожче), ряд міток навіть
   без міток і два рядки під "студія · RTP" (інакше однорядковий рядок
   починається на 19 px нижче, ніж дворядковий у сусідній картці). Лише
   з 424 px, де в сітці дві колонки і більше: в одну колонку сусідів нема,
   і картка на телефоні мала 39 px порожнечі під назвою і під текстом
   (перевірка на телефоні, 26.09.2026). */
@media (min-width: 424px) {
  .game-card__name { min-height: calc(2 * 1.2em); }
  .game-card .markers { min-height: 20px; }
  .game-card__meta { min-height: calc(2 * 1.45em); }
}

/* Чіп типу і пігулка оцінки: однакова висота рядка в усіх картках,
   незалежно від довжини слова в чіпі. */
.game-card__top { min-height: 26px; }

/* ═══════════════════════════════════════════════════════════════════════
   ПЛАТІЖКИ НА ВИДНОМУ МІСЦІ
   Вересень 2026. Дані про платежі лежали в базі, але в рядку рейтингу
   від них був лише перелік методів через кому, а сторінки самих методів
   не знали, хто їх приймає.
   ═══════════════════════════════════════════════════════════════════ */

/* Строк виплати. Окремим рядком і трохи помітніше за умови: це те
   питання, яке гравець ставить після виграшу, і на ринку на нього майже
   ніхто не відповідає в картці. */
.rank-card .payout {
  display: block; margin-top: 4px;
  font-size: 12px; color: var(--body-text);
}
.rank-card .payout b {
  font-weight: 700; color: var(--green);
  text-transform: uppercase; letter-spacing: .03em;
  font-size: 11px; margin-right: 4px;
}

/* Методи оплати плитками, а не рядком через кому. Десять назв підряд
   читаються як суцільний текст; плитки скануються. Ті, про які в нас є
   сторінка, клікабельні - це і перелінковка, і відповідь читачеві, який
   не знає, що таке Ozow. */
.method-grid { display: flex; flex-wrap: wrap; gap: 7px; margin: 4px 0 14px; }
.method-chip {
  font-size: 13px; font-weight: 600;
  padding: 6px 11px; border-radius: 9px;
  background: var(--band); color: var(--ink);
  border: 1px solid var(--hairline);
}
a.method-chip { text-decoration: none; }
a.method-chip:hover { border-color: var(--green); color: var(--green); }

@media (hover: none) {
  a.method-chip:hover { border-color: var(--hairline); color: var(--ink); }
}

/* Таблиця "ключ - значення" на дві колонки. Звичайній таблиці даних
   потрібна мінімальна ширина 460px, щоб п'ять колонок не злипались; тут
   колонок дві, і та сама ширина лише виштовхувала значення за край
   екрана телефону. */
.data-table--kv { min-width: 0; }

/* Що відрізняє бренд: список фактів, а не абзац. */
.standout { margin: 0; padding-left: 20px; color: var(--body-text); }
.standout li + li { margin-top: 6px; }

/* ПІДПИСКА НА PUSH (app/push.py, static/push.js). Скромний блок над
   футером: не спливає поверх сторінки і не просить дозволу сам - лише на
   клік. Прихований, доки скрипт не переконається, що push можливий. */
.push-box {
  margin: 28px var(--gutter) 0; padding: 14px 16px;
  background: var(--card); border-radius: var(--radius);
  border: 1px solid var(--band);
  display: grid; grid-template-columns: 1fr auto; gap: 8px 12px; align-items: center;
}
.push-box[hidden] { display: none; }
.push-box__text { margin: 0; font-size: 14px; color: var(--ink-dim); }
.push-box__actions { display: flex; align-items: center; gap: 6px; }
.push-box__close {
  border: 0; background: transparent; cursor: pointer; color: var(--muted);
  font-size: 22px; line-height: 1; width: 36px; height: 36px; border-radius: 8px;
}
.push-box__close:hover { background: var(--band); }
.push-box__note { grid-column: 1 / -1; margin: 0; font-size: 13px; color: var(--green); }
.push-box__note:empty { display: none; }
.push-box .btn--sm { width: auto; }

/* ФОРМА ЗВОРОТНОГО ЗВ'ЯЗКУ (app/feedback.py). Поля заввишки від 48px -
   у них цілять пальцем; шрифт 16px, щоб iPhone не збільшував сторінку
   при фокусі. */
.feedback__form { display: flex; flex-direction: column; gap: 14px; max-width: 560px; }
.feedback__field { display: flex; flex-direction: column; gap: 6px; font-weight: 600; font-size: 14px; }
.feedback__field input, .feedback__field textarea {
  font: inherit; font-weight: 400; font-size: 16px; color: var(--ink);
  background: var(--card); border: 1px solid #d9d5c7; border-radius: 10px;
  padding: 12px 14px; min-height: 48px; width: 100%;
}
.feedback__field input:focus, .feedback__field textarea:focus { outline: 2px solid var(--green); outline-offset: 1px; }
.feedback__submit { align-self: flex-start; width: auto; padding-inline: 28px; }
.feedback__note { font-size: 13px; color: var(--muted); margin: 0; }
.feedback__ok { background: #d9eadd; color: var(--green); padding: 12px 14px; border-radius: 10px; }
.feedback__error { background: #f7dfd8; color: #a3341f; padding: 12px 14px; border-radius: 10px; }
/* Пастка для ботів: поза екраном, а не display:none - деякі боти
   пропускають невидимі поля. */
.feedback__trap { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; }
.offer-cta { width: auto; white-space: nowrap; padding-inline: 14px; }

/* ═══════════════════════════════════════════════════════════════════════
   ШИРИНА СТОРІНКИ (вересень 2026). Раніше її не було: на широкому моніторі
   вміст тягнувся на весь екран, картинки разом з ним ставали велетенськими,
   а рядки тексту - задовгими для читання. Тепер вміст не ширший за
   --page-max і стоїть по центру. Смуги на всю ширину (шапка, розкриття,
   футер, нижня панель) лишаються на всю ширину, але їхній вміст вирівняний
   з колонкою тексту. На телефоні нічого не змінюється. */
:root { --page-max: 1200px; }
.wrap { max-width: calc(var(--page-max) + 2 * var(--gutter)); margin-inline: auto; }
.site-header, .disclosure, .site-footer, .sticky-cta {
  padding-inline: max(var(--gutter), calc((100% - var(--page-max)) / 2));
}
.push-box { margin-inline: max(var(--gutter), calc((100% - var(--page-max)) / 2)); }
/* Кадри в тексті: не ширші за 760px навіть там, де колонка ширша. */
.shots, .shot--block { max-width: 760px; }

/* ═══════════════════════════════════════════════════════════════════════
   РЕКЛАМА (app/ads.py, partials/ad.html, docs/BANNERS.md)
   Банер стоїть у бежевій рамці з підписом "Advertisement" і рядком 18+:
   читач має з першого погляду відрізнити рекламу від нашого тексту і
   рейтингу (Google знижує сторінки, де реклама маскується під вміст).
   Порожнє місце не дає розмітки взагалі, тож і стилів для "порожньо" нема.
   Межа телефон / комп'ютер - 900px, як у всій верстці.
   ═══════════════════════════════════════════════════════════════════ */
.ad {
  display: flex; flex-direction: column; gap: 6px;
  margin: 0; padding: 8px 10px 9px;
  background: var(--band); border-radius: var(--radius);
  /* Довгий заголовок текстового банера не має розпирати колонку. */
  min-width: 0; overflow-wrap: anywhere;
}
.ad__label {
  font-size: 10.5px; font-weight: 700; line-height: 1.2;
  text-transform: uppercase; letter-spacing: .08em; color: var(--muted);
}
.ad__rg { margin: 0; font-size: 11px; line-height: 1.35; color: var(--ink-dim); }
.ad__rg strong { color: var(--ink); }
.ad__link { display: block; color: var(--ink); text-decoration: none; border-radius: 10px; }
.ad__link:hover { color: var(--ink); }
.ad__link:focus-visible { outline: 2px solid var(--green); outline-offset: 2px; }
/* Посилання картинки - завширшки з саму картинку: порожнє поле збоку від
   вузького банера не має бути кліком на рекламу. */
.ad__link--image { width: fit-content; max-width: 100%; margin-inline: auto; }
/* Картинка: не ширша за колонку і не більша за свій файл; пропорції
   тримають справжні width/height, тож під неї резервується місце ще до
   завантаження. Без "width: auto": воно скасовує атрибут width, і до
   завантаження картинка мала б нульовий розмір - сторінка стрибала б (CLS).
   По центру - малий банер у широкій колонці не липне до лівого краю. */
.ad__picture { display: block; }
.ad__img {
  display: block; max-width: 100%; height: auto;
  margin-inline: auto; border-radius: 10px;
}

/* Текстовий банер: картка сайту з золотою кнопкою Play. На вузькому
   екрані кнопка переходить під текст на всю ширину. */
.ad__text {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px 16px;
  background: var(--card); border-radius: 10px; padding: 14px 16px;
  border-left: 4px solid var(--accent);
}
.ad__copy { flex: 1 1 240px; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.ad__title { font-family: var(--font-display); font-weight: 700; font-size: 17px; line-height: 1.25; color: var(--ink); }
.ad__body { font-size: 14px; line-height: 1.45; color: var(--body-text); }
.ad__button { flex: 1 1 100%; }
@media (min-width: 560px) {
  .ad__button { flex: 0 0 auto; width: auto; }
}

/* Над футером - поза <main>, тож свій відступ від вмісту. */
.ad-row { margin-top: 28px; }
/* Бічна панель: банер вужчий за колонку тексту, кнопка - на всю ширину. */
.sidebar .ad__title { font-size: 16px; }
.sidebar .ad__button { flex: 1 1 100%; width: 100%; }

/* Банер лише для одного пристрою: другий отримав інший (або жодного). */
@media (min-width: 900px) { .ad--only-mobile { display: none; } }
/* 899.98, а не 899: при дробовій ширині вікна (масштаб 110%, 899.5px)
   інакше не діяло б жодне з двох правил, і показались би обидві копії. */
@media (max-width: 899.98px) { .ad--only-desktop { display: none; } }

/* ЛИПКА СМУГА НА ТЕЛЕФОНІ (місце sticky-mobile). Стає на місце нижньої
   кнопки: одна смуга, не дві. Не вища за ~100px разом з підписом і рядком
   18+: за стандартом Better Ads (за ним Chrome блокує рекламу) липкий
   банер, що займає понад 30% екрана, - порушення, а 100px на телефоні
   844px заввишки - 12%. */
.ad--sticky-mobile {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 21;
  gap: 3px; border-radius: 0;
  padding: 4px var(--gutter) calc(5px + env(safe-area-inset-bottom, 0px));
  background: var(--ink);
  box-shadow: 0 -2px 12px rgba(21, 32, 26, 0.18);
}
.ad__head { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 18px; }
.ad--sticky-mobile .ad__label { color: var(--on-dark); }
.ad--sticky-mobile .ad__rg { color: var(--on-dark); font-size: 10px; line-height: 12px; text-align: center; }
.ad--sticky-mobile .ad__rg strong { color: var(--ground); }
/* Висота - рівно 56px ще до завантаження, ширина - з пропорцій файлу. */
.ad--sticky-mobile .ad__img { height: 56px; width: auto; max-height: none; object-fit: contain; border-radius: 6px; }
.ad--sticky-mobile .ad__text { padding: 6px 10px; gap: 10px; flex-wrap: nowrap; max-height: 56px; }
/* Заголовку - щонайменше половина смуги: кнопка до 24 знаків інакше
   стискала б його до 40px, і пропозицію не прочитати. */
.ad--sticky-mobile .ad__copy { flex: 1 0 50%; }
.ad--sticky-mobile .ad__title {
  font-size: 14px; line-height: 1.2;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.ad--sticky-mobile .ad__body { display: none; }
.ad--sticky-mobile .ad__button {
  flex: 0 1 auto; min-width: 0; width: auto; height: 38px; padding: 0 14px;
  display: block; line-height: 34px; text-align: center;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Кнопка закриття: дрібний напис, але палець влучає в 44px - поле натиску
   розширене відступом, а смугу не збільшує (від'ємний margin). */
.ad__close {
  /* Над посиланням банера: розширене поле натиску заходить на картинку, і
     без z-index нижня його частина відкривала б рекламодавця. */
  position: relative; z-index: 1;
  color: var(--ground); font-size: 11px; font-weight: 700; line-height: 1;
  cursor: pointer; user-select: none; white-space: nowrap;
  padding: 13px 10px; margin: -13px -10px;
}
/* Прапорець закриття візуально схований, але лишається в порядку Tab:
   з клавіатури смугу закривають пробілом. fixed - щоб фокус на ньому не
   гортав сторінку в самий низ, де він стоїть у розмітці. */
.ad-close {
  position: fixed; bottom: 0; left: 0;
  width: 1px; height: 1px; margin: -1px; padding: 0; border: 0;
  overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.ad-close:focus-visible ~ .ad--sticky-mobile .ad__close { outline: 2px solid var(--accent); outline-offset: 2px; }
.ad-close:checked ~ .ad--sticky-mobile { display: none; }

@media (max-width: 899.98px) {
  /* Смуга банера замість нижньої кнопки, і місце під неї внизу сторінки,
     щоб вона не накривала футер. Закрили банер - кнопка повертається. */
  body.has-ad-sticky { padding-bottom: calc(104px + env(safe-area-inset-bottom, 0px)); }
  .has-ad-sticky .sticky-cta { display: none; }
  .has-ad-sticky .ad-close:checked ~ .sticky-cta { display: flex; }
  body.has-ad-sticky:has(.ad-close:checked) { padding-bottom: calc(71px + env(safe-area-inset-bottom, 0px)); }
}
@media (min-width: 900px) {
  /* На комп'ютері смуги банера нема: тонка кнопка лишається (рішення
     власника). Прапорець закриття теж зникає, щоб Tab не заходив у
     невидиме поле. */
  .ad--sticky-mobile, .ad-close { display: none; }

  /* ЛИПКИЙ БЛОК У БІЧНІЙ ПАНЕЛІ (місце sticky-desktop). Липка панель,
     вища за екран, ховає свій низ до кінця сторінки - і банер разом з
     ним. Тому з таким банером панель не липка, а тягнеться на всю висоту
     тексту, і липким стає лише банер, не вищий за екран. */
  .sidebar--sticky-ad { position: static; align-self: stretch; max-height: none; overflow: visible; }
  .ad--sticky-desktop { position: sticky; top: calc(var(--header-h) + 20px); }
  /* Екран мінус шапка з відступом (header + 20), підпис і рядок 18+ (~57)
     і тонка нижня кнопка (~58): інакше на ноутбуці 768px заввишки кнопка
     накрила б низ банера разом з рядком 18+. */
  .ad--sticky-desktop .ad__img { max-height: calc(100vh - var(--header-h) - 150px); object-fit: contain; }
}


/* ═══════════════════════════════════════════════════════════════════════
   ТЕМНА ШАПКА СТОРІНКИ (24.09.2026)
   Власник про картинку прев'ю (app/og.py): "можна було б зробити заголовки
   описів в такому форматі, типу зверху так, знизу вже світлий фон як
   зараз. Ну і в цілому провести це через весь дизайн сайту". Смуга на всю
   ширину, кольору шапки сайту: золотий надпис розділу, великий заголовок
   Syne, кадр гри в темній рамці з підписом джерела. Під смугою - світлий
   фон, як був. Сірі тони на темному - не темніші за #8c9a91: це 5.7:1 з
   тлом, дрібний текст лишається читабельним (WCAG AA - від 4.5:1).
   ═══════════════════════════════════════════════════════════════════ */

/* Текст для пошуковика і читача екрана, якого не видно: двокрапка між
   великим і малим рядком заголовка (partials/hero_title.html). */
.visually-hidden {
  position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* Рядок про комісію - того ж темного тону: шапка сайту, цей рядок і
   заголовок сторінки читаються одним блоком. */
.disclosure { background: #1c2922; color: var(--on-dark); }
.disclosure a { color: var(--accent); }

.hero-band { background: var(--ink); color: var(--ground); padding: 18px 0 30px; }
.hero-band--tall { padding: 44px 0 56px; }
.page-body { padding-top: 28px; }
/* Заголовок-речення хаба не тягнеться на всю ширину монітора. */
.hero-text { max-width: 900px; }
.hero-band a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.hero-band .breadcrumb { color: #8c9a91; }
.hero-band .breadcrumb a { color: var(--on-dark); }
.hero-band .breadcrumb a:hover { color: var(--ground); }
.hero-band .breadcrumb .current { color: var(--ground); }

/* Надпис над заголовком: розділ гри, "Operator review", "Guide". */
.kicker {
  font-weight: 800; font-size: 13px; letter-spacing: .14em; text-transform: uppercase;
  color: var(--accent); align-self: flex-start;
}
a.kicker:hover { color: var(--accent); text-decoration: underline; }

/* Заголовок: великий рядок (назва гри чи бренду, або частина до
   двокрапки) і менший під ним. Розмір великого - за довжиною
   (rules.title_parts): назва з одного-двох слів найбільша, речення
   дрібніше, щоб на телефоні не займати пів екрана. */
/* Одне довге слово не переноситься: "Hollywoodbets" у 64px ширше за
   колонку і налазило на картку праворуч, а на телефоні розсунуло б
   сторінку. Тож шрифт не більший, ніж дає ширина заголовка (100cqi) на
   найдовше слово (--longest букв, з partials/hero_title.html): у Syne 800
   буква займає 0.8-0.93 em, одна em на букву - із запасом. Браузер без
   одиниць cqi бере перший, звичайний розмір; перенос посеред слова -
   крайній випадок. */
.hero-title { font-family: var(--font-display); color: var(--ground); container-type: inline-size; }
.hero-title__main {
  --size: 38px;
  display: block; line-height: 1.02; font-weight: 800; letter-spacing: -.02em;
  font-size: var(--size);
  font-size: min(var(--size), 100cqi / var(--longest, 1));
  overflow-wrap: break-word;
}
.hero-title__main--long { --size: 32px; line-height: 1.05; }
.hero-title__main--sentence { --size: 28px; line-height: 1.1; }
.hero-title__sub {
  display: block; margin-top: 12px; font-size: 19px; line-height: 1.25; font-weight: 700;
  letter-spacing: -.01em; color: var(--on-dark);
}
/* "in South Africa: ..." - продовження заголовка; з великої літери лише
   на око, у тексті H1 буква та сама. */
.hero-title__sub::first-letter { text-transform: uppercase; }

.hero-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; font-size: 15px; color: var(--on-dark); }
.hero-meta__provider { color: var(--ground); font-weight: 700; }
a.hero-meta__provider {
  text-decoration: underline; text-decoration-color: rgba(244, 242, 234, .35); text-underline-offset: 3px;
}
a.hero-meta__provider:hover { color: var(--accent); }

.hero-band p { color: #dde3df; }
.hero-band p a { color: var(--accent); }
.hero-band .muted { color: #8c9a91; }
.hero-band .byline { color: #8c9a91; }
.hero-band .byline a { color: var(--on-dark); }

.hero-band .chip { background: rgba(244, 242, 234, .09); color: var(--ground); }
/* Ліцензія ПАР - зелена, чужа - золота, як на світлому тлі. */
.hero-band .chip--sa { background: rgba(62, 158, 106, .22); color: #9fdcb8; }
.hero-band .chip--foreign { background: rgba(227, 178, 60, .16); color: #f0c768; }
/* Рядок ліцензії буває на 2-3 рядки: у пігулці з радіусом 999 px перша
   літера лягала на заокруглення. */
.hero-band .chip--sa, .hero-band .chip--foreign { border-radius: 10px; }
.hero-band .offshore-note {
  background: rgba(227, 178, 60, .1); border-left-color: var(--accent); color: #dde3df;
}
.hero-band .offshore-note strong { color: var(--ground); }
.hero-band .rating-basis { background: rgba(244, 242, 234, .05); color: var(--on-dark); }
.hero-band .rating-basis strong { color: var(--ground); }
.hero-band .rating-basis a { color: var(--accent); }

.hero-band .btn--app, .hero-band .btn--dark {
  background: transparent; border-color: var(--on-dark); color: var(--ground);
}
.hero-band .btn--app:hover, .hero-band .btn--dark:hover { border-color: var(--ground); color: var(--ground); }

/* "At a glance" оператора - темною панеллю, як плитки фактів гри. */
.hero-band .card { background: rgba(244, 242, 234, .06); border: 1px solid rgba(244, 242, 234, .1); color: var(--ground); }
.hero-band .facts .row { border-bottom-color: rgba(244, 242, 234, .1); }
.hero-band .facts .k { color: #8c9a91; }
.hero-band .facts .v { color: var(--ground); }
.hero-band .facts-note { color: #8c9a91; }

/* Кадр гри в темній рамці з підписом джерела, як на картинці прев'ю. */
.hero-band .shot { background: #0c140f; border-radius: 18px; padding: 14px; gap: 10px; }
.hero-band .hero-shot { box-shadow: none; border-radius: 10px; }
.hero-band .shot__credit { color: #8c9a91; }
.hero-band .hero-media { background: #0c140f; border-color: rgba(244, 242, 234, .15); }
.hero-band .quick-facts div { background: rgba(244, 242, 234, .06); border: 1px solid rgba(244, 242, 234, .08); }
.hero-band .quick-facts .label { color: #8c9a91; }
.hero-band .quick-facts .value { color: var(--ground); }

@media (min-width: 900px) {
  .hero-band { padding: 26px 0 44px; }
  .hero-band--tall { padding: 72px 0 88px; }
  .page-body { padding-top: 36px; }
  .hero-title__main { --size: 64px; }
  .hero-title__main--long { --size: 50px; }
  .hero-title__main--sentence { --size: 42px; }
  .hero-title__sub { font-size: 24px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   ПЕРЕВІРКА САЙТУ, 25.09.2026
   Власник: "Перевір чи немає багів на сайті, типу різний розмір кнопок,
   текст десь наїзджає або фото різного розміру". Знахідки - з автоматичної
   перевірки всіх сторінок на 390, 800 і 1280 px і з огляду очима гравця.
   ═══════════════════════════════════════════════════════════════════ */

/* Меню на телефоні зливалося з темною шапкою сторінки: другий рядок H1 під
   ним читався як шостий пункт. Панель світліша, із золотою рискою знизу, а
   сторінку під нею притемнено; тінь обрізано над панеллю, щоб не темніла
   сама шапка з кнопкою Close. */
.menu__panel {
  background: #223128;
  border-bottom: 2px solid var(--accent);
  box-shadow: 0 0 0 100vmax rgba(8, 12, 10, .62);
  clip-path: inset(0 0 -100vmax 0);
}

/* Рамка головного зображення: порожні боки рамки 16:9 заповнює та сама
   обкладинка, розмита і притемнена (вертикальні й квадратні плитки
   займали 45-56% рамки). */
.hero-frame { position: relative; display: block; overflow: hidden; border-radius: 10px; background: var(--ink); }
.hero-frame__bg {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; filter: blur(22px) brightness(.5); transform: scale(1.2);
}
.hero-frame .hero-shot { position: relative; background: transparent; box-shadow: none; }

/* Картки без обкладинки (/guides/, /payments/): тіло з відступами (назва
   стояла в 2-4 px від краю), опис до чотирьох рядків. */
.game-card--text .game-card__meta { -webkit-line-clamp: 4; min-height: 0; }
.game-card--text .game-card__name { min-height: 0; }

/* Вісім карток на головній - повні ряди: 4 по 2 на планшеті, 2 по 4 на
   десктопі (було 3+3+2 і 5+3). */
@media (min-width: 600px) { .game-grid--home { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1100px) { .game-grid--home { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
/* Те саме для інших сіток з незмінною кількістю карток (перевірка на
   телефоні, 26.09.2026). Вісім ігор в огляді казино: 3+3+2 на планшеті;
   колонка огляду поруч з бічною панеллю вужча за головну, тож 4 в ряд -
   лише з 1240 px. Топ-20 на /games/: 6 рядів по 3 і ще 2 на планшеті, і
   3 ряди по 6 і ще 2 на ширині сторінки 1200; тепер 2, 4 або 5 - усі ділять 20. */
@media (min-width: 600px) {
  .game-grid--eight, .game-grid--top { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 900px) { .game-grid--top { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (min-width: 1100px) { .game-grid--top { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
@media (min-width: 1240px) { .game-grid--eight { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* Плитки фактів угорі сторінки гри: стільки колонок, скільки плиток (не
   порожнє третє місце), довге значення - на весь рядок (максимальний
   виграш Aviator займав 7 рядків у третині ширини). */
.quick-facts { display: flex; flex-wrap: wrap; }
.quick-facts div { flex: 1 1 110px; }
.quick-facts div:has(.value--long) { flex-basis: 100%; order: 1; }

/* "Updated ... | Reviewed by": на телефоні - два рядки без роздільника (він
   висів у кінці першого рядка), ширше - один рядок з роздільником. */
.byline { flex-direction: column; gap: 2px; }
@media (min-width: 600px) {
  .byline { flex-direction: row; gap: 8px; }
  .byline span + span::before { content: "|"; margin-right: 8px; }
}

/* Пара кнопок угорі на телефоні - однакової ширини ("Play Aviator" і "Full
   Aviator guide" були 153 і 195 px): базове .cta-row .btn { flex: 1 1 0 } вище,
   на десктопі - за вмістом. Лише min-width: сайт будується від телефона. */

/* Таблиця, ширша за екран, прокручується вбік, а колонок справа не видно:
   на телефоні над нею підказка. */
.table-hint { margin: 0 0 6px; font-size: 12px; color: var(--muted); }
@media (min-width: 700px) { .table-hint { display: none; } }

/* Огляд казино: вісім карток, решта ігор - списком під "показати". */
.more-games { margin-top: 14px; background: var(--card); border-radius: var(--radius); padding: 0 16px; }
/* З 25.09.2026 тут посилання, а не <details>: без summary смужка мала 33 px
   і текст за 5 px від країв, як порожнє поле вводу. Тепер уся смужка -
   ціль для пальця. */
.more-games > a { display: flex; align-items: center; min-height: 48px; padding-block: 10px; font-weight: 700; }
.more-games > summary { cursor: pointer; font-weight: 700; min-height: 44px; display: flex; align-items: center; }
.game-list { margin: 4px 0 12px; padding: 0; list-style: none; columns: 1; column-gap: 28px; }
@media (min-width: 700px) { .game-list { columns: 2; } }
.game-list li { break-inside: avoid; padding: 7px 0; border-bottom: 1px solid var(--hairline); font-size: 14px; }
.game-list__provider { color: var(--muted); font-size: 12px; margin-left: 6px; }
.game-list__note { display: block; color: var(--ink-dim); font-size: 12px; }

/* Бічна панель гри: ще ігри того самого розділу. */
.toc__meta { display: block; font-size: 12px; font-weight: 500; color: var(--muted); }
.toc__all { font-weight: 800; }

/* Зміст сторінки на телефоні: під смугою, згорнутий; з 900 px він у бічній панелі. */
.toc-mobile { background: var(--card); border-radius: var(--radius); padding: 4px 16px; }
.toc-mobile > summary { cursor: pointer; font-family: var(--font-display); font-weight: 700; min-height: 44px; display: flex; align-items: center; }
.toc-mobile .toc { padding: 0 0 8px; gap: 0; }
/* 22 px заввишки через 8 px - легко влучити в сусідній розділ. */
.toc-mobile .toc a { display: flex; align-items: center; min-height: 44px; }
@media (min-width: 900px) { .toc-mobile { display: none; } }
/* Сторінки без бічної панелі (розділ, студія) показують зміст на будь-якій ширині. */
@media (min-width: 900px) { .toc-mobile--always { display: block; } }
/* Згорнуті списки показують, що розкриваються: "+" і "−" праворуч. */
.toc-mobile > summary, .more-games > summary { list-style: none; gap: 12px; }
.toc-mobile > summary::-webkit-details-marker, .more-games > summary::-webkit-details-marker { display: none; }
.toc-mobile > summary::after, .more-games > summary::after { content: "+"; margin-left: auto; font-size: 22px; line-height: 1; color: var(--green); }
.toc-mobile[open] > summary::after, .more-games[open] > summary::after { content: "\2212"; }

/* Студії в рядку категорій: на телефоні під кнопкою, що розкривається, з 700 px - рядком. */
.cat-nav__row--wide { display: none; }
.cat-nav__summary { list-style: none; cursor: pointer; width: max-content; }
.cat-nav__summary::-webkit-details-marker { display: none; }
.cat-nav__summary::after { content: "+"; font-size: 18px; line-height: 1; color: var(--green); }
.cat-nav__more[open] > .cat-nav__summary::after { content: "\2212"; }
.cat-nav__more > .cat-nav__row { margin-top: 8px; }
@media (min-width: 700px) {
  .cat-nav__more { display: none; }
  .cat-nav__row--wide { display: flex; }
}

/* Одна кнопка на першому екрані (власник, 25.09.2026): нижня панель з'являється,
   коли кнопки вгорі сторінки (.hero-cta) вже не видно, і ховається, коли вона
   знову на екрані. Без JavaScript: анімація, прив'язана до прокрутки (Chrome і
   Android з версії 115, а це більшість телефонів у ПАР). Де браузер цього не вміє,
   і на сторінках без кнопки вгорі, панель стоїть завжди, як раніше. */
@supports (animation-timeline: view()) {
  body { timeline-scope: --hero-cta; }
  .hero-cta { view-timeline: --hero-cta block; }
  .sticky-cta {
    animation: sticky-reveal linear both;
    animation-timeline: --hero-cta;
    animation-range: exit 0% exit 100%;
  }
}
@keyframes sticky-reveal {
  from { transform: translateY(110%); visibility: hidden; }
  to { transform: none; visibility: visible; }
}


/* Нещодавно оновлені огляди на головній. */
.recent-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 0; }
.recent-list li { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between;
  gap: 4px 12px; padding: 10px 0; border-bottom: 1px solid var(--hairline); }
.recent-list a { font-weight: 700; }
.recent-list__meta { color: var(--muted); font-size: 13px; }
@media (min-width: 700px) { .recent-list { grid-template-columns: 1fr 1fr; column-gap: 32px; } }

/* Фільтри таблиць порівняння (app/filters.py): поля в сітку, на телефоні по два. */
.filters { margin: 4px 0 16px; }
.filters fieldset { border: 1px solid var(--hairline); border-radius: var(--radius); background: var(--card); padding: 12px 16px 16px; margin: 0; }
.filters legend { font-family: var(--font-display); font-weight: 700; font-size: 15px; padding: 0 6px; }
.filters__fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 12px; }
@media (min-width: 900px) { .filters__fields { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
.filters__field { display: grid; gap: 4px; font-size: 13px; font-weight: 700; color: var(--muted); }
.filters__field select { min-height: 44px; border: 1px solid var(--hairline); border-radius: 10px; background: var(--ground);
  color: var(--ink); font: inherit; font-weight: 600; font-size: 14px; padding: 0 10px; width: 100%; }
.filters__actions { display: flex; align-items: center; gap: 16px; margin-top: 12px; }
.filters__count { font-weight: 700; }
.filters__actions .btn { flex: 0 0 auto; width: auto; padding-inline: 28px; }
.filters__actions a { white-space: nowrap; }

/* Пошук по сайту (app/search.py). */
.search-form { display: grid; grid-template-columns: minmax(0, 1fr); gap: 8px; max-width: 640px; }
.search-form label { color: var(--on-dark); font-size: 14px; font-weight: 700; }
.search-form__row { display: flex; gap: 8px; }
.search-form input { flex: 1 1 auto; min-width: 0; min-height: 52px; border-radius: 12px; border: 1px solid transparent;
  padding: 0 14px; font: inherit; font-size: 16px; color: var(--ink); background: var(--card); }
.search-form .btn { flex: 0 0 auto; }
.search-results { list-style: none; margin: 0; padding: 0; }
.search-results li { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 4px 12px;
  padding: 10px 0; border-bottom: 1px solid var(--hairline); }
.search-results a { font-weight: 700; }
.search-results__kind { color: var(--muted); font-size: 13px; }
/* На телефоні тип завжди під назвою: інакше короткі назви мали його праворуч,
   довгі - під собою, і список виглядав рваним. */
.search-results li { flex-direction: column; }
@media (min-width: 700px) { .search-results li { flex-direction: row; } }

/* "З чого почати" на головній: чотири кроки новачка. На телефоні - компактний
   список з номерами (картки забирали 565 px першого екрана), з 700 px - картки
   у дві колонки, з 1100 px - у чотири. */
.start-steps { list-style: none; margin: 0; padding: 0; display: grid; gap: 0; counter-reset: start; }
.start-steps__item { counter-increment: start; position: relative; display: grid; gap: 2px;
  padding: 10px 0 10px 44px; border-bottom: 1px solid var(--hairline); }
.start-steps__item::before { content: counter(start); position: absolute; left: 0; top: 10px;
  width: 30px; height: 30px; border-radius: 50%; background: var(--accent); color: var(--ink);
  font-family: var(--font-display); font-weight: 700; font-size: 15px;
  display: grid; place-items: center; }
.start-steps__title { font-family: var(--font-display); font-weight: 700; font-size: 17px; color: var(--ink); }
.start-steps__text { color: var(--body-text); font-size: 15px; line-height: 1.45; }
@media (min-width: 700px) {
  .start-steps { grid-template-columns: 1fr 1fr; gap: 10px; }
  .start-steps__item { gap: 4px; background: var(--card); border: 1px solid var(--hairline);
    border-radius: var(--radius); padding: 14px 16px 14px 60px; }
  .start-steps__item::before { left: 16px; top: 14px; }
}
@media (min-width: 1100px) { .start-steps { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* Таблиця порівняння ігор (блок "compare"): підписи рядків ліворуч, по колонці
   на гру; на телефоні таблиця гортається вбік, як решта (підказка над нею). */
.compare-table th[scope="row"] { text-align: left; white-space: nowrap; color: var(--ink); font-weight: 700; }
.compare-table thead th, .compare-table td { vertical-align: top; }
.compare-table--wide thead th, .compare-table--wide td { min-width: 128px; }
.compare-table--wide thead th:first-child { min-width: 0; }
