<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
* {
box-sizing: border-box;
}
body {
font-family: 'Noto Sans', sans-serif;
background-color: #f9f9f9;
margin: 0;
padding: 20px;
display: flex;
justify-content: center;
color: #222;
}
.calculator {
width: 100%;
max-width: 800px;
background: white;
border-radius: 16px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
padding: 30px;
min-height: 600px;
display: flex;
flex-direction: column;
justify-content: flex-start;
}
h1 {
font-size: 24px;
margin-bottom: 10px;
font-weight: bold;
}
h2 {
font-size: 24px;
margin-bottom: 20px;
font-weight: bold;
}
p.description {
margin-bottom: 30px;
color: #444;
font-size: 16px;
font-weight: 300;
}
.step {
display: none;
}
.step.active {
display: block;
}
/* Кнопки выбора */
.options button {
display: block;
width: 100%;
margin: 10px 0;
padding: 14px 18px;
border: 1px solid #aad4f5;
background-color: #e9f5ff;
border-radius: 12px;
cursor: pointer;
font-size: 16px;
text-align: left;
color: #222;
font-weight: normal;
text-transform: none;
letter-spacing: normal;
transition: all 0.2s ease;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
}
.options button:hover {
background-color: #bfe0f8;
border-color: #aad4f5;
box-shadow: 0 2px 6px rgba(0, 140, 255, 0.08);
color: #222 !important;
opacity: 1;
}
/* Картинка в ответе */
.answer img {
max-width: 400px;
display: block;
margin: 20px auto;
border-radius: 12px;
}
/* Общий стиль кнопок */
.actions {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.actions button,
.actions a,
#monthly-btn {
flex: 1;
padding: 14px;
border-radius: 12px;
font-size: 16px;
cursor: pointer;
text-align: center;
text-decoration: none;
height: 50px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
font-family: 'Noto Sans', sans-serif;
text-transform: none;
letter-spacing: normal;
display: flex;
align-items: center;
justify-content: center;
}
#monthly-btn:hover {
background-color: #d3eef9;
}
.primary {
border: 1px solid #cceaf5;
background-color: #e0f3fc;
color: #004d66;
border: 1px solid #e0e0dc; /* деликатная граница */
transition: background-color 0.2s ease, color 0.2s ease;
text-align: center;
}
.primary:hover {
background-color: #d3eef9; /* чуть темнее при наведении */
color: #222;
opacity: 1;
/* чуть более выразительный текст */
}
/* Неакцентная кнопка — бежевый фон */
.secondary {
background-color: #f5f5f2; /* мягкий светло-серый с бежевым оттенком */
color: #444; /* приятный тёмно-серый текст */
border: 1px solid #e0e0dc; /* деликатная граница */
transition: background-color 0.2s ease, color 0.2s ease;
}
.secondary:hover {
background-color: #ebeae6; /* чуть темнее при наведении */
color: #222;
opacity: 1;
/* чуть более выразительный текст */
}
.options button .descr {
display: block;
font-size: 14px;
color: #777;
margin-top: 4px;
font-weight: 300;
}
.amount-options {
display: flex;
gap: 10px;
justify-content: space-between;
flex-wrap: wrap;
}
.amount-options button {
width: 220px;
height: 100px;
padding: 0;
font-size: 18px;
font-weight: bold;
text-align: center;
justify-content: center;
align-items: center;
display: flex;
flex-direction: column;
white-space: nowrap;
}
/* Адаптивность для маленьких экранов */
@media (max-width: 600px) {
.amount-options {
justify-content: center;
}
.amount-options button {
width: 100%;
max-width: 100%;
height: auto;
padding: 14px 0;
font-size: 16px;
border-radius: 10px;
}
}
@media (max-width: 600px) {
.calculator {
padding: 20px;
min-height: auto;
}
}
</style>
</head>
<body>
<div class="calculator">
<p class="description">Помогать можно даже небольшими суммами. Узнайте, на что фонды могут потратить ваше пожертвование.</p>
<div class="step step-1 active">
<h2>Кому вы хотели бы помочь?</h2>
<div class="options" id="step1-options">
<button data-theme="orphansfamily">
<strong>Дети-сироты и поддержка семей</strong>
<span class="descr"></span>
</button>
<button data-theme="adultsupport">
<strong>Взрослые в трудных ситуациях</strong>
<span class="descr"></span>
</button>
<button data-theme="elderly">
<strong>Пожилые люди</strong>
<span class="descr"></span>
</button>
<button data-theme="animals">
<strong>Животные</strong>
<span class="descr"></span>
</button>
<button data-theme="environment">
<strong>Экология и защита природы</strong>
<span class="descr"></span>
</button>
<button data-theme="socialissues">
<strong>Сложные темы и уязвимые группы</strong>
<span class="descr"></span>
</button>
<button data-theme="culture">
<strong>Культурное наследие</strong>
<span class="descr"></span>
</button>
<button data-theme="ngosupport">
<strong>Поддержка работы НКО</strong>
<span class="descr"></span>
</button>
<button data-theme="childrenillness">
<strong>Дети с тяжёлыми заболеваниями</strong>
<span class="descr"></span>
</button>
<button data-theme="childrendisability">
<strong>Дети с особенностями развития</strong>
<span class="descr"></span>
</button>
</div>
</div>
<div class="step step-2">
<h2>Сколько вы готовы пожертвовать?</h2>
<div class="options amount-options" id="step2-options">
<button data-amount="100"><span>100 ₽</span></button>
<button data-amount="300"><span>300 ₽</span></button>
<button data-amount="1000"><span>1000 ₽</span></button>
</div>
</div>
<div class="step step-3">
<h2 id="once-heading"></h2>
<div class="answer">
<p id="once-text"></p>
<img id="once-img" src="" alt="">
</div>
<button class="primary" id="monthly-btn">А если жертвовать ежемесячно?</button>
</div>
<div class="step step-4">
<h2 id="monthly-heading"></h2>
<div class="answer">
<p id="monthly-text"></p>
<img id="monthly-img" src="" alt="">
</div>
<div class="actions">
<a id="donate-link" class="primary" target="_blank">Хочу помочь</a>
<button class="secondary" id="start-over">Выбрать, кому еще помочь</button>
</div>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function () {
const data = {
"childrenillness": {
"descr": "Помощь детям с тяжёлыми заболеваниями",
"url": "https://example.org/donate/childrenillness",
"100_once_text": "Подгузники, питание, игрушки — всё, чтобы день стал легче. Даже супергероям нужна поддержка.",
"300_once_text": "Набор заботы: лекарства, такси до больницы, пара улыбок в придачу. Маленьким бойцам — максимум комфорта.",
"1000_once_text": "Сложное лечение требует простых вещей: любви, помощи и финансов. Чтобы родители думали не о счетах, а о детях.",
"100_reg_text": "Регулярная поддержка — как зарядка для надежды. А у надежды, знаете ли, всегда мало батарейки.",
"300_reg_text": "Когда помощь приходит вовремя, болезни сдаются. И мы за это платим любовью, а вы — регулярным переводом.",
"1000_reg_text": "Финансовый экзоскелет для семьи, которая держится из последних сил. Вы — их поддержка каждый месяц.",
"100_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"100_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png"
},
"childrendisability": {
"descr": "Поддержка детей с особенностями развития",
"url": "https://example.org/donate/childrendisability",
"100_once_text": "Пластилин, книжки, развивашки — всё, что помогает раскрыться. Особенные дети — просто особенные.",
"300_once_text": "Помогаем говорить, двигаться, жить активнее. Путь длинный, но вы делаете первый шаг.",
"1000_once_text": "Реабилитация — это не волшебство, а труд и ресурсы. Но с вашей помощью она работает.",
"100_reg_text": "Каждый месяц — шанс. Шанс выучить новое слово или сделать первый шаг.",
"300_reg_text": "Поддержка в ритме месяца. Как репетиции к спектаклю, где звезда — особенный ребёнок.",
"1000_reg_text": "Финансовый костюм супергероя — чтобы ребёнок с особенностями чувствовал себя обычным.",
"100_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"100_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png"
},
"orphansfamily": {
"descr": "Помощь детям-сиротам и семьям",
"url": "https://example.org/donate/orphansfamily",
"100_once_text": "Конфетка, книжка, забота — как домашнее тепло в маленькой упаковке.",
"300_once_text": "Мир, где у ребёнка снова появляется 'мама' и 'папа', пусть и в виде волонтёров и психологов.",
"1000_once_text": "Курс поддержки семьи или шаг к усыновлению. Вы — как добрый волшебник, только без бороды.",
"100_reg_text": "Стабильная забота — как дом, в который возвращаешься. Даже если он ещё только строится.",
"300_reg_text": "Регулярная поддержка — это когда не разово, а по-настоящему. Чтобы детство было с завтраками.",
"1000_reg_text": "Финансовая подушка под детство, которому досталось не самое мягкое начало.",
"100_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"100_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png"
},
"adultsupport": {
"descr": "Поддержка взрослых в трудной ситуации",
"url": "https://example.org/donate/adultsupport",
"100_once_text": "Чашка супа, носки, разговор. Иногда этого достаточно, чтобы продержаться.",
"300_once_text": "Помогаем людям не потеряться в жизни. Потому что каждый заслуживает шанс.",
"1000_once_text": "Юрист, психолог, новый старт. Бывает, одному просто не справиться.",
"100_reg_text": "Вы — постоянная рука помощи. Чтобы человек мог выбраться, а не только выживать.",
"300_reg_text": "Регулярная поддержка делает жизнь снова предсказуемой. В хорошем смысле.",
"1000_reg_text": "Это уже не просто помощь. Это целая лестница из ямы.",
"100_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"100_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png"
},
"elderly": {
"descr": "Забота о пожилых людях",
"url": "https://example.org/donate/elderly",
"100_once_text": "Чай, плед и звонок, чтобы спросили: как вы там? Тепло бывает не только от батареи.",
"300_once_text": "Аптечка, прогулка, сиделка. Пожилым нужно внимание, не только таблетки.",
"1000_once_text": "Чтобы старость была в радость, а не в списке дел у волонтёра.",
"100_reg_text": "Каждый месяц — тёплая весточка. Пусть даже на другом конце провода.",
"300_reg_text": "Стабильность — лучший подарок в возрасте. И вы его дарите.",
"1000_reg_text": "Это как соцпакет, только с душой. И любовью.",
"100_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"100_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png"
},
"animals": {
"descr": "Помощь животным",
"url": "https://example.org/donate/animals",
"100_once_text": "Коробка вкусняшек для кота. Котам в приютах тоже нужны эндорфины.",
"300_once_text": "Проверка у ветеринара и новое лежбище. Мяу-сервис на уровне.",
"1000_once_text": "Операция, стерилизация, реабилитация. Чтобы лапки снова бежали, а хвосты махали.",
"100_reg_text": "Корм ежемесячно — стабильность в миске. Коты уважают предсказуемость.",
"300_reg_text": "Пушистый абонемент на заботу. Тут вам и когтеточка, и прививка.",
"1000_reg_text": "Вы, по сути, спонсируете кота. Он не знает, но уже благодарен.",
"100_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"100_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png"
},
"environment": {
"descr": "Озеленение и забота об экологии",
"url": "https://example.org/donate/environment",
"100_once_text": "Маленький саженец, большой шаг для планеты. Деревья умеют благодарить — кислородом.",
"300_once_text": "Пакет семян, перчатки, и немного надежды на зелёное завтра. Урбанистам на радость.",
"1000_once_text": "Лес не вырастет за день. Но за тысячу рублей — может начать.",
"100_reg_text": "Каждый месяц — один зелёный плюсик в карму. Экологичный и красивый.",
"300_reg_text": "Абонемент на посадку деревьев. Ваша личная фотосинтетическая армия.",
"1000_reg_text": "Почти как мини-Гринпис. Только вы один, и это работает.",
"100_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"100_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png"
},
"socialissues": {
"descr": "Работа с уязвимыми группами и правозащита",
"url": "https://example.org/donate/socialissues",
"100_once_text": "Печенье и юрист — странная, но нужная пара. Особенно если тебе есть, что защищать.",
"300_once_text": "Когда у человека отняли голос, мы даём микрофон. И немного правозащиты.",
"1000_once_text": "Большая защита для тех, у кого нет возможности защититься. Ваша помощь — их щит.",
"100_reg_text": "Регулярная поддержка — как адвокат по подписке. Только с эмпатией.",
"300_reg_text": "Каждый месяц — вы помогаете системе стать чуть более человечной.",
"1000_reg_text": "Это уже не помощь — это маленькая революция. Со знаком плюс.",
"100_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"100_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png"
},
"culture": {
"descr": "Сохранение культурного наследия",
"url": "https://example.org/donate/culture",
"100_once_text": "Поддержать реставрацию — всё равно что сказать 'спасибо' бабушке за варенье.",
"300_once_text": "Купол, куплет или ковёр — культура держится не только на традициях, но и на донатах.",
"1000_once_text": "Меценат XXI века. Без парика, но с банковской картой.",
"100_reg_text": "Вы вносите ежемесячный вклад в красоту. Архитектурную и смысловую.",
"300_reg_text": "Стабильный донат — как регулярный поход в музей. Только вы платите — и всё сохраняется.",
"1000_reg_text": "Благодаря вам история не пылится. А сияет.",
"100_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"100_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png"
},
"ngosupport": {
"descr": "Развитие работы НКО",
"url": "https://example.org/donate/ngosupport",
"100_once_text": "Чашка кофе координатору. Он не устал — он просто делает мир лучше.",
"300_once_text": "Маркер, ноут и аренда. НКО тоже надо чем-то дышать.",
"1000_once_text": "Поддержка целой команды, которая помогает другим. Вы — их опора.",
"100_reg_text": "Каждый месяц — это зарплата тому, кто помогает десяткам.",
"300_reg_text": "НКО работают не на волшебстве. Но с вами — почти.",
"1000_reg_text": "Финансовый мотор третьего сектора. И вы его заправляете.",
"100_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_once_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"100_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"300_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png",
"1000_reg_img": "https://t-j.ru/media/100-derevev-min.el2yt7wmsuoq..png"
}
};
let currentTheme = '';
let currentAmount = '';
document.querySelectorAll('#step1-options button').forEach(btn => {
const theme = btn.dataset.theme;
const descr = data[theme]?.descr;
if (descr) {
btn.querySelector('.descr').textContent = descr;
}
});
document.querySelectorAll('#step1-options button').forEach(btn => {
btn.addEventListener('click', () => {
currentTheme = btn.dataset.theme;
showStep(2);
});
});
document.querySelectorAll('#step2-options button').forEach(btn => {
btn.addEventListener('click', () => {
currentAmount = btn.dataset.amount;
const d = data[currentTheme];
// Обновляем заголовок и контент на шаге 3 (разово)
document.getElementById('once-heading').textContent = `${currentAmount} ₽ —`;
document.getElementById('once-text').textContent = d[`${currentAmount}_once_text`];
document.getElementById('once-img').src = d[`${currentAmount}_once_img`];
showStep(3);
});
});
document.getElementById('monthly-btn').addEventListener('click', () => {
const d = data[currentTheme];
// Обновляем заголовок и контент на шаге 4 (ежемесячно)
document.getElementById('monthly-heading').textContent = `${currentAmount} ₽ каждый месяц —`;
document.getElementById('monthly-text').textContent = d[`${currentAmount}_reg_text`];
document.getElementById('monthly-img').src = d[`${currentAmount}_reg_img`];
document.getElementById('donate-link').href = d.url;
showStep(4);
});
document.getElementById('start-over').addEventListener('click', () => {
currentTheme = '';
currentAmount = '';
showStep(1);
});
function showStep(stepNum) {
document.querySelectorAll('.step').forEach(step => step.classList.remove('active'));
document.querySelector(`.step-${stepNum}`).classList.add('active');
}
});
</script>
</body>
</html>