Files
portal/web/index.html
T
Дмитрий 938066fefe docs(narrative)+web: narrative v8.4 partial (§1, §17, §26) + HTML-прототип 03 «Список сделок»
Narrative переработан под решения 04–06.05 + аудит партий 1–15:
- §1.4.1 — 7 конкурентных преимуществ vs оригинал crm.bp-gr.ru
- §1.5 — 3 формата ingress (webhook/manual/CSV), 3 чекбокса click-wrap
- §17.8 — Тихие часы (start_hour/end_hour 0..23, минимум 3 часа,
  общий timezone тенанта), паритет с партией 13.2.1
- §26 — полная замена под брендбук v1.1: палитра Teal (#0F6E56),
  сетка 4px, JetBrains Mono, маскирование credentials как
  антипаттерн оригинала.

Шапка narrative — блок «Что нового в v8.4» с маппингом 11 закрытых
вопросов из реестра v1.10. Остальные 9 разделов плана —
в Plan_narrative_v8_4.md (отдельные сессии).

web/03-deals.html — прототип «/deals»:
- Sidebar + topbar + balance widget (как 02-dashboard)
- Sticky-фильтры: поиск FTS, проект, статус, менеджер, период, теги,
  «только с напоминанием», кнопки Колонки/Экспорт/Создать
- Bulk-actions bar при выборе строк
- Таблица 20 демо-строк с 14 цветными статусами (включая 🔥 Горячий)
- Pagination, low-balance баннер, чекбоксы, sort-индикаторы
- Телефоны маскированы по правилу gitleaks `ru-phone-unmasked`
  и брендбуку §9 (формат +7 (XXX) ***-XX-XX)
- web/index.html: 03 → готов, счётчик 3/8

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 13:25:35 +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_3.md</code> §1–28 + Прил. Г для №08
</p>
</div>
</body>
</html>