From c003faf931f95b925fbd79e82e81c8dc7fbb3677 Mon Sep 17 00:00:00 2001 From: wasrusgen Date: Wed, 3 Jun 2026 16:40:04 +0300 Subject: [PATCH] =?UTF-8?q?brand(cabinet):=20=D0=BF=D0=B8=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=8B=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=B1=D1=80=D0=B5=D0=BD=D0=B4=D0=B1=D1=83=D0=BA=D1=83=20(Lucid?= =?UTF-8?q?e=20stroke=201.75)=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20?= =?UTF-8?q?=D1=8D=D0=BC=D0=BE=D0=B4=D0=B7=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cabinet.html | 109 +++++++++++++++++++++++++++++----------------- 1 file changed, 69 insertions(+), 40 deletions(-) diff --git a/docs/cabinet.html b/docs/cabinet.html index 865bfdc..6762a74 100644 --- a/docs/cabinet.html +++ b/docs/cabinet.html @@ -55,7 +55,7 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ .sv{display:none;flex:1;flex-direction:column;overflow:hidden} .sv.active{display:flex} .hero{background:var(--white);border-bottom:1px solid var(--border);padding:18px 26px;display:flex;align-items:center;gap:16px;flex-shrink:0} -.hero-ic{width:46px;height:46px;border-radius:12px;background:linear-gradient(135deg,var(--dark),var(--primary));display:flex;align-items:center;justify-content:center;font-size:21px;flex-shrink:0} +.hero-ic{width:46px;height:46px;border-radius:12px;background:linear-gradient(135deg,var(--dark),var(--primary));display:flex;align-items:center;justify-content:center;font-size:21px;flex-shrink:0;color:#fff} .hero-tag{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--primary);margin-bottom:3px} .hero-h{font-size:18px;font-weight:700;color:var(--text)} .hero-d{font-size:13px;color:var(--muted);margin-top:2px} @@ -229,16 +229,16 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ
Е
Елена
-
💳 К оплате:
+
К оплате:
@@ -277,7 +277,7 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ
@@ -293,7 +293,7 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ
-
👤
Профиль компании
Расскажите о вашей деятельности
Базовая информация — Елена начнёт разговор уже зная контекст
+
Профиль компании
Расскажите о вашей деятельности
Базовая информация — Елена начнёт разговор уже зная контекст
@@ -306,7 +306,7 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ
-
💬
Этап 1 из 4 · В процессе
Разговор с Еленой
Расскажите о бизнесе — Елена знакомится и сразу углубляется в детали. Текстом или голосом.
+
Этап 1 из 4 · В процессе
Разговор с Еленой
Расскажите о бизнесе — Елена знакомится и сразу углубляется в детали. Текстом или голосом.
@@ -317,10 +317,10 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ
-
📁
Этап 2 из 4
Документы
Загрузите материалы — Елена учтёт их в анализе
+
Этап 2 из 4
Документы
Загрузите материалы — Елена учтёт их в анализе
-
📎
+
Нажмите или перетащите документы
PDF, Word, Excel, txt · прайс, оргструктура, отчёты
@@ -331,19 +331,19 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ
-
🧠
Этап 3 из 4
Анализ бизнеса
Елена строит модель вашего бизнеса
+
Этап 3 из 4
Анализ бизнеса
Елена строит модель вашего бизнеса
-
🚀
Этап 4 из 4
План — ТЗ на программу
Проект системы для вашего бизнеса
+
Этап 4 из 4
План — ТЗ на программу
Проект системы для вашего бизнеса
-
💬
Личный консультант
Связаться с Русланом
Вопросы по проекту, срокам, оплате — напишите напрямую
+
Личный консультант
Связаться с Русланом
Вопросы по проекту, срокам, оплате — напишите напрямую
@@ -354,7 +354,7 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ
-
💬 Спросить Елену об этом этапе
+
Спросить Елену об этом этапе
@@ -380,6 +380,35 @@ const chat=document.getElementById("chat"), inp=document.getElementById("inp"); const PCTS={1:25,3:50,4:75,5:100}; // 4 шага для клиента (Этап 1 объединён) function esc(s){return (s||"").replace(/&/g,"&").replace(//g,">")} function fmt(s){return esc(s).replace(/\*\*(.+?)\*\*/g,"$1")} +/* ── Иконки по брендбуку: Lucide, stroke 1.75, fill none, round ── */ +const ICONS={ + user:'', + message:'', + folder:'', + file:'', + chart:'', + activity:'', + process:'', + team:'', + clipboard:'', + idea:'', + paperclip:'', + card:'', + phone:'', + cash:'', + printer:'', + download:'', + lock:'', + calendar:'', + check:'', + alert:'', + mic:'', + receipt:'', + search:'', + target:'', + send:'' +}; +function ic(n,s,sw){s=s||20;return ''+(ICONS[n]||'')+'';} function toggleSb(){ const sb=document.getElementById('sbNav'), bd=document.getElementById('sbBackdrop'); @@ -471,7 +500,7 @@ function openIdeas(){ const list=sgs.length?sgs.map(s=>{const st=SUG_ST[s.status]||SUG_ST.new;return `
${esc(s.text)}
${st[0]}${s.decision?`— ${esc(s.decision)}`:''}
`}).join(''):'
Пока нет. Предложите первую идею — мы рассмотрим её.
'; const m=document.createElement('div');m.id='ideaModal';m.style.cssText='position:fixed;inset:0;background:rgba(15,15,26,.5);z-index:260;display:flex;align-items:center;justify-content:center;padding:18px';m.onclick=()=>m.remove(); m.innerHTML=`
-
💡 Мои предложения
+
${ic('idea',20)} Мои предложения
Ваши идеи по проекту. Консультант рассмотрит каждую и ответит решением.
${list}
@@ -557,7 +586,7 @@ function fillProfile(){ function renderDocs(){ const dl=document.getElementById("docList");if(!dl)return; const docs=state.documents||[]; - dl.innerHTML=docs.length?docs.map(d=>{const u=`${API}/api/doc?token=${encodeURIComponent(token)}&name=${encodeURIComponent(d.filename)}`;return `
📄
${esc(d.filename)}
${(d.size/1024).toFixed(0)} КБ · учтён в анализе
`}).join(""):'
Документов пока нет
'; + dl.innerHTML=docs.length?docs.map(d=>{const u=`${API}/api/doc?token=${encodeURIComponent(token)}&name=${encodeURIComponent(d.filename)}`;return `
${ic('file',18)}
${esc(d.filename)}
${(d.size/1024).toFixed(0)} КБ · учтён в анализе
${ic('download',16)}
`}).join(""):'
Документов пока нет
'; } async function handleFiles(files){ const dl=document.getElementById("docList"); @@ -665,29 +694,29 @@ async function sendMsg(){ let anTab="canvas"; function renderAnalysis(){ const pad=document.getElementById("anPad"); - pad.innerHTML=`
📊 Стратегия
🔧 Функции
🏢 Организация
`; + pad.innerHTML=`
${ic('chart',16)} Стратегия
${ic('process',16)} Функции
${ic('team',16)} Организация
`; renderAnContent(); } function setAnTab(t){anTab=t;renderAnalysis()} function renderAnContent(){ const c=document.getElementById("anContent"); if(anTab==='canvas'){ - if(!state.canvas){c.innerHTML=runCard("canvas","📊","Стратегическая модель","Елена построит Business Model Canvas — как устроен ваш бизнес и как он зарабатывает.","Построить стратегию →");return} + if(!state.canvas){c.innerHTML=runCard("canvas",ic('chart',30),"Стратегическая модель","Елена построит Business Model Canvas — как устроен ваш бизнес и как он зарабатывает.","Построить стратегию →");return} c.innerHTML=renderCanvas(state.canvas); }else if(anTab==='idef0'){ - if(!state.model){c.innerHTML=runCard("model","🔧","Функциональная модель","Елена разложит бизнес на функции (IDEF0): входы, выходы, нормы, ресурсы и разрывы.","Построить модель →");return} + if(!state.model){c.innerHTML=runCard("model",ic('process',30),"Функциональная модель","Елена разложит бизнес на функции (IDEF0): входы, выходы, нормы, ресурсы и разрывы.","Построить модель →");return} c.innerHTML=renderIdef(state.model); }else{ c.innerHTML=renderOrg(); } } function renderOrg(){ - if(!state.model)return runCard(null,"⚠️","Сначала функции","Оргструктура строится из функциональной модели. Постройте модель на вкладке «Функции».","→ К функциям",()=>setAnTab('idef0')); + if(!state.model)return runCard(null,ic('alert',30),"Сначала функции","Оргструктура строится из функциональной модели. Постройте модель на вкладке «Функции».","→ К функциям",()=>setAnTab('idef0')); let h=''; - if(!state.orgchart)h+=runCard("orgchart","🏢","Целевая оргструктура","Елена построит оргструктуру из модели: кто за что отвечает, подчинённость, штат, узкие места.","Построить оргструктуру →"); + if(!state.orgchart)h+=runCard("orgchart",ic('team',30),"Целевая оргструктура","Елена построит оргструктуру из модели: кто за что отвечает, подчинённость, штат, узкие места.","Построить оргструктуру →"); else h+=renderOrgChart(state.orgchart); if(state.orgchart){ - if(!state.jobs)h+=`
`+runCard("jobs","📋","Должностные инструкции","По ролям: зоны ответственности, KPI, полномочия. С учётом ваших пожеланий (отклонений).","Собрать инструкции →"); + if(!state.jobs)h+=`
`+runCard("jobs",ic('clipboard',30),"Должностные инструкции","По ролям: зоны ответственности, KPI, полномочия. С учётом ваших пожеланий (отклонений).","Собрать инструкции →"); else h+=`
`+renderJobs(state.jobs); } return h; @@ -708,7 +737,7 @@ function renderOrgChart(o){ } function renderJobs(j){ const roles=j.roles||[]; - return `
📋 Должностные инструкции
`+roles.map(r=>`
+ return `
${ic('clipboard',17)} Должностные инструкции
`+roles.map(r=>`
${esc(r.role||'')}
${esc(r.purpose||'')}${r.reports_to?` · ↑ ${esc(r.reports_to)}`:''}
${(r.responsibilities&&r.responsibilities.length)?`
Зоны ответственности
    ${r.responsibilities.map(x=>`
  • ${esc(x)}
  • `).join('')}
`:''} @@ -720,17 +749,17 @@ function renderJobs(j){ function renderSpecPane(){ const pad=document.getElementById("specPad"); if(!state.spec){ - if(!state.model){pad.innerHTML=runCard(null,"⚠️","Сначала Анализ","ТЗ собирается из функциональной модели. Перейдите на Этап 4 и постройте модель.","← К анализу",()=>go(4));return} - pad.innerHTML=runCard("spec","📋","Техническое задание","Из модели бизнеса Елена спроектирует программу: роли, модули, экраны, данные.","Собрать ТЗ →");return} + if(!state.model){pad.innerHTML=runCard(null,ic('alert',30),"Сначала Анализ","ТЗ собирается из функциональной модели. Перейдите на Этап 4 и постройте модель.","← К анализу",()=>go(4));return} + pad.innerHTML=runCard("spec",ic('clipboard',30),"Техническое задание","Из модели бизнеса Елена спроектирует программу: роли, модули, экраны, данные.","Собрать ТЗ →");return} pad.innerHTML=renderSpec(state.spec)+renderExportBar(); } const EST_STAGES=[ - {key:"interview", name:"Интервью", icon:"💬", desc:"Диагностика «как есть» — карта проблем"}, - {key:"methods", name:"Методологии", icon:"🎯", desc:"Подбор фреймворков под вашу задачу"}, - {key:"canvas", name:"Стратегия", icon:"📊", desc:"Целевая модель процессов (TO-BE)"}, - {key:"idef0", name:"Функции IDEF0", icon:"🔧", desc:"Декомпозиция функций + регламенты"}, - {key:"org", name:"Организация", icon:"🏢", desc:"Оргструктура + должностные инструкции"}, - {key:"spec", name:"Выдача ТЗ", icon:"📋", desc:"Готовое ТЗ к внедрению"}, + {key:"interview", name:"Интервью", icon:ic('message',15), desc:"Диагностика «как есть» — карта проблем"}, + {key:"methods", name:"Методологии", icon:ic('target',15), desc:"Подбор фреймворков под вашу задачу"}, + {key:"canvas", name:"Стратегия", icon:ic('chart',15), desc:"Целевая модель процессов (TO-BE)"}, + {key:"idef0", name:"Функции IDEF0", icon:ic('process',15), desc:"Декомпозиция функций + регламенты"}, + {key:"org", name:"Организация", icon:ic('team',15), desc:"Оргструктура + должностные инструкции"}, + {key:"spec", name:"Выдача ТЗ", icon:ic('clipboard',15), desc:"Готовое ТЗ к внедрению"}, ]; function estStageDone(k){ if(k==="interview")return (state.messages||[]).length>0; @@ -751,7 +780,7 @@ function renderEstimateCard(){ const total=Object.values(sp).reduce((a,b)=>a+(+b||0),0); const paid=Object.values(pays).reduce((s,p)=>s+(p.amount||0),0); return `
-
🧾 Смета проекта
+
${ic('receipt',18)} Смета проекта
Прозрачно: за что и сколько. Интервью — бесплатно, дальше помодульно. Готовое ТЗ — после полной оплаты.
${EST_STAGES.map(s=>{ const price=+sp[s.key]||0, isFree=price<=0, isPaid=!!pays[s.key], done=estStageDone(s.key); @@ -780,15 +809,15 @@ function renderExportBar(){ return renderEstimateCard()+`
📦 Готовые документы
Долг закрыт — документы и ТЗ доступны для печати и выгрузки.
- - + +
`; } const debt=state.debt||0, deal=state.deal_amount||0; const moneyStr=deal>0?`Сумма: ${deal.toLocaleString('ru')} ₽${debt>0?` · к оплате: ${debt.toLocaleString('ru')} ₽`:''}`:''; return renderEstimateCard()+`
-
🔒 Документы готовы — доступны после оплаты
+
${ic('lock',17)} Документы готовы — доступны после оплаты
Вы видите полный результат на экране. Печатный документ и выгрузка ТЗ для разработчика открываются после закрытия оплаты.
${moneyStr}
`;