Files
portal/web/index.html
T
Дмитрий c8db9a26c4 docs(narrative): v8.4 финал (§23.10 + 13/13 + rename _v8_3 → _v8_4)
- §23.10 Админка SaaS: расширен с 5 до 10 подсекций — Биз-16
  (колонка «Желаемое × факт сегодня» с цветовым кодированием),
  Ю-2 (поставщики, дашборд маржи, сверка счетов), OPEN-Д-5/И-1
  (incidents_log: 8 типов × 4 severity, 24ч SLA уведомления РКН для
  data_breach по 152-ФЗ ст.18.1 ч.3.1), Прил. Д (workflow обращений
  субъектов ПДн с 30-дневным SLA), таблица преимуществ vs оригинал.
- Шапка narrative: убрано «in progress», блок «Что нового в v8.4»
  дополнен §23.10. Подвал: имя файла v8.4.
- Переименование: CRM_bp-gr_Инструкция_v8_3.md → _v8_4.md.
- Кросс-ссылки обновлены: CLAUDE.md (§0/§2/§6/§8 — версии, метрики
  схемы 53/86/33, счётчик прототипов 3/8), README.md (версии, статусы
  прототипов, репо CoralMinister), db/schema.sql, db/CHANGELOG_schema.md,
  web/index.html.
- .lychee.toml: exclude приватного github.com/CoralMinister/lidpotok
  (404 анонимно — норма).
- Plan_narrative_v8_4.md удалён (план v8.4 выполнен полностью, 13/13).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 19:14:53 +07:00

