Files
portal/web/v8/v8_deals.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

1439 lines
60 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 {
/* v8 Forest — warm ivory main + deep teal-noir sidebar (palette_options.py) */
--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;
/* Forest sidebar tokens */
--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;
/* 14 funnel statuses — OKLCH (palette_14.py, min ΔE2000 = 10.57) */
--st-new-tint: #FFD8CF; --st-new-solid: #B94837;
--st-work-tint: #FFDBC4; --st-work-solid: #B35100;
--st-call-tint: #F6E2BC; --st-call-solid: #9A6700;
--st-nocall-tint: #E9E8BD; --st-nocall-solid: #7E7500;
--st-neg-tint: #D9EDC6; --st-neg-solid: #538200;
--st-quote-tint: #C7F0D7; --st-quote-solid: #008A4D;
--st-think-tint: #BCF1E9; --st-think-solid: #008C7E;
--st-wait-tint: #BAF0F6; --st-wait-solid: #00889B;
--st-paid-tint: #C0ECFF; --st-paid-solid: #007EB8;
--st-refund-tint: #D1E5FF; --st-refund-solid: #406DC8;
--st-fail-tint: #E1E0FF; --st-fail-solid: #6C60C4;
--st-dup-tint: #F2DAFF; --st-dup-solid: #9052AE;
--st-spam-tint: #FFD7EE; --st-spam-solid: #AA4788;
--st-arch-tint: #FFD6DD; --st-arch-solid: #B7445F;
--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;
--row-h: 36px; /* table density: comfortable */
--row-h-compact: 28px;
}
body {
background: var(--bg);
color: var(--ink);
font-family: var(--font-ui);
font-feature-settings: 'cv11', 'ss01', 'ss03';
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-variation-settings: 'opsz' 14;
min-height: 100vh;
}
a { color: inherit; text-decoration: none; }
button { font-family: inherit; }
/* Focus — 2px ring of accent + 2px offset, WCAG 2.4.7 */
a:focus-visible, button:focus-visible, input:focus-visible,
select: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;
text-decoration: none; font-weight: 600;
border-radius: var(--r-sm);
}
.skip-link:focus { top: 12px; }
/* ============================================================
APP FRAME
============================================================ */
.app {
display: grid;
grid-template-columns: 232px 1fr;
min-height: 100vh;
}
/* ===== SIDEBAR — Forest dark teal-noir ===== */
.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);
transition: background 100ms ease, color 100ms ease;
}
.nav-item.has-motion { transition: background 100ms ease, color 100ms ease; }
.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-item.active .nav-count { background: rgba(255,255,255,0.14); color: #fff; }
.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 ===== */
.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; }
.searchbar {
display: inline-flex; align-items: center; gap: 8px;
height: 30px; padding: 0 10px 0 12px;
border: 1px solid var(--hairline);
border-radius: var(--r-sm);
background: var(--surface);
font-size: 12.5px; color: var(--ink-3);
cursor: pointer;
min-width: 280px;
transition: border-color 120ms ease;
}
.searchbar:hover { border-color: #BFC4C8; }
.searchbar svg { width: 13px; height: 13px; flex-shrink: 0; }
.searchbar kbd {
margin-left: auto;
font-family: var(--font-mono);
font-size: 10px;
color: var(--ink-3);
background: var(--sunken);
padding: 2px 5px;
border-radius: 3px;
border: 1px solid var(--hairline);
}
.icon-btn {
width: 30px; height: 30px;
border-radius: var(--r-sm);
border: 1px solid transparent;
background: transparent;
color: var(--ink-2);
display: inline-flex; align-items: center; justify-content: center;
cursor: pointer;
position: relative;
}
.icon-btn:hover { background: var(--sunken); color: var(--ink); }
.icon-btn .pip {
position: absolute; top: 5px; right: 5px;
width: 6px; height: 6px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 0 2px var(--surface);
}
.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;
letter-spacing: 0.02em;
}
.user-chip .uname { font-size: 12px; color: var(--ink); font-weight: 500; }
/* ===== CONTENT ===== */
.content { padding: 24px 28px 56px; flex: 1; }
/* Page head — no oversized display, just precise */
.page-head {
display: flex; align-items: flex-end; justify-content: space-between;
margin-bottom: 20px; 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-stats {
display: flex; gap: 14px;
font-size: 12.5px;
color: var(--ink-3);
align-items: center;
}
.page-stats .num {
font-family: var(--font-mono);
font-feature-settings: 'tnum';
color: var(--ink-2);
font-weight: 500;
}
.page-stats .accent-num { color: var(--accent); font-weight: 600; }
.page-stats .sep { color: var(--ink-disabled); }
.page-actions { display: flex; gap: 6px; flex-shrink: 0; }
.btn {
display: inline-flex; align-items: center; gap: 7px;
height: 32px; padding: 0 12px;
border-radius: var(--r-sm);
border: 1px solid var(--hairline);
background: var(--surface);
font-size: 12.5px;
font-weight: 500;
letter-spacing: -0.005em;
color: var(--ink);
cursor: pointer;
transition: border-color 120ms ease, background 120ms ease;
}
.btn:hover { border-color: #BFC4C8; 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; }
/* ===== FILTER BAR — segmented chips (status), search, density ===== */
.filterbar {
display: flex; align-items: center; gap: 10px;
padding: 8px 0 12px;
flex-wrap: wrap;
}
.chiprow { display: inline-flex; gap: 2px; padding: 2px; background: var(--sunken); border-radius: var(--r-sm); }
.chiprow button {
height: 26px; padding: 0 10px;
border: none; background: transparent;
font-family: inherit;
font-size: 12px; font-weight: 500;
color: var(--ink-2);
cursor: pointer;
border-radius: 4px;
letter-spacing: -0.005em;
display: inline-flex; align-items: center; gap: 6px;
}
.chiprow button.active { background: var(--surface); color: var(--ink); box-shadow: inset 0 0 0 1px var(--hairline); }
.chiprow button .badge {
font-family: var(--font-mono);
font-feature-settings: 'tnum';
font-size: 10px;
color: var(--ink-3);
font-weight: 500;
}
.chiprow button.active .badge { color: var(--accent); }
.search-input {
display: inline-flex; align-items: center; gap: 8px;
flex: 1; min-width: 220px;
height: 30px; padding: 0 10px;
border: 1px solid var(--hairline);
border-radius: var(--r-sm);
background: var(--surface);
}
.search-input svg { width: 13px; height: 13px; color: var(--ink-3); flex-shrink: 0; }
.search-input input {
flex: 1; min-width: 0;
border: none; outline: none; background: none;
font-family: inherit; font-size: 12.5px;
color: var(--ink);
}
.search-input input::placeholder { color: var(--ink-3); }
.search-input kbd {
font-family: var(--font-mono);
font-size: 9.5px;
color: var(--ink-3);
background: var(--sunken);
padding: 2px 4px;
border-radius: 3px;
border: 1px solid var(--hairline);
}
.fbtn {
height: 30px; padding: 0 10px;
border: 1px solid var(--hairline);
border-radius: var(--r-sm);
background: var(--surface);
font-family: inherit;
font-size: 12px;
color: var(--ink-2);
cursor: pointer;
display: inline-flex; align-items: center; gap: 6px;
}
.fbtn:hover { border-color: #BFC4C8; }
.fbtn svg { width: 12px; height: 12px; color: var(--ink-3); }
.fbtn .dropdown-arrow { width: 9px; height: 9px; opacity: 0.6; }
.applied {
display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
padding: 0 0 12px;
font-size: 11.5px; color: var(--ink-3);
}
.applied-chip {
display: inline-flex; align-items: center; gap: 5px;
height: 22px; padding: 0 4px 0 9px;
background: var(--surface);
border: 1px solid var(--hairline);
border-radius: 100px;
font-size: 11px; color: var(--ink-2);
font-weight: 500;
}
.applied-chip button {
width: 16px; height: 16px;
border: none; background: transparent;
border-radius: 50%;
display: inline-flex; align-items: center; justify-content: center;
color: var(--ink-3);
cursor: pointer;
padding: 0;
}
.applied-chip button:hover { background: var(--sunken); color: var(--ink); }
.applied-chip button svg { width: 8px; height: 8px; stroke-width: 2.5; }
.applied-clear {
border: none; background: none;
color: var(--ink-3);
text-decoration: underline; text-underline-offset: 3px;
font-size: 11px; cursor: pointer;
font-family: inherit;
padding: 0 6px;
}
.applied-clear:hover { color: var(--ink); }
/* ===== TABLE — hairline-only, no shadows ===== */
.tbl-wrap {
background: var(--surface);
border: 1px solid var(--hairline);
border-radius: var(--r-md);
overflow: hidden;
}
.tbl {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
.tbl thead th {
text-align: left;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.005em;
color: var(--ink-2);
padding: 10px 14px;
background: var(--sunken);
border-bottom: 1px solid var(--hairline);
white-space: nowrap;
position: sticky; top: 0;
}
.tbl thead th.sortable { cursor: pointer; user-select: none; }
.tbl thead th.sortable:hover { color: var(--ink); }
.tbl thead th.sortable .arrow { display: inline-block; margin-left: 4px; opacity: 0.55; font-family: var(--font-mono); font-size: 9.5px; }
.tbl thead th.sortable.is-sort .arrow { opacity: 1; color: var(--accent); }
.tbl thead th.cb-col { width: 36px; padding-right: 0; }
.tbl thead th.act-col { text-align: right; }
.tbl thead th.num { text-align: right; font-family: var(--font-mono); font-feature-settings: 'tnum'; }
.tbl tbody tr {
border-bottom: 1px solid var(--hairline-soft);
cursor: pointer;
transition: background 80ms ease;
}
.tbl tbody tr:hover { background: var(--sunken); }
.tbl tbody tr:last-child { border-bottom: none; }
.tbl tbody tr.selected { background: var(--ink); color: #fff; }
.tbl tbody tr.selected:hover { background: var(--ink); }
.tbl tbody tr.selected .deal-phone,
.tbl tbody tr.selected .cell-product,
.tbl tbody tr.selected .cell-manager,
.tbl tbody tr.selected .num-soft,
.tbl tbody tr.selected .cell-time { color: rgba(255,255,255,0.65); }
.tbl tbody tr.selected .cb { background: #fff; color: var(--ink); border-color: #fff; }
.tbl tbody tr.selected .row-action { color: rgba(255,255,255,0.7); }
.tbl tbody tr.selected .row-action:hover { background: rgba(255,255,255,0.12); color: #fff; }
.tbl tbody td {
padding: 9px 14px;
vertical-align: middle;
height: var(--row-h);
}
.tbl.is-compact tbody td { padding: 5px 14px; height: var(--row-h-compact); }
.cb {
width: 16px; height: 16px;
border: 1.5px solid var(--ink-disabled);
border-radius: 4px;
background: var(--surface);
cursor: pointer;
display: inline-flex; align-items: center; justify-content: center;
vertical-align: middle;
transition: border-color 100ms ease;
}
.cb:hover { border-color: var(--ink-2); }
.cb.checked { background: var(--ink); border-color: var(--ink); color: #fff; }
.cb svg { width: 10px; height: 10px; stroke-width: 3; }
/* deal cell with hairline-ring avatar */
.cell-deal { display: flex; align-items: center; gap: 10px; }
.deal-avatar {
width: 26px; height: 26px;
border-radius: 50%;
background: var(--sunken);
color: var(--ink-2);
display: inline-flex; align-items: center; justify-content: center;
font-size: 9.5px; font-weight: 600;
flex-shrink: 0;
letter-spacing: 0.02em;
position: relative;
}
.deal-avatar::after {
content: ''; position: absolute; inset: 0;
border-radius: 50%;
border: 1px solid rgba(10,19,25,0.08);
pointer-events: none;
}
.tbl tbody tr.selected .deal-avatar {
background: rgba(255,255,255,0.10);
color: #fff;
}
.tbl tbody tr.selected .deal-avatar::after { border-color: rgba(255,255,255,0.20); }
.deal-meta { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.deal-name {
font-weight: 500; color: inherit;
letter-spacing: -0.005em;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
max-width: 180px;
font-size: 13px;
}
.deal-phone {
font-family: var(--font-mono);
font-feature-settings: 'tnum';
font-size: 11px;
color: var(--ink-3);
letter-spacing: -0.005em;
}
/* status chip — dot + text, NO background by default (premium-quiet) */
.chip {
display: inline-flex; align-items: center; gap: 7px;
font-size: 12px;
font-weight: 500;
color: var(--ink);
letter-spacing: -0.005em;
white-space: nowrap;
}
.chip .dot {
width: 7px; height: 7px;
border-radius: 50%;
flex-shrink: 0;
position: relative;
}
.chip .dot::after {
content: ''; position: absolute; inset: -1px;
border-radius: 50%;
border: 1px solid rgba(10,19,25,0.10);
}
.tbl tbody tr.selected .chip .dot::after { border-color: rgba(255,255,255,0.18); }
.chip-new .dot { background: var(--st-new-solid); }
.chip-work .dot { background: var(--st-work-solid); }
.chip-call .dot { background: var(--st-call-solid); }
.chip-nocall .dot { background: var(--st-nocall-solid); }
.chip-neg .dot { background: var(--st-neg-solid); }
.chip-quote .dot { background: var(--st-quote-solid); }
.chip-think .dot { background: var(--st-think-solid); }
.chip-wait .dot { background: var(--st-wait-solid); }
.chip-paid .dot { background: var(--st-paid-solid); }
.chip-refund .dot { background: var(--st-refund-solid); }
.chip-fail .dot { background: var(--st-fail-solid); }
.chip-dup .dot { background: var(--st-dup-solid); }
.chip-spam .dot { background: var(--st-spam-solid); }
.chip-arch .dot { background: var(--st-arch-solid); }
/* tinted variant — used in drawer "current status" emphasis */
.chip-tinted {
padding: 3px 9px 3px 7px;
border-radius: 100px;
}
.chip-tinted.chip-new { background: var(--st-new-tint); }
.chip-tinted.chip-work { background: var(--st-work-tint); }
.chip-tinted.chip-call { background: var(--st-call-tint); }
.chip-tinted.chip-nocall { background: var(--st-nocall-tint); }
.chip-tinted.chip-neg { background: var(--st-neg-tint); }
.chip-tinted.chip-quote { background: var(--st-quote-tint); }
.chip-tinted.chip-think { background: var(--st-think-tint); }
.chip-tinted.chip-wait { background: var(--st-wait-tint); }
.chip-tinted.chip-paid { background: var(--st-paid-tint); }
.chip-tinted.chip-refund { background: var(--st-refund-tint); }
.chip-tinted.chip-fail { background: var(--st-fail-tint); }
.chip-tinted.chip-dup { background: var(--st-dup-tint); }
.chip-tinted.chip-spam { background: var(--st-spam-tint); }
.chip-tinted.chip-arch { background: var(--st-arch-tint); }
.cell-product { color: var(--ink-2); font-size: 12.5px; white-space: nowrap; }
.cell-manager {
display: flex; align-items: center; gap: 6px;
color: var(--ink-2);
font-size: 12.5px;
}
.mini-ava {
width: 18px; height: 18px;
border-radius: 50%;
background: var(--sunken);
color: var(--ink-2);
display: inline-flex; align-items: center; justify-content: center;
font-size: 8px; font-weight: 600;
position: relative;
}
.mini-ava::after {
content: ''; position: absolute; inset: 0;
border-radius: 50%;
border: 1px solid rgba(10,19,25,0.08);
}
.tbl tbody tr.selected .mini-ava {
background: rgba(255,255,255,0.12);
color: rgba(255,255,255,0.92);
}
.num {
font-family: var(--font-mono);
font-feature-settings: 'tnum';
font-size: 12.5px;
color: var(--ink);
text-align: right;
font-weight: 500;
letter-spacing: -0.01em;
}
.num-soft { color: var(--ink-disabled); }
.cell-time {
font-family: var(--font-mono);
font-feature-settings: 'tnum';
font-size: 11px;
color: var(--ink-3);
white-space: nowrap;
text-align: right;
letter-spacing: -0.005em;
}
.cell-actions { text-align: right; white-space: nowrap; }
.row-action {
width: 24px; height: 24px;
border: none; background: none;
color: var(--ink-3);
border-radius: 4px;
cursor: pointer;
display: inline-flex; align-items: center; justify-content: center;
}
.row-action:hover { background: rgba(10,19,25,0.06); color: var(--ink); }
.row-action svg { width: 13px; height: 13px; stroke-width: 1.7; }
.tbl-foot {
display: flex; justify-content: space-between; align-items: center;
padding: 10px 16px;
border-top: 1px solid var(--hairline);
background: var(--surface);
font-size: 12px; color: var(--ink-2);
}
.tbl-foot .lo { display: flex; align-items: center; gap: 14px; }
.tbl-foot .lo .num-line { font-family: var(--font-mono); font-feature-settings: 'tnum'; color: var(--ink-2); }
.tbl-foot .lo .num-line strong { color: var(--ink); font-weight: 600; }
.density-toggle {
display: inline-flex; gap: 1px;
border: 1px solid var(--hairline);
border-radius: var(--r-xs);
padding: 1px;
background: var(--surface);
}
.density-toggle button {
height: 22px; padding: 0 8px;
border: none; background: transparent;
font-family: inherit; font-size: 11px; color: var(--ink-3);
cursor: pointer; border-radius: 3px;
}
.density-toggle button.active { background: var(--ink); color: #fff; }
.pager { display: inline-flex; gap: 2px; align-items: center; }
.pager button {
height: 26px; min-width: 26px; padding: 0 8px;
border: 1px solid transparent;
border-radius: var(--r-xs);
background: transparent;
font-family: var(--font-mono);
font-size: 11px; font-weight: 500;
color: var(--ink-2);
cursor: pointer;
}
.pager button:hover:not(:disabled) { background: var(--sunken); color: var(--ink); }
.pager button.active { background: var(--ink); color: #fff; border-color: var(--ink); }
.pager button:disabled { opacity: 0.35; cursor: not-allowed; }
.pager .ellipsis { padding: 0 4px; color: var(--ink-3); font-size: 12px; }
/* ============================================================
SLIDE-OVER DRAWER — open static for demo
============================================================ */
.scrim {
position: fixed; inset: 0;
background: rgba(10,19,25,0.18);
z-index: 90;
backdrop-filter: blur(2px);
-webkit-backdrop-filter: blur(2px);
}
.drawer {
position: fixed; top: 0; right: 0; bottom: 0;
width: 440px;
background: var(--surface);
border-left: 1px solid var(--hairline);
z-index: 100;
display: flex; flex-direction: column;
overflow: hidden;
box-shadow: -16px 0 40px rgba(10,19,25,0.10);
}
.drawer-head {
padding: 18px 22px 14px;
border-bottom: 1px solid var(--hairline);
display: flex; align-items: flex-start; justify-content: space-between;
gap: 12px;
}
.drawer-title-block { min-width: 0; }
.drawer-eyebrow {
font-size: 11px;
font-weight: 500;
color: var(--ink-3);
letter-spacing: 0.005em;
margin-bottom: 6px;
}
.drawer-title-block h2 {
font-size: 22px;
font-weight: 600;
font-variation-settings: 'opsz' 22;
letter-spacing: -0.018em;
line-height: 1.2;
margin: 0 0 4px;
}
.drawer-title-block .meta {
font-size: 11.5px; color: var(--ink-3);
font-family: var(--font-mono);
font-feature-settings: 'tnum';
display: flex; gap: 10px; align-items: center;
}
.drawer-title-block .meta .id { color: var(--accent); }
.drawer-close {
border: 1px solid var(--hairline);
background: var(--surface);
width: 28px; height: 28px;
border-radius: var(--r-sm);
display: inline-flex; align-items: center; justify-content: center;
cursor: pointer; color: var(--ink-2);
flex-shrink: 0;
}
.drawer-close:hover { background: var(--sunken); color: var(--ink); }
.drawer-close svg { width: 13px; height: 13px; stroke-width: 1.7; }
.drawer-body {
flex: 1;
overflow-y: auto;
padding: 20px 22px 24px;
display: flex; flex-direction: column; gap: 22px;
}
.d-section { display: flex; flex-direction: column; gap: 10px; }
.d-section-label {
font-size: 11px;
color: var(--ink-3);
font-weight: 500;
letter-spacing: 0.005em;
}
.d-status-card {
display: flex; align-items: center; gap: 10px;
padding: 10px 12px;
background: var(--bg);
border: 1px solid var(--hairline);
border-radius: var(--r-sm);
}
.d-status-card .change-link {
margin-left: auto;
font-size: 12px;
color: var(--accent);
font-weight: 500;
cursor: pointer;
display: inline-flex; align-items: center; gap: 4px;
}
.d-status-card .change-link svg { width: 11px; height: 11px; stroke-width: 1.7; }
.d-grid {
display: grid;
grid-template-columns: 110px 1fr;
row-gap: 8px;
column-gap: 14px;
font-size: 13px;
}
.d-grid .k { color: var(--ink-3); font-size: 12px; }
.d-grid .v { color: var(--ink); }
.d-grid .v.mono { font-family: var(--font-mono); font-feature-settings: 'tnum'; font-size: 12px; }
.timeline {
display: flex; flex-direction: column; gap: 16px;
position: relative; padding-left: 18px;
}
.timeline::before {
content: ''; position: absolute;
left: 5px; top: 6px; bottom: 6px;
width: 1px;
background: var(--hairline);
}
.t-item { position: relative; }
.t-item::before {
content: ''; position: absolute;
left: -18px; top: 4px;
width: 11px; height: 11px;
border-radius: 50%;
background: var(--surface);
border: 1.5px solid var(--ink-disabled);
}
.t-item.done::before { background: var(--accent); border-color: var(--accent); }
.t-item.next::before { border-style: dashed; }
.t-time {
font-family: var(--font-mono);
font-feature-settings: 'tnum';
font-size: 10.5px;
color: var(--ink-3);
letter-spacing: -0.005em;
}
.t-text { font-size: 12.5px; color: var(--ink); margin-top: 2px; line-height: 1.5; }
.drawer-foot {
padding: 12px 22px;
border-top: 1px solid var(--hairline);
background: var(--bg);
display: flex; gap: 6px;
}
.drawer-foot .btn { flex: 1; justify-content: center; }
/* ============================================================
RESPONSIVE
============================================================ */
@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; }
.drawer { width: min(440px, calc(100vw - 56px)); }
.topbar { padding: 0 16px; }
.content { padding: 18px 18px 56px; }
.searchbar { min-width: 200px; }
}
@media (max-width: 768px) {
.app { grid-template-columns: 1fr; }
.side { display: none; }
.topbar .crumb span:first-child { display: none; }
.page-head { flex-direction: column; align-items: flex-start; gap: 12px; }
.page-title { font-size: 24px; }
.filterbar { gap: 8px; }
.chiprow { order: -1; width: 100%; overflow-x: auto; flex-wrap: nowrap; }
.search-input { order: 0; flex: 1 1 100%; }
.tbl thead { display: none; }
.tbl, .tbl tbody, .tbl tr, .tbl td { display: block; width: 100%; }
.tbl tbody { padding: 8px; }
.tbl tbody tr {
padding: 12px;
background: var(--surface);
border: 1px solid var(--hairline);
border-radius: var(--r-md);
margin-bottom: 8px;
}
.tbl tbody tr.selected { background: var(--ink); color: #fff; border-color: var(--ink); }
.tbl tbody td { padding: 3px 0; border: none; height: auto; }
.num, .cell-time { text-align: left; }
.cb-col, .cell-actions { display: none !important; }
.drawer { width: 100%; box-shadow: none; }
.tbl-foot { flex-direction: column; gap: 10px; align-items: flex-start; }
}
</style>
</head>
<body>
<a href="#main" class="skip-link">К контенту</a>
<div class="app">
<!-- ===== SIDEBAR ===== -->
<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 active" href="#" aria-current="page">
<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"/><rect x="19" y="3" width="2" height="8"/></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" href="#">
<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"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></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"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
<span class="nav-text">Настройки</span>
</a>
</nav>
</aside>
<!-- ===== MAIN ===== -->
<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="searchbar" aria-label="Поиск, ⌘K">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/></svg>
<span>Поиск</span>
<kbd>⌘K</kbd>
</button>
<button type="button" class="icon-btn" aria-label="Уведомления, есть новые">
<svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.7" aria-hidden="true"><path d="M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9M13.73 21a2 2 0 0 1-3.46 0"/></svg>
<span class="pip" aria-hidden="true"></span>
</button>
<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">
<!-- ===== Page head ===== -->
<header class="page-head">
<div>
<h1 class="page-title">Сделки</h1>
<div class="page-stats">
<span><span class="num accent-num">+3</span> новых лида с утра</span>
<span class="sep">·</span>
<span><span class="num">247</span> всего</span>
<span class="sep">·</span>
<span><span class="num">18</span> в работе</span>
<span class="sep">·</span>
<span><span class="num">4</span> ждут оплату</span>
</div>
</div>
<div class="page-actions">
<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>
<span>Экспорт</span>
</button>
<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>
<span>Новая сделка</span>
</button>
</div>
</header>
<!-- ===== Filter bar ===== -->
<div class="filterbar" role="search" aria-label="Фильтры сделок">
<div class="chiprow" role="tablist" aria-label="Срез статусов">
<button type="button" role="tab" aria-selected="false">Все <span class="badge">247</span></button>
<button type="button" role="tab" aria-selected="true" class="active">Активные <span class="badge">8</span></button>
<button type="button" role="tab" aria-selected="false">Ждут оплату <span class="badge">4</span></button>
<button type="button" role="tab" aria-selected="false">Закрытые <span class="badge">230</span></button>
<button type="button" role="tab" aria-selected="false">Невалидные <span class="badge">5</span></button>
</div>
<label class="search-input">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/></svg>
<input type="search" placeholder="Поиск: имя, телефон, проект…" aria-label="Поиск по сделкам">
<kbd>/</kbd>
</label>
<button type="button" class="fbtn" aria-haspopup="listbox">
<span>Проект:</span><strong>Окна Москва</strong>
<svg class="dropdown-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
</button>
<button type="button" class="fbtn" aria-haspopup="listbox">
<span>Менеджер:</span><strong>Все</strong>
<svg class="dropdown-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
</button>
<button type="button" class="fbtn" aria-haspopup="listbox">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M22 3H2l8 9.46V19l4 2v-8.54L22 3z"/></svg>
<span>Ещё</span>
</button>
</div>
<!-- ===== Applied filters ===== -->
<div class="applied" aria-label="Активные фильтры">
<span>Применено:</span>
<span class="applied-chip">
активные
<button type="button" aria-label="Убрать фильтр активные"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg></button>
</span>
<span class="applied-chip">
Окна Москва
<button type="button" aria-label="Убрать фильтр Окна Москва"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg></button>
</span>
<button type="button" class="applied-clear">сбросить всё</button>
</div>
<!-- ===== Table ===== -->
<div class="tbl-wrap">
<table class="tbl">
<thead>
<tr>
<th class="cb-col" scope="col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать все"></span></th>
<th class="sortable is-sort" scope="col">Лид <span class="arrow" aria-hidden="true"></span></th>
<th scope="col">Статус</th>
<th scope="col">Проект</th>
<th scope="col">Менеджер</th>
<th class="num sortable" scope="col">Стоимость <span class="arrow" aria-hidden="true"></span></th>
<th class="num sortable" scope="col">Время</th>
<th class="act-col" scope="col"><span style="position:absolute;left:-9999px">Действия</span></th>
</tr>
</thead>
<tbody>
<tr class="selected">
<td class="cb-col"><span class="cb checked" role="checkbox" aria-checked="true" tabindex="0" aria-label="Выбрать сделку Анна Соколова"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">АС</span>
<span class="deal-meta">
<span class="deal-name">Анна Соколова</span>
<span class="deal-phone">+7 (916) 871-23-45</span>
</span>
</div>
</td>
<td><span class="chip chip-new"><span class="dot" aria-hidden="true"></span>Новая</span></td>
<td class="cell-product">Натяжные потолки</td>
<td><span class="cell-manager"><span class="mini-ava">ИП</span>Иван П.</span></td>
<td class="num">1 850&nbsp;</td>
<td class="cell-time">28м</td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Анна Соколова"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Иван Петров"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">ИП</span>
<span class="deal-meta">
<span class="deal-name">Иван Петров</span>
<span class="deal-phone">+7 (909) 234-56-78</span>
</span>
</div>
</td>
<td><span class="chip chip-neg"><span class="dot" aria-hidden="true"></span>Переговоры</span></td>
<td class="cell-product">Окна Москва</td>
<td><span class="cell-manager"><span class="mini-ava">ИП</span>Иван П.</span></td>
<td class="num">2 200&nbsp;</td>
<td class="cell-time"></td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Иван Петров"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Дмитрий Котов"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">ДК</span>
<span class="deal-meta">
<span class="deal-name">Дмитрий Котов</span>
<span class="deal-phone">+7 (985) 119-87-23</span>
</span>
</div>
</td>
<td><span class="chip chip-paid"><span class="dot" aria-hidden="true"></span>Оплачено</span></td>
<td class="cell-product">Окна Москва</td>
<td><span class="cell-manager"><span class="mini-ava">МС</span>Мария С.</span></td>
<td class="num">2 200&nbsp;</td>
<td class="cell-time"></td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Дмитрий Котов"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Михаил Орлов"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">МО</span>
<span class="deal-meta">
<span class="deal-name">Михаил Орлов</span>
<span class="deal-phone">+7 (926) 781-34-22</span>
</span>
</div>
</td>
<td><span class="chip chip-wait"><span class="dot" aria-hidden="true"></span>Ждёт оплату</span></td>
<td class="cell-product">Натяжные потолки</td>
<td><span class="cell-manager"><span class="mini-ava">ИП</span>Иван П.</span></td>
<td class="num">1 850&nbsp;</td>
<td class="cell-time"></td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Михаил Орлов"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Елена Васильева"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">ЕВ</span>
<span class="deal-meta">
<span class="deal-name">Елена Васильева</span>
<span class="deal-phone">+7 (903) 456-12-09</span>
</span>
</div>
</td>
<td><span class="chip chip-call"><span class="dot" aria-hidden="true"></span>Дозвон</span></td>
<td class="cell-product">Кухни на заказ</td>
<td><span class="cell-manager"><span class="mini-ava">МС</span>Мария С.</span></td>
<td class="num">3 100&nbsp;</td>
<td class="cell-time"></td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Елена Васильева"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Сергей Новиков"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">СН</span>
<span class="deal-meta">
<span class="deal-name">Сергей Новиков</span>
<span class="deal-phone">+7 (962) 014-78-91</span>
</span>
</div>
</td>
<td><span class="chip chip-fail"><span class="dot" aria-hidden="true"></span>Отказ</span></td>
<td class="cell-product">Окна Москва</td>
<td><span class="cell-manager"><span class="mini-ava">ИП</span>Иван П.</span></td>
<td class="num">2 200&nbsp;</td>
<td class="cell-time"></td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Сергей Новиков"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Ольга Громова"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">ОГ</span>
<span class="deal-meta">
<span class="deal-name">Ольга Громова</span>
<span class="deal-phone">+7 (965) 552-09-71</span>
</span>
</div>
</td>
<td><span class="chip chip-quote"><span class="dot" aria-hidden="true"></span>КП отправлено</span></td>
<td class="cell-product">Кухни на заказ</td>
<td><span class="cell-manager"><span class="mini-ava">МС</span>Мария С.</span></td>
<td class="num">3 100&nbsp;</td>
<td class="cell-time"></td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Ольга Громова"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Артём Лебедев"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">АЛ</span>
<span class="deal-meta">
<span class="deal-name">Артём Лебедев</span>
<span class="deal-phone">+7 (911) 738-21-66</span>
</span>
</div>
</td>
<td><span class="chip chip-think"><span class="dot" aria-hidden="true"></span>Думает</span></td>
<td class="cell-product">Окна Москва</td>
<td><span class="cell-manager"><span class="mini-ava">ИП</span>Иван П.</span></td>
<td class="num">2 200&nbsp;</td>
<td class="cell-time"></td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Артём Лебедев"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Татьяна Иванова"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">ТИ</span>
<span class="deal-meta">
<span class="deal-name">Татьяна Иванова</span>
<span class="deal-phone">+7 (495) 184-22-19</span>
</span>
</div>
</td>
<td><span class="chip chip-nocall"><span class="dot" aria-hidden="true"></span>Не дозвон.</span></td>
<td class="cell-product">Натяжные потолки</td>
<td><span class="cell-manager"><span class="mini-ava">ИП</span>Иван П.</span></td>
<td class="num">1 850&nbsp;</td>
<td class="cell-time">11ч</td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Татьяна Иванова"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Виктор Зайцев"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">ВЗ</span>
<span class="deal-meta">
<span class="deal-name">Виктор Зайцев</span>
<span class="deal-phone">+7 (917) 002-44-31</span>
</span>
</div>
</td>
<td><span class="chip chip-work"><span class="dot" aria-hidden="true"></span>В работе</span></td>
<td class="cell-product">Окна Москва</td>
<td><span class="cell-manager"><span class="mini-ava">МС</span>Мария С.</span></td>
<td class="num">2 200&nbsp;</td>
<td class="cell-time">13ч</td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Виктор Зайцев"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Кирилл Морозов"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">КМ</span>
<span class="deal-meta">
<span class="deal-name">Кирилл Морозов</span>
<span class="deal-phone">+7 (495) 717-08-52</span>
</span>
</div>
</td>
<td><span class="chip chip-refund"><span class="dot" aria-hidden="true"></span>Возврат</span></td>
<td class="cell-product">Кухни на заказ</td>
<td><span class="cell-manager"><span class="mini-ava">МС</span>Мария С.</span></td>
<td class="num">3 100&nbsp;</td>
<td class="cell-time">16ч</td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Кирилл Морозов"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Полина Власова"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">ПВ</span>
<span class="deal-meta">
<span class="deal-name">Полина Власова</span>
<span class="deal-phone">+7 (903) 119-44-87</span>
</span>
</div>
</td>
<td><span class="chip chip-dup"><span class="dot" aria-hidden="true"></span>Дубликат</span></td>
<td class="cell-product">Окна Москва</td>
<td><span class="cell-manager"><span class="mini-ava">ИП</span>Иван П.</span></td>
<td class="num num-soft"></td>
<td class="cell-time">вчера</td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Полина Власова"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Степан Юдин"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">СЮ</span>
<span class="deal-meta">
<span class="deal-name">Степан Юдин</span>
<span class="deal-phone">+7 (000) 000-00-00</span>
</span>
</div>
</td>
<td><span class="chip chip-spam"><span class="dot" aria-hidden="true"></span>Спам</span></td>
<td class="cell-product">Натяжные потолки</td>
<td><span class="cell-manager"><span class="mini-ava"></span></span></td>
<td class="num num-soft"></td>
<td class="cell-time">вчера</td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Степан Юдин"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
<tr>
<td class="cb-col"><span class="cb" role="checkbox" aria-checked="false" tabindex="0" aria-label="Выбрать сделку Антон Беляев"></span></td>
<td>
<div class="cell-deal">
<span class="deal-avatar" aria-hidden="true">АБ</span>
<span class="deal-meta">
<span class="deal-name">Антон Беляев</span>
<span class="deal-phone">+7 (903) 802-21-15</span>
</span>
</div>
</td>
<td><span class="chip chip-arch"><span class="dot" aria-hidden="true"></span>Архив</span></td>
<td class="cell-product">Окна Москва</td>
<td><span class="cell-manager"><span class="mini-ava">ИП</span>Иван П.</span></td>
<td class="num">2 200&nbsp;</td>
<td class="cell-time"></td>
<td class="cell-actions">
<button type="button" class="row-action" aria-label="Действия со сделкой Антон Беляев"><svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg></button>
</td>
</tr>
</tbody>
</table>
<div class="tbl-foot">
<div class="lo">
<span class="num-line">Показано <strong>14</strong> из <strong>247</strong> · выбрано 1</span>
<div class="density-toggle" role="group" aria-label="Плотность таблицы">
<button type="button" class="active" aria-pressed="true">Норм.</button>
<button type="button" aria-pressed="false">Компакт</button>
</div>
</div>
<div class="pager" role="navigation" aria-label="Пагинация">
<button type="button" disabled aria-label="Предыдущая страница"></button>
<button type="button" class="active" aria-current="page">1</button>
<button type="button">2</button>
<button type="button">3</button>
<span class="ellipsis" aria-hidden="true"></span>
<button type="button">18</button>
<button type="button" aria-label="Следующая страница"></button>
</div>
</div>
</div>
</main>
</div>
</div>
<!-- ============================================================
SLIDE-OVER DRAWER
============================================================ -->
<div class="scrim" aria-hidden="true"></div>
<aside class="drawer" role="dialog" aria-labelledby="drawer-title" aria-modal="true">
<header class="drawer-head">
<div class="drawer-title-block">
<div class="drawer-eyebrow">Сделка</div>
<h2 id="drawer-title">Анна Соколова</h2>
<div class="meta">
<span class="id">#1042</span>
<span>+7 (916) 871-23-45</span>
<span>28м</span>
</div>
</div>
<button type="button" class="drawer-close" aria-label="Закрыть">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg>
</button>
</header>
<div class="drawer-body">
<div class="d-section">
<span class="d-section-label">Текущий статус</span>
<div class="d-status-card">
<span class="chip chip-tinted chip-new"><span class="dot" aria-hidden="true"></span>Новая</span>
<button type="button" class="change-link">сменить
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M9 18l6-6-6-6"/></svg>
</button>
</div>
</div>
<div class="d-section">
<span class="d-section-label">Параметры</span>
<div class="d-grid">
<span class="k">Проект</span><span class="v">Натяжные потолки</span>
<span class="k">Стоимость</span><span class="v mono">1 850&nbsp;</span>
<span class="k">Менеджер</span><span class="v">Иван Петров</span>
<span class="k">Источник</span><span class="v">Я.Директ → landing-1</span>
<span class="k">UTM</span><span class="v mono" style="font-size:11px">utm_campaign=spring_2026</span>
</div>
</div>
<div class="d-section">
<span class="d-section-label">История</span>
<div class="timeline">
<div class="t-item done">
<div class="t-time">14:32 · сегодня</div>
<div class="t-text">Лид принят, отправлено уведомление в Telegram-канал команды</div>
</div>
<div class="t-item done">
<div class="t-time">14:31 · сегодня</div>
<div class="t-text">Источник: Я.Директ, кампания «Натяжные потолки · Москва · март»</div>
</div>
<div class="t-item next">
<div class="t-time">→ ожидается до 15:00</div>
<div class="t-text">Первый звонок — менеджер Иван П.</div>
</div>
</div>
</div>
</div>
<footer class="drawer-foot">
<button type="button" class="btn">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
<span>Позвонить</span>
</button>
<button type="button" class="btn btn-primary">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
<span>Открыть карточку</span>
</button>
</footer>
</aside>
</body>
</html>