/*
Theme Name: VPN 360 Ru
Theme URI: https://vpn360.help/
Author: VPN 360 Ru
Description: Тема сайта VPN 360 Ru — тарифы, подключение, ключ VLESS и клиенты Telegram-бота VPN 360.
Version: 1.0.1
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Text Domain: vpn360-help
*/

/* ============================================================
   ШРИФТ — хостится в теме, строкой к Google Fonts не подключается.
   Sofia Sans Condensed, вариативный по оси wght 300-800:
   два файла (cyrillic, latin) на 66 КБ дают все начертания темы.

   ВАЖНО ПРО КИРИЛЛИЦУ. У этого семейства ДЕФОЛТНЫЕ кириллические
   начертания — болгарские: б рисуется как 6, т как m, в как ẞ,
   л как ʌ, п как n. Русские формы лежат в фиче locl под langsys
   RUS и включаются только тогда, когда браузер знает язык текста.
   Поэтому в header.php жёстко стоит <html lang="ru"> — без него
   весь сайт молча наберётся болгарскими формами, без единой ошибки
   в консоли. Проверять кадром живой страницы, а не кодом.
   Субсеты взяты у Google как есть: в них сохранён GSUB с locl и все
   29 глифов .loclRUS. Если резать субсет своим pyftsubset —
   фичу locl сохранять явно, иначе русские формы исчезнут.

   Знака рубля U+20BD в этом шрифте НЕТ ни в исходнике, ни в субсете
   (рисуется пустым квадратом), поэтому цены пишутся словом «руб.».
   Форма записи задана в одном месте — v360_money() в functions.php.
   ============================================================ */

/* ---------- токены ---------- */
:root{
  --bg:#17181c;
  --surface:#1e2025;
  --surface-2:#26282f;
  --line:#34373f;
  --line-soft:#282b32;
  --text:#eef0f4;
  --muted:#9aa0ab;
  --accent:#ab47bc;
  --accent-text:#c98fd6;
  --accent-deep:#790e8b;
  --accent-tint:rgba(171,71,188,.12);

  --wrap:1240px;
  --col:780px;
  --gut:28px;

  --r:2px;
  --ease:cubic-bezier(.22,1,.36,1);
}

/* ---------- база ---------- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;
  background:var(--bg);
  color:var(--text);
  font-family:"Sofia Sans Condensed",system-ui,-apple-system,"Segoe UI",Arial,sans-serif;
  font-size:19px;
  line-height:1.62;
  font-weight:400;
  font-variant-numeric:tabular-nums;
  -webkit-font-smoothing:antialiased;
}
img{max-width:100%;height:auto;display:block}
a{color:var(--accent-text);text-decoration:none}
a:hover{text-decoration:underline}
h1,h2,h3{margin:0 0 .5em;font-weight:800;line-height:1.08;letter-spacing:-.01em}
h1{font-size:clamp(2.4rem,6vw,4.1rem)}
h2{font-size:clamp(1.7rem,3.4vw,2.5rem)}
h3{font-size:clamp(1.2rem,2vw,1.42rem);font-weight:700}
p{margin:0 0 1em}
ul,ol{margin:0 0 1em;padding-left:1.15em}
li{margin-bottom:.4em}
strong{font-weight:700}
:focus-visible{outline:2px solid var(--accent-text);outline-offset:3px}

.wrap{width:100%;max-width:var(--wrap);margin:0 auto;padding:0 var(--gut)}
.wrap--col{max-width:calc(var(--col) + var(--gut)*2)}
.lede{font-size:clamp(1.1rem,2vw,1.32rem);color:var(--muted);max-width:62ch;margin-bottom:1.6em}
.muted{color:var(--muted)}
.skip{position:absolute;left:-9999px}
.skip:focus{left:12px;top:12px;z-index:99;background:var(--accent);color:#fff;padding:10px 16px}

/* ---------- секции: сплошная лента, разделитель — линия с квадратом ---------- */
.sec{padding:clamp(52px,7vw,92px) 0;position:relative}
.sec + .sec::before{
  content:"";position:absolute;top:0;left:var(--gut);right:var(--gut);
  height:1px;background:var(--line-soft);
}
.sec + .sec::after{
  content:"";position:absolute;top:-3px;left:var(--gut);
  width:7px;height:7px;background:var(--accent);
}