235 lines
10 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" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Прил. Л — Прототипы Лидпоток</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap&subset=cyrillic" rel="stylesheet" />
<style>
:root {
--teal-900: #04342C;
--teal-600: #0F6E56;
--teal-200: #5DCAA5;
--teal-50: #E1F5EE;
--gray-900: #1A1A1A;
--gray-700: #444441;
--gray-500: #888780;
--gray-200: #D3D1C7;
--gray-100: #F1EFE8;
--gray-50: #FAFAF8;
}
* { box-sizing: border-box; }
body {
margin: 0;
font-family: Inter, sans-serif;
background: var(--gray-100);
color: var(--gray-900);
line-height: 1.6;
}
.container { max-width: 880px; margin: 0 auto; padding: 64px 24px; }
.header {
display: flex; align-items: center; gap: 16px;
padding-bottom: 24px; border-bottom: 1px solid var(--gray-200); margin-bottom: 32px;
}
.header-mark {
display: flex; align-items: center; gap: 4px;
}
.header-mark span {
display: block; border-radius: 50%;
}
.header-mark span:nth-child(1) { width: 8px; height: 8px; background: var(--teal-600); opacity: 0.6; }
.header-mark span:nth-child(2) { width: 14px; height: 14px; background: var(--teal-600); opacity: 0.8; }
.header-mark span:nth-child(3) { width: 20px; height: 20px; background: var(--teal-600); }
.header-title { font-size: 22px; font-weight: 600; margin: 0; letter-spacing: -0.01em; }
.header-sub { font-size: 13px; color: var(--gray-500); margin-top: 2px; }
h1 { font-size: 32px; font-weight: 700; letter-spacing: -0.02em; margin: 0 0 8px; }
h1 + p { font-size: 16px; color: var(--gray-700); margin: 0 0 32px; max-width: 640px; }
.meta {
background: var(--teal-50); border: 1px solid var(--teal-200);
border-radius: 12px; padding: 16px 20px; margin-bottom: 40px;
font-size: 13px; color: var(--teal-900);
}
.meta strong { color: var(--teal-900); }
.screens { list-style: none; padding: 0; margin: 0; display: grid; gap: 12px; }
.screen {
display: flex; align-items: center; gap: 20px;
padding: 20px 24px; background: white;
border: 1px solid var(--gray-200); border-radius: 12px;
transition: border-color .15s ease, transform .05s ease;
text-decoration: none; color: inherit;
}
.screen:hover { border-color: var(--teal-600); }
.screen:active { transform: translateY(1px); }
.screen[aria-disabled="true"] {
opacity: 0.5; pointer-events: none;
background: var(--gray-50);
}
.screen-num {
flex: 0 0 40px; height: 40px;
border-radius: 8px;
background: var(--teal-50); color: var(--teal-600);
display: flex; align-items: center; justify-content: center;
font-weight: 600; font-size: 14px;
}
.screen[aria-disabled="true"] .screen-num { background: var(--gray-100); color: var(--gray-500); }
.screen-body { flex: 1; min-width: 0; }
.screen-title { font-size: 15px; font-weight: 500; margin: 0 0 2px; }
.screen-desc { font-size: 13px; color: var(--gray-500); margin: 0; }
.screen-status {
flex: 0 0 auto; font-size: 12px; font-weight: 500;
padding: 4px 10px; border-radius: 999px;
}
.screen-status.is-ready {
background: var(--teal-50); color: var(--teal-600);
}
.screen-status.is-pending {
background: var(--gray-100); color: var(--gray-500);
}
.screen-arrow { color: var(--gray-300); flex: 0 0 auto; }
.screen:hover .screen-arrow { color: var(--teal-600); }
.footer {
margin-top: 48px; padding-top: 24px;
border-top: 1px solid var(--gray-200);
font-size: 12px; color: var(--gray-500);
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<div class="header-mark" aria-hidden="true">
<span></span><span></span><span></span>
</div>
<div>
<p class="header-title">Лидпоток</p>
<p class="header-sub">Прил. Л — HTML-прототипы 8 экранов</p>
</div>
</div>
<h1>Прототипы клиентского приложения и админки SaaS</h1>
<p>HTML/CSS/JS-прототипы 8 ключевых экранов для дизайнера (Диз-1) и frontend-разработчика. Каждый файл самодостаточен — открывается двойным кликом, без сборки. Источник истины по визуалу — <code>brandbook.md</code> v1.1, по поведению — narrative v8.3.1.</p>
<div class="meta">
<strong>Версия:</strong> v0.2 от 06.05.2026 ·
<strong>Готовность:</strong> 3 / 8 экранов (01 + 02 + 03) ·
<strong>Создаётся итеративно:</strong> по одному экрану за сессию ·
<strong>Назначение:</strong> референс для Figma-макетов (Диз-1) и для frontend-команды на старте спринтов 1, 4, 5, 8, 14
</div>
<ul class="screens">
<li>
<a class="screen" href="01-login.html">
<div class="screen-num">01</div>
<div class="screen-body">
<p class="screen-title">Логин · Регистрация · 2FA · Recovery</p>
<p class="screen-desc">Email + пароль, регистрация с zxcvbn, TOTP с 6-значным кодом, 8 резервных кодов</p>
</div>
<span class="screen-status is-ready">Готово</span>
<svg class="screen-arrow" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
<line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/>
</svg>
</a>
</li>
<li>
<a class="screen" href="02-dashboard.html">
<div class="screen-num">02</div>
<div class="screen-body">
<p class="screen-title">Дашборд</p>
<p class="screen-desc">5 KPI-карточек, 2 графика (ApexCharts), последние сделки, баланс</p>
</div>
<span class="screen-status is-ready">Готово</span>
<svg class="screen-arrow" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
<line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/>
</svg>
</a>
</li>
<li>
<a class="screen" href="03-deals.html">
<div class="screen-num">03</div>
<div class="screen-body">
<p class="screen-title">Список сделок</p>
<p class="screen-desc">Таблица с фильтрами, 14 цветных статусов, массовые операции, пагинация, low-balance баннер</p>
</div>
<span class="screen-status is-ready">Готово</span>
<svg class="screen-arrow" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
<line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/>
</svg>
</a>
</li>
<li>
<a class="screen" aria-disabled="true">
<div class="screen-num">04</div>
<div class="screen-body">
<p class="screen-title">Карточка сделки</p>
<p class="screen-desc">Модалка/страница: статусы, теги, комментарии, напоминания, история</p>
</div>
<span class="screen-status is-pending">В очереди</span>
<span></span>
</a>
</li>
<li>
<a class="screen" aria-disabled="true">
<div class="screen-num">05</div>
<div class="screen-body">
<p class="screen-title">Канбан-доска</p>
<p class="screen-desc">Drag-and-drop по 14 статусам, optimistic UI, виртуализация колонок</p>
</div>
<span class="screen-status is-pending">В очереди</span>
<span></span>
</a>
</li>
<li>
<a class="screen" aria-disabled="true">
<div class="screen-num">06</div>
<div class="screen-body">
<p class="screen-title">Биллинг и тарифы</p>
<p class="screen-desc">Кошелёк, история операций, выбор тарифа, пополнение, счета и УПД</p>
</div>
<span class="screen-status is-pending">В очереди</span>
<span></span>
</a>
</li>
<li>
<a class="screen" aria-disabled="true">
<div class="screen-num">07</div>
<div class="screen-body">
<p class="screen-title">Настройки тенанта</p>
<p class="screen-desc">Профиль, проекты, токены API, интеграции, тихие часы, активные сессии</p>
</div>
<span class="screen-status is-pending">В очереди</span>
<span></span>
</a>
</li>
<li>
<a class="screen" aria-disabled="true">
<div class="screen-num">08</div>
<div class="screen-body">
<p class="screen-title">Админка SaaS</p>
<p class="screen-desc">Список тенантов, карточка тенанта, биллинг, impersonation, журналы</p>
</div>
<span class="screen-status is-pending">В очереди</span>
<span></span>
</a>
</li>
</ul>
<p class="footer">
Прил. Л v0.1 · Источник истины по визуалу: <code>brandbook.md</code> v1.1 ·
По поведению: <code>CRM_bp-gr_Инструкция_v8_4.md</code> §1–28 + Прил. Г для №08
</p>
</div>
</body>
</html>