Files
portal/liderra_v8_handoff/docs/index.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

570 lines
34 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>Лидерра · Developer Hub</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; }
: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-icon-act:#32C8A9;
--st-quote:#008A4D; --st-paid:#007EB8; --st-call:#9A6700; --st-new:#B94837; --st-fail:#6C60C4;
--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'; -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 {
outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-sm);
}
/* Top header (dark) */
.head {
background: var(--side-bg);
color: #fff;
padding: 28px 32px 32px;
}
.head-inner { max-width: 1280px; margin: 0 auto; }
.brand { display:flex; align-items:center; gap:10px; font-weight:600; font-size:18px; letter-spacing:-0.012em; font-variation-settings:'opsz' 18; }
.brand .mark { width:28px; height:28px; border-radius:6px; background:#fff; display:inline-flex; align-items:center; justify-content:center; overflow:hidden; }
.brand .mark svg { width:100%; height:100%; display:block; }
.brand .dot { color:var(--side-icon-act); }
.brand .tag { font-family:var(--font-mono); font-size:10px; font-weight:600; letter-spacing:0.06em; padding:3px 7px; border-radius:3px; background:rgba(50,200,169,0.15); color:var(--side-icon-act); margin-left:8px; }
.head h1 { font-size:36px; font-weight:600; font-variation-settings:'opsz' 32; letter-spacing:-0.022em; line-height:1.1; margin:18px 0 10px; max-width:760px; }
.head p { font-size:14.5px; color:#B1C2BD; line-height:1.55; margin:0; max-width:680px; letter-spacing:-0.005em; }
.head-meta { font-family:var(--font-mono); font-size:11.5px; color:#7A8C87; letter-spacing:-0.005em; margin-top:18px; display:flex; gap:14px; flex-wrap:wrap; }
.head-meta .num { color: var(--side-icon-act); font-weight: 600; }
/* Quick links bar */
.quicklinks { background:#0A2A22; border-top:1px solid #1A3A30; padding: 12px 32px; }
.quicklinks-inner { max-width: 1280px; margin: 0 auto; display: flex; gap: 14px; flex-wrap: wrap; align-items: center; }
.quicklinks .label { font-family:var(--font-mono); font-size:10.5px; color:#A0B5AE; letter-spacing:0.06em; font-weight:700; }
.quicklinks a { font-size: 12.5px; color: #B1C2BD; padding: 5px 10px; border-radius: 4px; transition: background 100ms; }
.quicklinks a:hover { background: rgba(255,255,255,0.06); color: #fff; }
/* Main */
.wrap { max-width: 1280px; margin: 0 auto; padding: 40px 32px 80px; }
.section-h { margin: 36px 0 18px; display: flex; align-items: baseline; justify-content: space-between; gap: 14px; }
.section-h:first-child { margin-top: 0; }
.section-h h2 { font-size: 22px; font-weight: 600; font-variation-settings:'opsz' 24; letter-spacing:-0.018em; margin: 0; }
.section-h .label { font-family:var(--font-mono); font-size:10.5px; font-weight:600; letter-spacing:0.06em; color:var(--accent); }
/* Card grid */
.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.grid.col2 { grid-template-columns: repeat(2, 1fr); }
.grid.col4 { grid-template-columns: repeat(4, 1fr); }
.card {
background: var(--surface);
border: 1px solid var(--hairline);
border-radius: var(--r-md);
padding: 18px 20px;
display: flex; flex-direction: column; gap: 6px;
text-decoration: none;
color: inherit;
transition: border-color 120ms ease, transform 120ms ease;
cursor: pointer;
}
.card:hover { border-color: var(--ink-disabled); transform: translateY(-1px); }
.card .num {
font-family: var(--font-mono);
font-size: 10.5px; font-weight: 600;
letter-spacing: 0.06em;
color: var(--ink-3);
text-transform: uppercase;
}
.card .name {
font-size: 16px; font-weight: 600;
font-variation-settings:'opsz' 18;
letter-spacing: -0.012em;
margin-top: 4px;
color: var(--ink);
}
.card .desc {
font-size: 12.5px;
color: var(--ink-2);
line-height: 1.5;
letter-spacing: -0.005em;
margin-top: 4px;
flex: 1;
}
.card .open {
display: inline-flex; align-items: center; gap: 4px;
margin-top: 8px;
color: var(--accent);
font-size: 12px; font-weight: 500;
}
.card .open svg { width: 11px; height: 11px; stroke-width: 1.7; }
/* Doc cards (markdown) */
.card.doc { border-left: 3px solid var(--accent); padding-left: 17px; }
/* Status pill on cards */
.pill {
display: inline-flex; align-items: center; gap: 6px;
padding: 2px 8px;
border-radius: 100px;
font-family: var(--font-mono);
font-size: 10px; font-weight: 600;
letter-spacing: 0.04em;
width: fit-content;
}
.pill.ready { background: var(--accent-tint); color: var(--accent-deep); }
.pill.ready::before { content: '●'; color: var(--accent); margin-right: 2px; }
/* Brand & tokens preview blocks */
.tokens {
background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-md);
padding: 22px 24px;
font-family: var(--font-mono);
font-size: 12.5px;
overflow-x: auto;
}
.tokens pre { margin: 0; line-height: 1.6; color: var(--ink-2); white-space: pre; }
.tokens .v { color: var(--accent); font-weight: 600; }
.tokens .c { color: var(--ink-3); font-style: normal; }
/* Palette swatches */
.swatches { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }
.sw { display: flex; flex-direction: column; gap: 4px; }
.sw .chip { height: 36px; border-radius: var(--r-sm); border: 1px solid var(--hairline-soft); }
.sw .label { font-size: 9.5px; color: var(--ink-3); font-family: var(--font-mono); font-feature-settings:'tnum'; letter-spacing:-0.005em; text-align:center; }
/* 14 status grid */
.statuses { display: grid; grid-template-columns: repeat(7, 1fr); gap: 8px; }
.st-card { background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-sm); padding: 10px 12px; display: flex; flex-direction: column; gap: 5px; }
.st-card .top { display: flex; align-items: center; gap: 7px; font-size: 11.5px; font-weight: 500; color: var(--ink); letter-spacing: -0.005em; }
.st-card .dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; position: relative; }
.st-card .dot::after { content:''; position:absolute; inset:-1px; border-radius:50%; border:1px solid rgba(10,19,25,0.10); }
.st-card .hex { font-family: var(--font-mono); font-size: 10px; color: var(--ink-3); letter-spacing:-0.005em; }
/* Brand display */
.brand-row {
display: grid;
grid-template-columns: 280px 1fr;
gap: 18px;
}
.brand-render {
background: var(--side-bg);
border-radius: var(--r-md);
padding: 36px 24px;
display: flex; flex-direction: column; align-items: center; gap: 14px;
}
.brand-render .big-mark { width: 80px; height: 80px; border-radius: 18px; background: #fff; display: inline-flex; align-items: center; justify-content: center; overflow: hidden; }
.brand-render .big-mark svg { width: 100%; height: 100%; }
.brand-render .wm { font-size: 28px; font-weight: 600; color: #fff; font-variation-settings:'opsz' 28; letter-spacing: -0.022em; }
.brand-render .wm .dot { color: var(--side-icon-act); }
.brand-info {
background: var(--surface);
border: 1px solid var(--hairline);
border-radius: var(--r-md);
padding: 22px 24px;
}
.brand-info dl { display: grid; grid-template-columns: 140px 1fr; row-gap: 10px; column-gap: 18px; margin: 0; font-size: 12.5px; }
.brand-info dt { color: var(--ink-3); font-size: 11px; font-weight: 500; padding-top: 2px; letter-spacing: -0.005em; }
.brand-info dd { margin: 0; color: var(--ink); letter-spacing: -0.005em; }
.brand-info dd.mono { font-family: var(--font-mono); font-feature-settings:'tnum'; font-size: 12px; }
@media (max-width: 1100px) {
.grid { grid-template-columns: 1fr 1fr; }
.grid.col4 { grid-template-columns: 1fr 1fr; }
.swatches { grid-template-columns: repeat(4, 1fr); }
.statuses { grid-template-columns: repeat(3, 1fr); }
.brand-row { grid-template-columns: 1fr; }
}
@media (max-width: 768px) {
.head { padding: 22px 18px 24px; }
.head h1 { font-size: 28px; }
.quicklinks { padding: 10px 18px; }
.wrap { padding: 28px 18px 60px; }
.grid, .grid.col2, .grid.col4 { grid-template-columns: 1fr; }
.swatches, .statuses { grid-template-columns: repeat(2, 1fr); }
}
</style>
</head>
<body>
<header class="head">
<div class="head-inner">
<a href="#" class="brand">
<span class="mark"><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 style="color:#fff">Лидерра<span class="dot">.</span></span>
<span class="tag">DEV HUB</span>
</a>
<h1>Всё, что нужно разработчику для портала Лидерра.</h1>
<p>Дизайн-система v8 Forest, 25 живых HTML-макетов, токены, компонентная библиотека и полный handoff. Production-ready по разметке, нужна только интеграция с реальными данными.</p>
<div class="head-meta">
<span><span class="num">25</span> макетов</span>
<span><span class="num">0</span> axe violations · WCAG 2.1 AA</span>
<span><span class="num">14</span> OKLCH-статусов · ΔE2000 ≥ 10.57</span>
<span><span class="num">4</span> viewports проверено · 1680/1440/768/375</span>
<span>v8 Forest · 2026-05-07</span>
</div>
</div>
</header>
<nav class="quicklinks" aria-label="Быстрые ссылки">
<div class="quicklinks-inner">
<span class="label">QUICK LINKS</span>
<a href="DEVELOPER_HANDOFF.md">📘 Полный handoff (markdown)</a>
<a href="BRANDBOOK_v2.md">🎨 Brandbook v2</a>
<a href="#screens">25 экранов</a>
<a href="#tokens">CSS токены</a>
<a href="#statuses">14 статусов</a>
<a href="../palette_v7.py">palette_v7.py</a>
<a href="../palette_14.py">palette_14.py</a>
</div>
</nav>
<main class="wrap">
<!-- ===== BRAND ===== -->
<header class="section-h">
<h2>Бренд</h2>
<span class="label">01 · brand</span>
</header>
<div class="brand-row">
<div class="brand-render">
<span class="big-mark"><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="wm">Лидерра<span class="dot">.</span></span>
</div>
<div class="brand-info">
<dl>
<dt>Имя</dt><dd>Лидерра (Liderra)</dd>
<dt>Wordmark</dt><dd>Лидерра<span style="color:var(--accent);font-weight:600">.</span> · с Teal-точкой</dd>
<dt>Знак</dt><dd>L-Square: белый rounded-square + dark stroke L + Teal-точка</dd>
<dt>Tone of voice</dt><dd>Уверенный, технический, прямой про деньги</dd>
<dt>Не использовать</dt><dd>«Лидпоток» (старое имя), lowercase «лидерра.»</dd>
<dt>Бренд-цвет</dt><dd class="mono">Teal #0F6E56 · oklch(0.46 0.10 175)</dd>
<dt>Bright variant</dt><dd class="mono">#32C8A9 · для иконок на тёмном sidebar</dd>
<dt>Палитра</dt><dd>Forest: warm ivory main + deep teal-noir sidebar</dd>
</dl>
</div>
</div>
<!-- ===== TOKENS ===== -->
<header class="section-h" id="tokens">
<h2>Дизайн-токены</h2>
<span class="label">02 · tokens</span>
</header>
<div style="margin-bottom: 16px">
<div style="font-size: 13px; color: var(--ink-2); margin-bottom: 14px; max-width: 760px; line-height: 1.55; letter-spacing: -0.005em">
Все цвета через OKLCH с проверкой WCAG AA. Скопировать в <code style="font-family:var(--font-mono);background:var(--sunken);padding:2px 6px;border-radius:3px;font-size:11.5px">assets/tokens.css</code> и подключить глобально. Полный список — в <a href="DEVELOPER_HANDOFF.md#3-дизайн-токены--css-variables" style="color:var(--accent);font-weight:500">handoff §3</a>.
</div>
<div class="tokens" tabindex="0" role="region" aria-label="CSS-токены палитры">
<pre>:root {
<span class="c">/* Поверхности (Forest light) */</span>
--bg: <span class="v">#F6F3EC</span>; <span class="c">/* page bg */</span>
--surface: <span class="v">#FFFDFA</span>; <span class="c">/* карточки */</span>
--sunken: <span class="v">#F0EDE4</span>;
--hairline: <span class="v">#D9D5CD</span>;
--hairline-soft: <span class="v">#E8E3D6</span>;
<span class="c">/* Текст */</span>
--ink: <span class="v">#081319</span>; <span class="c">/* 16.96:1 на bg */</span>
--ink-2: <span class="v">#343C41</span>; <span class="c">/* 10.34:1 */</span>
--ink-3: <span class="v">#66635C</span>; <span class="c">/* 5.42:1 */</span>
--ink-disabled: <span class="v">#92907B</span>; <span class="c">/* 3.48:1 — для UI, не для текста */</span>
<span class="c">/* Бренд */</span>
--accent: <span class="v">#0F6E56</span>; <span class="c">/* Teal · 5.94:1 на bg */</span>
--accent-tint: <span class="v">#E1EEEA</span>;
--accent-deep: <span class="v">#084635</span>;
<span class="c">/* Sidebar (тёмный) */</span>
--side-bg: <span class="v">#012019</span>;
--side-text: <span class="v">#B1C2BD</span>; <span class="c">/* 9.23:1 */</span>
--side-active: <span class="v">#13382F</span>;
--side-icon-act: <span class="v">#32C8A9</span>; <span class="c">/* bright Teal · 8.15:1 */</span>
}</pre>
</div>
</div>
<h3 style="font-size:14px;font-weight:600;margin:20px 0 10px;color:var(--ink-2);font-variation-settings:'opsz' 16">Поверхности и текст</h3>
<div class="swatches">
<div class="sw"><div class="chip" style="background:#F6F3EC"></div><div class="label">bg<br>F6F3EC</div></div>
<div class="sw"><div class="chip" style="background:#FFFDFA"></div><div class="label">surface<br>FFFDFA</div></div>
<div class="sw"><div class="chip" style="background:#F0EDE4"></div><div class="label">sunken<br>F0EDE4</div></div>
<div class="sw"><div class="chip" style="background:#D9D5CD"></div><div class="label">hairline<br>D9D5CD</div></div>
<div class="sw"><div class="chip" style="background:#081319"></div><div class="label">ink<br>081319</div></div>
<div class="sw"><div class="chip" style="background:#343C41"></div><div class="label">ink-2<br>343C41</div></div>
<div class="sw"><div class="chip" style="background:#66635C"></div><div class="label">ink-3<br>66635C</div></div>
</div>
<h3 style="font-size:14px;font-weight:600;margin:24px 0 10px;color:var(--ink-2);font-variation-settings:'opsz' 16">Бренд и sidebar</h3>
<div class="swatches">
<div class="sw"><div class="chip" style="background:#0F6E56"></div><div class="label">accent<br>0F6E56</div></div>
<div class="sw"><div class="chip" style="background:#084635"></div><div class="label">accent-deep<br>084635</div></div>
<div class="sw"><div class="chip" style="background:#E1EEEA"></div><div class="label">accent-tint<br>E1EEEA</div></div>
<div class="sw"><div class="chip" style="background:#012019"></div><div class="label">side-bg<br>012019</div></div>
<div class="sw"><div class="chip" style="background:#13382F"></div><div class="label">side-active<br>13382F</div></div>
<div class="sw"><div class="chip" style="background:#B1C2BD"></div><div class="label">side-text<br>B1C2BD</div></div>
<div class="sw"><div class="chip" style="background:#32C8A9"></div><div class="label">side-icon-act<br>32C8A9</div></div>
</div>
<!-- ===== STATUS PALETTE ===== -->
<header class="section-h" id="statuses">
<h2>14 статусов воронки</h2>
<span class="label">03 · status palette · ΔE2000 ≥ 10.57</span>
</header>
<div style="font-size:13px;color:var(--ink-2);margin-bottom:14px;max-width:760px;line-height:1.55;letter-spacing:-0.005em">
OKLCH-распределённые solid цвета для status-dots. Repulsion-итерация в <a href="../palette_14.py" style="color:var(--accent);font-weight:500">palette_14.py</a> гарантирует ΔE2000 ≥ 10 между соседними парами — статусы визуально различимы даже при цветовой слепоте средней степени.
</div>
<div class="statuses">
<div class="st-card"><div class="top"><span class="dot" style="background:#B94837"></span>Новая</div><div class="hex">#B94837</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#B35100"></span>В работе</div><div class="hex">#B35100</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#9A6700"></span>Дозвон</div><div class="hex">#9A6700</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#7E7500"></span>Не дозвон.</div><div class="hex">#7E7500</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#538200"></span>Переговоры</div><div class="hex">#538200</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#008A4D"></span>КП отправл.</div><div class="hex">#008A4D</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#008C7E"></span>Думает</div><div class="hex">#008C7E</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#00889B"></span>Ждёт оплату</div><div class="hex">#00889B</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#007EB8"></span>Оплачено</div><div class="hex">#007EB8</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#406DC8"></span>Возврат</div><div class="hex">#406DC8</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#6C60C4"></span>Отказ</div><div class="hex">#6C60C4</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#9052AE"></span>Дубликат</div><div class="hex">#9052AE</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#AA4788"></span>Спам</div><div class="hex">#AA4788</div></div>
<div class="st-card"><div class="top"><span class="dot" style="background:#B7445F"></span>Архив</div><div class="hex">#B7445F</div></div>
</div>
<!-- ===== SCREENS ===== -->
<header class="section-h" id="screens">
<h2>25 макетов</h2>
<span class="label">04 · screens · все 0 axe violations</span>
</header>
<h3 style="font-size:14px;font-weight:600;margin:8px 0 10px;color:var(--ink-2);font-variation-settings:'opsz' 16">Кабинет тенанта (8)</h3>
<div class="grid">
<a class="card" href="../concepts/v8_dashboard.html" target="_blank">
<span class="num">02 · /dashboard</span>
<span class="name">Дашборд</span>
<span class="desc">KPI strip · Hero balance с runway · Activity chart · Funnel · Recent deals · System health · Quick actions</span>
<span class="pill ready">PROD-READY</span>
<span class="open">Открыть макет <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
<a class="card" href="../concepts/v8_deals.html" target="_blank">
<span class="num">03 · /deals</span>
<span class="name">Список сделок</span>
<span class="desc">Таблица 14 строк · 14 status-chips · sticky thead · selected-row solid fill · slide-over drawer открыт</span>
<span class="pill ready">PROD-READY</span>
<span class="open">Открыть макет <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
<a class="card" href="../concepts/v8_deal_card.html" target="_blank">
<span class="num">04 · /deals/{id}</span>
<span class="name">Карточка сделки</span>
<span class="desc">Hero + параметры + комментарий с 8 шаблонами + напоминание · aside: менеджер + метрики + history (timeline)</span>
<span class="pill ready">PROD-READY</span>
<span class="open">Открыть макет <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
<a class="card" href="../concepts/v8_kanban.html" target="_blank">
<span class="num">05 · /deals/kanban</span>
<span class="name">Канбан-доска</span>
<span class="desc">14 колонок DnD (виртуализация-ready) · карточки с иконками 🔥 / ⏰ / ✓ · optimistic UI</span>
<span class="pill ready">PROD-READY</span>
<span class="open">Открыть макет <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
<a class="card" href="../concepts/v8_billing.html" target="_blank">
<span class="num">06 · /billing</span>
<span class="name">Биллинг и тарифы</span>
<span class="desc">Кошелёк ₽ · ГЦК баланс лидов · runway · pending-banner · история транзакций · счета и УПД (1С 8.3 XML)</span>
<span class="pill ready">PROD-READY</span>
<span class="open">Открыть макет <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
<a class="card" href="../concepts/v8_settings.html" target="_blank">
<span class="num">07 · /settings</span>
<span class="name">Настройки</span>
<span class="desc">8 вкладок · Профиль · Безопасность · Проекты · Команда · API/Webhook · Интеграции · Тихие часы · Уведомления</span>
<span class="pill ready">PROD-READY</span>
<span class="open">Открыть макет <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
<a class="card" href="../concepts/v8_reports.html" target="_blank">
<span class="num">08 · /reports</span>
<span class="name">Отчёты</span>
<span class="desc">Форма запроса · 4 типа · 4 формата · jobs (done / running с progressbar / queued / failed + retry) · квота 2/3</span>
<span class="pill ready">PROD-READY</span>
<span class="open">Открыть макет <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
<a class="card" href="../concepts/v8_login.html" target="_blank">
<span class="num">01 · /login и др.</span>
<span class="name">Вход / Регистр / 2FA</span>
<span class="desc">5 состояний: login · register с zxcvbn · 2FA (6-cell код) · forgot password · 8 recovery codes</span>
<span class="pill ready">PROD-READY</span>
<span class="open">Открыть макет <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
</div>
<h3 style="font-size:14px;font-weight:600;margin:24px 0 10px;color:var(--ink-2);font-variation-settings:'opsz' 16">Экраны ошибок (3)</h3>
<div class="grid col4">
<a class="card" href="../concepts/v8_errors.html#404" target="_blank">
<span class="num">09 · 404</span>
<span class="name">Не найдено</span>
<span class="desc">Декоративный SVG-маркер · кнопки «На дашборд» / «Назад» · mailto support</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_errors.html#403" target="_blank">
<span class="num">10 · 403</span>
<span class="name">Нет доступа</span>
<span class="desc">Replace-key SVG · REQ-id для копирования · контакт поддержки</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_errors.html#500" target="_blank">
<span class="num">11 · 500/503</span>
<span class="name">Сервис недоступен</span>
<span class="desc">Status-list (API/Telegram/YooKassa) · INC-id · ссылка на status page</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_errors.html" target="_blank">
<span class="num">все 3</span>
<span class="name">Switcher</span>
<span class="desc">Открыть файл с переключателем между состояниями</span>
<span class="open">Открыть <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
</div>
<h3 style="font-size:14px;font-weight:600;margin:24px 0 10px;color:var(--ink-2);font-variation-settings:'opsz' 16">Админка SaaS (6) · admin.liderra.app</h3>
<div class="grid">
<a class="card" href="../concepts/v8_admin.html#login" target="_blank">
<span class="num">12 · /admin/login</span>
<span class="name">SSO Yandex 360</span>
<span class="desc">Yandex 360 primary + локальный 2FA fallback · rate-limit 5/15 · captcha</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_admin.html#tenants" target="_blank">
<span class="num">13 · /admin/tenants</span>
<span class="name">Список тенантов</span>
<span class="desc">142 тенанта · фильтры · 4 статус-чипа (active/trial/overdue/suspended) · MRR · желаем×факт</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_admin.html#tenant-card" target="_blank">
<span class="num">14 · /admin/tenants/{id}</span>
<span class="name">Карточка тенанта</span>
<span class="desc">Профиль · баланс · корректировки · impersonation · удаление 152-ФЗ · журнал действий</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_admin.html#impersonation" target="_blank">
<span class="num">15 · impersonation</span>
<span class="name">Войти как клиент</span>
<span class="desc">Красный sticky banner · спец. avatar «Админ → ИП» · обязательный reason</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_admin.html#incidents" target="_blank">
<span class="num">16 · /admin/incidents</span>
<span class="name">Журнал инцидентов</span>
<span class="desc">HIGH/MED/LOW · read-only для compliance · webhook timeout / RLS bypass / payment retry</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_admin.html#system" target="_blank">
<span class="num">17 · /admin/system</span>
<span class="name">System settings</span>
<span class="desc">6 sys-cards: settings/tariffs/legal/payment/webhook_log/auth_log · только super_admin</span>
<span class="pill ready">PROD-READY</span>
</a>
</div>
<h3 style="font-size:14px;font-weight:600;margin:24px 0 10px;color:var(--ink-2);font-variation-settings:'opsz' 16">Лендинг и юр. (4)</h3>
<div class="grid col4">
<a class="card" href="../concepts/v8_landing.html#home" target="_blank">
<span class="num">18 · /</span>
<span class="name">Главная</span>
<span class="desc">Hero + 3 hi-cards · 6 features · 4 tariffs · FAQ · footer (контент Lorem ipsum, Диз-4 закрыт)</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_landing.html#pricing" target="_blank">
<span class="num">19 · /pricing</span>
<span class="name">Тарифы</span>
<span class="desc">4 заглушки · Start/Basic/Команда POPULAR/Enterprise · цены 1.00 ₽ на MVP</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_landing.html#offer" target="_blank">
<span class="num">20 · /legal/offer</span>
<span class="name">Договор-оферта</span>
<span class="desc">TOC · 8 разделов · шаблон Прил. Ж · ждёт регистрации ООО (Б-1)</span>
<span class="pill ready">PROD-READY</span>
</a>
<a class="card" href="../concepts/v8_landing.html#privacy" target="_blank">
<span class="num">21 · /legal/privacy</span>
<span class="name">Политика</span>
<span class="desc">TOC · 10 разделов · 152-ФЗ compliant · Yandex Cloud РФ</span>
<span class="pill ready">PROD-READY</span>
</a>
</div>
<!-- ===== DOCS ===== -->
<header class="section-h">
<h2>Документация</h2>
<span class="label">05 · docs</span>
</header>
<div class="grid col2">
<a class="card doc" href="DEVELOPER_HANDOFF.md">
<span class="num">📘 HANDOFF</span>
<span class="name">Developer Handoff</span>
<span class="desc">Главный документ. Стек, архитектура, токены, типографика, компоненты, все 25 экранов, WCAG-правила, Vue 3 + Vuetify 3 mapping, API hints, тестирование, FAQ. Открой первым.</span>
<span class="open">Открыть <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
<a class="card doc" href="BRANDBOOK_v2.md">
<span class="num">🎨 BRAND</span>
<span class="name">Brandbook v2</span>
<span class="desc">Имя, лого, палитра, типографика, do/don't, голос бренда, использование Teal #0F6E56. Деприкейтит старый брендбук Лидпоток v1.1.</span>
<span class="open">Открыть <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
<a class="card doc" href="../concepts/v8_brand.html" target="_blank">
<span class="num">BR-1</span>
<span class="name">10 имён + 5 логотипов (архив)</span>
<span class="desc">Все варианты, рассмотренные при выборе. Лидерра + L-Square — финальный выбор.</span>
<span class="open">Открыть <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
<a class="card doc" href="../concepts/v8_palette_options.html" target="_blank">
<span class="num">BR-2</span>
<span class="name">5 палитр на выбор (архив)</span>
<span class="desc">А Graphite · Б Forest (выбран) · В Slate-Blue · Г Champagne · Д Inverted Hero. Архив выбора палитры.</span>
<span class="open">Открыть <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</a>
</div>
<!-- ===== TECH ARTIFACTS ===== -->
<header class="section-h">
<h2>Технические артефакты</h2>
<span class="label">06 · scripts &amp; sources</span>
</header>
<div class="grid">
<a class="card" href="../palette_v7.py">
<span class="num">.py · OKLCH</span>
<span class="name">palette_v7.py</span>
<span class="desc">Расчёт всех cool-tech токенов с WCAG-проверкой. Python 3 + colour-science. Базовая палитра (унаследована Forest).</span>
</a>
<a class="card" href="../palette_14.py">
<span class="num">.py · OKLCH</span>
<span class="name">palette_14.py</span>
<span class="desc">14 hue-распределённых статусов с repulsion-итерацией. min ΔE2000 = 10.57. min/max/mean — выводит в console.</span>
</a>
<a class="card" href="../palette_options.py">
<span class="num">.py · OKLCH</span>
<span class="name">palette_options.py</span>
<span class="desc">5 вариантов палитры (А/Б/В/Г/Д) с side-by-side WCAG verification всех ключевых пар.</span>
</a>
<a class="card" href="../v4_critic.py">
<span class="num">.py · audit</span>
<span class="name">v4_critic.py</span>
<span class="desc">Критика старого v4 (cream + Instrument Serif). Контрасты, ΔE2000 между chip-фонами. Архив.</span>
</a>
</div>
</main>
</body>
</html>