Files
portal/web/v8/v8_billing.html
T
Дмитрий 887abf444e rebrand(v8.5→Лидерра): дизайн-handoff Платона v8 Forest + Лидпоток→Лидерра
Получен handoff-пакет liderra_v8_handoff/ от дизайнера Платона
(kpd9363@gmail.com) от 07.05.2026 — v8 Forest. Заказчик 08.05 решил
применить только в части дизайна, имени, логотипа. Функционал, состав
страниц и правила (CTO-11, click-wrap, SSO break-glass, 14 статусов
воронки) — без изменений (источник — ТЗ v8.5/schema v8.5).

Что сделано:

- Массовая замена Лидпоток→Лидерра (с учётом падежей: Лидерры/Лидерре)
  в 33 файлах (449 вхождений) — все .md/.sql/.json/.toml/.yml/.txt/.html,
  кроме исторических упоминаний внутри liderra_v8_handoff/
- Удалён docs/brandbook.md v1.1 — заменён на BRANDBOOK_v2.md из handoff
- Скопированы 13 концептов liderra_v8_handoff/concepts/v8_*.html в
  web/v8/. Удалены старые web/01-login.html, 02-dashboard.html,
  03-deals.html, index.html (палитра v1.1 deprecated)
- CLAUDE.md v1.0→v1.1: §0 (BRANDBOOK_v2 + DEVELOPER_HANDOFF в источниках),
  §2 (палитра Forest, Inter+JBM, Lucide), §5 п.6 (anti-pattern Inter
  снят — в Forest Inter наш основной шрифт), §6 (13 концептов в web/v8/)
- Реестр Открытые_вопросы_v8_3.md v1.12→v1.13: добавлена запись о
  ребрендинге + 4 точечных расхождений handoff vs ТЗ (статусы воронки,
  click-wrap чекбоксы, SSO fallback, axe violations)
- package.json/package-lock.json: name lidpotok→liderra

4 расхождения handoff vs ТЗ (НЕ применены, источник истины — ТЗ/schema):

1. 14 «обобщённых» статусов в BRANDBOOK_v2 §3.6 ≠ 14 slug'ов в
   schema.sql:2076 (совпадает 2 из 14: «Переговоры», «Оплачено»).
   Источник — schema/ТЗ §6.4 (реселлерская модель из аудита crm.bp-gr.ru,
   6 системных + 8 настраиваемых статусов).
2. 3-й click-wrap в v8_login.html («маркетинг-опционально») ≠ ТЗ §1.5/§4.1
   («согласие на ПДн», обязательное, OPEN-Ж-3).
3. SSO в v8_admin.html («локальный 2FA fallback») ≠ ТЗ OPEN-И-13
   (break-glass super_admin, локальный 2FA выключен).
