feat: simplify navigation and add RU/EN home and contacts

- simplify main navigation and hide extra menu items
- make home page more sales-focused with updated hero, benefits and fleet teaser
- add RU/EN handling for home and contacts, including SEO defaults
- integrate basic Strapi homepage API client (no breaking changes)
- update contacts page with messenger buttons and dynamic footer year

Made-with: Cursor
This commit is contained in:
2026-03-13 19:41:07 +05:00
parent 575db0ac53
commit fde9609f9a
26 changed files with 1753 additions and 735 deletions

View File

@@ -1,60 +1,100 @@
import React from 'react';
import PageHeader from '../components/PageHeader';
import { CheckCircle2, Map, FileText, MapPin, Landmark, ClipboardList, Navigation } from 'lucide-react';
import { useLocation } from 'react-router-dom';
const LandSurveyPage: React.FC = () => {
const location = useLocation();
const isEnglish = location.pathname.startsWith('/en');
const services = [
{
icon: Landmark,
title: 'Рекультивация нарушенных земель',
description: 'Восстановление земель после промышленной деятельности и приведение их в состояние, пригодное для дальнейшего использования'
title: isEnglish ? 'Reclamation of disturbed lands' : 'Рекультивация нарушенных земель',
description: isEnglish
? 'Restoration of land affected by industrial activities and bringing it into a condition suitable for further use.'
: 'Восстановление земель после промышленной деятельности и приведение их в состояние, пригодное для дальнейшего использования'
},
{
icon: FileText,
title: 'Подготовка материалов к актам выбора земельного участка лесного фонда',
description: 'Комплексная подготовка документации и согласование с надзорными инстанциями для выбора участков лесного фонда'
title: isEnglish
? 'Preparation of documentation for selecting forest land plots'
: 'Подготовка материалов к актам выбора земельного участка лесного фонда',
description: isEnglish
? 'Comprehensive preparation of documentation and coordination with supervisory authorities for selecting forest fund land plots.'
: 'Комплексная подготовка документации и согласование с надзорными инстанциями для выбора участков лесного фонда'
},
{
icon: Map,
title: 'Градостроительный план земельного участка',
description: 'Разработка градостроительного плана с указанием всех необходимых параметров и ограничений использования территории'
title: isEnglish
? 'Urban development plan of a land plot'
: 'Градостроительный план земельного участка',
description: isEnglish
? 'Development of an urban development plan indicating all required parameters and landuse restrictions for the territory.'
: 'Разработка градостроительного плана с указанием всех необходимых параметров и ограничений использования территории'
},
{
icon: ClipboardList,
title: 'Проект планировки и проект межевания территории',
description: 'Разработка проектов планировки и межевания для комплексного освоения территорий и организации рационального землепользования'
title: isEnglish
? 'Planning and subdivision (demarcation) projects'
: 'Проект планировки и проект межевания территории',
description: isEnglish
? 'Development of planning and subdivision projects for integrated development of territories and rational land use.'
: 'Разработка проектов планировки и межевания для комплексного освоения территорий и организации рационального землепользования'
},
{
icon: Navigation,
title: 'Получение технических условий',
description: 'Получение технических условий на подключение к инженерным сетям и дальнейшее согласование в соответствующих организациях'
title: isEnglish ? 'Obtaining technical specifications' : 'Получение технических условий',
description: isEnglish
? 'Obtaining technical conditions for connection to engineering networks and further coordination with the relevant utility providers.'
: 'Получение технических условий на подключение к инженерным сетям и дальнейшее согласование в соответствующих организациях'
}
];
const cadastralWorks = [
{
title: 'Согласование границ земельных участков',
description: 'Проведение работ по установлению и согласованию границ земельных участков с заинтересованными лицами и смежными землепользователями'
title: isEnglish
? 'Boundary agreement for land plots'
: 'Согласование границ земельных участков',
description: isEnglish
? 'Carrying out works to establish and agree land plot boundaries with interested parties and adjoining land users.'
: 'Проведение работ по установлению и согласованию границ земельных участков с заинтересованными лицами и смежными землепользователями'
},
{
title: 'Определение координат и границ межевых знаков',
description: 'Геодезические измерения и закрепление межевых знаков на местности с использованием современного оборудования'
title: isEnglish
? 'Determining coordinates and boundaries of boundary markers'
: 'Определение координат и границ межевых знаков',
description: isEnglish
? 'Geodetic measurements and setting boundary markers in the field using modern surveying equipment.'
: 'Геодезические измерения и закрепление межевых знаков на местности с использованием современного оборудования'
},
{
title: 'Определение площади земельного участка',
description: 'Точный расчет площади земельного участка по полученным координатам межевых знаков с применением современных методик'
title: isEnglish
? 'Determining the land plot area'
: 'Определение площади земельного участка',
description: isEnglish
? 'Accurate calculation of the land plot area based on boundary marker coordinates using modern methods.'
: 'Точный расчет площади земельного участка по полученным координатам межевых знаков с применением современных методик'
},
{
title: 'Формирование пакета документов',
description: 'Подготовка полного пакета документов и последующая сдача землеустроительного дела (межевой план) в соответствующие государственные органы'
title: isEnglish
? 'Document package preparation'
: 'Формирование пакета документов',
description: isEnglish
? 'Preparation of the full set of documents and subsequent submission of the land management file (cadastral plan) to the relevant state authorities.'
: 'Подготовка полного пакета документов и последующая сдача землеустроительного дела (межевой план) в соответствующие государственные органы'
}
];
return (
<div className="bg-white pb-20">
<PageHeader
title="Землеустроительные и кадастровые работы"
description="Комплекс услуг по межеванию, кадастровому учету и землеустройству"
title={isEnglish ? 'Land management and cadastral works' : 'Землеустроительные и кадастровые работы'}
description={
isEnglish
? 'A comprehensive range of services in land surveying, cadastral registration and land management.'
: 'Комплекс услуг по межеванию, кадастровому учету и землеустройству'
}
image="/media/images/headers/header-zemlestroit-kadastr-jobs.png"
/>
@@ -62,10 +102,12 @@ const LandSurveyPage: React.FC = () => {
{/* Основные услуги */}
<div className="max-w-6xl mx-auto mb-20">
<h2 className="text-3xl font-bold text-gray-900 mb-4 text-center">
Основные виды работ
{isEnglish ? 'Main types of works' : 'Основные виды работ'}
</h2>
<p className="text-center text-gray-600 mb-12 max-w-3xl mx-auto">
Профессиональное выполнение землеустроительных и кадастровых работ любой сложности
{isEnglish
? 'Professional execution of land management and cadastral works of any complexity.'
: 'Профессиональное выполнение землеустроительных и кадастровых работ любой сложности'}
</p>
<div className="space-y-6">
@@ -97,10 +139,14 @@ const LandSurveyPage: React.FC = () => {
<div className="text-center mb-12">
<div className="inline-flex items-center gap-3 bg-brand-orange text-white px-8 py-4 rounded-full mb-4">
<MapPin size={32} />
<span className="text-xl font-bold">КАДАСТРОВЫЕ РАБОТЫ</span>
<span className="text-xl font-bold">
{isEnglish ? 'CADASTRAL WORKS' : 'КАДАСТРОВЫЕ РАБОТЫ'}
</span>
</div>
<p className="text-gray-600 max-w-3xl mx-auto">
Комплексное выполнение работ по межеванию земельных участков и подготовке документации для государственного кадастрового учета
{isEnglish
? 'Comprehensive execution of boundary survey works and preparation of documentation for state cadastral registration.'
: 'Комплексное выполнение работ по межеванию земельных участков и подготовке документации для государственного кадастрового учета'}
</p>
</div>
@@ -129,7 +175,7 @@ const LandSurveyPage: React.FC = () => {
{/* Этапы работы */}
<div className="max-w-6xl mx-auto mb-20">
<h2 className="text-3xl font-bold text-gray-900 mb-12 text-center">
Этапы выполнения работ
{isEnglish ? 'Work stages' : 'Этапы выполнения работ'}
</h2>
<div className="relative">
@@ -141,8 +187,14 @@ const LandSurveyPage: React.FC = () => {
1
</div>
<div className="flex-1 bg-white rounded-xl p-6 shadow-md">
<h3 className="text-lg font-bold text-gray-900 mb-2">Получение заявки и выезд на объект</h3>
<p className="text-gray-600 text-sm">Первичное обследование территории и определение объема работ</p>
<h3 className="text-lg font-bold text-gray-900 mb-2">
{isEnglish ? 'Receiving the request and site visit' : 'Получение заявки и выезд на объект'}
</h3>
<p className="text-gray-600 text-sm">
{isEnglish
? 'Initial site survey and defining the scope of work.'
: 'Первичное обследование территории и определение объема работ'}
</p>
</div>
</div>
@@ -151,8 +203,14 @@ const LandSurveyPage: React.FC = () => {
2
</div>
<div className="flex-1 bg-white rounded-xl p-6 shadow-md">
<h3 className="text-lg font-bold text-gray-900 mb-2">Геодезические измерения</h3>
<p className="text-gray-600 text-sm">Проведение измерений и закрепление границ межевыми знаками</p>
<h3 className="text-lg font-bold text-gray-900 mb-2">
{isEnglish ? 'Geodetic measurements' : 'Геодезические измерения'}
</h3>
<p className="text-gray-600 text-sm">
{isEnglish
? 'Carrying out field measurements and setting boundaries with boundary markers.'
: 'Проведение измерений и закрепление границ межевыми знаками'}
</p>
</div>
</div>
@@ -161,8 +219,14 @@ const LandSurveyPage: React.FC = () => {
3
</div>
<div className="flex-1 bg-white rounded-xl p-6 shadow-md">
<h3 className="text-lg font-bold text-gray-900 mb-2">Согласование границ</h3>
<p className="text-gray-600 text-sm">Согласование установленных границ со смежными землепользователями</p>
<h3 className="text-lg font-bold text-gray-900 mb-2">
{isEnglish ? 'Boundary agreement' : 'Согласование границ'}
</h3>
<p className="text-gray-600 text-sm">
{isEnglish
? 'Agreeing established boundaries with adjoining land users.'
: 'Согласование установленных границ со смежными землепользователями'}
</p>
</div>
</div>
@@ -171,8 +235,14 @@ const LandSurveyPage: React.FC = () => {
4
</div>
<div className="flex-1 bg-white rounded-xl p-6 shadow-md">
<h3 className="text-lg font-bold text-gray-900 mb-2">Подготовка документации</h3>
<p className="text-gray-600 text-sm">Формирование межевого плана и полного пакета документов</p>
<h3 className="text-lg font-bold text-gray-900 mb-2">
{isEnglish ? 'Documentation preparation' : 'Подготовка документации'}
</h3>
<p className="text-gray-600 text-sm">
{isEnglish
? 'Preparation of the cadastral (boundary) plan and the complete document package.'
: 'Формирование межевого плана и полного пакета документов'}
</p>
</div>
</div>
@@ -181,8 +251,14 @@ const LandSurveyPage: React.FC = () => {
5
</div>
<div className="flex-1 bg-white rounded-xl p-6 shadow-md">
<h3 className="text-lg font-bold text-gray-900 mb-2">Сдача в государственные органы</h3>
<p className="text-gray-600 text-sm">Передача документов в Росреестр для постановки на кадастровый учет</p>
<h3 className="text-lg font-bold text-gray-900 mb-2">
{isEnglish ? 'Submission to state authorities' : 'Сдача в государственные органы'}
</h3>
<p className="text-gray-600 text-sm">
{isEnglish
? 'Submitting documents to Rosreestr for state cadastral registration.'
: 'Передача документов в Росреестр для постановки на кадастровый учет'}
</p>
</div>
</div>
</div>
@@ -193,7 +269,7 @@ const LandSurveyPage: React.FC = () => {
<div className="max-w-6xl mx-auto">
<div className="bg-gradient-to-br from-gray-900 to-gray-800 text-white rounded-2xl p-8 md:p-12 mb-12">
<h2 className="text-3xl font-bold mb-8 text-center">
Наши преимущества
{isEnglish ? 'Our advantages' : 'Наши преимущества'}
</h2>
<div className="grid md:grid-cols-3 gap-8">
@@ -201,9 +277,13 @@ const LandSurveyPage: React.FC = () => {
<div className="inline-flex w-16 h-16 bg-brand-orange rounded-xl items-center justify-center mb-4">
<CheckCircle2 size={32} />
</div>
<h3 className="font-bold text-lg mb-3">Полное сопровождение</h3>
<h3 className="font-bold text-lg mb-3">
{isEnglish ? 'Endtoend support' : 'Полное сопровождение'}
</h3>
<p className="text-gray-300 text-sm leading-relaxed">
От измерений на местности до получения свидетельства о регистрации
{isEnglish
? 'From field measurements to obtaining the registration certificate.'
: 'От измерений на местности до получения свидетельства о регистрации'}
</p>
</div>
@@ -211,9 +291,13 @@ const LandSurveyPage: React.FC = () => {
<div className="inline-flex w-16 h-16 bg-brand-orange rounded-xl items-center justify-center mb-4">
<Navigation size={32} />
</div>
<h3 className="font-bold text-lg mb-3">Точность измерений</h3>
<h3 className="font-bold text-lg mb-3">
{isEnglish ? 'Measurement accuracy' : 'Точность измерений'}
</h3>
<p className="text-gray-300 text-sm leading-relaxed">
Использование современного геодезического оборудования высокой точности
{isEnglish
? 'Use of modern highprecision geodetic equipment.'
: 'Использование современного геодезического оборудования высокой точности'}
</p>
</div>
@@ -221,9 +305,13 @@ const LandSurveyPage: React.FC = () => {
<div className="inline-flex w-16 h-16 bg-brand-orange rounded-xl items-center justify-center mb-4">
<FileText size={32} />
</div>
<h3 className="font-bold text-lg mb-3">Юридическая чистота</h3>
<h3 className="font-bold text-lg mb-3">
{isEnglish ? 'Legal compliance' : 'Юридическая чистота'}
</h3>
<p className="text-gray-300 text-sm leading-relaxed">
Грамотное оформление всех документов в соответствии с законодательством
{isEnglish
? 'Proper preparation of all documents in strict accordance with current legislation.'
: 'Грамотное оформление всех документов в соответствии с законодательством'}
</p>
</div>
</div>
@@ -233,13 +321,15 @@ const LandSurveyPage: React.FC = () => {
<div className="text-center">
<div className="bg-gray-50 rounded-2xl p-8">
<p className="text-gray-700 mb-6 text-lg">
Нужны землеустроительные или кадастровые работы?
{isEnglish
? 'Do you need land management or cadastral services?'
: 'Нужны землеустроительные или кадастровые работы?'}
</p>
<a
href="#/contacts"
href={`#${isEnglish ? '/en/contacts' : '/contacts'}`}
className="inline-block px-10 py-4 bg-brand-orange text-white font-bold rounded-lg hover:bg-orange-600 transition-colors text-lg shadow-lg hover:shadow-xl"
>
Заказать услугу
{isEnglish ? 'Order a service' : 'Заказать услугу'}
</a>
</div>
</div>