mirror of
https://github.com/wasrusgen/wasrusgen1-crm.git
synced 2026-06-03 19:04:47 +00:00
feat: presentation arch v2 — CRM брендбук, экраны, раздел БД/безопасности (16 слайдов)
This commit is contained in:
parent
b0cc480b06
commit
585177895c
@ -6,19 +6,21 @@
|
|||||||
<title>Архитектура платформы @wasrusgen1 CRM</title>
|
<title>Архитектура платформы @wasrusgen1 CRM</title>
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&family=Montserrat:wght@700;800;900&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
:root{
|
:root{
|
||||||
--bg:#0F0F1A;
|
--bg:#0F0F1A;
|
||||||
--accent:#3B82F6;
|
--accent:#003E7E;
|
||||||
--accent2:#60A5FA;
|
--accent2:#4338CA;
|
||||||
--success:#10B981;
|
--success:#76BD22;
|
||||||
--warn:#F59E0B;
|
--warn:#F59E0B;
|
||||||
|
--danger:#EF4444;
|
||||||
--text:#F8FAFC;
|
--text:#F8FAFC;
|
||||||
--card:#1A1A2E;
|
--card:#1A1A2E;
|
||||||
--muted:#94A3B8;
|
--muted:#94A3B8;
|
||||||
--border:rgba(148,163,184,.16);
|
--border:rgba(148,163,184,.16);
|
||||||
--mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,monospace;
|
--mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,monospace;
|
||||||
|
--display:'Montserrat',sans-serif;
|
||||||
}
|
}
|
||||||
*{margin:0;padding:0;box-sizing:border-box}
|
*{margin:0;padding:0;box-sizing:border-box}
|
||||||
html,body{height:100%}
|
html,body{height:100%}
|
||||||
@ -46,15 +48,21 @@
|
|||||||
max-width:1920px;max-height:1080px;margin:auto;
|
max-width:1920px;max-height:1080px;margin:auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* per-slide brand watermark (top-right) */
|
||||||
|
.slide-brand{
|
||||||
|
position:absolute;top:0;right:0;z-index:5;display:flex;align-items:center;
|
||||||
|
pointer-events:none;
|
||||||
|
}
|
||||||
|
|
||||||
/* background glows */
|
/* background glows */
|
||||||
.slide::before{
|
.slide::before{
|
||||||
content:"";position:absolute;width:760px;height:760px;border-radius:50%;
|
content:"";position:absolute;width:760px;height:760px;border-radius:50%;
|
||||||
background:radial-gradient(circle,rgba(59,130,246,.16),transparent 62%);
|
background:radial-gradient(circle,rgba(67,56,202,.16),transparent 62%);
|
||||||
top:-300px;right:-200px;pointer-events:none;
|
top:-300px;right:-200px;pointer-events:none;
|
||||||
}
|
}
|
||||||
.slide::after{
|
.slide::after{
|
||||||
content:"";position:absolute;width:620px;height:620px;border-radius:50%;
|
content:"";position:absolute;width:620px;height:620px;border-radius:50%;
|
||||||
background:radial-gradient(circle,rgba(16,185,129,.08),transparent 65%);
|
background:radial-gradient(circle,rgba(118,189,34,.08),transparent 65%);
|
||||||
bottom:-280px;left:-160px;pointer-events:none;
|
bottom:-280px;left:-160px;pointer-events:none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,8 +72,8 @@
|
|||||||
color:var(--accent2);margin-bottom:18px;display:flex;align-items:center;gap:12px;
|
color:var(--accent2);margin-bottom:18px;display:flex;align-items:center;gap:12px;
|
||||||
}
|
}
|
||||||
.kicker::before{content:"";width:30px;height:2px;background:var(--accent);display:inline-block}
|
.kicker::before{content:"";width:30px;height:2px;background:var(--accent);display:inline-block}
|
||||||
h1{font-size:64px;font-weight:900;line-height:1.04;letter-spacing:-.02em}
|
h1{font-family:var(--display);font-size:64px;font-weight:900;line-height:1.04;letter-spacing:-.02em}
|
||||||
h2{font-size:44px;font-weight:800;line-height:1.08;letter-spacing:-.015em;margin-bottom:10px}
|
h2{font-family:var(--display);font-size:44px;font-weight:800;line-height:1.08;letter-spacing:-.015em;margin-bottom:10px}
|
||||||
.sub{color:var(--muted);font-size:20px;font-weight:400;line-height:1.5;max-width:980px}
|
.sub{color:var(--muted);font-size:20px;font-weight:400;line-height:1.5;max-width:980px}
|
||||||
.slide-body{flex:1;min-height:0;margin-top:34px;display:flex;flex-direction:column}
|
.slide-body{flex:1;min-height:0;margin-top:34px;display:flex;flex-direction:column}
|
||||||
|
|
||||||
@ -98,28 +106,29 @@
|
|||||||
}
|
}
|
||||||
.card .ic{
|
.card .ic{
|
||||||
width:46px;height:46px;border-radius:12px;display:flex;align-items:center;justify-content:center;
|
width:46px;height:46px;border-radius:12px;display:flex;align-items:center;justify-content:center;
|
||||||
font-size:22px;margin-bottom:16px;background:rgba(59,130,246,.14);border:1px solid rgba(59,130,246,.3);
|
font-size:22px;margin-bottom:16px;background:rgba(0,62,126,.18);border:1px solid rgba(0,62,126,.4);
|
||||||
}
|
}
|
||||||
.card h3{font-size:21px;font-weight:700;margin-bottom:8px}
|
.card h3{font-size:21px;font-weight:700;margin-bottom:8px}
|
||||||
.card p{color:var(--muted);font-size:16px;line-height:1.55}
|
.card p{color:var(--muted);font-size:16px;line-height:1.55}
|
||||||
.card.accent{border-color:rgba(59,130,246,.45)}
|
.card.accent{border-color:rgba(67,56,202,.5)}
|
||||||
.card.success .ic{background:rgba(16,185,129,.14);border-color:rgba(16,185,129,.35)}
|
.card.accent .ic{background:rgba(67,56,202,.16);border-color:rgba(67,56,202,.4)}
|
||||||
|
.card.success .ic{background:rgba(118,189,34,.16);border-color:rgba(118,189,34,.4)}
|
||||||
.card.warn .ic{background:rgba(245,158,11,.14);border-color:rgba(245,158,11,.35)}
|
.card.warn .ic{background:rgba(245,158,11,.14);border-color:rgba(245,158,11,.35)}
|
||||||
.tag{font-family:var(--mono);font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--accent2);font-weight:600}
|
.tag{font-family:var(--mono);font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--accent2);font-weight:600}
|
||||||
.pill{display:inline-block;font-family:var(--mono);font-size:13px;padding:4px 12px;border-radius:100px;border:1px solid var(--border);color:var(--muted)}
|
.pill{display:inline-block;font-family:var(--mono);font-size:13px;padding:4px 12px;border-radius:100px;border:1px solid var(--border);color:var(--muted)}
|
||||||
.pill.rec{color:var(--success);border-color:rgba(16,185,129,.4);background:rgba(16,185,129,.08)}
|
.pill.rec{color:var(--success);border-color:rgba(118,189,34,.4);background:rgba(118,189,34,.1)}
|
||||||
|
|
||||||
/* ===== CODE / DIAGRAM BLOCK ===== */
|
/* ===== CODE / DIAGRAM BLOCK ===== */
|
||||||
.codeblock{
|
.codeblock{
|
||||||
font-family:var(--mono);background:#0A0A12;border:1px solid var(--border);
|
font-family:var(--mono);background:#0A0A12;border:1px solid var(--border);
|
||||||
border-radius:16px;padding:30px 34px;font-size:18px;line-height:1.85;color:#CBD5E1;
|
border-radius:16px;padding:30px 34px;font-size:18px;line-height:1.85;color:#CBD5E1;
|
||||||
box-shadow:inset 0 0 0 1px rgba(59,130,246,.05);position:relative;
|
box-shadow:inset 0 0 0 1px rgba(0,62,126,.08);position:relative;
|
||||||
}
|
}
|
||||||
.codeblock .winbar{position:absolute;top:14px;left:18px;display:flex;gap:7px}
|
.codeblock .winbar{position:absolute;top:14px;left:18px;display:flex;gap:7px}
|
||||||
.codeblock .winbar i{width:11px;height:11px;border-radius:50%;display:inline-block}
|
.codeblock .winbar i{width:11px;height:11px;border-radius:50%;display:inline-block}
|
||||||
.codeblock pre{margin-top:14px;white-space:pre;overflow:auto}
|
.codeblock pre{margin-top:14px;white-space:pre;overflow:auto}
|
||||||
.c-key{color:var(--accent2)} .c-ok{color:var(--success)} .c-warn{color:var(--warn)}
|
.c-key{color:var(--accent2)} .c-ok{color:var(--success)} .c-warn{color:var(--warn)}
|
||||||
.c-mut{color:var(--muted)} .c-acc{color:var(--accent);font-weight:700}
|
.c-mut{color:var(--muted)} .c-acc{color:#5B8BD0;font-weight:700} .c-file{color:#F8FAFC}
|
||||||
|
|
||||||
/* ===== ARCH MAP ===== */
|
/* ===== ARCH MAP ===== */
|
||||||
.archmap{display:flex;flex-direction:column;align-items:center;gap:0;font-family:var(--mono)}
|
.archmap{display:flex;flex-direction:column;align-items:center;gap:0;font-family:var(--mono)}
|
||||||
@ -129,15 +138,15 @@
|
|||||||
}
|
}
|
||||||
.node strong{display:block;font-size:20px;font-family:'Inter';font-weight:700}
|
.node strong{display:block;font-size:20px;font-family:'Inter';font-weight:700}
|
||||||
.node span{font-size:13px;color:var(--muted)}
|
.node span{font-size:13px;color:var(--muted)}
|
||||||
.node.master{border-color:var(--accent);box-shadow:0 0 32px rgba(59,130,246,.25);background:rgba(59,130,246,.08)}
|
.node.master{border-color:var(--accent2);box-shadow:0 0 32px rgba(67,56,202,.28);background:rgba(67,56,202,.1)}
|
||||||
.node.git{border-color:rgba(96,165,250,.4)}
|
.node.git{border-color:rgba(0,62,126,.5)}
|
||||||
.node.vps{border-color:rgba(16,185,129,.4);background:rgba(16,185,129,.05)}
|
.node.vps{border-color:rgba(118,189,34,.4);background:rgba(118,189,34,.05)}
|
||||||
.arrow{color:var(--accent2);font-size:22px;padding:8px 0;font-family:var(--mono)}
|
.arrow{color:var(--accent2);font-size:22px;padding:8px 0;font-family:var(--mono)}
|
||||||
.arrow small{display:block;font-size:11px;color:var(--muted);letter-spacing:.1em}
|
.arrow small{display:block;font-size:11px;color:var(--muted);letter-spacing:.1em}
|
||||||
.tenants{display:flex;gap:18px;margin-top:6px}
|
.tenants{display:flex;gap:18px;margin-top:6px}
|
||||||
.tenant{
|
.tenant{
|
||||||
border:1px dashed rgba(16,185,129,.4);border-radius:12px;padding:14px 20px;
|
border:1px dashed rgba(118,189,34,.4);border-radius:12px;padding:14px 20px;
|
||||||
font-family:var(--mono);font-size:14px;text-align:center;background:rgba(16,185,129,.04);
|
font-family:var(--mono);font-size:14px;text-align:center;background:rgba(118,189,34,.04);
|
||||||
}
|
}
|
||||||
.tenant b{color:var(--success)} .tenant span{display:block;color:var(--muted);font-size:12px;margin-top:4px}
|
.tenant b{color:var(--success)} .tenant span{display:block;color:var(--muted);font-size:12px;margin-top:4px}
|
||||||
|
|
||||||
@ -150,7 +159,7 @@
|
|||||||
td .mono{font-family:var(--mono)}
|
td .mono{font-family:var(--mono)}
|
||||||
.num{font-family:var(--mono);font-weight:700;color:var(--accent2);text-align:right}
|
.num{font-family:var(--mono);font-weight:700;color:var(--accent2);text-align:right}
|
||||||
.num.ok{color:var(--success)}
|
.num.ok{color:var(--success)}
|
||||||
tbody tr:hover{background:rgba(59,130,246,.05)}
|
tbody tr:hover{background:rgba(0,62,126,.07)}
|
||||||
|
|
||||||
/* ===== CHECKLIST ===== */
|
/* ===== CHECKLIST ===== */
|
||||||
.checklist{display:grid;grid-template-columns:1fr 1fr;gap:16px 38px;align-self:stretch}
|
.checklist{display:grid;grid-template-columns:1fr 1fr;gap:16px 38px;align-self:stretch}
|
||||||
@ -159,12 +168,12 @@
|
|||||||
background:var(--card);border:1px solid var(--border);border-radius:14px;padding:20px 24px;
|
background:var(--card);border:1px solid var(--border);border-radius:14px;padding:20px 24px;
|
||||||
transition:.25s;
|
transition:.25s;
|
||||||
}
|
}
|
||||||
.check:hover{border-color:rgba(59,130,246,.4);transform:translateX(3px)}
|
.check:hover{border-color:rgba(0,62,126,.5);transform:translateX(3px)}
|
||||||
.box{
|
.box{
|
||||||
width:30px;height:30px;border-radius:8px;border:2px solid var(--muted);flex:0 0 auto;
|
width:30px;height:30px;border-radius:8px;border:2px solid var(--muted);flex:0 0 auto;
|
||||||
display:flex;align-items:center;justify-content:center;transition:.2s;font-weight:900;color:transparent;
|
display:flex;align-items:center;justify-content:center;transition:.2s;font-weight:900;color:transparent;
|
||||||
}
|
}
|
||||||
.check.done .box{background:var(--success);border-color:var(--success);color:#06281c}
|
.check.done .box{background:var(--success);border-color:var(--success);color:#0c2b06}
|
||||||
.check.done .box::after{content:"✓"}
|
.check.done .box::after{content:"✓"}
|
||||||
.check .label{font-size:19px;font-weight:500;transition:.2s}
|
.check .label{font-size:19px;font-weight:500;transition:.2s}
|
||||||
.check.done .label{color:var(--muted);text-decoration:line-through}
|
.check.done .label{color:var(--muted);text-decoration:line-through}
|
||||||
@ -187,7 +196,7 @@
|
|||||||
.phase-card{
|
.phase-card{
|
||||||
background:var(--card);border:1px solid var(--border);border-radius:16px;padding:24px 22px;text-align:center;height:100%;
|
background:var(--card);border:1px solid var(--border);border-radius:16px;padding:24px 22px;text-align:center;height:100%;
|
||||||
}
|
}
|
||||||
.phase.now .phase-card{border-color:var(--accent);background:rgba(59,130,246,.08)}
|
.phase.now .phase-card{border-color:var(--accent);background:rgba(0,62,126,.1)}
|
||||||
.phase .ph-tag{font-family:var(--mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--accent2);margin-bottom:8px}
|
.phase .ph-tag{font-family:var(--mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--accent2);margin-bottom:8px}
|
||||||
.phase h3{font-size:22px;font-weight:700;margin-bottom:10px}
|
.phase h3{font-size:22px;font-weight:700;margin-bottom:10px}
|
||||||
.phase p{font-size:15px;color:var(--muted);line-height:1.5}
|
.phase p{font-size:15px;color:var(--muted);line-height:1.5}
|
||||||
@ -198,39 +207,116 @@
|
|||||||
/* generic list */
|
/* generic list */
|
||||||
.blist{list-style:none;display:flex;flex-direction:column;gap:14px}
|
.blist{list-style:none;display:flex;flex-direction:column;gap:14px}
|
||||||
.blist li{display:flex;gap:14px;font-size:19px;line-height:1.5;align-items:flex-start}
|
.blist li{display:flex;gap:14px;font-size:19px;line-height:1.5;align-items:flex-start}
|
||||||
.blist li::before{content:"▸";color:var(--accent);font-weight:900;margin-top:2px}
|
.blist li::before{content:"▸";color:var(--accent2);font-weight:900;margin-top:2px}
|
||||||
.blist li b{color:var(--text)}
|
.blist li b{color:var(--text)}
|
||||||
.blist li span{color:var(--muted)}
|
.blist li span{color:var(--muted)}
|
||||||
|
|
||||||
/* steps for lifecycle */
|
/* steps for lifecycle */
|
||||||
.steps{display:flex;flex-direction:column;gap:14px}
|
.steps{display:flex;flex-direction:column;gap:14px}
|
||||||
.step{display:flex;gap:22px;align-items:center;background:var(--card);border:1px solid var(--border);border-radius:14px;padding:20px 26px}
|
.step{display:flex;gap:22px;align-items:center;background:var(--card);border:1px solid var(--border);border-radius:14px;padding:20px 26px}
|
||||||
.step .no{font-family:var(--mono);font-size:26px;font-weight:700;color:var(--accent);width:46px;flex:0 0 auto}
|
.step .no{font-family:var(--mono);font-size:26px;font-weight:700;color:var(--accent2);width:46px;flex:0 0 auto}
|
||||||
.step .txt{flex:1}
|
.step .txt{flex:1}
|
||||||
.step .txt b{font-size:20px;font-weight:700;display:block}
|
.step .txt b{font-size:20px;font-weight:700;display:block}
|
||||||
.step .txt span{color:var(--muted);font-size:16px}
|
.step .txt span{color:var(--muted);font-size:16px}
|
||||||
.step .time{font-family:var(--mono);font-size:15px;color:var(--success);background:rgba(16,185,129,.1);border:1px solid rgba(16,185,129,.3);border-radius:100px;padding:7px 16px;white-space:nowrap}
|
.step .time{font-family:var(--mono);font-size:15px;color:var(--success);background:rgba(118,189,34,.12);border:1px solid rgba(118,189,34,.3);border-radius:100px;padding:7px 16px;white-space:nowrap}
|
||||||
|
|
||||||
/* P&L econ */
|
/* P&L econ */
|
||||||
.pl{display:grid;grid-template-columns:1fr 1fr;gap:26px}
|
.pl{display:grid;grid-template-columns:1fr 1fr;gap:26px}
|
||||||
.pl .block{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:30px}
|
.pl .block{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:30px}
|
||||||
.pl .block.rev{border-color:rgba(16,185,129,.35)}
|
.pl .block.rev{border-color:rgba(118,189,34,.35)}
|
||||||
.pl .block.cost{border-color:rgba(245,158,11,.35)}
|
.pl .block.cost{border-color:rgba(245,158,11,.35)}
|
||||||
.pl .row{display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px dashed var(--border);font-size:18px}
|
.pl .row{display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px dashed var(--border);font-size:18px}
|
||||||
.pl .row:last-child{border:none}
|
.pl .row:last-child{border:none}
|
||||||
.pl .row b{font-family:var(--mono)}
|
.pl .row b{font-family:var(--mono)}
|
||||||
.be{margin-top:24px;display:flex;gap:24px}
|
.be{margin-top:24px;display:flex;gap:24px}
|
||||||
.be .stat{flex:1;background:linear-gradient(160deg,rgba(59,130,246,.12),rgba(26,26,46,.6));border:1px solid rgba(59,130,246,.35);border-radius:16px;padding:24px 28px}
|
.be .stat{flex:1;background:linear-gradient(160deg,rgba(0,62,126,.14),rgba(26,26,46,.6));border:1px solid rgba(0,62,126,.4);border-radius:16px;padding:24px 28px}
|
||||||
.be .stat span{font-family:var(--mono);font-size:13px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
|
.be .stat span{font-family:var(--mono);font-size:13px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
|
||||||
.be .stat strong{display:block;font-size:38px;font-weight:800;color:var(--accent2);margin-top:6px}
|
.be .stat strong{display:block;font-size:38px;font-weight:800;color:var(--accent2);margin-top:6px}
|
||||||
|
|
||||||
|
/* ===== PHONE FRAMES (new slides) ===== */
|
||||||
|
.screens{display:flex;gap:40px;justify-content:center;align-items:flex-start;flex-wrap:wrap}
|
||||||
|
.phone{
|
||||||
|
width:330px;border-radius:30px;background:#000;padding:8px;
|
||||||
|
box-shadow:0 20px 60px rgba(0,0,0,.5);flex:0 0 auto;
|
||||||
|
}
|
||||||
|
.phone.sm{width:300px}
|
||||||
|
.phscreen{
|
||||||
|
border-radius:24px;background:#F5F6F8;overflow:hidden;color:#1A1A2E;
|
||||||
|
font-family:'Inter',sans-serif;
|
||||||
|
}
|
||||||
|
.statusbar{
|
||||||
|
background:#003E7E;color:#fff;height:30px;display:flex;align-items:center;
|
||||||
|
justify-content:space-between;padding:0 16px;font-size:12px;font-weight:600;font-family:var(--mono);
|
||||||
|
}
|
||||||
|
.statusbar .sb-r{display:flex;gap:5px;align-items:center;letter-spacing:1px}
|
||||||
|
.ph-head{
|
||||||
|
background:#003E7E;color:#fff;padding:10px 16px 14px;display:flex;align-items:center;
|
||||||
|
justify-content:space-between;
|
||||||
|
}
|
||||||
|
.ph-head .ph-title{font-size:15px;font-weight:800;font-family:var(--display)}
|
||||||
|
.ph-head .ph-sub{font-size:11px;color:rgba(255,255,255,.7);margin-top:2px}
|
||||||
|
.ph-head .ph-badge{font-size:11px;font-weight:600;background:rgba(255,255,255,.15);padding:4px 10px;border-radius:100px}
|
||||||
|
.ph-body{padding:12px;display:flex;flex-direction:column;gap:10px;min-height:330px}
|
||||||
|
.scard{
|
||||||
|
background:#fff;border-radius:14px;padding:12px 14px;border:1px solid #E5E7EB;
|
||||||
|
box-shadow:0 1px 4px rgba(0,0,0,.05);
|
||||||
|
}
|
||||||
|
.scard .sc-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
|
||||||
|
.scard .sc-name{font-size:13px;font-weight:700;color:#1A1A2E}
|
||||||
|
.scard .sc-sub{font-size:11px;color:#8A94A6;margin-bottom:6px}
|
||||||
|
.scard .sc-money{font-size:13px;font-weight:700;color:#003E7E;font-variant-numeric:tabular-nums}
|
||||||
|
.scard .sc-warn{font-size:11px;color:#D97706;font-weight:600;margin-top:4px;display:flex;align-items:center;gap:4px}
|
||||||
|
.sbar{height:7px;background:#E5E7EB;border-radius:100px;overflow:hidden;margin-top:8px}
|
||||||
|
.sbar i{display:block;height:100%;background:#76BD22;border-radius:100px}
|
||||||
|
.sbar.warnbar i{background:#003E7E}
|
||||||
|
.sbadge{font-size:9px;font-weight:700;padding:2px 8px;border-radius:100px}
|
||||||
|
.sbadge.done{background:#DCFCE7;color:#15803D}
|
||||||
|
.sbadge.wait{background:#FEF3C7;color:#D97706}
|
||||||
|
.sbadge.act{background:#DBEAFE;color:#1D4ED8}
|
||||||
|
|
||||||
|
/* schedule grid (chess) */
|
||||||
|
.chess{width:100%;border-collapse:collapse;font-size:11px;background:#fff;border-radius:12px;overflow:hidden}
|
||||||
|
.chess th,.chess td{border:1px solid #E5E7EB;padding:7px 8px;text-align:left;color:#1A1A2E}
|
||||||
|
.chess th{background:#003E7E;color:#fff;font-size:10px;font-weight:700}
|
||||||
|
.chess td.time{font-family:var(--mono);color:#8A94A6;font-weight:600;background:#F9FAFB}
|
||||||
|
.cell-done{color:#15803D;font-weight:600}
|
||||||
|
.cell-act{color:#003E7E;font-weight:700}
|
||||||
|
.cell-free{color:#9CA3AF}
|
||||||
|
|
||||||
|
/* day schedule */
|
||||||
|
.daysched{display:flex;flex-direction:column;gap:2px;font-size:12px}
|
||||||
|
.ds-row{display:flex;gap:10px;align-items:flex-start;padding:6px 0}
|
||||||
|
.ds-time{font-family:var(--mono);font-size:11px;color:#003E7E;font-weight:700;width:46px;flex:0 0 auto}
|
||||||
|
.ds-block{background:#fff;border:1px solid #E5E7EB;border-left:3px solid #003E7E;border-radius:8px;padding:7px 10px;flex:1}
|
||||||
|
.ds-block.green{border-left-color:#76BD22}
|
||||||
|
.ds-block b{font-size:12px;font-weight:700;color:#1A1A2E;display:block}
|
||||||
|
.ds-block span{font-size:10px;color:#8A94A6}
|
||||||
|
.ds-marker{font-size:11px;color:#8A94A6;font-weight:600;padding:5px 0}
|
||||||
|
.ds-btn{margin-top:8px;background:#003E7E;color:#fff;text-align:center;padding:9px;border-radius:10px;font-size:12px;font-weight:700}
|
||||||
|
|
||||||
|
.scaption{text-align:center;color:var(--muted);font-size:17px;margin-top:24px;font-family:var(--mono);letter-spacing:.02em}
|
||||||
|
|
||||||
|
/* security 2-col */
|
||||||
|
.seccols{display:grid;grid-template-columns:0.95fr 1.05fr;gap:34px;height:100%;align-items:stretch}
|
||||||
|
.sec-arch{display:flex;flex-direction:column}
|
||||||
|
.sec-arch .codeblock{flex:1;font-size:15px;line-height:1.7}
|
||||||
|
.secgrid{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-content:start}
|
||||||
|
.seccard{
|
||||||
|
background:var(--card);border:1px solid var(--border);border-radius:14px;padding:18px 18px;
|
||||||
|
}
|
||||||
|
.seccard .si{font-size:22px;margin-bottom:8px;display:block}
|
||||||
|
.seccard h4{font-size:16px;font-weight:700;margin-bottom:5px}
|
||||||
|
.seccard p{color:var(--muted);font-size:12.5px;line-height:1.5}
|
||||||
|
.seccard.b1{border-color:rgba(118,189,34,.35)}
|
||||||
|
.seccard.b2{border-color:rgba(0,62,126,.4)}
|
||||||
|
|
||||||
/* ===== NAV ===== */
|
/* ===== NAV ===== */
|
||||||
.nav{position:fixed;bottom:26px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:18px;z-index:50}
|
.nav{position:fixed;bottom:26px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:18px;z-index:50}
|
||||||
.nav button{
|
.nav button{
|
||||||
width:46px;height:46px;border-radius:12px;border:1px solid var(--border);background:rgba(26,26,46,.85);
|
width:46px;height:46px;border-radius:12px;border:1px solid var(--border);background:rgba(26,26,46,.85);
|
||||||
color:var(--text);font-size:20px;cursor:pointer;transition:.2s;backdrop-filter:blur(8px);
|
color:var(--text);font-size:20px;cursor:pointer;transition:.2s;backdrop-filter:blur(8px);
|
||||||
}
|
}
|
||||||
.nav button:hover{border-color:var(--accent);color:var(--accent2)}
|
.nav button:hover{border-color:var(--accent2);color:var(--accent2)}
|
||||||
.nav .counter{font-family:var(--mono);font-size:15px;color:var(--muted);min-width:64px;text-align:center}
|
.nav .counter{font-family:var(--mono);font-size:15px;color:var(--muted);min-width:64px;text-align:center}
|
||||||
.nav .counter b{color:var(--text)}
|
.nav .counter b{color:var(--text)}
|
||||||
.progress{position:fixed;top:0;left:0;height:3px;background:linear-gradient(90deg,var(--accent),var(--success));z-index:60;transition:width .5s ease;box-shadow:0 0 10px var(--accent)}
|
.progress{position:fixed;top:0;left:0;height:3px;background:linear-gradient(90deg,var(--accent),var(--success));z-index:60;transition:width .5s ease;box-shadow:0 0 10px var(--accent)}
|
||||||
@ -246,6 +332,7 @@
|
|||||||
.g4{grid-template-columns:repeat(2,1fr)}.g3{grid-template-columns:repeat(2,1fr)}
|
.g4{grid-template-columns:repeat(2,1fr)}.g3{grid-template-columns:repeat(2,1fr)}
|
||||||
.checklist{grid-template-columns:1fr}.timeline{flex-direction:column;gap:14px}
|
.checklist{grid-template-columns:1fr}.timeline{flex-direction:column;gap:14px}
|
||||||
.phase::before{display:none}.twocol{grid-template-columns:1fr;gap:24px}
|
.phase::before{display:none}.twocol{grid-template-columns:1fr;gap:24px}
|
||||||
|
.seccols{grid-template-columns:1fr;gap:20px}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
@ -255,6 +342,7 @@
|
|||||||
|
|
||||||
<!-- 1 TITLE -->
|
<!-- 1 TITLE -->
|
||||||
<section class="slide title-slide active">
|
<section class="slide title-slide active">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage" style="display:flex;flex-direction:column;justify-content:center">
|
<div class="stage" style="display:flex;flex-direction:column;justify-content:center">
|
||||||
<div class="brandtag"><span class="dot"></span> @wasrusgen1 CRM · PLATFORM ARCHITECTURE</div>
|
<div class="brandtag"><span class="dot"></span> @wasrusgen1 CRM · PLATFORM ARCHITECTURE</div>
|
||||||
<h1>Архитектура платформы<br><span style="color:var(--accent2)">@wasrusgen1 CRM</span></h1>
|
<h1>Архитектура платформы<br><span style="color:var(--accent2)">@wasrusgen1 CRM</span></h1>
|
||||||
@ -269,6 +357,7 @@
|
|||||||
|
|
||||||
<!-- 2 SYSTEM MAP -->
|
<!-- 2 SYSTEM MAP -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 02 · Big picture</div>
|
<div class="kicker">Слайд 02 · Big picture</div>
|
||||||
<h2>Карта системы</h2>
|
<h2>Карта системы</h2>
|
||||||
@ -293,6 +382,7 @@
|
|||||||
|
|
||||||
<!-- 3 THREE MODELS -->
|
<!-- 3 THREE MODELS -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 03 · Стратегия</div>
|
<div class="kicker">Слайд 03 · Стратегия</div>
|
||||||
<h2>Три модели управления</h2>
|
<h2>Три модели управления</h2>
|
||||||
@ -325,6 +415,7 @@
|
|||||||
|
|
||||||
<!-- 4 LIFECYCLE -->
|
<!-- 4 LIFECYCLE -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 04 · Процесс</div>
|
<div class="kicker">Слайд 04 · Процесс</div>
|
||||||
<h2>Жизненный цикл нового проекта</h2>
|
<h2>Жизненный цикл нового проекта</h2>
|
||||||
@ -343,6 +434,7 @@
|
|||||||
|
|
||||||
<!-- 5 STACK -->
|
<!-- 5 STACK -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 05 · Технологии</div>
|
<div class="kicker">Слайд 05 · Технологии</div>
|
||||||
<h2>Стек технологий</h2>
|
<h2>Стек технологий</h2>
|
||||||
@ -364,6 +456,7 @@
|
|||||||
|
|
||||||
<!-- 6 ER DIAGRAM -->
|
<!-- 6 ER DIAGRAM -->
|
||||||
<section class="slide er">
|
<section class="slide er">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 06 · Данные</div>
|
<div class="kicker">Слайд 06 · Данные</div>
|
||||||
<h2>Схема базы данных</h2>
|
<h2>Схема базы данных</h2>
|
||||||
@ -400,6 +493,7 @@
|
|||||||
|
|
||||||
<!-- 7 MASTER PANEL -->
|
<!-- 7 MASTER PANEL -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 07 · Инструмент владельца</div>
|
<div class="kicker">Слайд 07 · Инструмент владельца</div>
|
||||||
<h2>Мастер-панель Руслана</h2>
|
<h2>Мастер-панель Руслана</h2>
|
||||||
@ -415,10 +509,150 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- 8 CHECKLIST -->
|
<!-- 8 [NEW] WHAT EACH ROLE SEES -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 08 · Onboarding</div>
|
<div class="kicker">Слайд 08 · Интерфейсы по ролям</div>
|
||||||
|
<h2>Что видит каждая роль</h2>
|
||||||
|
<p class="sub">Один продукт — разные кабинеты. У каждой роли свой экран и свой набор данных.</p>
|
||||||
|
<div class="slide-body" style="justify-content:center">
|
||||||
|
<div class="screens">
|
||||||
|
|
||||||
|
<!-- Screen 1: КД дашборд -->
|
||||||
|
<div class="phone">
|
||||||
|
<div class="phscreen">
|
||||||
|
<div class="statusbar"><span>9:41</span><span class="sb-r">⣾ ▌</span></div>
|
||||||
|
<div class="ph-head">
|
||||||
|
<div><div class="ph-title">📊 КД Дашборд</div><div class="ph-sub">вся сеть · реальное время</div></div>
|
||||||
|
<div class="ph-badge">май 2026</div>
|
||||||
|
</div>
|
||||||
|
<div class="ph-body">
|
||||||
|
<div class="scard">
|
||||||
|
<div class="sc-top"><span class="sc-name">🏪 Салон Ленина</span><span class="sbadge done">27/30</span></div>
|
||||||
|
<div class="sc-sub">заказов выполнено</div>
|
||||||
|
<div class="sc-money">₽ 1 537 000 / 1 700 000</div>
|
||||||
|
<div class="sc-warn">⚠ 1 просрочен</div>
|
||||||
|
<div class="sbar"><i style="width:90%"></i></div>
|
||||||
|
</div>
|
||||||
|
<div class="scard">
|
||||||
|
<div class="sc-top"><span class="sc-name">🏪 Салон Победы</span><span class="sbadge done">20/22</span></div>
|
||||||
|
<div class="sc-sub">заказов выполнено</div>
|
||||||
|
<div class="sc-money">₽ 1 310 000 / 1 500 000</div>
|
||||||
|
<div class="sc-warn">⚠ 1 просрочен</div>
|
||||||
|
<div class="sbar"><i style="width:87%"></i></div>
|
||||||
|
</div>
|
||||||
|
<div class="scard">
|
||||||
|
<div class="sc-top"><span class="sc-name">🏪 Салон Садовая</span><span class="sbadge act">15/19</span></div>
|
||||||
|
<div class="sc-sub">заказов выполнено</div>
|
||||||
|
<div class="sc-money">₽ 980 000 / 1 250 000</div>
|
||||||
|
<div class="sbar"><i style="width:78%"></i></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Screen 2: Администратор шахматка -->
|
||||||
|
<div class="phone">
|
||||||
|
<div class="phscreen">
|
||||||
|
<div class="statusbar"><span>9:41</span><span class="sb-r">⣾ ▌</span></div>
|
||||||
|
<div class="ph-head">
|
||||||
|
<div><div class="ph-title">Салон Ленина</div><div class="ph-sub">Шахматка · сегодня, 22 мая</div></div>
|
||||||
|
<div class="ph-badge">Админ</div>
|
||||||
|
</div>
|
||||||
|
<div class="ph-body">
|
||||||
|
<table class="chess">
|
||||||
|
<thead><tr><th>Время</th><th>Анна К.</th><th>Мария С.</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td class="time">10:00</td><td class="cell-done">✅ Орлова</td><td class="cell-free">—</td></tr>
|
||||||
|
<tr><td class="time">11:00</td><td class="cell-done">✅ Соколова</td><td class="cell-free">—</td></tr>
|
||||||
|
<tr><td class="time">12:00</td><td class="cell-free">○ Свободно</td><td class="cell-done">✅ Лебедев</td></tr>
|
||||||
|
<tr><td class="time">14:00</td><td class="cell-act">🔵 Ким Л.</td><td class="cell-act">🔵 Петрова</td></tr>
|
||||||
|
<tr><td class="time">15:00</td><td class="cell-act">🔵 Ким Л.</td><td class="cell-act">🔵 Петрова</td></tr>
|
||||||
|
<tr><td class="time">16:00</td><td class="cell-act">🔵 Захарова</td><td class="cell-free">—</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="scaption">КД — вся сеть в реальном времени · Администратор — управление командой</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- 9 [NEW] MANAGER MOBILE -->
|
||||||
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
|
<div class="stage">
|
||||||
|
<div class="kicker">Слайд 09 · Мобильный кабинет</div>
|
||||||
|
<h2>Менеджер: работа из телефона</h2>
|
||||||
|
<p class="sub">Весь рабочий день — в кармане. Заказы, расписание, чек-ин на объекте.</p>
|
||||||
|
<div class="slide-body" style="justify-content:center">
|
||||||
|
<div class="screens">
|
||||||
|
|
||||||
|
<!-- Screen 1: orders -->
|
||||||
|
<div class="phone sm">
|
||||||
|
<div class="phscreen">
|
||||||
|
<div class="statusbar"><span>9:41</span><span class="sb-r">⣾ ▌</span></div>
|
||||||
|
<div class="ph-head">
|
||||||
|
<div><div class="ph-title">Мои заказы</div><div class="ph-sub">3 активных + 3 лида</div></div>
|
||||||
|
<div class="ph-badge">Менеджер</div>
|
||||||
|
</div>
|
||||||
|
<div class="ph-body">
|
||||||
|
<div class="scard">
|
||||||
|
<div class="sc-top"><span class="sc-name">МБ-2025-041 · Иванова А.С.</span></div>
|
||||||
|
<div class="sc-sub">Кухня · Ленина 34</div>
|
||||||
|
<div class="sc-warn">⚠ Техника — ждём 2 позиции</div>
|
||||||
|
<div class="sc-money" style="margin-top:6px">₽ 186 000 · аванс ✓</div>
|
||||||
|
</div>
|
||||||
|
<div class="scard">
|
||||||
|
<div class="sc-top"><span class="sc-name">МБ-2025-038 · Петров К.Н.</span><span class="sbadge done">готов</span></div>
|
||||||
|
<div class="sc-sub">Шкаф-купе · Победы 12</div>
|
||||||
|
<div class="sc-money" style="margin-top:6px">₽ 94 000 · оплачен ✓</div>
|
||||||
|
</div>
|
||||||
|
<div class="scard">
|
||||||
|
<div class="sc-top"><span class="sc-name">МБ-2025-044 · Сидоров</span><span class="sbadge wait">замер</span></div>
|
||||||
|
<div class="sc-sub">Гардероб · Садовая 5</div>
|
||||||
|
<div class="sc-money" style="margin-top:6px">оценка ₽ 120 000</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Screen 2: day schedule -->
|
||||||
|
<div class="phone sm">
|
||||||
|
<div class="phscreen">
|
||||||
|
<div class="statusbar"><span>9:41</span><span class="sb-r">⣾ ▌</span></div>
|
||||||
|
<div class="ph-head">
|
||||||
|
<div><div class="ph-title">Расписание дня</div><div class="ph-sub">22 мая · 4 встречи</div></div>
|
||||||
|
<div class="ph-badge">Сегодня</div>
|
||||||
|
</div>
|
||||||
|
<div class="ph-body">
|
||||||
|
<div class="daysched">
|
||||||
|
<div class="ds-marker">━● 10:00 — Начало смены</div>
|
||||||
|
<div class="ds-row"><span class="ds-time">12:00</span><div class="ds-block"><b>Ким Л. — Консультация</b><span>Кухня · 2 ч</span></div></div>
|
||||||
|
<div class="ds-row"><span class="ds-time">15:30</span><div class="ds-block green"><b>Захаров П. — Замер</b><span>Садовая 5 · GPS-чекин</span></div></div>
|
||||||
|
<div class="ds-row"><span class="ds-time">17:00</span><div class="ds-block"><b>Лебедева — Договор</b><span>офис · подпись</span></div></div>
|
||||||
|
<div class="ds-marker">━○ 19:00 — Конец смены</div>
|
||||||
|
<div class="ds-btn">+ Добавить встречу</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="scaption">Заказы · Расписание · GPS-чекин · База знаний</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- 10 CHECKLIST -->
|
||||||
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
|
<div class="stage">
|
||||||
|
<div class="kicker">Слайд 10 · Onboarding</div>
|
||||||
<h2>Как подключить нового клиента</h2>
|
<h2>Как подключить нового клиента</h2>
|
||||||
<p class="sub">Интерактивный чеклист — кликните по пунктам. <span style="color:var(--accent2)">Прогресс сохраняется в сессии.</span></p>
|
<p class="sub">Интерактивный чеклист — кликните по пунктам. <span style="color:var(--accent2)">Прогресс сохраняется в сессии.</span></p>
|
||||||
<div class="slide-body" style="justify-content:center">
|
<div class="slide-body" style="justify-content:center">
|
||||||
@ -435,10 +669,59 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- 9 INFRA COST -->
|
<!-- 11 [EXPANDED] DATABASE & SECURITY -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 09 · Инфраструктура</div>
|
<div class="kicker">Слайд 11 · Архитектура и защита</div>
|
||||||
|
<h2>База данных и безопасность</h2>
|
||||||
|
<p class="sub">Данные каждого клиента физически отделены — утечка одного не затрагивает других.</p>
|
||||||
|
<div class="slide-body">
|
||||||
|
<div class="seccols">
|
||||||
|
|
||||||
|
<!-- Section A: DB architecture -->
|
||||||
|
<div class="sec-arch">
|
||||||
|
<div class="tag" style="margin-bottom:12px">A · Архитектура базы данных</div>
|
||||||
|
<div class="codeblock">
|
||||||
|
<div class="winbar"><i style="background:#ff5f57"></i><i style="background:#febc2e"></i><i style="background:#28c840"></i></div>
|
||||||
|
<pre><span class="c-acc">PostgreSQL</span> <span class="c-mut">per-tenant</span>
|
||||||
|
<span class="c-ok">├── crm_client1/</span>
|
||||||
|
<span class="c-ok">│ ├── </span><span class="c-file">salons · users · clients</span>
|
||||||
|
<span class="c-ok">│ ├── </span><span class="c-file">orders · appointments</span>
|
||||||
|
<span class="c-ok">│ ├── </span><span class="c-file">requests · ratings</span>
|
||||||
|
<span class="c-ok">│ └── </span><span class="c-file">shift_requests</span>
|
||||||
|
<span class="c-ok">├── crm_client2/</span>
|
||||||
|
<span class="c-ok">└── crm_clientN/</span>
|
||||||
|
|
||||||
|
<span class="c-acc">Redis</span> <span class="c-mut"># сессии + KPI-кеш</span>
|
||||||
|
<span class="c-acc">MinIO/S3</span> <span class="c-mut"># документы, фото</span>
|
||||||
|
<span class="c-acc">Nginx</span> <span class="c-mut"># routing + TLS termination</span></pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Section B: Security grid -->
|
||||||
|
<div>
|
||||||
|
<div class="tag" style="margin-bottom:12px">B · Безопасность</div>
|
||||||
|
<div class="secgrid">
|
||||||
|
<div class="seccard b1"><span class="si">🔐</span><h4>Физическая изоляция</h4><p>Каждый клиент — отдельная PostgreSQL БД. Код одного клиента физически не может достать данные другого.</p></div>
|
||||||
|
<div class="seccard b2"><span class="si">🔑</span><h4>Авторизация JWT</h4><p>Access (15 мин) + Refresh (30 дней). Роль и salonId в payload. Проверка на каждом запросе.</p></div>
|
||||||
|
<div class="seccard b2"><span class="si">🔒</span><h4>HTTPS / TLS</h4><p>Let's Encrypt, автообновление. HTTP → 301 redirect. HSTS включён.</p></div>
|
||||||
|
<div class="seccard b1"><span class="si">💾</span><h4>Резервные копии</h4><p>Ежедневный pg_dump в S3. Хранение 30 дней. RTO < 1 ч, RPO < 24 ч.</p></div>
|
||||||
|
<div class="seccard b2"><span class="si">👁</span><h4>Аудит-лог</h4><p>Каждое изменение заказа/клиента — с userId + timestamp. Просмотр только admin/owner.</p></div>
|
||||||
|
<div class="seccard b1"><span class="si">🛡</span><h4>RBAC</h4><p>5 ролей (owner, admin, manager, measurer, assembler). Матрица прав в SCHEMA.md.</p></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- 12 INFRA COST -->
|
||||||
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
|
<div class="stage">
|
||||||
|
<div class="kicker">Слайд 12 · Инфраструктура</div>
|
||||||
<h2>Инфраструктура и стоимость</h2>
|
<h2>Инфраструктура и стоимость</h2>
|
||||||
<p class="sub">Расходы растут вместе с числом клиентов — на старте почти нулевые.</p>
|
<p class="sub">Расходы растут вместе с числом клиентов — на старте почти нулевые.</p>
|
||||||
<div class="slide-body" style="justify-content:center">
|
<div class="slide-body" style="justify-content:center">
|
||||||
@ -458,11 +741,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- 10 ECONOMICS -->
|
<!-- 13 ECONOMICS -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 10 · Экономика</div>
|
<div class="kicker">Слайд 13 · Экономика</div>
|
||||||
<h2>Экономика продукта · P&L</h2>
|
<h2>Экономика продукта · P&L</h2>
|
||||||
<p class="sub">Точка безубыточности — первый же клиент. Маржа растёт с каждым следующим.</p>
|
<p class="sub">Точка безубыточности — первый же клиент. Маржа растёт с каждым следующим.</p>
|
||||||
<div class="slide-body" style="justify-content:center">
|
<div class="slide-body" style="justify-content:center">
|
||||||
<div class="pl">
|
<div class="pl">
|
||||||
@ -490,10 +774,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- 11 ROADMAP -->
|
<!-- 14 ROADMAP -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 11 · Roadmap</div>
|
<div class="kicker">Слайд 14 · Roadmap</div>
|
||||||
<h2>Roadmap продукта</h2>
|
<h2>Roadmap продукта</h2>
|
||||||
<p class="sub">Четыре фазы — от прототипа до AI-функций.</p>
|
<p class="sub">Четыре фазы — от прототипа до AI-функций.</p>
|
||||||
<div class="slide-body" style="justify-content:center">
|
<div class="slide-body" style="justify-content:center">
|
||||||
@ -519,29 +804,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- 12 SECURITY -->
|
<!-- 15 SLA -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 12 · Безопасность</div>
|
<div class="kicker">Слайд 15 · Обязательства</div>
|
||||||
<h2>Безопасность и изоляция данных</h2>
|
|
||||||
<p class="sub">Данные каждого клиента физически отделены — утечка одного не затрагивает других.</p>
|
|
||||||
<div class="slide-body">
|
|
||||||
<div class="grid g3" style="flex:1;align-content:center">
|
|
||||||
<div class="card success"><div class="ic">🧱</div><h3>Физическая изоляция</h3><p>Каждый клиент — отдельная БД. Данные не пересекаются на уровне хранилища.</p></div>
|
|
||||||
<div class="card"><div class="ic">🔑</div><h3>JWT авторизация</h3><p>Токены доступа, роли и права на уровне API.</p></div>
|
|
||||||
<div class="card"><div class="ic">🔐</div><h3>HTTPS везде</h3><p>Let's Encrypt, авто-обновление сертификатов на всех поддоменах.</p></div>
|
|
||||||
<div class="card"><div class="ic">💾</div><h3>Бэкапы ежедневно</h3><p>Автоматический бэкап каждой БД, хранение и восстановление.</p></div>
|
|
||||||
<div class="card accent"><div class="ic">📤</div><h3>Экспорт данных</h3><p>Клиент может запросить выгрузку своих данных в любой момент.</p></div>
|
|
||||||
<div class="card"><div class="ic">📜</div><h3>Соответствие ПДн</h3><p>Хранение в РФ, разграничение доступа, журналирование.</p></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<!-- 13 SLA -->
|
|
||||||
<section class="slide">
|
|
||||||
<div class="stage">
|
|
||||||
<div class="kicker">Слайд 13 · Обязательства</div>
|
|
||||||
<h2>SLA и поддержка</h2>
|
<h2>SLA и поддержка</h2>
|
||||||
<p class="sub">Понятные обязательства перед клиентом — основа доверия и удержания.</p>
|
<p class="sub">Понятные обязательства перед клиентом — основа доверия и удержания.</p>
|
||||||
<div class="slide-body">
|
<div class="slide-body">
|
||||||
@ -555,10 +822,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- 14 NEXT STEPS -->
|
<!-- 16 NEXT STEPS -->
|
||||||
<section class="slide">
|
<section class="slide">
|
||||||
|
<div class="slide-brand"><span style="font-family:'Montserrat',sans-serif;font-weight:500;font-size:12px;color:rgba(255,255,255,.45)">@wasrusgen1</span><span style="display:inline-block;width:1px;height:14px;background:rgba(255,255,255,.2);margin:0 8px;vertical-align:middle"></span><span style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:13px;color:#fff;letter-spacing:1px">CRM</span></div>
|
||||||
<div class="stage">
|
<div class="stage">
|
||||||
<div class="kicker">Слайд 14 · План действий</div>
|
<div class="kicker">Слайд 16 · План действий</div>
|
||||||
<h2>Следующие шаги</h2>
|
<h2>Следующие шаги</h2>
|
||||||
<p class="sub">Конкретный план на 4 недели — от выбора клиента до запуска пилота.</p>
|
<p class="sub">Конкретный план на 4 недели — от выбора клиента до запуска пилота.</p>
|
||||||
<div class="slide-body">
|
<div class="slide-body">
|
||||||
@ -576,11 +844,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="brandmark">@wasrusgen1 · CRM PLATFORM</div>
|
<div class="brandmark">@wasrusgen1 · CRM PLATFORM</div>
|
||||||
<div class="pagenum" id="pagenum">01 / 14</div>
|
<div class="pagenum" id="pagenum">01 / 16</div>
|
||||||
|
|
||||||
<nav class="nav">
|
<nav class="nav">
|
||||||
<button id="prev" aria-label="Назад">‹</button>
|
<button id="prev" aria-label="Назад">‹</button>
|
||||||
<div class="counter"><b id="cur">1</b> / 14</div>
|
<div class="counter"><b id="cur">1</b> / 16</div>
|
||||||
<button id="next" aria-label="Вперёд">›</button>
|
<button id="next" aria-label="Вперёд">›</button>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user