Обновлены зависимости в package.json и package-lock.json, включая переход на версию Next.js 15.3.1. Внесены изменения в компоненты About, Certificates, Hero и Services: добавлены новые изображения, улучшены стили и описания услуг, а также добавлены новые элементы интерфейса. Удалены неиспользуемые изображения из папки placeholders.
This commit is contained in:
@ -155,11 +155,13 @@ const About = () => {
|
||||
className="relative h-[400px] rounded-lg overflow-hidden shadow-xl"
|
||||
variants={imageVariants}
|
||||
>
|
||||
<div className="absolute inset-0 bg-gradient-to-t from-blue-900/40 to-transparent z-10" />
|
||||
<Image
|
||||
src="/images/office.jpg"
|
||||
alt="Наш офис"
|
||||
fill
|
||||
className="object-cover"
|
||||
sizes="(max-width: 768px) 100vw, 50vw"
|
||||
/>
|
||||
</motion.div>
|
||||
</div>
|
||||
|
@ -118,17 +118,18 @@ const Certificates = () => {
|
||||
className="bg-white rounded-xl overflow-hidden shadow-md hover:shadow-lg transition-shadow duration-300 cursor-pointer"
|
||||
onClick={() => setSelectedCert(index)}
|
||||
>
|
||||
<div className="relative h-64">
|
||||
<div className="relative h-64 overflow-hidden">
|
||||
<Image
|
||||
src={cert.image}
|
||||
alt={cert.title}
|
||||
fill
|
||||
className="object-cover"
|
||||
className="object-contain p-2"
|
||||
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
|
||||
/>
|
||||
<motion.div
|
||||
initial={{ opacity: 0 }}
|
||||
whileHover={{ opacity: 1 }}
|
||||
className="absolute inset-0 bg-black bg-opacity-20 flex items-center justify-center"
|
||||
className="absolute inset-0 bg-blue-600/10 flex items-center justify-center"
|
||||
>
|
||||
<motion.div
|
||||
whileHover={{ scale: 1.2 }}
|
||||
|
@ -97,10 +97,9 @@ const Hero = ({ selectedCity }: HeroProps) => {
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Заглушка-предупреждение */}
|
||||
<div className="absolute top-4 right-4 bg-yellow-600 text-white text-xs px-3 py-1 rounded z-10">
|
||||
Нужна баннерная фотография для этого раздела
|
||||
</div>
|
||||
{/* Декоративные элементы фона */}
|
||||
<div className="absolute inset-0 bg-gradient-to-b from-blue-500/20 to-blue-900/40"></div>
|
||||
<div className="absolute right-0 top-0 w-1/2 h-full bg-gradient-to-l from-blue-400/10 to-transparent"></div>
|
||||
|
||||
<motion.div
|
||||
className="container mx-auto px-4 py-16 sm:py-20 relative"
|
||||
|
@ -90,16 +90,16 @@ export const services = [
|
||||
image: '/images/placeholders/services/thermal-inspection.jpg',
|
||||
},
|
||||
{
|
||||
icon: Building,
|
||||
title: 'Контроль строительных работ',
|
||||
slug: 'construction-control',
|
||||
icon: Thermometer,
|
||||
title: 'Определение причины возникновения плесени',
|
||||
slug: 'mold-inspection',
|
||||
description:
|
||||
'Определение качества строительно-монтажных работ на всех этапах строительства.',
|
||||
'Профессиональное обследование с целью выявления и устранения причин появления плесени.',
|
||||
details: [
|
||||
'Проверка соответствия проекту',
|
||||
'Контроль технологий',
|
||||
'Оценка материалов',
|
||||
'Выявление нарушений',
|
||||
'Измерение влажности воздуха и конструкций',
|
||||
'Проверка вентиляции',
|
||||
'Взятие соскобов плесени для анализа',
|
||||
'Рекомендации по устранению',
|
||||
],
|
||||
image: '/images/placeholders/services/construction-control.jpg',
|
||||
},
|
||||
@ -211,17 +211,19 @@ const Services = () => {
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative h-64">
|
||||
<div className="relative h-64 mt-4 rounded-lg overflow-hidden">
|
||||
<div className="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent z-10" />
|
||||
<Image
|
||||
src={service.image}
|
||||
alt={service.title}
|
||||
fill
|
||||
className="object-cover"
|
||||
className="object-cover object-center transition-transform duration-300 group-hover:scale-105"
|
||||
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
|
||||
/>
|
||||
<motion.div
|
||||
initial={{ opacity: 0 }}
|
||||
whileHover={{ opacity: 1 }}
|
||||
className="absolute inset-0 bg-black bg-opacity-20 flex items-center justify-center"
|
||||
className="absolute inset-0 bg-blue-900/30 flex items-center justify-center z-20"
|
||||
>
|
||||
<motion.div
|
||||
whileHover={{ scale: 1.2 }}
|
||||
@ -242,11 +244,6 @@ const Services = () => {
|
||||
<br />
|
||||
Все консультации бесплатны.
|
||||
</p>
|
||||
<p className="text-gray-600 mb-6 text-sm italic">
|
||||
Примечание: Для каждой услуги необходимы качественные тематические
|
||||
фотографии. Пожалуйста, предоставьте соответствующие изображения
|
||||
для замены заглушек.
|
||||
</p>
|
||||
<motion.div whileHover={{ scale: 1.05 }} whileTap={{ scale: 0.95 }}>
|
||||
<Button
|
||||
className="bg-blue-700 hover:bg-blue-800 text-white px-8"
|
||||
|
@ -2,7 +2,13 @@
|
||||
|
||||
import { useState } from 'react';
|
||||
import { motion } from 'framer-motion';
|
||||
import { ArrowLeft, CheckCircle2, AlertCircle, FileText } from 'lucide-react';
|
||||
import {
|
||||
ArrowLeft,
|
||||
CheckCircle2,
|
||||
AlertCircle,
|
||||
FileText,
|
||||
Phone,
|
||||
} from 'lucide-react';
|
||||
import Link from 'next/link';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import ContactModal from '@/app/components/ContactModal';
|
||||
@ -79,6 +85,17 @@ export default function ServicePage({ params }: ServicePageProps) {
|
||||
</h1>
|
||||
</div>
|
||||
<p className="text-xl text-gray-600">{service.description}</p>
|
||||
|
||||
{service.slug === 'mold-inspection' && (
|
||||
<div className="mt-6 p-5 bg-blue-50 rounded-lg text-gray-700">
|
||||
Плесень в помещении — не просто неприятный налёт на стенах, а
|
||||
тревожный сигнал о серьёзных нарушениях в микроклимате,
|
||||
вентиляции или конструкции здания. Наша команда проводит
|
||||
профессиональное обследование с целью выявления и устранения
|
||||
причин появления плесени, чтобы вы могли вернуть безопасность и
|
||||
комфорт в своё пространство.
|
||||
</div>
|
||||
)}
|
||||
</motion.div>
|
||||
|
||||
{/* Основные моменты */}
|
||||
@ -98,6 +115,108 @@ export default function ServicePage({ params }: ServicePageProps) {
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{service.slug === 'mold-inspection' && (
|
||||
<div className="mt-8 border-t pt-6">
|
||||
<h3 className="text-xl font-semibold text-gray-900 mb-4">
|
||||
Что входит в услугу:
|
||||
</h3>
|
||||
<div className="grid gap-3">
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Визуальный осмотр стен, потолков, углов, пола, оконных
|
||||
откосов
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Измерение влажности воздуха и строительных конструкций
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Проверка вентиляции (естественной и/или принудительной)
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Анализ температурных мостов (с применением тепловизора)
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Локализация источников протечек или конденсата
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Оценка герметичности окон и дверей
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Заключение эксперта с рекомендациями по устранению
|
||||
причин
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3 className="text-xl font-semibold text-gray-900 mt-6 mb-4">
|
||||
Дополнительно:
|
||||
</h3>
|
||||
<div className="grid gap-3">
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Возможность взять пробу плесени на лабораторный анализ
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Составление официального акта или технического отчёта
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3 className="text-xl font-semibold text-gray-900 mt-6 mb-4">
|
||||
Где применимо:
|
||||
</h3>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Частные квартиры и дома
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Новостройки и вторичный рынок
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Офисы, коммерческая недвижимость
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-start space-x-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-blue-700 flex-shrink-0 mt-1" />
|
||||
<span className="text-gray-600">
|
||||
Детские учреждения, школы, сады, медучреждения
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Процесс работы */}
|
||||
@ -209,6 +328,15 @@ export default function ServicePage({ params }: ServicePageProps) {
|
||||
Наши специалисты ответят на все ваши вопросы и помогут решить вашу
|
||||
задачу
|
||||
</p>
|
||||
<div className="flex flex-col md:flex-row items-center justify-center gap-4 mb-6">
|
||||
<a
|
||||
href="tel:+79991234567"
|
||||
className="flex items-center text-white hover:text-blue-100"
|
||||
>
|
||||
<Phone className="h-5 w-5 mr-2" />
|
||||
<span className="text-xl">+7 (999) 123-45-67</span>
|
||||
</a>
|
||||
</div>
|
||||
<Button
|
||||
onClick={() => setIsModalOpen(true)}
|
||||
className="bg-white text-blue-700 hover:bg-blue-50"
|
||||
|
Reference in New Issue
Block a user