// База данных по городам и участникам тура
const citiesData = {
penza: {
title: "ПЕНЗА",
date: "20-21 ИЮНЯ",
tagline: "Битва Вкусов • Локальные специалитеты Сурского края",
desc: "Суровое противостояние команд в приготовлении из локальных ингредиентов. Никто не знает, что в Черном Ящике.",
chefs: [
{ name: "Илья Ласкавый", desc: "Шеф-куратор «Крафт»", label: "Баттл-Шеф", img: "https://static.tildacdn.com/tild3834-3863-4432-b863-346139393037/_.JPG", bio: "Амбициозный шеф-повар с глубоким пониманием современной локальной кухни Поволжья. Сторонник чистых, понятных вкусов и безупречной технической дисциплины." },
{ name: "Алексей Мещеряков", desc: "Шеф-повар «Gojira»", label: "Баттл-Шеф", img: "https://static.tildacdn.com/tild6130-3330-4266-b165-373661366339/_.JPG", bio: "Опытнейший повар и визионер гастрономической культуры Пензы. Любит переосмыслять классические европейские рецепты с использованием редких сурских продуктов." },
{ name: "Сергей Подгорнов", desc: "Шеф-повар кафе Гости", label: "Баттл-Шеф", img: "https://static.tildacdn.com/tild3030-3939-4861-a437-666238323362/_.JPG", bio: "Сергей — профессионал своего дела, который ежедневно создает блюда, объединяющие качество, вкус и авторский подход. Его кулинарный стиль основан на уважении к продукту, внимании к деталям и любви к гастрономии." },
{ name: "Станислав Шпагин", desc: "Шеф-повар «Абашево бистро»", label: "Баттл-Шеф", img: "https://static.tildacdn.com/tild3732-3861-4265-a337-386233353466/_.png", bio: "Прогрессивный шеф-новатор, активно использующий локальное сырьё, лесные дикоросы и традиционные техники ферментации в современном авторском ключе." }
],
bloggers: [
{ name: "Ольга Комазенок", desc: "Популярный лайфстайл-блогер, инфлюенсер", label: "Блогер-Повар", img: "https://static.tildacdn.com/tild3966-3836-4234-b337-653861353937/2026-06-17_151652.jpg", bio: "Оля — блогер и яркая творческая личность, которая привлекает аудиторию своей искренностью, позитивной энергией и умением создавать интересный и живой контент." },
{ name: "Жанна Валова", desc: "Педиатр | Эксперт по питанию детей", label: "Блогер-Повар", img: "https://static.tildacdn.com/tild6632-6333-4463-b131-363639623235/_.JPG", bio: "Врач-педиатр, которой ежедневно доверяют самое ценное — здоровье детей. В своих социальных сетях Жанна помогает родителям разбираться в вопросах прикорма." },
{ name: "Элина", desc: "Фуд-инфлюенсер, кулинарный блогер", label: "Блогер-Повар", img: "https://static.tildacdn.com/tild3231-6636-4363-a139-396631326234/photo.JPG", bio: "Фуд-блогер, автор популярных рецептов и кулинарного контента, за которым следят более 300 тысяч подписчиков. Элина вдохновляет своей любовью к кулинарии." },
{ name: "Павел Волков", desc: "Медиа-блогер, шоумен, ведущий мероприятий", label: "Блогер-Повар", img: "https://static.tildacdn.com/tild3335-3933-4632-b237-323666333735/_.JPG", bio: "Блогер и Stand Up-комик, который умеет находить повод для улыбки в любой ситуации. Свою аудиторию Павел покорил искромётным юмором." }
]
},
spb: {
title: "СПБ", date: "29 АВГУСТА", tagline: "Vokzal 1853 • Северо-западный кулинарный авангард",
desc: "Суровое противостояние команд в приготовлении из локальных ингредиентов. Никто не знает, что в Черном Ящике.",
chefs: Array(4).fill(null).map(() => ({ name: "Скоро будет известно", desc: "Определяется кастингом", label: "Баттл-Шеф", img: "", bio: "Имя участника этого этапа будет объявлено сразу после завершения финального кастинга." })),
bloggers: Array(4).fill(null).map(() => ({ name: "Скоро будет известно", desc: "Определяется кастингом", label: "Блогер-Повар", img: "", bio: "Имя участника этого этапа будет объявлено сразу после завершения финального кастинга." }))
},
nsk: {
title: "НОВОСИБИРСК", date: "12 ИЮЛЯ", tagline: "Фестиваль «В Сибири - есть!» • Мощь сибирского духа",
desc: "Суровое противостояние команд в приготовлении из локальных ингредиентов. Никто не знает, что в Черном Ящике.",
chefs: Array(4).fill(null).map(() => ({ name: "Скоро будет известно", desc: "Определяется кастингом", label: "Баттл-Шеф", img: "", bio: "Имя участника этого этапа будет объявлено сразу после завершения финального кастинга." })),
bloggers: Array(4).fill(null).map(() => ({ name: "Скоро будет известно", desc: "Определяется кастингом", label: "Блогер-Повар", img: "", bio: "Имя участника этого этапа будет объявлено сразу после завершения финального кастинга." }))
},
mhk: {
title: "МАХАЧКАЛА", date: "8-9 АВГУСТА", tagline: "Фестиваль «Наследие» • Гастрономический огонь Кавказа",
desc: "Суровое противостояние команд в приготовлении из локальных ингредиентов. Никто не знает, что в Черном Ящике.",
chefs: Array(4).fill(null).map(() => ({ name: "Скоро будет известно", desc: "Определяется кастингом", label: "Баттл-Шеф", img: "", bio: "Имя участника этого этапа будет объявлено сразу после завершения финального кастинга." })),
bloggers: Array(4).fill(null).map(() => ({ name: "Скоро будет известно", desc: "Определяется кастингом", label: "Блогер-Повар", img: "", bio: "Имя участника этого этапа будет объявлено сразу после завершения финального кастинга." }))
},
yar: {
title: "ЯРОСЛАВЛЬ", date: "23 АВГУСТА", tagline: "«Пир на Волге» • Финальный аккорд Золотого Кольца",
desc: "Суровое противостояние команд в приготовлении из локальных ингредиентов. Никто не знает, что в Черном Ящике.",
chefs: Array(4).fill(null).map(() => ({ name: "Скоро будет известно", desc: "Определяется кастингом", label: "Баттл-Шеф", img: "", bio: "Имя участника этого этапа будет объявлено сразу после завершения финального кастинга." })),
bloggers: Array(4).fill(null).map(() => ({ name: "Скоро будет известно", desc: "Определяется кастингом", label: "Блогер-Повар", img: "", bio: "Имя участника этого этапа будет объявлено сразу после завершения финального кастинга." }))
}
};
let activeCity = "penza";
// Управление кнопками городов
function renderCityButtons() {
const container = document.getElementById('city-buttons-container');
if(!container) return;
container.innerHTML = '';
Object.keys(citiesData).forEach(cityKey => {
const city = citiesData[cityKey];
const isActive = cityKey === activeCity;
const activeClasses = isActive ? 'bg-red-50 border-l-8 border-red-600' : 'hover:bg-gray-50';
container.innerHTML += `
${city.date}
${city.title}
"${city.tagline.split('•')[0].trim()}"
`;
});
}
// Обновление контента активного города
function renderActiveCityData() {
const city = citiesData[activeCity];
document.getElementById('active-city-name').innerText = city.title;
document.getElementById('active-city-date').innerText = city.date;
document.getElementById('active-city-tagline').innerText = city.tagline;
document.getElementById('active-city-desc').innerText = city.desc;
const chefsContainer = document.getElementById('chefs-container');
const bloggersContainer = document.getElementById('bloggers-container');
chefsContainer.innerHTML = '';
bloggersContainer.innerHTML = '';
city.chefs.forEach((chef, index) => { chefsContainer.innerHTML += createParticipantCard(chef, 'chefs', index); });
city.bloggers.forEach((blogger, index) => { bloggersContainer.innerHTML += createParticipantCard(blogger, 'bloggers', index); });
}
// Шаблонизатор карточки участника
function createParticipantCard(person, role, index) {
const hasImage = person.img && person.img.trim() !== "";
const imageHtml = hasImage ? `

` : '';
const placeholderHtml = `
`;
return `
${imageHtml} ${placeholderHtml}
${person.name}
${person.desc}
${person.label}
`;
}
// Модальное окно
function openModal(role, index) {
const person = citiesData[activeCity][role][index];
const modalImg = document.getElementById('modal-img');
const modalPlaceholder = document.getElementById('modal-placeholder');
if (person.img && person.img.trim() !== "") {
modalImg.src = person.img;
modalImg.classList.remove('hidden');
modalPlaceholder.classList.add('hidden');
modalImg.onerror = function() { this.classList.add('hidden'); modalPlaceholder.classList.remove('hidden'); };
} else {
modalImg.classList.add('hidden'); modalPlaceholder.classList.remove('hidden');
}
document.getElementById('modal-name').innerText = person.name;
document.getElementById('modal-desc').innerText = person.desc;
document.getElementById('modal-label').innerText = person.label;
document.getElementById('modal-bio').innerText = person.bio;
document.getElementById('bio-modal').classList.remove('hidden');
}
function closeModal() {
document.getElementById('bio-modal').classList.add('hidden');
}
function switchCity(cityKey) {
activeCity = cityKey;
renderCityButtons();
renderActiveCityData();
}
// Инициализация при загрузке страницы
window.onload = function() {
renderCityButtons();
renderActiveCityData();
}