const { useState, useEffect } = React; // Функция для получения настроек сайта из HTML function getSiteConfigFromHTML() { const configElement = document.querySelector('#site-config site-header'); if (!configElement) { return { bgImage: 'https://picsum.photos/1920/1080?random=1', title: 'Станция Сосновая', subtitle: 'База отдыха' }; } return { bgImage: configElement.getAttribute('data-bg-image') || 'https://picsum.photos/1920/1080?random=1', title: configElement.getAttribute('data-title') || 'Станция Сосновая', subtitle: configElement.getAttribute('data-subtitle') || 'База отдыха' }; } // Функция для получения данных карточек из HTML function getCardDataFromHTML() { const cardElements = document.querySelectorAll('#cards-data card-data'); return Array.from(cardElements).map(element => { const images = element.getAttribute('data-images'); return { title: element.getAttribute('data-title'), short: element.getAttribute('data-short'), images: images ? images.split(',').map(img => img.trim()) : [], long: element.getAttribute('data-long') }; }); } // Функция для установки фонового изображения function setHeaderBackground(bgImage) { useEffect(() => { const headerBg = document.querySelector('.header-bg'); if (headerBg && bgImage) { headerBg.style.backgroundImage = `url('${bgImage}')`; } }, [bgImage]); } function Header() { const [siteConfig, setSiteConfig] = useState({ bgImage: '', title: 'Станция Сосновая', subtitle: 'База отдыха' }); useEffect(() => { const config = getSiteConfigFromHTML(); setSiteConfig(config); }, []); // Устанавливаем фоновое изображение useEffect(() => { const headerBg = document.querySelector('.header-bg'); if (headerBg && siteConfig.bgImage) { headerBg.style.backgroundImage = `url('${siteConfig.bgImage}')`; } }, [siteConfig.bgImage]); return (

{siteConfig.title}

{siteConfig.subtitle}

); } function SafeImage({ src, alt, className, fallback = '/images/placeholder.jpg' }) { const [imgSrc, setImgSrc] = useState(src); const handleError = () => { console.warn(`Не удалось загрузить изображение: ${src}`); setImgSrc(fallback); }; return ( {alt} ); } function Card({ card, onCardClick }) { return (
onCardClick(card)}>

{card.title}

{card.short}

); } function Modal({ card, isOpen, onClose }) { const [currentImageIndex, setCurrentImageIndex] = useState(0); useEffect(() => { if (isOpen) { setCurrentImageIndex(0); document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } return () => (document.body.style.overflow = ''); }, [isOpen, card]); if (!isOpen || !card) return null; const next = (e) => { e.stopPropagation(); setCurrentImageIndex((i) => (i + 1) % card.images.length); }; const prev = (e) => { e.stopPropagation(); setCurrentImageIndex((i) => (i - 1 + card.images.length) % card.images.length); }; const modalContent = (
e.target === e.currentTarget && onClose()}>

{card.title}

{card.images.length > 1 && ( <> )}

{card.long}

); return ReactDOM.createPortal(modalContent, document.body); } function CardsSection() { const [selected, setSelected] = useState(null); const [cardData, setCardData] = useState([]); const isOpen = Boolean(selected); // Загружаем данные карточек из HTML при монтировании компонента useEffect(() => { const data = getCardDataFromHTML(); setCardData(data); }, []); return (

Что есть на участке

{cardData.map((c, i) => ( ))}
setSelected(null)} />
); } function Footer() { const ContactLink = ({ href, children }) => ( {children} ); const TelegramIcon = ( ); const WhatsAppIcon = ( ); const PhoneIcon = ( ); return ( ); } function App() { return ( <>