/* ---------- шапка ---------- */
.hdr{position:sticky;top:0;z-index:40;background:rgba(23,24,28,.92);backdrop-filter:blur(10px);border-bottom:1px solid var(--line-soft)}
.hdr__in{display:flex;align-items:center;gap:14px;min-height:64px}
.logo{display:flex;align-items:center;gap:9px;color:var(--text);font-weight:800;font-size:1.28rem;letter-spacing:-.01em;flex:0 0 auto}
.logo:hover{text-decoration:none}
.logo__m{width:26px;height:26px;flex:0 0 auto}
/* Знак растровый, со своей скруглённой плашкой и уже прозрачными углами —
   собственного border-radius ему не задаём, иначе радиус удвоится. */
.hdr .logo__m{width:28px;height:28px}
.nav{display:flex;gap:2px;margin-left:auto;flex-wrap:wrap}
.nav a{color:var(--muted);font-size:.94rem;padding:7px 10px;border-radius:var(--r)}
.nav a:hover,.nav a[aria-current="page"]{color:var(--text);background:var(--surface-2);text-decoration:none}
/* В широкой строке места на все 11 пунктов нет: четыре скрыты здесь и
   остаются в бургере и в подвале. Ссылки из разметки НЕ убираются. */
@media(min-width:981px){.nav .nav__x{display:none}}
.hdr .btn{flex:0 0 auto;margin-left:10px}
.burger{display:none;flex:0 0 auto;width:42px;height:38px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r);cursor:pointer;padding:0}
.burger span{display:block;width:18px;height:2px;background:var(--text);margin:3px auto}

/* ---------- кнопки ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  padding:12px 22px;border:1px solid transparent;border-radius:var(--r);
  font:inherit;font-weight:700;font-size:1rem;line-height:1.1;
  cursor:pointer;white-space:nowrap;transition:background .18s var(--ease),color .18s var(--ease),border-color .18s var(--ease);
}
.btn:hover{text-decoration:none}
.btn--primary{background:var(--accent);color:#fff}
.btn--primary:hover{background:var(--accent-deep);color:#fff}
.btn--ghost{background:transparent;color:var(--text);border-color:var(--line)}
.btn--ghost:hover{border-color:var(--accent);color:var(--accent-text)}
.btn--xs{padding:7px 13px;font-size:.88rem}
.btn--wide{width:100%}
.cta-row{display:flex;gap:12px;flex-wrap:wrap;margin-top:26px}

/* ---------- первый экран: текст слева, табло справа ---------- */
.hero{padding:clamp(46px,6vw,78px) 0 clamp(40px,5vw,64px)}
.hero__grid{display:grid;grid-template-columns:minmax(0,1fr);gap:38px;align-items:start}
@media(min-width:980px){.hero__grid{grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:56px}}
.hero h1{margin-bottom:.34em}
.hero__facts{display:flex;flex-wrap:wrap;gap:10px 26px;margin-top:26px;padding-top:22px;border-top:1px solid var(--line-soft)}
.hero__fact{min-width:0}
.hero__fact b{display:block;font-size:1.5rem;font-weight:800;line-height:1.1}
.hero__fact span{font-size:.88rem;color:var(--muted)}

/* ============================================================
   ЦИФЕРБЛАТ — несущая форма первого экрана.
   Стоит в правой колонке hero на главной, «Серверы» и «Подключение».
   Раньше здесь было табло стран (.board) — снято 10.09.2026 по
   распоряжению владельца: список стран есть текстом на /servery/,
   дублировать его в первом экране не нужно.

   ЧИСТЫЙ CSS, БЕЗ CANVAS И БЕЗ requestAnimationFrame — намеренно.
   Отсюда два следствия, ради которых форма и выбрана такой:
   1) первый кадр рисуется синхронно при первой же отрисовке страницы;
      чернеющего холста при возврате из фоновой вкладки тут быть не может,
      потому что холста нет вовсе;
   2) вес первого экрана не растёт: ни одного лишнего байта JS и ни одной
      картинки, всё считает композитор по transform/opacity.

   Движение — только transform и opacity, раскладку не трогает.
   ============================================================ */
