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,8 +1,12 @@
import React from 'react';
import { Microscope, Activity, ArrowRight, CheckCircle2, Shield } from 'lucide-react';
import { Link } from 'react-router-dom';
import { Link, useLocation } from 'react-router-dom';
const Laboratories: React.FC = () => {
const location = useLocation();
const isEnglish = location.pathname.startsWith('/en');
const prefix = isEnglish ? '/en' : '';
return (
<section className="py-20 bg-gradient-to-b from-white to-gray-50">
<div className="container mx-auto px-6">
@@ -11,11 +15,12 @@ const Laboratories: React.FC = () => {
<Microscope className="text-brand-orange" size={32} />
</div>
<h2 className="text-4xl md:text-5xl font-bold text-gray-900 mb-4">
Наши лаборатории
{isEnglish ? 'Our laboratories' : 'Наши лаборатории'}
</h2>
<p className="text-gray-600 text-lg max-w-2xl mx-auto">
Современное оборудование и квалифицированные специалисты для проведения
комплексных исследований
{isEnglish
? 'State-of-the-art equipment and qualified specialists for comprehensive testing and research.'
: 'Современное оборудование и квалифицированные специалисты для проведения комплексных исследований'}
</p>
</div>
@@ -26,7 +31,7 @@ const Laboratories: React.FC = () => {
<div className="relative h-64 overflow-hidden">
<img
src="/media/images/services/soil-survey.png"
alt="Грунтовая лаборатория"
alt={isEnglish ? 'Soil testing laboratory' : 'Грунтовая лаборатория'}
className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-500"
loading="lazy"
/>
@@ -42,10 +47,12 @@ const Laboratories: React.FC = () => {
{/* Заголовок на изображении */}
<div className="absolute bottom-6 left-6 right-6">
<h3 className="text-2xl font-bold text-white mb-2">
Грунтовая лаборатория
{isEnglish ? 'Soil testing laboratory' : 'Грунтовая лаборатория'}
</h3>
<p className="text-white/90 text-sm">
Исследования физических, механических и химических свойств
{isEnglish
? 'Testing of physical, mechanical and chemical soil properties.'
: 'Исследования физических, механических и химических свойств'}
</p>
</div>
</div>
@@ -56,34 +63,46 @@ const Laboratories: React.FC = () => {
<div className="flex items-start gap-3">
<CheckCircle2 className="text-brand-orange flex-shrink-0 mt-1" size={20} />
<div>
<p className="text-gray-700 font-medium">Физические свойства грунтов</p>
<p className="text-sm text-gray-500">Влажность, плотность, гранулометрический состав</p>
<p className="text-gray-700 font-medium">
{isEnglish ? 'Physical properties of soils' : 'Физические свойства грунтов'}
</p>
<p className="text-sm text-gray-500">
{isEnglish ? 'Moisture content, density, grain-size distribution.' : 'Влажность, плотность, гранулометрический состав'}
</p>
</div>
</div>
<div className="flex items-start gap-3">
<CheckCircle2 className="text-brand-orange flex-shrink-0 mt-1" size={20} />
<div>
<p className="text-gray-700 font-medium">Механические характеристики</p>
<p className="text-sm text-gray-500">Прочность, деформируемость, сжимаемость</p>
<p className="text-gray-700 font-medium">
{isEnglish ? 'Mechanical characteristics' : 'Механические характеристики'}
</p>
<p className="text-sm text-gray-500">
{isEnglish ? 'Strength, deformability, compressibility.' : 'Прочность, деформируемость, сжимаемость'}
</p>
</div>
</div>
<div className="flex items-start gap-3">
<CheckCircle2 className="text-brand-orange flex-shrink-0 mt-1" size={20} />
<div>
<p className="text-gray-700 font-medium">Химический анализ</p>
<p className="text-sm text-gray-500">Агрессивность грунтов, анализ воды</p>
<p className="text-gray-700 font-medium">
{isEnglish ? 'Chemical analysis' : 'Химический анализ'}
</p>
<p className="text-sm text-gray-500">
{isEnglish ? 'Soil aggressiveness, water analysis.' : 'Агрессивность грунтов, анализ воды'}
</p>
</div>
</div>
</div>
{/* Кнопка */}
<Link
to="/laboratories/soil"
to={`${prefix}/laboratories/soil`}
className="flex items-center justify-center gap-2 w-full py-4 bg-gradient-to-r from-brand-orange to-orange-600 text-white font-bold rounded-xl hover:from-orange-600 hover:to-brand-orange transition-all duration-300 group/btn"
>
Подробнее о лаборатории
{isEnglish ? 'More about the laboratory' : 'Подробнее о лаборатории'}
<ArrowRight className="group-hover/btn:translate-x-1 transition-transform" size={20} />
</Link>
</div>
@@ -95,7 +114,7 @@ const Laboratories: React.FC = () => {
<div className="relative h-64 overflow-hidden">
<img
src="/media/images/services/engineering-surveys.png"
alt="Радиационная лаборатория"
alt={isEnglish ? 'Radiation laboratory' : 'Радиационная лаборатория'}
className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-500"
loading="lazy"
/>
@@ -111,10 +130,12 @@ const Laboratories: React.FC = () => {
{/* Заголовок на изображении */}
<div className="absolute bottom-6 left-6 right-6">
<h3 className="text-2xl font-bold text-white mb-2">
Радиационная лаборатория
{isEnglish ? 'Radiation laboratory' : 'Радиационная лаборатория'}
</h3>
<p className="text-white/90 text-sm">
Профессиональные исследования радиационной безопасности
{isEnglish
? 'Professional radiation safety and exposure assessments.'
: 'Профессиональные исследования радиационной безопасности'}
</p>
</div>
</div>
@@ -125,23 +146,33 @@ const Laboratories: React.FC = () => {
<div className="flex items-start gap-3">
<Shield className="text-brand-orange flex-shrink-0 mt-1" size={20} />
<div>
<p className="text-gray-700 font-medium">Радиационный контроль</p>
<p className="text-sm text-gray-500">Измерение уровня радона и гамма-излучения</p>
<p className="text-gray-700 font-medium">
{isEnglish ? 'Radiation monitoring' : 'Радиационный контроль'}
</p>
<p className="text-sm text-gray-500">
{isEnglish ? 'Measurement of radon and gamma radiation levels.' : 'Измерение уровня радона и гамма-излучения'}
</p>
</div>
</div>
<div className="flex items-start gap-3">
<Shield className="text-brand-orange flex-shrink-0 mt-1" size={20} />
<div>
<p className="text-gray-700 font-medium">Аккредитованная лаборатория</p>
<p className="text-sm text-gray-500">Техническая компетентность и независимость</p>
<p className="text-gray-700 font-medium">
{isEnglish ? 'Accredited laboratory' : 'Аккредитованная лаборатория'}
</p>
<p className="text-sm text-gray-500">
{isEnglish ? 'Technical competence and independence.' : 'Техническая компетентность и независимость'}
</p>
</div>
</div>
<div className="flex items-start gap-3">
<Shield className="text-brand-orange flex-shrink-0 mt-1" size={20} />
<div>
<p className="text-gray-700 font-medium">Современное оборудование</p>
<p className="text-gray-700 font-medium">
{isEnglish ? 'Modern equipment' : 'Современное оборудование'}
</p>
<p className="text-sm text-gray-500">КАМЕРА-01, ДКГ-02У, ДРБП-03</p>
</div>
</div>
@@ -149,10 +180,10 @@ const Laboratories: React.FC = () => {
{/* Кнопка */}
<Link
to="/laboratories/radiation"
to={`${prefix}/laboratories/radiation`}
className="flex items-center justify-center gap-2 w-full py-4 bg-gradient-to-r from-brand-orange to-orange-600 text-white font-bold rounded-xl hover:from-orange-600 hover:to-brand-orange transition-all duration-300 group/btn"
>
Подробнее о лаборатории
{isEnglish ? 'More about the laboratory' : 'Подробнее о лаборатории'}
<ArrowRight className="group-hover/btn:translate-x-1 transition-transform" size={20} />
</Link>
</div>
@@ -163,16 +194,20 @@ const Laboratories: React.FC = () => {
<div className="mt-16 max-w-4xl mx-auto">
<div className="bg-gradient-to-br from-gray-900 to-gray-800 text-white rounded-2xl p-8 md:p-12 text-center">
<h3 className="text-2xl md:text-3xl font-bold mb-4">
Нужна консультация по лабораторным исследованиям?
{isEnglish
? 'Need a consultation on laboratory testing?'
: 'Нужна консультация по лабораторным исследованиям?'}
</h3>
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
Наши специалисты помогут подобрать оптимальный комплекс исследований для вашего проекта
{isEnglish
? 'Our specialists will help you select the optimal set of tests for your project.'
: 'Наши специалисты помогут подобрать оптимальный комплекс исследований для вашего проекта'}
</p>
<Link
to="/contacts"
to={`${prefix}/contacts`}
className="inline-flex items-center gap-2 px-8 py-4 bg-brand-orange text-white font-bold rounded-xl hover:bg-orange-600 transition-colors"
>
Связаться с нами
{isEnglish ? 'Contact us' : 'Связаться с нами'}
<ArrowRight size={20} />
</Link>
</div>