/* /events — каталог событий */ const Events = () => { const navy = '#1A2535'; const cream = '#F2EADA'; const [typeFilter, setTypeFilter] = React.useState('ALL'); const [formatFilter, setFormatFilter] = React.useState('ALL'); const [topicFilter, setTopicFilter] = React.useState('ALL'); const [selectedDay, setSelectedDay] = React.useState(null); // События: month (0-index Apr=3), day, тип, формат, тема, название, цена, мест осталось, дата текстом const events = [ {id:'e1', d: new Date(2026,3,28), type:'СЕССИЯ', fmt:'ОНЛАЙН', topic:'ВЕС', title:'Индивидуальная сессия', price:20000, seats:2, dur:'90 мин', lead:'Один запрос. Точечная работа. Ведут авторы метода.', href:'session.html'}, {id:'e2', d: new Date(2026,4,3), type:'ГРУППА', fmt:'ЛИЧНО · МОСКВА', topic:'ОТНОШЕНИЯ', title:'Расстановочная группа — «Повторяющийся сценарий»', price:55000, seats:4, dur:'3 дня', lead:'Три дня плотной работы. Свой запрос + десятки чужих сцен, которые открывают твою.', href:'#e2'}, {id:'e3', d: new Date(2026,4,7), type:'ВЕБИНАР', fmt:'ОНЛАЙН', topic:'МЕТОД', title:'Почему откатывается результат', price:0, seats:250, dur:'90 мин', lead:'Открытый разговор о том, почему психотерапия и коучинг не удерживают эффект.', href:'#e3'}, {id:'e4', d: new Date(2026,4,12), type:'ПРОГРАММА', fmt:'ОНЛАЙН', topic:'ВЕС', title:'Поток «Вес-лес» · 4 сессии', price:90000, seats:3, dur:'2 мес', lead:'Для тех, кто сбрасывает и возвращает. Работаем с причиной, не с калориями.', href:'ves-les.html'}, {id:'e5', d: new Date(2026,4,17), type:'СЕССИЯ', fmt:'ЛИЧНО · СПБ', topic:'ДЕНЬГИ', title:'Индивидуальная сессия', price:20000, seats:1, dur:'90 мин', lead:'Очный формат. Для тех, кто ценит живой контакт и расстановочное поле.', href:'session.html'}, {id:'e6', d: new Date(2026,4,22), type:'ГРУППА', fmt:'ОНЛАЙН', topic:'ДЕНЬГИ', title:'Группа «Денежный потолок»', price:48000, seats:6, dur:'2 дня', lead:'Работаем с тем, что не пускает твой доход выше привычной планки.', href:'#e6'}, {id:'e7', d: new Date(2026,4,29), type:'ВЕБИНАР', fmt:'ОНЛАЙН', topic:'МЕТОД', title:'Вселенская терапия — что это', price:2000, seats:120, dur:'2 ч', lead:'Разбор метода Леонида Тальписа. С демо-работой для 3 участников.', href:'#e7'}, {id:'e8', d: new Date(2026,5,5), type:'ВЫЕЗД', fmt:'ВЫЕЗД · СОЧИ', topic:'ТЕЛО', title:'Ретрит «Тело не врёт» · 5 дней', price:220000, seats:2, dur:'5 дней', lead:'Пять дней в Сочи: утро — тело, день — сессии, вечер — сборка. Закрытая группа 8 человек.', href:'#e8'}, {id:'e9', d: new Date(2026,5,11), type:'ПРОГРАММА', fmt:'ОНЛАЙН', topic:'ОТНОШЕНИЯ', title:'Поток «Отношения»', price:90000, seats:5, dur:'2 мес', lead:'4 сессии для тех, кто третий раз попадает в один и тот же сценарий.', href:'#e9'}, {id:'e10', d: new Date(2026,5,18), type:'ВЕБИНАР', fmt:'ОНЛАЙН', topic:'ТЕЛО', title:'Q&A с авторами метода', price:0, seats:400, dur:'60 мин', lead:'Открытый созвон. Присылаешь вопрос заранее — отвечаем в эфире.', href:'#e10'}, {id:'e11', d: new Date(2026,5,23), type:'VIP', fmt:'ЛИЧНО · МОСКВА', topic:'БИЗНЕС', title:'VIP-сопровождение · старт потока', price:180000, seats:3, dur:'3 мес', lead:'Пакет 6 сессий + чат + 2 сверки. Для собственников и предпринимателей.', href:'#vip'}, {id:'e12', d: new Date(2026,5,28), type:'ГРУППА', fmt:'ОНЛАЙН', topic:'ВОЗРАСТ', title:'Группа «Зрелая сила»', price:48000, seats:8, dur:'2 дня', lead:'Для женщин 45+. Без романтизации «молодости» и без страха.', href:'#e12'}, ]; const types = ['ALL', ...Array.from(new Set(events.map(e=>e.type)))]; const fmts = ['ALL', 'ОНЛАЙН','ЛИЧНО','ВЫЕЗД']; const topics = ['ALL', ...Array.from(new Set(events.map(e=>e.topic)))]; const filtered = events.filter(e => { if (typeFilter !== 'ALL' && e.type !== typeFilter) return false; if (formatFilter !== 'ALL' && !e.fmt.startsWith(formatFilter)) return false; if (topicFilter !== 'ALL' && e.topic !== topicFilter) return false; if (selectedDay) { const s = selectedDay; if (e.d.getFullYear() !== s.getFullYear() || e.d.getMonth() !== s.getMonth() || e.d.getDate() !== s.getDate()) return false; } return true; }); // Calendar: April 2026 (month index 3) const [calMonth, setCalMonth] = React.useState(3); const calYear = 2026; const monthNames = ['ЯНВАРЬ','ФЕВРАЛЬ','МАРТ','АПРЕЛЬ','МАЙ','ИЮНЬ','ИЮЛЬ','АВГУСТ','СЕНТЯБРЬ','ОКТЯБРЬ','НОЯБРЬ','ДЕКАБРЬ']; const daysInMonth = new Date(calYear, calMonth+1, 0).getDate(); const firstDow = (new Date(calYear, calMonth, 1).getDay() + 6) % 7; // Mon=0 const eventsByDay = {}; events.forEach(e => { if (e.d.getMonth() === calMonth && e.d.getFullYear() === calYear) { const k = e.d.getDate(); eventsByDay[k] = eventsByDay[k] || []; eventsByDay[k].push(e); } }); const typeColor = (t) => { if (t === 'СЕССИЯ') return '#F2EADA'; if (t === 'ГРУППА') return '#E3683E'; if (t === 'ВЕБИНАР') return '#FF4D1A'; if (t === 'ПРОГРАММА') return '#E3683E'; if (t === 'ВЫЕЗД') return '#FF4D1A'; if (t === 'VIP') return '#F2EADA'; return '#F2EADA'; }; const fmtDate = (d) => { const days = ['ВС','ПН','ВТ','СР','ЧТ','ПТ','СБ']; const months = ['ЯНВ','ФЕВ','МАР','АПР','МАЙ','ИЮН','ИЮЛ','АВГ','СЕН','ОКТ','НОЯ','ДЕК']; return `${days[d.getDay()]} · ${d.getDate()} ${months[d.getMonth()]}`; }; const resetFilters = () => { setTypeFilter('ALL'); setFormatFilter('ALL'); setTopicFilter('ALL'); setSelectedDay(null); }; return (