/* Компоненты Mini App vpnberg — базовый слой (задача 4) + компоненты
   экранов (задачи 5–11). CSS-решения перенесены из design-reference/preview.html
   и адаптированы к токенам tokens.css. */

/* ---- Производные переменные тем (поверх tokens.css) ---- */
:root[data-theme="dark"]{
  --ok-bg:rgba(75,221,182,.13); --warn-bg:rgba(255,178,46,.13);
  --bad-bg:rgba(255,92,143,.14); --trial-bg:rgba(139,99,246,.18);
  --track:rgba(255,255,255,.09); --toast-bg:rgba(22,16,30,.90);
  --sel-glow:0 6px 22px rgba(143,121,255,.30); --bar-glow:0 0 10px rgba(143,121,255,.45);
  --link:#B9A6FF;
}
:root[data-theme="light"]{
  --ok-bg:rgba(20,168,133,.12); --warn-bg:rgba(255,178,46,.16);
  --bad-bg:rgba(210,47,99,.10); --trial-bg:rgba(124,82,240,.10);
  --track:#E9E7F2; --toast-bg:rgba(35,39,65,.92);
  --sel-glow:0 6px 18px rgba(124,82,240,.16); --bar-glow:none;
  --link:#6C4FE0;
}

/* ---- Типографика ---- */
.t22{font-size:22px;line-height:28px;font-weight:700;letter-spacing:-.3px;color:var(--text);}
.t17{font-size:17px;line-height:22px;font-weight:600;color:var(--text);}
.t15{font-size:15px;line-height:20px;color:var(--text);}
.t13{font-size:13px;line-height:16px;color:var(--hint);}
.t26{font-size:26px;line-height:32px;font-weight:700;letter-spacing:-.3px;color:var(--text);}
.num{font-variant-numeric:tabular-nums;}
.stack{display:flex;flex-direction:column;gap:var(--space-2);}
.hr{height:1px;background:var(--line);margin:var(--space-3) 0;}

.card{background:var(--card);border-radius:var(--radius);padding:var(--space-4);
  box-shadow:var(--shadow);}

.row{display:flex;align-items:center;gap:var(--space-3);min-height:48px;}
.row.tight{min-height:24px;gap:10px;}
.row .sp{margin-left:auto;}
.chev{margin-left:auto;color:var(--hint);font-size:20px;flex:none;}

/* Бейджи статуса подписки */
.badge{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:600;
  border-radius:999px;padding:5px 11px;}
.badge.ok{color:var(--ok);background:var(--ok-bg);}
.badge.trial{color:var(--trial);background:var(--trial-bg);}
.badge.bad{color:var(--bad);background:var(--bad-bg);}

/* Полоса трафика; >90 % — красный градиент (.danger) */
.bar{height:8px;border-radius:999px;background:var(--track);position:relative;}
.bar i{display:block;height:100%;border-radius:999px;background:var(--grad-line);
  box-shadow:var(--bar-glow);max-width:100%;}
.bar.danger i{background:linear-gradient(90deg,#FF5C8F,#F45BDF);box-shadow:none;}

/* Карточки продуктов (переходы с главного) */
.prod{display:flex;align-items:center;gap:var(--space-3);min-height:64px;cursor:pointer;}
.prod .ic{width:40px;height:40px;flex:none;border-radius:12px;display:flex;
  align-items:center;justify-content:center;font-size:20px;
  background:linear-gradient(135deg,rgba(244,91,223,.16),rgba(64,214,240,.16));
  border:1px solid var(--line);}
.prod .sub{margin-top:2px;}

/* Янтарный баннер неоплаченного счёта */
.unpaid{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);
  border-radius:var(--radius);background:var(--warn-bg);border-left:3px solid var(--warn);
  cursor:pointer;min-height:56px;}
.unpaid b{color:var(--text);font-size:15px;font-weight:600;}
.unpaid .chev{color:var(--warn);}

/* Список строк-переходов */
.list .row{cursor:pointer;}
.list .row+.row{border-top:1px solid var(--line);}

/* Счётчик устройств (кнопки 48×48 — тап-мишени) */
.stepper{display:flex;align-items:center;gap:var(--space-2);margin-left:auto;}
.stepper button{width:48px;height:48px;border-radius:12px;border:0;cursor:pointer;
  background:var(--chip);color:var(--text);font-size:22px;line-height:1;}
.stepper button:disabled{opacity:.35;cursor:default;}

/* Радио-карточки сроков; выбранная — градиентная рамка + галочка */
.durgrid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:var(--space-2);}
.dur{position:relative;border-radius:var(--radius);padding:12px 8px 10px;text-align:center;
  cursor:pointer;background:var(--card);border:1.5px solid var(--line);
  display:flex;flex-direction:column;align-items:center;gap:5px;min-height:96px;
  justify-content:center;}
