- FloatingContacts: кнопки WhatsApp + Telegram (правый нижний угол) - ScrollToTop: кнопка "наверх" (появляется после 400px скролла) - FAQ секция: 6 вопросов с аккордеоном, id=faq в навбаре - Hero: телефон под CTA кнопками - Форма: поле телефона, реальная отправка (fetch FormSpree или mailto fallback) - Яндекс.Карты embed в блоке контактов - Navigation: убран дубль "Контакты" из links, добавлен FAQ - img width/height на логотипах (антиCLS) - JSON-LD: og-image.svg → .png, добавлен postalCode, уточнен streetAddress - prerender.mjs: динамически обновляет хеш preload шрифта - src/config.js: централизованный конфиг (WhatsApp, Telegram, form endpoint) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
44 lines
1.2 KiB
JavaScript
44 lines
1.2 KiB
JavaScript
import React, { useEffect, useState } from 'react'
|
|
import { LanguageProvider, useLanguage } from './contexts/LanguageContext.jsx'
|
|
import Navigation from './components/Navigation.jsx'
|
|
import Footer from './components/Footer.jsx'
|
|
import Home from './pages/Home.jsx'
|
|
import NotFound from './pages/NotFound.jsx'
|
|
import FloatingContacts from './components/FloatingContacts.jsx'
|
|
import ScrollToTop from './components/ScrollToTop.jsx'
|
|
|
|
function LangSync() {
|
|
const { lang } = useLanguage()
|
|
useEffect(() => {
|
|
document.documentElement.lang = lang
|
|
}, [lang])
|
|
return null
|
|
}
|
|
|
|
function Router() {
|
|
const [path, setPath] = useState(typeof window !== 'undefined' ? window.location.pathname : '/')
|
|
useEffect(() => {
|
|
const handler = () => setPath(window.location.pathname)
|
|
window.addEventListener('popstate', handler)
|
|
return () => window.removeEventListener('popstate', handler)
|
|
}, [])
|
|
|
|
const isHome = path === '/' || path === '/index.html'
|
|
return isHome ? <Home /> : <NotFound />
|
|
}
|
|
|
|
export default function App() {
|
|
return (
|
|
<LanguageProvider>
|
|
<LangSync />
|
|
<Navigation />
|
|
<main>
|
|
<Router />
|
|
</main>
|
|
<Footer />
|
|
<FloatingContacts />
|
|
<ScrollToTop />
|
|
</LanguageProvider>
|
|
)
|
|
}
|