v1: FinPlan AI лендинг
This commit is contained in:
parent
387cb97d22
commit
18a141cd12
239
index.html
239
index.html
@ -3,108 +3,161 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
<title>Статистика кликов</title>
|
<title>FinPlan AI — ИИ-агент финансового планирования</title>
|
||||||
|
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>💰</text></svg>">
|
||||||
<style>
|
<style>
|
||||||
:root{--ink:#0F1218;--cyan:#00E5FF;--cyan-50:#E8FCFF;--white:#fff;--gray-500:#5B6573;--gray-100:#F2F4F7}
|
:root{--ink:#0F1218;--cyan:#00E5FF;--cyan-50:#E8FCFF;--white:#fff;--gray-500:#5B6573;--gray-100:#F2F4F7;--green:#00C853;--green-50:#E8F5E9}
|
||||||
*{box-sizing:border-box;margin:0;padding:0}
|
*{box-sizing:border-box;margin:0;padding:0}
|
||||||
body{font:17px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",Inter,system-ui,sans-serif;color:var(--ink);background:var(--white)}
|
body{font:17px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",Inter,system-ui,sans-serif;color:var(--ink);background:var(--white)}
|
||||||
.container{max-width:1140px;margin:0 auto;padding:80px 24px}
|
.container{max-width:1140px;margin:0 auto;padding:80px 24px}
|
||||||
.hero{background:var(--ink);color:var(--white)}
|
.hero{background:var(--ink);color:var(--white);padding:100px 24px;text-align:center}
|
||||||
.hero h1{font-size:56px;font-weight:800;line-height:1.05;margin-bottom:24px}
|
.hero h1{font-size:56px;font-weight:800;line-height:1.05;margin-bottom:20px}
|
||||||
.hero p{font-size:20px;color:#9aa3b2;max-width:600px;margin-bottom:32px}
|
.hero h1 span{color:var(--cyan)}
|
||||||
.btn{display:inline-block;background:var(--cyan);color:var(--ink);padding:14px 28px;border-radius:8px;font-weight:700;text-decoration:none;cursor:pointer;margin:4px}
|
.hero p{font-size:20px;color:#9aa3b2;max-width:640px;margin:0 auto 36px}
|
||||||
.section h2{font-size:36px;font-weight:700;margin-bottom:24px}
|
.btn{display:inline-block;background:var(--cyan);color:var(--ink);padding:16px 32px;border-radius:8px;font-weight:700;text-decoration:none;font-size:17px;cursor:pointer;border:none;transition:transform .2s,box-shadow .2s}
|
||||||
.card{background:var(--gray-100);border-radius:16px;padding:32px;margin-bottom:16px}
|
.btn:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,229,255,.3)}
|
||||||
@media (max-width:640px){.hero h1{font-size:36px}.section h2{font-size:28px}.container{padding:48px 20px}}
|
.btn-white{background:var(--white);color:var(--ink)}
|
||||||
.counter{margin-left:8px;font-weight:700;color:var(--cyan)}
|
.btn-green{background:var(--green);color:var(--white)}
|
||||||
|
.section{padding:80px 24px}
|
||||||
|
.section h2{font-size:36px;font-weight:700;margin-bottom:12px;text-align:center}
|
||||||
|
.section .subtitle{color:var(--gray-500);text-align:center;max-width:560px;margin:0 auto 48px;font-size:18px}
|
||||||
|
.features{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:24px;max-width:1140px;margin:0 auto}
|
||||||
|
.feature-card{background:var(--gray-100);border-radius:16px;padding:36px 28px;text-align:center;transition:transform .25s}
|
||||||
|
.feature-card:hover{transform:translateY(-4px)}
|
||||||
|
.feature-card .icon{font-size:48px;margin-bottom:16px;display:block}
|
||||||
|
.feature-card h3{font-size:20px;font-weight:700;margin-bottom:10px}
|
||||||
|
.feature-card p{color:var(--gray-500);font-size:15px;line-height:1.55}
|
||||||
|
.how{background:var(--gray-100)}
|
||||||
|
.steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:32px;max-width:900px;margin:0 auto}
|
||||||
|
.step{text-align:center;padding:20px}
|
||||||
|
.step-num{display:inline-flex;width:52px;height:52px;align-items:center;justify-content:center;background:var(--ink);color:var(--cyan);border-radius:50%;font-size:22px;font-weight:800;margin-bottom:16px}
|
||||||
|
.step h3{font-size:19px;font-weight:700;margin-bottom:8px}
|
||||||
|
.step p{color:var(--gray-500);font-size:15px}
|
||||||
|
.faq{max-width:720px;margin:0 auto}
|
||||||
|
.faq-item{border-bottom:1px solid var(--gray-100);padding:20px 0}
|
||||||
|
.faq-item summary{font-size:18px;font-weight:700;cursor:pointer;list-style:none;display:flex;justify-content:space-between;align-items:center}
|
||||||
|
.faq-item summary::after{content:'+';font-size:24px;color:var(--cyan);transition:transform .2s}
|
||||||
|
.faq-item[open] summary::after{transform:rotate(45deg)}
|
||||||
|
.faq-item p{margin-top:12px;color:var(--gray-500);line-height:1.6}
|
||||||
|
.cta-section{background:var(--ink);color:var(--white);text-align:center;padding:100px 24px}
|
||||||
|
.cta-section h2{font-size:40px;font-weight:800;margin-bottom:16px}
|
||||||
|
.cta-section p{color:#9aa3b2;font-size:19px;max-width:520px;margin:0 auto 32px}
|
||||||
|
.form-inline{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;max-width:480px;margin:0 auto}
|
||||||
|
.form-inline input{flex:1;min-width:220px;padding:16px 20px;border-radius:8px;border:2px solid transparent;font-size:16px;outline:none}
|
||||||
|
.form-inline input:focus{border-color:var(--cyan)}
|
||||||
|
.reveal{opacity:0;transform:translateY(24px);transition:opacity .65s ease,transform .65s ease}
|
||||||
|
.reveal.in{opacity:1;transform:none}
|
||||||
|
@media (max-width:640px){
|
||||||
|
.hero h1{font-size:34px}.hero{padding:60px 20px}
|
||||||
|
.section h2{font-size:28px}.section{padding:56px 20px}
|
||||||
|
.cta-section h2{font-size:28px}.cta-section{padding:64px 20px}
|
||||||
|
.container{padding:48px 20px}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<section class="hero"><div class="container">
|
|
||||||
<h1>Сбор статистики нажатий</h1>
|
<section class="hero">
|
||||||
<p>Нажимайте на кнопки — счётчик будет сохраняться в браузере.</p>
|
<div class="container">
|
||||||
<div style="margin-top:12px;">
|
<h1><span>FinPlan AI</span><br>Твой личный финансовый помощник</h1>
|
||||||
<label for="userInput" style="margin-right:8px;">Пользователь:</label>
|
<p>ИИ-агент, который анализирует расходы, строит бюджеты, помогает копить и инвестировать — без сложных таблиц и банковских приложений.</p>
|
||||||
<input id="userInput" type="text" placeholder="Введите имя" style="padding:4px 8px; border:1px solid var(--gray-500); border-radius:4px;">
|
<a href="#cta" class="btn">Попробовать бесплатно</a>
|
||||||
<button id="setUserBtn" class="btn" style="padding:4px 12px; font-size:14px;">Установить</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div></section>
|
</section>
|
||||||
<section class="section"><div class="container">
|
|
||||||
<h2>Кнопки</h2>
|
<section class="section reveal">
|
||||||
<div id="buttons"></div>
|
<div class="container">
|
||||||
<div id="aggregation" style="margin-top:24px;"></div>
|
<h2>Что умеет FinPlan AI</h2>
|
||||||
</div></section>
|
<p class="subtitle">Всё, что нужно для контроля финансов — в одном месте</p>
|
||||||
|
<div class="features">
|
||||||
|
<div class="feature-card">
|
||||||
|
<span class="icon">📊</span>
|
||||||
|
<h3>Анализ расходов</h3>
|
||||||
|
<p>Загрузи выписку или расскажи голосом — ИИ категоризирует каждый расход и покажет куда уходят деньги.</p>
|
||||||
|
</div>
|
||||||
|
<div class="feature-card">
|
||||||
|
<span class="icon">🎯</span>
|
||||||
|
<h3>Бюджет на месяц</h3>
|
||||||
|
<p>Автоматически рассчитает лимиты по категориям и предупредит, когда приближаешься к границе.</p>
|
||||||
|
</div>
|
||||||
|
<div class="feature-card">
|
||||||
|
<span class="icon">📈</span>
|
||||||
|
<h3>План накоплений</h3>
|
||||||
|
<p>Построит персональный план по целям: отпуск, машина, подушка безопасности — с реальными сроками.</p>
|
||||||
|
</div>
|
||||||
|
<div class="feature-card">
|
||||||
|
<span class="icon">🤖</span>
|
||||||
|
<h3>Умные советы</h3>
|
||||||
|
<p>Персональные рекомендации на основе твоих данных: где сэкономить, как оптимизировать, во что вложить.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="how section reveal">
|
||||||
|
<div class="container">
|
||||||
|
<h2>Как это работает</h2>
|
||||||
|
<p class="subtitle">Три простых шага — и ты контролируешь свои финансы</p>
|
||||||
|
<div class="steps">
|
||||||
|
<div class="step">
|
||||||
|
<div class="step-num">1</div>
|
||||||
|
<h3>Расскажи о себе</h3>
|
||||||
|
<p>Ответь на несколько вопросов о доходах, расходах и финансовых целях — это займёт 2 минуты.</p>
|
||||||
|
</div>
|
||||||
|
<div class="step">
|
||||||
|
<div class="step-num">2</div>
|
||||||
|
<h3>ИИ проанализирует</h3>
|
||||||
|
<p>Агент построит твой финансовый профиль, найдёт точки роста и составит персональный план.</p>
|
||||||
|
</div>
|
||||||
|
<div class="step">
|
||||||
|
<div class="step-num">3</div>
|
||||||
|
<h3>Получай рекомендации</h3>
|
||||||
|
<p>Еженедельные отчёты, советы в чате и уведомления — чтобы ты всегда был в курсе.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section reveal">
|
||||||
|
<div class="container">
|
||||||
|
<h2>Частые вопросы</h2>
|
||||||
|
<div class="faq">
|
||||||
|
<details class="faq-item">
|
||||||
|
<summary>Безопасны ли мои финансовые данные?</summary>
|
||||||
|
<p>Да. Все данные шифруются, хранятся на защищённых серверах и никогда не передаются третьим лицам. Ты можешь удалить все данные одним кликом в любой момент.</p>
|
||||||
|
</details>
|
||||||
|
<details class="faq-item">
|
||||||
|
<summary>Нужно ли подключать банковские счета?</summary>
|
||||||
|
<p>Нет. FinPlan AI работает на основе данных, которые ты предоставляешь сам — вручную или через загрузку выписки. Никаких привязок к картам и счетам.</p>
|
||||||
|
</details>
|
||||||
|
<details class="faq-item">
|
||||||
|
<summary>Сколько стоит использование?</summary>
|
||||||
|
<p>Базовый функционал — бесплатный. Расширенный анализ инвестиций и персональная стратегия доступны по подписке. Первые 14 дней — полностью бесплатно для всех функций.</p>
|
||||||
|
</details>
|
||||||
|
<details class="faq-item">
|
||||||
|
<summary>Подходит ли для начинающих?</summary>
|
||||||
|
<p>Именно для вас! FinPlan AI объясняет всё простым языком, без финансового жаргона. Агент адаптируется под твой уровень знаний.</p>
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="cta" class="cta-section reveal">
|
||||||
|
<div class="container">
|
||||||
|
<h2>Начни управлять финансами уже сегодня</h2>
|
||||||
|
<p>Оставь email — пришлём приглашение первым и дадим 14 дней полного доступа бесплатно.</p>
|
||||||
|
<form action="https://formsubmit.co/your@email.com" method="POST" class="form-inline">
|
||||||
|
<input type="email" name="email" placeholder="твой@email.com" required>
|
||||||
|
<button type="submit" class="btn btn-green">Получить доступ</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Список кнопок, которые нужно отслеживать
|
var io=new IntersectionObserver(function(entries){
|
||||||
const buttonLabels = ['Кнопка A', 'Кнопка B', 'Кнопка C'];
|
entries.forEach(function(e){ if(e.isIntersecting) e.target.classList.add('in'); });
|
||||||
// Ключ в localStorage для всех статистик
|
},{threshold:.15});
|
||||||
const storageKey = 'clickStats';
|
document.querySelectorAll('.reveal').forEach(function(el){ io.observe(el); });
|
||||||
// Текущий пользователь (по умолчанию «guest»)
|
|
||||||
let currentUser = localStorage.getItem('currentUser') || 'guest';
|
|
||||||
// Объект {user: {label: count}}
|
|
||||||
let allStats = JSON.parse(localStorage.getItem(storageKey)) || {};
|
|
||||||
// Инициализируем запись для текущего пользователя, если её нет
|
|
||||||
if (!allStats[currentUser]) {
|
|
||||||
allStats[currentUser] = {};
|
|
||||||
buttonLabels.forEach(label => allStats[currentUser][label] = 0);
|
|
||||||
}
|
|
||||||
// Убедимся, что у всех пользователей присутствуют новые кнопки
|
|
||||||
Object.values(allStats).forEach(userStats => {
|
|
||||||
buttonLabels.forEach(label => {
|
|
||||||
if (!(label in userStats)) userStats[label] = 0;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
localStorage.setItem(storageKey, JSON.stringify(allStats));
|
|
||||||
const container = document.getElementById('buttons');
|
|
||||||
function renderButtons() {
|
|
||||||
container.innerHTML = '';
|
|
||||||
buttonLabels.forEach((label, i) => {
|
|
||||||
const btn = document.createElement('button');
|
|
||||||
btn.className = 'btn';
|
|
||||||
btn.textContent = label;
|
|
||||||
const cnt = document.createElement('span');
|
|
||||||
cnt.className = 'counter';
|
|
||||||
cnt.id = 'cnt-' + i;
|
|
||||||
cnt.textContent = allStats[currentUser][label];
|
|
||||||
btn.addEventListener('click', () => {
|
|
||||||
allStats[currentUser][label]++;
|
|
||||||
cnt.textContent = allStats[currentUser][label];
|
|
||||||
localStorage.setItem(storageKey, JSON.stringify(allStats));
|
|
||||||
renderAggregation();
|
|
||||||
});
|
|
||||||
container.appendChild(btn);
|
|
||||||
container.appendChild(cnt);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function renderAggregation() {
|
|
||||||
const aggDiv = document.getElementById('aggregation');
|
|
||||||
const totals = {};
|
|
||||||
buttonLabels.forEach(label => totals[label] = 0);
|
|
||||||
Object.values(allStats).forEach(userStats => {
|
|
||||||
buttonLabels.forEach(label => {
|
|
||||||
totals[label] += userStats[label] || 0;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
aggDiv.innerHTML = '<h3>Общая статистика</h3>' +
|
|
||||||
buttonLabels.map(label => `<div>${label}: <span class="counter">${totals[label]}</span></div>`).join('');
|
|
||||||
}
|
|
||||||
// UI для установки пользователя
|
|
||||||
document.getElementById('setUserBtn').addEventListener('click', () => {
|
|
||||||
const input = document.getElementById('userInput').value.trim();
|
|
||||||
if (input) {
|
|
||||||
currentUser = input;
|
|
||||||
localStorage.setItem('currentUser', currentUser);
|
|
||||||
if (!allStats[currentUser]) {
|
|
||||||
allStats[currentUser] = {};
|
|
||||||
buttonLabels.forEach(label => allStats[currentUser][label] = 0);
|
|
||||||
}
|
|
||||||
renderButtons();
|
|
||||||
renderAggregation();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// Initial render
|
|
||||||
renderButtons();
|
|
||||||
renderAggregation();
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user