.dur .d{font-size:13px;font-weight:600;color:var(--text);white-space:nowrap;}
.dur .p{font-size:17px;font-weight:700;color:var(--text);}
.dur .h{font-size:12px;line-height:14px;color:var(--hint);}
.dur .eco{font-size:11px;line-height:14px;font-weight:700;color:var(--ok);white-space:nowrap;}
.dur.sel{border-color:transparent;
  background:linear-gradient(var(--card),var(--card)) padding-box,
    linear-gradient(120deg,var(--neon-pink),var(--neon-mid),var(--neon-cyan)) border-box;
  box-shadow:var(--sel-glow);}
.dur.sel::after{content:"✓";position:absolute;top:-7px;right:-5px;width:20px;height:20px;
  border-radius:50%;background:var(--grad-line);color:#FFFFFF;font-size:12px;font-weight:700;
  display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(180,90,230,.5);}

/* Радио-строки (страны, способы оплаты) */
.optrow{display:flex;align-items:center;gap:var(--space-3);min-height:48px;cursor:pointer;}
.optrow .em{flex:none;min-width:34px;height:26px;padding:0 5px;border-radius:7px;
  background:var(--chip);display:flex;align-items:center;justify-content:center;
  font-size:16px;font-weight:700;letter-spacing:.5px;color:var(--text);}
.optrow .cap{margin-left:auto;color:var(--hint);font-size:13px;white-space:nowrap;flex:none;}
.radio{width:22px;height:22px;flex:none;border-radius:50%;border:2px solid var(--hint);
  display:flex;align-items:center;justify-content:center;margin-left:auto;}
.optrow .cap+.radio{margin-left:var(--space-2);}
.radio.on{border-color:transparent;background:var(--grad-line);}
.radio.on::after{content:"";width:8px;height:8px;border-radius:50%;background:#FFFFFF;}
.optrow.dis{opacity:.55;filter:saturate(.4);cursor:default;}
.busy{font-size:13px;font-weight:600;color:var(--warn);background:var(--warn-bg);
  border-radius:999px;padding:4px 10px;margin-left:auto;flex:none;white-space:nowrap;}

/* Переключатель (списание баллов) */
.switch{width:50px;height:30px;border-radius:999px;background:var(--track);
  position:relative;flex:none;cursor:pointer;margin-left:auto;transition:.2s;border:0;padding:0;}
.switch::after{content:"";position:absolute;top:2px;left:2px;width:26px;height:26px;
  border-radius:50%;background:#FFFFFF;box-shadow:0 2px 6px rgba(0,0,0,.25);transition:.2s;}
.switch.on{background:var(--primary);}
.switch.on::after{left:22px;}

/* Янтарный блок предупреждения (смена тарифа) */
.warncard{border-radius:var(--radius);padding:14px var(--space-4);background:var(--warn-bg);
  border-left:3px solid var(--warn);display:flex;flex-direction:column;gap:6px;}
.warncard .wt{font-size:15px;font-weight:600;color:var(--text);}
.warncard .wl{font-size:13px;line-height:17px;color:var(--text);opacity:.85;}
.warncard .wh{font-size:13px;line-height:17px;color:var(--hint);}

/* Ссылка в тексте (документы) */
.link{color:var(--link);text-decoration:underline;cursor:pointer;}

/* Скелеты загрузки */
.skel{position:relative;overflow:hidden;background:var(--chip);border-radius:8px;}
.skel::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.10),transparent);
  animation:skel-shimmer 1.4s infinite;}
@keyframes skel-shimmer{to{transform:translateX(100%);}}

.btn{display:flex;align-items:center;justify-content:center;width:100%;min-height:48px;
  border:0;border-radius:var(--radius-inner);background:var(--primary);color:#FFFFFF;
  font:inherit;font-weight:600;cursor:pointer;-webkit-user-select:none;user-select:none;}
.btn:active{background:var(--primary-down);}

/* Спиннер ожидания оплаты — кольцо conic (розовый → циан), оборот за 1 с */
.spin{width:46px;height:46px;border-radius:50%;
  background:conic-gradient(from 0deg,transparent 0 22%,var(--neon-pink) 55%,var(--neon-cyan) 100%);
  -webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 5px),#000 calc(100% - 4px));
          mask:radial-gradient(farthest-side,transparent calc(100% - 5px),#000 calc(100% - 4px));
  animation:spin-rot 1s linear infinite;}