.dial{
  position:relative;aspect-ratio:1;width:100%;max-width:440px;margin-inline:auto;
  border:1px solid var(--line);border-radius:var(--r);background:var(--surface);
  overflow:hidden;contain:paint;
}
/* Сетка-подложка: та же роль, что у сетки в референсе, — задаёт масштаб. */
.dial__grid{
  position:absolute;inset:0;
  background-image:
    repeating-linear-gradient(to right,rgba(171,71,188,.07) 0 1px,transparent 1px 44px),
    repeating-linear-gradient(to bottom,rgba(171,71,188,.07) 0 1px,transparent 1px 44px);
  mask-image:radial-gradient(circle at 50% 50%,#000 30%,transparent 78%);
  -webkit-mask-image:radial-gradient(circle at 50% 50%,#000 30%,transparent 78%);
}
.dial__band,.dial__hand{
  position:absolute;left:50%;top:50%;border-radius:50%;
  transform:translate(-50%,-50%) rotate(0deg);
  animation:v360-spin linear infinite;
}
.dial__band--1{width:84%;height:84%;border:1px solid rgba(171,71,188,.34);animation-duration:52s}
.dial__band--2{width:63%;height:63%;border:1px dashed rgba(201,143,214,.5);animation-duration:34s;animation-direction:reverse}
.dial__band--3{width:44%;height:44%;border:1px solid rgba(171,71,188,.46);animation-duration:21s}
/* Акцентная дуга — «стрелка» циферблата, самый быстрый слой. */
.dial__hand{
  width:72%;height:72%;border:2px solid transparent;
  border-top-color:var(--accent);border-right-color:var(--accent-deep);
  animation-duration:8.5s;
}
/* Ядро: пульсирует масштабом и свечением, как core-pulse в референсе. */
.dial__seed{
  position:absolute;left:50%;top:50%;width:13%;height:13%;margin:0;border-radius:50%;
  transform:translate(-50%,-50%) scale(1);
  background:radial-gradient(circle at 50% 42%,#fff 0%,var(--accent-text) 38%,var(--accent) 72%,var(--accent-deep) 100%);
  box-shadow:0 0 18px var(--accent),0 0 44px var(--accent-deep);
  animation:v360-seed 5.6s ease-in-out infinite;
}
/* Искры: обёртка крутится вокруг центра и растёт, унося точку по радиусу. */
.dial__spark{
  position:absolute;inset:0;pointer-events:none;
  transform:rotate(var(--a)) scale(.18);opacity:0;
  animation:v360-drift var(--d) linear var(--t) infinite;
}
.dial__spark::after{
  content:"";position:absolute;left:50%;top:4%;width:5px;height:5px;margin-left:-2.5px;
  border-radius:50%;background:var(--accent-text);box-shadow:0 0 8px var(--accent);
}
@keyframes v360-spin{to{transform:translate(-50%,-50%) rotate(360deg)}}
@keyframes v360-seed{
  0%,100%{transform:translate(-50%,-50%) scale(1);box-shadow:0 0 18px var(--accent),0 0 44px var(--accent-deep)}
  50%    {transform:translate(-50%,-50%) scale(1.16);box-shadow:0 0 26px var(--accent),0 0 64px var(--accent-deep)}
}
@keyframes v360-drift{
  0%  {transform:rotate(var(--a)) scale(.18);opacity:0}
  14% {opacity:.9}
  100%{transform:rotate(var(--a)) scale(1.04);opacity:0}
}
/* Вне вьюпорта слои останавливаются: блок стоит в первом экране трёх
   страниц, крутить его при прокрученной странице незачем. */
.dial--rest .dial__band,
.dial--rest .dial__hand,
.dial--rest .dial__seed,
.dial--rest .dial__spark{animation-play-state:paused}

/* ---------- карточки / сетки ---------- */
.grid{display:grid;grid-template-columns:minmax(0,1fr);gap:16px}
@media(min-width:700px){.grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(min-width:900px){.grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(min-width:700px){.grid--4{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(min-width:1000px){.grid--4{grid-template-columns:repeat(4,minmax(0,1fr))}}
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:22px;min-width:0}
.card h3{margin-bottom:.4em}
.card p:last-child{margin-bottom:0}
.card__ico{width:22px;height:22px;color:var(--accent-text);margin-bottom:12px}

/* ---------- тарифы ---------- */
.plan{display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:24px;min-width:0}
.plan__term{font-weight:700;font-size:1.16rem;margin-bottom:10px}
.plan__price{font-size:2.5rem;font-weight:800;line-height:1.05;letter-spacing:-.02em}
.plan__dev{color:var(--muted);font-size:.94rem;margin:8px 0 20px}
.plan .btn{margin-top:auto}

/* ---------- шаги ---------- */
.steps{counter-reset:s;list-style:none;padding:0;margin:0;display:grid;gap:14px}
.steps li{counter-increment:s;position:relative;padding:18px 20px 18px 60px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r)}
.steps li::before{
  content:counter(s,decimal-leading-zero);position:absolute;left:20px;top:18px;
  font-weight:800;color:var(--accent-text);font-size:1.05rem;letter-spacing:.04em;
}
.steps li b{display:block;margin-bottom:3px}
.steps li p{margin:0;color:var(--muted);font-size:.96rem}

/* ---------- таблицы ---------- */
.tw{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r)}
table{border-collapse:collapse;width:100%;min-width:520px;font-size:.98rem}
th,td{padding:13px 16px;text-align:left;border-bottom:1px solid var(--line-soft);vertical-align:top}
th{font-weight:700;background:var(--surface-2);white-space:nowrap}
tr:last-child td{border-bottom:0}
@media(max-width:640px){
  .tw{border:0;overflow:visible}
  table,tbody,tr,td{display:block;width:100%;min-width:0}
  thead{display:none}
  tr{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);margin-bottom:12px;padding:6px 0}
  td{border-bottom:1px solid var(--line-soft);padding:10px 16px}
  tr td:last-child{border-bottom:0}
  td::before{content:attr(data-label);display:block;font-size:.78rem;color:var(--muted);margin-bottom:3px}
}

/* ---------- аккордеон (grid-template-rows, не max-height) ---------- */
.acc{border:1px solid var(--line);border-radius:var(--r);background:var(--surface);margin-bottom:10px;overflow:hidden}
.acc__q{display:flex;gap:14px;align-items:flex-start;justify-content:space-between;width:100%;padding:17px 20px;background:transparent;border:0;color:var(--text);font:inherit;font-weight:700;font-size:1.06rem;text-align:left;cursor:pointer}
.acc__mk{flex:0 0 auto;width:14px;height:14px;position:relative;margin-top:8px}
.acc__mk::before,.acc__mk::after{content:"";position:absolute;background:var(--accent-text);transition:transform .22s var(--ease)}
.acc__mk::before{left:0;top:6px;width:14px;height:2px}
.acc__mk::after{left:6px;top:0;width:2px;height:14px}
.acc.is-expanded .acc__mk::after{transform:scaleY(0)}
.acc__body{display:grid;grid-template-rows:0fr;transition:grid-template-rows .26s var(--ease)}
.acc.is-expanded .acc__body{grid-template-rows:1fr}
.acc__inner{overflow:hidden}
.acc__inner div{padding:0 20px 18px}
.acc__inner p:last-child{margin-bottom:0}

/* ---------- рейтинг / отзывы ---------- */
.score{display:flex;align-items:center;gap:18px;flex-wrap:wrap;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:22px;margin-bottom:26px}
.score__n{font-size:3.1rem;font-weight:800;line-height:1}
.stars{position:relative;display:inline-block;font-size:0;line-height:0}
.stars svg{width:21px;height:21px;fill:currentColor}
.stars__off{color:var(--line)}
.stars__on{position:absolute;left:0;top:0;overflow:hidden;color:var(--accent);white-space:nowrap}
.crit{display:grid;gap:10px;margin-top:6px}
.crit__r{display:grid;grid-template-columns:minmax(0,1fr) 46px;gap:12px;align-items:center;font-size:.95rem}
.crit__bar{grid-column:1/-1;height:3px;background:var(--line);position:relative}
.crit__bar i{position:absolute;left:0;top:0;bottom:0;background:var(--accent);display:block}
.rev{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:20px}
.rev__top{display:flex;justify-content:space-between;gap:12px;align-items:baseline;margin-bottom:9px;flex-wrap:wrap}
.rev__who{font-weight:700}
.rev__date{color:var(--muted);font-size:.85rem}

/* ---------- прочее ---------- */
.note{background:var(--surface-2);border-left:3px solid var(--accent);border-radius:0 var(--r) var(--r) 0;padding:16px 20px;margin:22px 0}
.note p:last-child{margin-bottom:0}
.related{display:flex;flex-wrap:wrap;gap:10px;margin-top:14px}
.related a{border:1px solid var(--line);border-radius:var(--r);padding:9px 15px;color:var(--text);font-size:.94rem}
.related a:hover{border-color:var(--accent);color:var(--accent-text);text-decoration:none}
.crumbs{font-size:.87rem;color:var(--muted);padding:18px 0 0}
.crumbs a{color:var(--muted)}
.crumbs span{margin:0 7px}

/* ---------- подвал ---------- */
.ftr{border-top:1px solid var(--line);padding:44px 0 34px;margin-top:20px;color:var(--muted);font-size:.94rem}
.ftr__top{display:grid;grid-template-columns:minmax(0,1fr);gap:26px;margin-bottom:26px}
@media(min-width:820px){.ftr__top{grid-template-columns:minmax(0,1.4fr) minmax(0,2fr)}}
.ftr__about{margin:12px 0 0;max-width:38ch}
/* Воздух над реф-кнопкой подвала — не меньше 28px. Задан классом, а не
   инлайновым style=, иначе из CSS его не переопределить. */
.ftr__cta{margin-top:30px}
.ftr__links{display:flex;flex-wrap:wrap;gap:8px 20px}
.ftr__links a{color:var(--muted)}
.ftr__dis{border-top:1px solid var(--line-soft);padding-top:18px;font-size:.86rem;line-height:1.55}

/* ---------- адаптив шапки ---------- */
@media(max-width:980px){
  .burger{display:block}
  .nav{
    display:grid;grid-template-rows:0fr;transition:grid-template-rows .24s var(--ease);
    position:absolute;left:0;right:0;top:100%;background:var(--bg);border-bottom:1px solid var(--line);
    margin:0;padding:0 var(--gut);
  }
  .nav > div{overflow:hidden;display:flex;flex-direction:column;gap:2px}
  /* Панель длинная (11 пунктов) — на невысоком телефоне нижние уходят
     за экран, поэтому раскрытая панель скроллится сама. */
  .hdr.is-expanded .nav > div{max-height:calc(100dvh - 72px);overflow-y:auto;overscroll-behavior:contain}
  .hdr.is-expanded .nav{grid-template-rows:1fr;padding-bottom:12px}
  .nav a{padding:11px 4px;font-size:1rem}
  .hdr__in{position:relative}
  /* Вправо строку шапки толкал только .nav со своим margin-left:auto.
     Здесь .nav уходит из потока (position:absolute), и без этой строки
     логотип, кнопка и бургер сбиваются влево, оставляя до 700px пустоты. */
  .hdr .btn{margin-left:auto}
  .burger{margin-left:8px}
}
@media(max-width:420px){
  :root{--gut:16px}
  body{font-size:18px}
  .logo{font-size:1.1rem}
  .hdr .btn{padding:10px 13px;font-size:.9rem}
  .dial{max-width:320px}
}

@media (prefers-reduced-motion:reduce){
  *{animation-duration:.01ms!important;transition-duration:.01ms!important}
  /* Общее правило выше только доводит цикл до последнего кадра, а у искр
     последний кадр — opacity:0, то есть циферблат остался бы без них.
     Поэтому здесь задан явный статичный кадр: движения нет, картинка
     полная. Это доступность, а не украшение — крутящаяся петля в первом
     экране без возможности её остановить бьёт по вестибулярному аппарату. */
  .dial__band,.dial__hand,.dial__seed,.dial__spark{animation:none!important}
  .dial__seed{transform:translate(-50%,-50%) scale(1)}
  .dial__spark{opacity:.75;transform:rotate(var(--a)) scale(.82)}
}