4. Заявление «axe-core 4.10.2 — 0 violations» в README handoff — локально
   Pa11y 9.1.1 + axe нашёл 81 violation на 10/13 HTML (преимущественно
   color-contrast на декоративных separator'ах с --ink-disabled).
   Чисто: settings/errors/palette_options.

Что НЕ включено в коммит:
- лендинг/TZ_landing_v1_0.md — untracked, не моя работа в этой сессии
- .tmp/ — gitignored

Что осталось (для следующих сессий):
- Возможное переименование GitHub-репо CoralMinister/lidpotok → liderra
  (отдельное решение заказчика)
- Опционально: обратная связь Платону по 4 расхождениям handoff vs ТЗ

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 07:11:58 +03:00

371 lines
27 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>v8 · Биллинг — Лидерра (Forest)</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,400;14..32,500;14..32,600;14..32,700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
@media (prefers-reduced-motion: reduce) { .has-motion { animation: none !important; transition: none !important; } }
:root {
--bg: #F6F3EC; --surface: #FFFDFA; --sunken: #F0EDE4;
--hairline: #D9D5CD; --hairline-soft:#E8E3D6;
--ink: #081319; --ink-2: #343C41; --ink-3: #66635C; --ink-disabled: #92907B;
--accent: #0F6E56; --accent-tint: #E1EEEA; --accent-deep: #084635;
--side-bg: #012019; --side-text: #B1C2BD; --side-text-2: #7A8C87;
--side-active: #13382F; --side-icon: #5C7A72; --side-icon-act: #32C8A9;
--side-hover: #0A2A22; --side-border: #1A3A30;
--st-paid-solid: #007EB8; --st-wait-solid: #00889B; --st-fail-solid: #6C60C4;
--st-new-solid: #B94837; --st-quote-solid: #008A4D; --st-call-solid: #9A6700;
--r-xs:4px; --r-sm:6px; --r-md:10px; --r-lg:14px;
--font-ui:'Inter',system-ui,sans-serif;
--font-mono:'JetBrains Mono',ui-monospace,monospace;
}
body { background: var(--bg); color: var(--ink); font-family: var(--font-ui); font-feature-settings: 'cv11','ss01','ss03'; -webkit-font-smoothing: antialiased; font-variation-settings: 'opsz' 14; min-height: 100vh; }
a { color: inherit; text-decoration: none; }
button { font-family: inherit; }
a:focus-visible, button:focus-visible, input:focus-visible, [tabindex]:focus-visible {
outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-sm);
}
.skip-link { position: absolute; top: -40px; left: 12px; background: var(--ink); color: #fff; padding: 9px 16px; z-index: 200; font-weight: 600; border-radius: var(--r-sm); }
.skip-link:focus { top: 12px; }
/* Shell — same as v8_dashboard */
.app { display: grid; grid-template-columns: 232px 1fr; min-height: 100vh; }
.side { background: var(--side-bg); border-right: 1px solid var(--side-border); padding: 18px 12px 24px; position: sticky; top: 0; height: 100vh; overflow-y: auto; color: var(--side-text); }
.brand { display: flex; align-items: center; gap: 10px; padding: 6px 8px 18px; font-weight: 600; font-size: 14.5px; letter-spacing: -0.01em; font-variation-settings: 'opsz' 18; color: #FFFFFF; }
.brand-mark { width: 22px; height: 22px; border-radius: var(--r-xs); background: #FFFFFF; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; overflow: hidden; }
.brand-mark svg { width: 100%; height: 100%; display: block; }
.brand-dot { color: var(--side-icon-act); }
.nav { display: flex; flex-direction: column; gap: 1px; }
.nav-eyebrow { font-size: 11px; font-weight: 500; letter-spacing: 0.01em; color: var(--side-text-2); padding: 14px 10px 6px; }
.nav-item { display: flex; align-items: center; gap: 10px; height: 32px; padding: 0 10px; border-radius: var(--r-sm); font-size: 13px; color: var(--side-text); }
.nav-item:hover { background: var(--side-hover); color: #FFFFFF; }
.nav-item.active { background: var(--side-active); color: #FFFFFF; font-weight: 500; }
.nav-item.active .nav-icon { color: var(--side-icon-act); }
.nav-icon { width: 15px; height: 15px; flex-shrink: 0; color: var(--side-icon); stroke-width: 1.6; }
.nav-item:hover .nav-icon { color: #FFFFFF; }
.nav-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nav-count { font-family: var(--font-mono); font-size: 10.5px; font-weight: 500; font-feature-settings: 'tnum'; background: rgba(255,255,255,0.10); color: var(--side-text); padding: 2px 6px; border-radius: 4px; }
.main { display: flex; flex-direction: column; min-width: 0; }
.topbar { height: 48px; border-bottom: 1px solid var(--hairline); background: var(--surface); padding: 0 24px; display: flex; align-items: center; gap: 12px; position: sticky; top: 0; z-index: 50; }
.crumb { font-size: 12.5px; color: var(--ink-3); display: flex; align-items: center; gap: 8px; }
.crumb strong { color: var(--ink); font-weight: 500; }
.crumb svg { width: 11px; height: 11px; color: var(--ink-3); opacity: 0.5; }
.topbar-spacer { flex: 1; }
.user-chip { display: inline-flex; align-items: center; gap: 8px; height: 30px; padding: 0 10px 0 4px; border-radius: 100px; border: 1px solid var(--hairline); background: var(--surface); }
.user-chip .ava { width: 22px; height: 22px; border-radius: 50%; background: var(--ink); color: #fff; display: inline-flex; align-items: center; justify-content: center; font-size: 9.5px; font-weight: 600; }
.user-chip .uname { font-size: 12px; color: var(--ink); font-weight: 500; }
/* Page */
.content { padding: 24px 28px 80px; max-width: 1500px; margin: 0 auto; }
.page-h { display: flex; align-items: flex-end; justify-content: space-between; margin-bottom: 22px; gap: 16px; }
.page-title { font-size: 28px; font-weight: 600; font-variation-settings: 'opsz' 28; letter-spacing: -0.02em; line-height: 1.1; margin: 0 0 6px; }
.page-meta { font-size: 12.5px; color: var(--ink-3); display: flex; gap: 14px; align-items: center; }
.page-meta .num { font-family: var(--font-mono); font-feature-settings: 'tnum'; color: var(--ink-2); font-weight: 500; }
.page-meta .accent-num { color: var(--accent); font-weight: 600; }
.page-meta .sep { color: var(--ink-disabled); }
.btn { display: inline-flex; align-items: center; gap: 7px; height: 34px; padding: 0 14px; border-radius: var(--r-sm); border: 1px solid var(--hairline); background: var(--surface); font-size: 12.5px; font-weight: 500; color: var(--ink); cursor: pointer; font-family: inherit; letter-spacing: -0.005em; }
.btn:hover { border-color: var(--ink-disabled); background: var(--sunken); }
.btn-primary { background: var(--accent); color: #fff; border-color: var(--accent); }
.btn-primary:hover { background: var(--accent-deep); border-color: var(--accent-deep); }
.btn svg { width: 13px; height: 13px; stroke-width: 1.7; }
/* Wallet hero — 2 islands: ₽ + ГЦК */
.wallet-row { display: grid; grid-template-columns: 1.3fr 1fr 1fr; gap: 12px; margin-bottom: 18px; }
.wallet-card { background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-md); padding: 20px 22px; min-height: 158px; display: flex; flex-direction: column; gap: 12px; position: relative; overflow: hidden; }
.wallet-card.primary::before { content: ''; position: absolute; inset: -1px; border: 1px solid var(--accent); opacity: 0.55; border-radius: var(--r-md); pointer-events: none; }
.wallet-h { display: flex; align-items: center; justify-content: space-between; }
.wallet-label { font-size: 11.5px; color: var(--ink-3); font-weight: 500; }
.wallet-tag { font-family: var(--font-mono); font-size: 9.5px; font-weight: 600; letter-spacing: 0.06em; padding: 2px 6px; border-radius: 3px; background: var(--accent-tint); color: var(--accent-deep); }
.wallet-amount { display: flex; align-items: baseline; gap: 4px; }
.wallet-amount .num { font-family: var(--font-mono); font-feature-settings: 'tnum'; font-weight: 600; font-size: 38px; letter-spacing: -0.03em; line-height: 1; color: var(--ink); }
.wallet-amount .ru { font-family: var(--font-mono); font-size: 16px; color: var(--ink-3); }
.wallet-actions { display: flex; gap: 8px; margin-top: auto; }
.wallet-actions .btn { flex: 1; justify-content: center; }
.wallet-foot { font-size: 11.5px; color: var(--ink-2); font-family: var(--font-mono); font-feature-settings: 'tnum'; }
.wallet-foot strong { color: var(--accent); font-weight: 600; }
/* Tariff card */
.tariff-card { background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-md); padding: 18px 20px; min-height: 158px; display: flex; flex-direction: column; gap: 10px; }
.tariff-name { font-size: 16px; font-weight: 600; font-variation-settings: 'opsz' 18; letter-spacing: -0.012em; }
.tariff-feats { font-size: 11.5px; color: var(--ink-2); display: flex; flex-direction: column; gap: 4px; line-height: 1.4; }
.tariff-feats span { display: flex; align-items: center; gap: 6px; }
.tariff-feats .check { color: var(--accent); flex-shrink: 0; width: 11px; height: 11px; }
/* History panel */
.panel { background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-md); margin-bottom: 14px; overflow: hidden; }
.panel-h { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px 12px; gap: 12px; flex-wrap: wrap; }
.panel-h h2 { font-size: 16px; font-weight: 600; font-variation-settings: 'opsz' 18; letter-spacing: -0.012em; margin: 0; }
.panel-tabs { display: inline-flex; gap: 2px; padding: 2px; background: var(--sunken); border-radius: var(--r-sm); }
.panel-tabs button { height: 26px; padding: 0 10px; border: none; background: transparent; font-family: inherit; font-size: 11.5px; font-weight: 500; color: var(--ink-3); cursor: pointer; border-radius: 4px; }
.panel-tabs button.active { background: var(--surface); color: var(--ink); box-shadow: inset 0 0 0 1px var(--hairline); }
.tx-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.tx-table thead th { text-align: left; font-size: 10.5px; font-weight: 600; letter-spacing: 0.005em; color: var(--ink-2); padding: 9px 14px; background: var(--sunken); border-top: 1px solid var(--hairline); border-bottom: 1px solid var(--hairline); white-space: nowrap; }
.tx-table thead th.num { text-align: right; }
.tx-table tbody tr { border-bottom: 1px solid var(--hairline-soft); }
.tx-table tbody tr:last-child { border-bottom: none; }
.tx-table tbody tr:hover { background: var(--sunken); }
.tx-table tbody td { padding: 9px 14px; vertical-align: middle; }
.tx-table .tx-when { font-family: var(--font-mono); font-feature-settings: 'tnum'; font-size: 11.5px; color: var(--ink-3); }
.tx-table .tx-id { font-family: var(--font-mono); font-feature-settings: 'tnum'; font-size: 11.5px; color: var(--accent); }
.tx-table .tx-amount { font-family: var(--font-mono); font-feature-settings: 'tnum'; font-weight: 500; text-align: right; }
.tx-amount.up { color: var(--accent); }
.tx-amount.down { color: var(--ink); }
.tx-amount.refund { color: var(--st-fail-solid); }
.chip { display: inline-flex; align-items: center; gap: 6px; font-size: 11.5px; font-weight: 500; }
.chip .dot { width: 6px; height: 6px; border-radius: 50%; position: relative; }
.chip .dot::after { content: ''; position: absolute; inset: -1px; border-radius: 50%; border: 1px solid rgba(10,19,25,0.10); }
.chip-paid .dot { background: var(--st-quote-solid); }
.chip-pending .dot { background: var(--st-call-solid); }
.chip-failed .dot { background: var(--st-new-solid); }
.chip-refund .dot { background: var(--st-fail-solid); }
.pending-banner { background: #FFF8E5; border: 1px solid #F0D89E; border-radius: var(--r-md); padding: 12px 16px; margin-bottom: 18px; display: flex; align-items: center; gap: 12px; font-size: 12.5px; color: #614209; }
.pending-banner .ico { width: 18px; height: 18px; color: #B35100; flex-shrink: 0; }
.pending-banner strong { color: #4A2F00; font-weight: 600; }
.invoices-list { display: flex; flex-direction: column; }
.inv-row { display: grid; grid-template-columns: 110px 1fr auto auto; gap: 14px; padding: 11px 20px; border-bottom: 1px solid var(--hairline-soft); align-items: center; font-size: 12.5px; }
.inv-row:last-child { border-bottom: none; }
.inv-row:hover { background: var(--sunken); }
.inv-when { font-family: var(--font-mono); font-feature-settings: 'tnum'; font-size: 11.5px; color: var(--ink-3); }
.inv-name { color: var(--ink); }
.inv-name .sub { font-size: 11px; color: var(--ink-3); display: block; margin-top: 2px; }
.inv-amount { font-family: var(--font-mono); font-feature-settings: 'tnum'; font-weight: 500; text-align: right; }
.inv-action { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border: 1px solid var(--hairline); background: var(--surface); border-radius: var(--r-sm); font-size: 11.5px; color: var(--ink-2); cursor: pointer; font-family: inherit; }
.inv-action:hover { border-color: var(--ink-disabled); color: var(--ink); }
.inv-action svg { width: 11px; height: 11px; }
@media (max-width: 1100px) {
.app { grid-template-columns: 56px 1fr; }
.side { padding: 14px 6px; }
.brand .brand-text, .nav-eyebrow, .nav-text, .nav-item:not(.active) .nav-count { display: none; }
.nav-item { justify-content: center; padding: 0; }
.topbar { padding: 0 16px; }
.content { padding: 18px 18px 60px; }
.wallet-row { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 768px) {
.app { grid-template-columns: 1fr; }
.side { display: none; }
.topbar .crumb span:first-child { display: none; }
.page-h { flex-direction: column; align-items: flex-start; gap: 12px; }
.wallet-row { grid-template-columns: 1fr; }
.tx-table thead { display: none; }
.tx-table, .tx-table tbody, .tx-table tr, .tx-table td { display: block; width: 100%; }
.tx-table tbody tr { padding: 12px 16px; border-bottom: 1px solid var(--hairline-soft); }
.tx-table tbody td { padding: 3px 0; border: none; }
.inv-row { grid-template-columns: 1fr; }
.inv-row .inv-amount, .inv-row .inv-action { justify-self: flex-start; }
}
</style>
</head>
<body>
<a href="#main" class="skip-link">К контенту</a>
<div class="app">
<aside class="side" aria-label="Главное меню">
<div class="brand">
<span class="brand-mark" aria-hidden="true"><svg viewBox="0 0 48 48"><path d="M16 14 L16 34 L32 34" stroke="#012019" stroke-width="4.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="32" cy="34" r="3.5" fill="#0F6E56"/></svg></span>
<span class="brand-text">Лидерра<span class="brand-dot">.</span></span>
</div>
<nav class="nav">
<div class="nav-eyebrow">Работа</div>
<a class="nav-item" href="#"><svg class="nav-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/></svg><span class="nav-text">Дашборд</span></a>
<a class="nav-item" href="#"><svg class="nav-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 6h18M6 12h12M9 18h6"/></svg><span class="nav-text">Сделки</span><span class="nav-count">247</span></a>
<a class="nav-item" href="#"><svg class="nav-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="3" width="6" height="18"/><rect x="11" y="3" width="6" height="12"/></svg><span class="nav-text">Канбан</span></a>
<a class="nav-item" href="#"><svg class="nav-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 6v6l4 2"/><circle cx="12" cy="12" r="9"/></svg><span class="nav-text">Напоминания</span><span class="nav-count">12</span></a>
<div class="nav-eyebrow">Финансы</div>
<a class="nav-item active" href="#" aria-current="page"><svg class="nav-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="6" width="18" height="13" rx="1"/><path d="M3 10h18M7 15h3"/></svg><span class="nav-text">Биллинг</span></a>
<a class="nav-item" href="#"><svg class="nav-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 12h18M3 6h18M3 18h18"/></svg><span class="nav-text">Отчёты</span></a>
<div class="nav-eyebrow">Команда</div>
<a class="nav-item" href="#"><svg class="nav-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/></svg><span class="nav-text">Менеджеры</span><span class="nav-count">4</span></a>
<a class="nav-item" href="#"><svg class="nav-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="3"/></svg><span class="nav-text">Настройки</span></a>
</nav>
</aside>
<div class="main">
<div class="topbar">
<div class="crumb"><span>Рабочая область</span><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M9 18l6-6-6-6"/></svg><strong>Биллинг</strong></div>
<div class="topbar-spacer"></div>
<button type="button" class="user-chip" aria-label="Профиль · Иван Петров"><span class="ava" aria-hidden="true">ИП</span><span class="uname">Иван П.</span></button>
</div>
<main id="main" class="content">
<header class="page-h">
<div>
<h1 class="page-title">Биллинг и тарифы</h1>
<div class="page-meta">
<span><span class="accent-num num">14 250 ₽</span> кошелёк</span>
<span class="sep">·</span>
<span><span class="num">285</span> лидов запас</span>
<span class="sep">·</span>
<span>хватит на <span class="num">4 дня</span></span>
</div>
</div>
<button type="button" class="btn btn-primary"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>Пополнить баланс</button>
</header>
<!-- Pending banner -->
<div class="pending-banner" role="status" aria-live="polite">
<svg class="ico" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.7" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 8v4M12 16h.01"/></svg>
<span><strong>1 платёж в обработке</strong> — 5 000 ₽ от ЮKassa, начат 14:21. Авто-восстановление в 14:51 (30 мин). Кнопки «Отменить» нет — это техническое решение.</span>
</div>
<!-- Wallet + Tariff -->
<div class="wallet-row">
<article class="wallet-card primary" aria-labelledby="wallet-rub">
<div class="wallet-h"><span id="wallet-rub" class="wallet-label">Кошелёк ₽</span><span class="wallet-tag">LIVE</span></div>
<div class="wallet-amount"><span class="num">14 250</span><span class="ru"></span></div>
<div class="wallet-foot">мин. пополнение <strong>100 ₽</strong> · округление вниз ₽→лиды</div>
<div class="wallet-actions">
<button type="button" class="btn btn-primary"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>Пополнить</button>
<button type="button" class="btn"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 12h18M3 6h18M3 18h18"/></svg>Автопополнение</button>
</div>
</article>
<article class="wallet-card" aria-labelledby="wallet-leads">
<div class="wallet-h"><span id="wallet-leads" class="wallet-label">Баланс лидов (ГЦК)</span></div>
<div class="wallet-amount"><span class="num">285</span><span class="ru" style="font-style:normal">лидов</span></div>
<div class="wallet-foot">средняя цена <strong>50 ₽/лид</strong> · потрачено за месяц 412</div>
</article>
<article class="tariff-card" aria-labelledby="tariff-name">
<div class="wallet-label">Тариф</div>
<div id="tariff-name" class="tariff-name">Команда <span style="font-family:var(--font-mono);color:var(--accent);font-size:13px;font-weight:500">· 990 ₽/мес</span></div>
<div class="tariff-feats">
<span><svg class="check" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2.2" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg>до 10 проектов</span>
<span><svg class="check" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2.2" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg>4 менеджера + расширение</span>
<span><svg class="check" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2.2" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg>Канбан, Webhook, API</span>
</div>
<button type="button" class="btn" style="margin-top:auto;justify-content:center">Сменить тариф →</button>
</article>
</div>
<!-- Transactions -->
<section class="panel" aria-labelledby="tx-title">
<div class="panel-h">
<h2 id="tx-title">История транзакций</h2>
<div class="panel-tabs" role="tablist" aria-label="Тип операций">
<button type="button" role="tab" aria-selected="true" class="active">Все</button>
<button type="button" role="tab" aria-selected="false">Пополнения</button>
<button type="button" role="tab" aria-selected="false">Списания</button>
<button type="button" role="tab" aria-selected="false">Возвраты</button>
</div>
</div>
<table class="tx-table">
<thead>
<tr>
<th scope="col">Дата</th>
<th scope="col">Операция</th>
<th scope="col">ID</th>
<th scope="col">Статус</th>
<th class="num" scope="col">Сумма</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tx-when">07.05 · 14:21</td>
<td>Пополнение через ЮKassa</td>
<td class="tx-id">#TX-89421</td>
<td><span class="chip chip-pending"><span class="dot" aria-hidden="true"></span>В обработке</span></td>
<td class="tx-amount up">+ 5 000 ₽</td>
</tr>
<tr>
<td class="tx-when">07.05 · 11:14</td>
<td>Списание · 3 лида проект «Окна Москва»</td>
<td class="tx-id">#TX-89384</td>
<td><span class="chip chip-paid"><span class="dot" aria-hidden="true"></span>Проведён</span></td>
<td class="tx-amount down"> 6 600 ₽</td>
</tr>
<tr>
<td class="tx-when">07.05 · 09:48</td>
<td>Возврат лида #1018 · дубликат</td>
<td class="tx-id">#TX-89370</td>
<td><span class="chip chip-paid"><span class="dot" aria-hidden="true"></span>Проведён</span></td>
<td class="tx-amount refund">+ 2 200 ₽</td>
</tr>
<tr>
<td class="tx-when">06.05 · 22:06</td>
<td>Пополнение через ЮKassa</td>
<td class="tx-id">#TX-89312</td>
<td><span class="chip chip-paid"><span class="dot" aria-hidden="true"></span>Проведён</span></td>
<td class="tx-amount up">+ 10 000 ₽</td>
</tr>
<tr>
<td class="tx-when">06.05 · 18:32</td>
<td>Списание · 5 лидов проект «Натяжные потолки»</td>
<td class="tx-id">#TX-89286</td>
<td><span class="chip chip-paid"><span class="dot" aria-hidden="true"></span>Проведён</span></td>
<td class="tx-amount down"> 9 250 ₽</td>
</tr>
<tr>
<td class="tx-when">05.05 · 12:00</td>
<td>Списание абонентской платы тарифа «Команда»</td>
<td class="tx-id">#TX-89108</td>
<td><span class="chip chip-paid"><span class="dot" aria-hidden="true"></span>Проведён</span></td>
<td class="tx-amount down"> 990 ₽</td>
</tr>
<tr>
<td class="tx-when">04.05 · 16:42</td>
<td>Попытка пополнения через банковский перевод</td>
<td class="tx-id">#TX-88937</td>
<td><span class="chip chip-failed"><span class="dot" aria-hidden="true"></span>Отклонено</span></td>
<td class="tx-amount" style="color:var(--ink-3)">— 0 ₽</td>
</tr>
<tr>
<td class="tx-when">03.05 · 09:18</td>
<td>Возврат лида #998 · спам</td>
<td class="tx-id">#TX-88714</td>
<td><span class="chip chip-paid"><span class="dot" aria-hidden="true"></span>Проведён</span></td>
<td class="tx-amount refund">+ 1 850 ₽</td>
</tr>
</tbody>
</table>
</section>
<!-- Invoices -->
<section class="panel" aria-labelledby="inv-title">
<div class="panel-h">
<h2 id="inv-title">Счета и УПД</h2>
<button type="button" class="btn"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7,10 12,15 17,10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>Реестр XLSX</button>
</div>
<div class="invoices-list">
<div class="inv-row">
<span class="inv-when">07.05.2026</span>
<span class="inv-name">Счёт № 2026-0512<span class="sub">Тариф «Команда» · май 2026</span></span>
<span class="inv-amount">990 ₽</span>
<button type="button" class="inv-action"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>PDF</button>
</div>
<div class="inv-row">
<span class="inv-when">06.05.2026</span>
<span class="inv-name">УПД № УПД-2026-0492<span class="sub">Списания за апрель · 18 лидов</span></span>
<span class="inv-amount">29 850 ₽</span>
<button type="button" class="inv-action"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>1С 8.3 XML</button>
</div>
<div class="inv-row">
<span class="inv-when">05.05.2026</span>
<span class="inv-name">УПД № УПД-2026-0488<span class="sub">Списания за март · 24 лида</span></span>
<span class="inv-amount">38 100 ₽</span>
<button type="button" class="inv-action"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>1С 8.3 XML</button>
</div>
<div class="inv-row">
<span class="inv-when">01.04.2026</span>
<span class="inv-name">Счёт № 2026-0411<span class="sub">Тариф «Команда» · апрель 2026</span></span>
<span class="inv-amount">990 ₽</span>
<button type="button" class="inv-action"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>PDF</button>
</div>
</div>
</section>
</main>
</div>
</div>
</body>
</html>