@keyframes spin-rot{to{transform:rotate(360deg);}}

/* Марка успеха 76px: неоновое кольцо + радиальный ореол позади */
.glowmark{position:relative;width:76px;height:76px;border-radius:50%;margin:4px auto;}
.glowmark img{width:100%;height:100%;border-radius:50%;display:block;position:relative;z-index:1;}
.glowmark::before{content:"";position:absolute;inset:-5px;border-radius:50%;
  background:var(--grad-ring);z-index:0;
  -webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 4px),#000 calc(100% - 3px));
          mask:radial-gradient(farthest-side,transparent calc(100% - 4px),#000 calc(100% - 3px));}
.glowmark::after{content:"";position:absolute;inset:-26px;border-radius:50%;z-index:0;
  background:radial-gradient(closest-side,rgba(244,91,223,.30),rgba(64,214,240,.14),transparent 72%);}
:root[data-theme="light"] .glowmark::after{
  background:radial-gradient(closest-side,rgba(244,91,223,.18),rgba(64,214,240,.10),transparent 72%);}

/* Центрированная карточка (ожидание оплаты, успех) */
.centercard{display:flex;flex-direction:column;align-items:center;gap:10px;
  padding:var(--space-6) var(--space-4);text-align:center;}
.bigico{font-size:44px;line-height:1;}

/* Вторичная кнопка в теле экрана (главное действие — всегда MainButton) */
.btn.ghost{background:var(--chip);color:var(--text);}
.btn.ghost:active{background:var(--track);}

/* Сегмент-вкладки платформ (подключение) */
.tabs{display:flex;background:var(--chip);border-radius:12px;padding:2px;gap:2px;}
.tabs span{flex:1;display:flex;align-items:center;justify-content:center;height:44px;
  border-radius:10px;font-size:15px;color:var(--hint);cursor:pointer;}
.tabs .on{background:var(--card);color:var(--text);font-weight:600;
  box-shadow:0 2px 8px rgba(0,0,0,.14);}

/* Поле-ссылка с кнопкой копирования (тап по полю тоже копирует) */
.linkrow{display:flex;gap:var(--space-2);align-items:stretch;}
.linkfield{flex:1;min-width:0;display:block;min-height:48px;
  padding:0 var(--space-3);border-radius:var(--radius-inner);background:var(--chip);
  font:13px/48px Consolas,Menlo,monospace;color:var(--text);
  overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;}
.copybtn{width:48px;min-height:48px;flex:none;border-radius:var(--radius-inner);
  border:0;cursor:pointer;font-size:19px;background:var(--chip);color:var(--text);}

/* Тост (App.toast) — поверх нижнего бара */
#toast{position:fixed;left:50%;transform:translateX(-50%);bottom:82px;z-index:50;
  background:var(--toast-bg);color:#FFFFFF;font-size:15px;font-weight:500;
  padding:10px 18px;border-radius:12px;box-shadow:0 8px 24px rgba(0,0,0,.35);
  backdrop-filter:blur(6px);white-space:nowrap;}
#toast[hidden]{display:none;}

/* Разворачиваемый блок (запасной вариант Happ) */
.fold .fold-head{cursor:pointer;}
.fold .fold-chev{margin-left:auto;color:var(--hint);font-size:20px;flex:none;
  transition:transform .2s;}
.fold .fold-body{display:none;}
.fold.open .fold-body{display:flex;flex-direction:column;gap:var(--space-2);
  margin-top:var(--space-2);}
.fold.open .fold-chev{transform:rotate(90deg);}

/* Тело документа (docs/legal/*.html размечены под parse_mode=HTML:
   переводы строк значимы — pre-wrap сохраняет их как в боте) */
.doc-body{white-space:pre-wrap;font-size:15px;line-height:1.5;
  color:var(--text);overflow-wrap:break-word;}
.doc-body b{color:var(--text);}
.doc-body a{color:var(--link);}

/* Нижний бар — фолбэк MainButton вне Telegram. */
#devMain{position:fixed;left:0;right:0;bottom:0;z-index:40;background:var(--bg);
  padding:var(--space-2) var(--space-4) calc(var(--space-2) + env(safe-area-inset-bottom));
  box-shadow:0 -2px 12px rgba(0,0,0,.12);}
#devMain[hidden]{display:none;}
#devMain .btn{max-width:448px;margin-inline:auto;}

/* Кнопка «‹» в шапке — фолбэк BackButton вне Telegram. */
.back-btn{width:36px;height:44px;flex:none;border:0;background:transparent;
  color:var(--text);font-size:28px;line-height:1;cursor:pointer;padding:0;}
.back-btn[hidden]{display:none;}
