new car added and added some new features to header location icon and again added show case section

This commit is contained in:
nabijonovdavronbek619@gmail.com
2025-11-14 15:14:41 +05:00
parent 8827f612a5
commit 8a2708a03a
81 changed files with 1147 additions and 476 deletions

View File

@@ -2,7 +2,31 @@
import InnerProductcard from "@/components/cards/innerProductcard";
import Title from "@/components/lib_components/title";
import { avtogreyderlar, avtokran, avtominora, buldozerlar, cement_trucks, dizel, dumb_trucks, eks_yuklagichlar, forkliftlar, gazels, gildirakli_eks, katkalar, kompressorlar, mini_eks, minora, old_yuklagichlar, paletli_eks, paletli_kranlar, teleskop_yuklagichlar, trailers } from "@/data";
import {
asfalt,
assenizator,
avtogreyderlar,
avtokran,
avtominora,
betonNasoslar,
buldozerlar,
cement_trucks,
dumb_trucks,
eks_yuklagichlar,
evakuatorDemo,
forkliftlar,
gildirakli_eks,
katkalar,
manipulyator,
mini_eks,
minora,
old_yuklagichlar,
paletli_eks,
shalandaTraller,
teleskop_yuklagichlar,
trailers,
vodovoz,
} from "@/data";
import { useParams } from "next/navigation";
export default function CartType() {
@@ -14,105 +38,142 @@ export default function CartType() {
{/* car type groups */}
<div className="mt-10 grid lg:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-5 max-w-[1200px] w-full mx-auto">
{/* Avtosementavoz */}
{carType === "cement-truck" && cement_trucks.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "cement-truck" &&
cement_trucks.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Samasvallar */}
{carType === "dumb-truck" && dumb_trucks.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "dumb-truck" &&
dumb_trucks.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Traylerlar */}
{carType === "trailers" && trailers.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
})}
{/* Gazellar */}
{carType === "gazels" && gazels.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "trailers" &&
trailers.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Avtominora */}
{carType === "avtotowers" && avtominora.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "avtotowers" &&
avtominora.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Avtokran */}
{carType === "avtocranes" && avtokran.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "avtocranes" &&
avtokran.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Minora kranlar */}
{carType === "tower-cranes" && minora.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
})}
{/* Dizel ko'targichlar */}
{carType === "lifters" && dizel.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
})}
{/* Paletli kranlar */}
{carType === "crawler-cranes" && paletli_kranlar.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "tower-cranes" &&
minora.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* old yuklagichlar */}
{carType === "front-loaders" && old_yuklagichlar.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "front-loaders" &&
old_yuklagichlar.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Teleskopik yuklagichlar */}
{carType === "tele-loaders" && teleskop_yuklagichlar.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "tele-loaders" &&
teleskop_yuklagichlar.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* forkliftlar */}
{carType === "forklift-trucks" && forkliftlar.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "forklift-trucks" &&
forkliftlar.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Paletli ekskavatorlar */}
{carType === "crawler-excavators" && paletli_eks.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "crawler-excavators" &&
paletli_eks.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* G'ildirakli ekskavatorlar */}
{carType === "wheel-excavators" && gildirakli_eks.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "wheel-excavators" &&
gildirakli_eks.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Mini-ekskavatorlar */}
{carType === "mini-excavators" && mini_eks.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "mini-excavators" &&
mini_eks.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* ekskavator yuklagichlar */}
{carType === "excavator-loaders" && eks_yuklagichlar.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "excavator-loaders" &&
eks_yuklagichlar.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* avtogreyderlar */}
{carType === "avtograders" && avtogreyderlar.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "avtograders" &&
avtogreyderlar.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Buldozerlar */}
{carType === "buldozers" && buldozerlar.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "buldozers" &&
buldozerlar.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Katkalar */}
{carType === "katkas" && katkalar.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{carType === "katkas" &&
katkalar.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* Kampressorlar */}
{carType === "compressors" && kompressorlar.map((item)=>{
return <InnerProductcard data={item} key={item.id} />
{/* Evakuatorlar */}
{carType === "evakuator" &&
evakuatorDemo.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* shalanda */}
{carType === "shalanda_traller" &&
shalandaTraller.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* asfalt yotqizuvchi */}
{carType === "asfalt_frez" &&
asfalt.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* asfalt ko'chiruvchi */}
{carType === "beton_nasos" &&
betonNasoslar.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* manipulyator */}
{carType === "manipulyator" &&
manipulyator.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* vodovoz */}
{carType === "vodovoz" &&
vodovoz.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
{/* assertizator */}
{carType === "assenizator" &&
assenizator.map((item) => {
return <InnerProductcard data={item} key={item.id} />;
})}
</div>
</div>

View File

@@ -5,14 +5,13 @@ import Faq from "@/components/pageParts/faq";
import Partners from "@/components/pageParts/partners";
import Map from "@/components/pageParts/map";
import CustomSlider from "@/components/pageParts/newsSlider";
import Footer from "@/components/nav_foot/footer";
import HeroSection from "@/components/pageParts/hero";
export default function Home() {
return (
<div>
<HeroSection/>
<section id="products" className=" mb-10">
<HeroSection />
<section id="products" className="mt-5 mb-10">
<Products />
</section>
<Texnika />
@@ -22,7 +21,10 @@ export default function Home() {
</section>
<Faq />
<Partners />
<section id="map">
<Map />
</section>
</div>
);
}

BIN
assets/assenizator5.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
assets/cranes/kran130.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
assets/cranes/kran30.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

BIN
assets/cranes/kran50.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

BIN
assets/cranes/kran75.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View File

@@ -75,12 +75,20 @@ export {default as Kranminora1} from './details/cranes/1-1.png';
export {default as Kranminora2} from './details/cranes/1-4.png';
export {default as Kranminora3} from './details/cranes/1-3.png';
export {default as Kranmexanik1} from './details/cranes/1-2.png';
export {default as Avtolift28} from './details/cranes/avtolift28.jpg';
export {default as Avtolift53} from './details/cranes/avtolift53.jpg';
export {default as Avtolift63} from './details/cranes/avtolift63.jpg';
export {default as Avtovishka28} from './details/cranes/avtovishka28.jpg';
export {default as Avtovishka36} from './details/cranes/avtovishka36.jpg';
export {default as Avtovishka45} from './details/cranes/avtovishka45.jpg';
export {default as Avtovishka60} from './details/cranes/avtovishka60.jpg';
export {default as Avtovishka75} from './details/cranes/avtovishka75.jpg';
// products avtokranlar images
export {default as Avtokran1} from './details/cranes/2-1.png';
export {default as Avtokran2} from './details/cranes/2-2.png';
export {default as Avtokran3} from './details/cranes/2-3.webp';
export {default as Avtokran4} from './details/cranes/2-4.webp';
export {default as Kran30} from './cranes/kran30.jpg';
export {default as Kran50} from './cranes/kran50.jpg';
export {default as Kran75} from './cranes/kran75.jpg';
export {default as Kran130} from './cranes/kran130.jpg';
// products paletli kran images
export {default as Palet1} from './details/cranes/3-1.png';
@@ -92,6 +100,7 @@ export {default as Minora1} from './details/cranes/4-1.png';
export {default as Minora2} from './details/cranes/4-3.png';
export {default as Minora3} from './details/cranes/4-5.jpg';
export {default as Minora4} from './details/cranes/4-6.jpg';
export {default as All_cranes} from './details/cranes/all_cranes.jpg';
// products dizel kotargich images
export {default as Dizel1} from './details/cranes/5-1.png';
@@ -111,9 +120,14 @@ export {default as Old4} from './details/loaders/1-4.png';
export {default as Old5} from './details/loaders/1-5.webp';
export {default as Old6} from './details/loaders/1-6.webp';
export {default as Old7} from './details/loaders/1-7.webp';
export {default as Tel1} from './details/loaders/2-1.png';
export {default as Tel2} from './details/loaders/2-2.jpg';
export {default as Tel3} from './details/loaders/2-4.png';
export {default as Old_yuklagich_biru8} from './details/old_yuklagich18kub.jpg';
export {default as Old_yuklagich_3} from './details/old_yuklagich3.jpg';
export {default as Old_yuklagich_mini1} from './details/old_yuklagich_mini1.jpg';
export {default as Old_yuklagich_mini2} from './details/old_yuklagich_mini2.jpg';
export {default as Tel1} from './details/loaders/teleskopik_manitau.jpg';
export {default as Tel2} from './details/loaders/teleskopik_bobkat.jpg';
export {default as Tel3} from './details/loaders/teleskopik_katta.jpg';
export {default as Tel4} from './details/loaders/teleskopik_jcb.jpg'
export {default as Fork1} from './details/loaders/3-1.png';
export {default as Fork2} from './details/loaders/3-2.jpeg';
export {default as Fork3} from './details/loaders/3-3.webp';
@@ -133,11 +147,11 @@ export {default as Digger} from './excavators/digger.png';
// products Paletli of ekskavator images
export {default as Paletli1} from './details/excavators/1-1.png';
export {default as Paletli2} from './details/excavators/1-2.png';
export {default as Balon1} from './details/excavators/2-1.png';
export {default as Balon2} from './details/excavators/2-2.png';
export {default as Balon1} from './details/excavators/excavator_mini1.jpg';
export {default as Balon2} from './details/excavators/excavator_mini2.jpg';
export {default as Mini1} from './details/excavators/3-1.png';
export {default as Mini2} from './details/excavators/3-2.png';
export {default as Digger1} from './details/excavators/4-1.png';
export {default as Digger1} from './details/excavators/excavator.jpg';
export {default as Digger2} from './details/excavators/4-2.png';
export {default as Digger3} from './details/excavators/4-3.png';
@@ -145,20 +159,46 @@ export {default as Digger3} from './details/excavators/4-3.png';
export {default as Grayder} from './roders/avtogreyder.png';
export {default as Buldozer} from './roders/buldozer.png';
export {default as Kat} from './roders/kat.png';
export {default as Kompressor} from './roders/kompressor.png';
export {default as Evakuator} from './evakuator/evakuator_fura.jpg';
// avtograyder , buldozer , katka , kampressor
export {default as Grayder1} from './details/roaders/1-1.png';
export {default as Grayder1} from './details/loaders/avtogreyder.jpg';
export {default as Grayder2} from './details/roaders/1-2.png';
export {default as Grayder3} from './details/roaders/1-3.png';
export {default as Buldozer1} from './details/roaders/2-1.png';
export {default as Buldozer2} from './details/roaders/2-2.png';
export {default as Buldozer3} from './details/roaders/2-3.png';
export {default as Katka1} from './details/roaders/3-1.png';
export {default as Katka2} from './details/roaders/3-2.png';
export {default as Kampressor1} from './details/roaders/4-1.png';
export {default as Kampressor2} from './details/roaders/4-3.png';
export {default as Kampressor3} from './details/roaders/4-5.png';
export {default as Katok3} from './details/roaders/katok3.jpg';
export {default as Katok4} from './details/roaders/katok4.jpg';
export {default as Katok6} from './details/roaders/katok6.jpg';
export {default as Katok10} from './details/roaders/katok10.jpg';
export {default as Katok20} from './details/roaders/katok20.jpg';
export {default as Pnevka_Katok4} from './details/roaders/pnevka_katok4.jpg';
export {default as Pnevka_Katok16} from './details/roaders/pnevka_katok16.jpg';
export {default as Evakuator5} from './evakuator/evakuator_5_tonna.jpg';
export {default as Evakuator20} from './evakuator/evakuator_20_tonna.jpg';
export {default as EvakuatorGruzavoy} from './evakuator/evakuator_fura.jpg';
// shalanda
export {default as Shalanda} from './evakuator/shalanda.jpg';
export {default as Traller} from './evakuator/traller.jpg';
// asfalt
export { default as Aspal_800} from './roders/aspal800.jpg';
export {default as Aspal_1800} from './roders/aspal1800.jpg';
export {default as Aspal_k} from './roders/aspal_k.jpg'
// beton nasos
export {default as Beton_nasos} from './details/trucks/beton_nasos.jpg'
// vodovoz
export {default as Vodovoz} from './vodavoz6.jpg';
// assenizator
export {default as Assenizator} from './assenizator5.jpg';
// manipulyator
export {default as Manipulyator} from './cranes/manipulyator7.jpg';
// avto brands
export {default as Gehl} from './brands/gehl.png'

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

BIN
assets/roders/aspal1800.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
assets/roders/aspal800.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
assets/roders/aspal_k.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

BIN
assets/vodavoz6.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

View File

@@ -24,12 +24,12 @@ export default function InnerProductcard({ data }: { data: innerCardTypes }) {
boxShadow: "0px 0px 15px rgba(0,0,0,0.1)",
}}
whileTap={{ scale: 0.97 }}
className="rounded-lg overflow-hidden bg-white transition-all"
className="h-[420px] rounded-lg overflow-hidden bg-white transition-all"
>
<Link
href={`/${route.lang}/${route.carType}/${data.name}`}
onClick={() => setDetail(data)}
className="flex flex-col items-center justify-between rounded-lg hover:cursor-pointer"
className="h-full flex flex-col items-center justify-between rounded-lg hover:cursor-pointer"
>
{/* Rasm qismi */}
<div className="rounded-t-lg bg-white">

View File

@@ -17,34 +17,37 @@ export default function ProductCard({ data }: { data: ProductTypes }) {
viewport={{ once: true, amount: 0.2 }}
transition={{ duration: 0.3, ease: "easeOut" }}
whileHover={{
scale: 1.05,
boxShadow: "0px 0px 15px rgba(0,0,0,0.1)",
boxShadow: "0px 0px 15px rgba(0,0,0,0.8)",
}}
whileTap={{ scale: 0.98 }}
className="rounded-xl border-2 border-primary h-[430px]"
>
<Link
href={`/${lang}/${data.path}`}
className="h-[400px] flex flex-col items-center justify-between rounded-lg bg-white transition-transform"
className="h-full flex flex-col items-center justify-between rounded-lg bg-white transition-transform"
>
{/* Yuqori qism - rasm */}
<div className="rounded-t-lg bg-white py-10 px-2 flex justify-center items-center">
<Image
src={data.image}
alt={data.truck_name}
width={200}
width={260}
height={200}
className="object-contain max-h-[200px] h-full"
className="object-contain max-h-[200px] h-full rounded-xl"
/>
</div>
{/* Pastki qism - matn */}
<div className="bg-[#fafafa] w-full py-5 rounded-b-lg flex flex-col items-center justify-center space-y-1">
<div className="font-medium text-gray-800 text-lg text-center">
<div className="font-medium text-primary text-xl text-center">
<Text txt={data.truck_name} />
</div>
<div className="text-secondary text-sm text-center">
<div className="text-secondary text-md font-extrabold text-center">
<Text txt={data.desc} />
</div>
<div className="text-center text-secondary bg-primary max-w-[200px] w-full rounded-xl text-lg py-2 hover:cursor-pointer">
<Text txt="more" />
</div>
</div>
</Link>
</motion.div>

View File

@@ -2,64 +2,115 @@
import React, { useEffect, useRef } from "react";
interface YandexMapProps {
interface GoogleMapProps {
lat?: number;
lng?: number;
zoom?: number;
}
export default function YandexMap({
export default function GoogleMap({
lat = 41.263731,
lng = 69.219434,
zoom = 12,
}: YandexMapProps) {
const mapRef = useRef<HTMLDivElement>(null);
zoom = 17,
}: GoogleMapProps) {
const mapRef = useRef<HTMLDivElement | null>(null);
useEffect(() => {
// Yandex Map scriptini dinamik yuklash
if (!window.ymaps) {
const script = document.createElement("script");
script.src = "https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=5169ae9d-529a-43f8-9cb1-30e1a3360dac";
script.async = true;
script.onload = () => initMap();
document.body.appendChild(script);
} else {
initMap();
let map: google.maps.Map | null = null;
let marker: google.maps.Marker | null = null;
// 🔹 Google script yuklash funksiyasi
function loadGoogleMapsScript(callback: () => void) {
if (typeof window.google === "object" && window.google.maps) {
callback();
return;
}
function initMap() {
if (!mapRef.current || !window.ymaps) return;
const existingScript = document.getElementById("googleMaps");
if (existingScript) {
existingScript.addEventListener("load", callback);
return;
}
window.ymaps.ready(() => {
const map = new window.ymaps.Map(mapRef.current!, {
center: [lat, lng],
const script = document.createElement("script");
script.id = "googleMaps";
script.src = `https://maps.googleapis.com/maps/api/js?key=AIzaSyCiq6iQrcZX6jJMkK_8eT56IeeZDY0LUYo`;
script.async = true;
script.defer = true;
script.onload = callback;
document.body.appendChild(script);
}
// 🔹 Google Mapni ishga tushirish
function initMap() {
if (!mapRef.current || !window.google) return;
map = new window.google.maps.Map(mapRef.current, {
center: { lat, lng },
zoom,
controls: ["zoomControl", "typeSelector", "fullscreenControl"],
mapTypeControl: false,
streetViewControl: false,
fullscreenControl: true,
});
const placemark = new window.ymaps.Placemark(
[lat, lng],
{
balloonContent: `
<div style="font-size:14px">
// 🔸 Custom marker (svg yoki png)
marker = new window.google.maps.Marker({
position: { lat, lng },
map,
title: "Bizning joylashuv",
icon: {
url: "/custom-marker.svg", // 📍 custom icon
scaledSize: new window.google.maps.Size(45, 45),
anchor: new window.google.maps.Point(22, 45),
},
});
// 🔸 Marker click eventi
marker.addListener("click", () => {
console.log("Marker clicked!");
new window.google.maps.InfoWindow({
content: `
<div style="font-size:14px; line-height:1.5;">
<b>Bizning joylashuv:</b><br/>
Toshkent sh., Mustaqillik maydoni<br/>
<a href="https://yandex.uz/maps/?ll=${lng}%2C${lat}&z=14" target="_blank">Yandex xaritada ochish</a>
<a href="https://www.google.com/maps?q=${lat},${lng}" target="_blank">Google xaritada ochish</a>
</div>
`,
},
{
iconColor: "#ff0000",
draggable: false,
}
);
}).open(map!, marker!);
});
map.geoObjects.add(placemark);
// 🔸 Xarita ustida click qilinsa
map.addListener("click", (event: google.maps.MapMouseEvent) => {
if (!event.latLng) return;
const coords = event.latLng.toJSON();
console.log("Map clicked at:", coords);
// Markazni ozgartirish
map!.setCenter(coords);
// Zoomni saqlab qolish (setZoom ishlatish mumkin)
const currentZoom = map!.getZoom() ?? 17;
map!.setZoom(currentZoom);
// Marker joyini ozgartirish
marker!.setPosition(coords);
});
}
// 🔹 Scriptni yuklash
loadGoogleMapsScript(initMap);
return () => {
// tozalash
if (map) map = null;
if (marker) marker = null;
};
}, [lat, lng, zoom]);
return (
<div className="w-full h-[500px] rounded-lg shadow-md overflow-hidden" ref={mapRef}></div>
<div
ref={mapRef}
className="w-full h-[400px] rounded-lg shadow-md overflow-hidden"
/>
);
}

View File

@@ -1,4 +1,5 @@
import { FaLocationDot } from "react-icons/fa6";
import Text from "../lib_components/text";
export default function Header() {
return (
@@ -7,12 +8,21 @@ export default function Header() {
className="bg-primary py-3 flex items-center sm:justify-around justify-center px-4"
>
<div className="max-w-[1500px] w-full mx-auto flex items-center sm:justify-between justify-center gap-4 flex-wrap ">
<div className="flex justify-center items-center text-white max-w-[250px] w-full ">
<div className="flex justify-center items-center gap-2 text-white max-w-[250px] w-full ">
Uzbekistan , Tashkent
<span className="text-[#f2a01c] text-[20px]">
<a href="#map" className="text-[#f2a01c] text-[20px]">
<FaLocationDot />
</span>
</a>
</div>
<div className="flex flex-col items-center justify-center">
<div className="text-white text-lg">
<Text txt="work_day_title" />
</div>
<div className="text-secondary text-xl">
<Text txt="work_day" />
</div>
<p className="text-xl text-secondary">24/7</p>
</div>
<div>
@@ -24,7 +34,6 @@ export default function Header() {
+998 33 252 00 00
</a>
</div>
</div>
</div>
);

View File

@@ -2,53 +2,51 @@
import { motion } from "framer-motion";
import Image from "next/image";
import Text from "../lib_components/text";
export default function HeroSection() {
return (
<section
dir="ltr"
className="relative w-full md:h-[300px] max-md:py-10 max-lg:px-2 overflow-hidden flex items-center justify-center"
className="relative w-full md:h-[500px] max-md:py-10 max-lg:px-2 overflow-hidden flex items-center justify-between"
>
<Image
{/* <Image
src="/hero2.jpg" // public papkaga rasm joylash (masalan, texnika rasmi)
alt="SpetsTexnika"
width={800}
height={400}
className="object-contain rounded-3xl"
/>
/> */}
{/* Asosiy kontent */}
{/* <div className="relative z-20 max-w-6xl mx-auto md:px-6 px-3 text-primary flex flex-col md:flex-row items-center gap-5 justify-between">
<div className="absolute inset-0 z-10">
{/* <div className="absolute inset-0 -z-10 mx-auto w-full h-full">
<Image
src="/hero2.jpg" // public papkaga rasm joylash (masalan, texnika rasmi)
src="/2.jpg"
alt="SpetsTexnika"
fill
className="object-cover opacity-30"
className="object-cover"
priority
/>
</div>
</div> */}
Chap tomondagi matn
<div className="relative z-20 max-w-7xl w-full mx-auto md:px-6 px-3 text-primary flex flex-col md:flex-row items-center gap-5 justify-between">
{/* Chap tomondagi matn */}
<motion.div
className="space-y-6 max-w-xl"
className="space-y-3 max-w-xl backdrop-blur-3xl bg-[#ffffff4a] rounded-xl py-6 px-4"
initial={{ opacity: 0, x: -60 }}
animate={{ opacity: 1, x: 0 }}
transition={{ duration: 0.8, ease: "easeOut" }}
>
<h1 className="text-2xl lg:text-4xl font-extrabold leading-tight">
Ishonchli <span className="text-yellow-400">SpesTexnika</span> —
sizning loyihangiz uchun eng yaxshi tanlov!
</h1>
<div className="text-2xl lg:text-4xl font-extrabold leading-tight text-primary">
<Text txt="hero_title"/>
</div>
<p className="text-lg text-gray-600">
Biz eng songgi texnikalar, maxsus transportlar va qurilish
uskunalarini qulay narxda taqdim etamiz.
</p>
<div className="text-xl font-medium text-secondary">
<Text txt="hero_desc"/>
</div>
</motion.div>
Ong tomondagi texnika rasmi
{/* Ong tomondagi texnika rasmi */}
<motion.div
className="hidden md:block"
initial={{ opacity: 0, x: 80 }}
@@ -63,7 +61,7 @@ export default function HeroSection() {
className="drop-shadow-2xl rounded-xl"
/>
</motion.div>
</div> */}
</div>
{/* Pastdagi tolqinli animatsiya (dekor) */}
{/* <motion.div

View File

@@ -18,23 +18,23 @@ export default function Map() {
<div className="text-left flex w-full justify-start">
<Title text="contacts" />
</div>
<div className="flex items-center justify-start gap-2 text-gray-500 text-[20px] ">
<div className="flex items-center justify-start gap-2 text-gray-500 text-[18px] ">
<span className="text-secondary">
<FaPhoneAlt />
</span>
+998 33 252-00-00
</div>
<div className="flex items-center justify-start gap-2 text-gray-500 text-[20px] ">
<div className="flex items-center justify-start gap-2 text-gray-500 text-[18px] ">
<span className="text-secondary">
<FaTelegram />
</span>
spes-texnika
</div>
<div className="flex items-center justify-start gap-2 text-gray-500 text-[20px] ">
<div className="flex items-center justify-start gap-2 text-gray-500 text-[18px] ">
<span className="text-secondary">
<BiTargetLock />
</span>
Yakkasaroy , Toshkent
Toshkent , Yakkasaroy , Xushtepa 6
</div>
</div>
</div>

View File

@@ -26,30 +26,30 @@ const productFilterTypesMainPage: productFilterTypes[] = [
];
export default function Products() {
const [productFilter, setProductFilter] = useState<string | null>(null);
//const [productFilter, setProductFilter] = useState<string | null>(null);
const [cars, setCars] = useState(allProducts);
// execute filetr function
useEffect(() => {
if (productFilter === "trucks") {
setCars(trucks);
} else if (productFilter === "cranes") {
setCars(cranes);
} else if (productFilter === "forklift-trucks") {
setCars(forklift);
} else if (productFilter === "excavators") {
setCars(excavators);
} else if (productFilter === "road-repairs") {
setCars(road_repairs);
} else {
setCars(allProducts);
}
}, [productFilter]);
// useEffect(() => {
// if (productFilter === "trucks") {
// setCars(trucks);
// } else if (productFilter === "cranes") {
// setCars(cranes);
// } else if (productFilter === "forklift-trucks") {
// setCars(forklift);
// } else if (productFilter === "excavators") {
// setCars(excavators);
// } else if (productFilter === "road-repairs") {
// setCars(road_repairs);
// } else {
// setCars(allProducts);
// }
// }, [productFilter]);
return (
<div dir="ltr" className="max-w-[1200px] w-full mx-auto">
{/* title part */}
<div className="flex flex-col">
<div className="flex flex-col mb-10">
<div className="flex items-center justify-center w-full ">
<div className="text-secondary px-2 text-[18px] font-semibold ">
<Text txt="katalog" />
@@ -59,7 +59,7 @@ export default function Products() {
</div>
{/* product filters */}
<div className="flex flex-wrap gap-1 gap-y-4 items-center justify-center mb-10 ">
{/* <div className="flex flex-wrap gap-1 gap-y-4 items-center justify-center mb-10 ">
{productFilterTypesMainPage.map((item, index) => (
<button
key={index}
@@ -80,7 +80,7 @@ export default function Products() {
)}
</button>
))}
</div>
</div> */}
{/* products */}
<div className="px-4 grid gap-5 grid-cols-1 place-content-center min-[500px]:grid-cols-2 min-lg:grid-cols-4 min-[1210px]:grid-cols-4">

File diff suppressed because it is too large Load Diff

BIN
public/beton_nasos.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

6
public/custom-marker.svg Normal file
View File

@@ -0,0 +1,6 @@
<svg width="45" height="45" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="32" cy="32" r="18" fill="#FF3B30"></circle>
<circle cx="32" cy="32" r="10" fill="white"></circle>
<circle cx="32" cy="32" r="6" fill="#FF3B30"></circle>
<path d="M32 62C32 62 52 42 52 28C52 16.9543 43.0457 8 32 8C20.9543 8 12 16.9543 12 28C12 42 32 62 32 62Z" fill="#FF3B30"></path>
</svg>

After

Width:  |  Height:  |  Size: 406 B

View File

@@ -194,5 +194,17 @@
"siqish": "Давление сжатия",
"havo": "Ёмкость воздуха",
"kompressor_sig": "Объём компрессора",
"katalog": "Познакомьтесь с каталогом"
"katalog": "Познакомьтесь с каталогом",
"work_day_title": "Рабочие дни:",
"work_day": "Понедельник–Воскресенье",
"hero_title": "Надёжная спецтехника — лучший выбор для вашего проекта!",
"hero_desc": "Мы предлагаем новейшую технику, специализированный транспорт и строительное оборудование по выгодной цене.",
"shalanda_traller": "Шаланда и Траллеры",
"evakuator": "Эвакуаторы",
"asfalt_yotqizuvchi": "Асфальтоукладчик",
"asfalt_kochiruvchi": "Асфальтоперегружатель",
"beton_nasos": "Бетононасосы",
"vodovoz": "Водовоз",
"assenizator": "Ассенизатор",
"manipulyator": "Манипулятор"
}

View File

@@ -196,5 +196,17 @@
"siqish": "Siqish bosimi",
"havo": "Havo sigimi",
"kompressor_sig": "Kompressor sigimi",
"katalog": "Katalog bilan tanishing"
"katalog": "Katalog bilan tanishing",
"work_day_title": "Ish kunlari:",
"work_day": "Dushanba-Yakshanba",
"hero_title": "Ishonchli SpesTexnika — sizning loyihangiz uchun eng yaxshi tanlov!",
"hero_desc": "Biz eng songgi texnikalar, maxsus transportlar va qurilish uskunalarini qulay narxda taqdim etamiz.",
"shalanda_traller": "Shalanda va Trallerlar",
"evakuator": "Evakuatorlar",
"asfalt_yotqizuvchi": "Asfalt yotqizuvchi mashina",
"asfalt_kochiruvchi": "Asfalt kochiruvchi mashina",
"beton_nasos": "Beton nasos mashinalari",
"vodovoz":"Vodovoz",
"assenizator":"Assenizator",
"manipulyator":"Manipulyator"
}

6
public/location.svg Normal file
View File

@@ -0,0 +1,6 @@
<svg width="45" height="45" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="32" cy="32" r="18" fill="#FF3B30"></circle>
<circle cx="32" cy="32" r="10" fill="white"></circle>
<circle cx="32" cy="32" r="6" fill="#FF3B30"></circle>
<path d="M32 62C32 62 52 42 52 28C52 16.9543 43.0457 8 32 8C20.9543 8 12 16.9543 12 28C12 42 32 62 32 62Z" fill="#FF3B30"></path>
</svg>

After

Width:  |  Height:  |  Size: 406 B

View File

@@ -9,29 +9,29 @@ export interface TitleType {
export interface productFilterTypes {
name: string;
image: StaticImageData|string;
image: StaticImageData | string;
}
export interface MainProductCard{
uzunlik?:string;
kenglik?:string;
balandlik?:String;
yukqob?:String;
makBalandlik?:string;
export interface MainProductCard {
uzunlik?: string;
kenglik?: string;
balandlik?: String;
yukqob?: String;
makBalandlik?: string;
}
export interface ProductCardType extends MainProductCard{
image?:StaticImageData[];
title?:string;
y_turi?:string;
hajmi?:string;
tezlik?:string;
interkuler?:string;
quvvat?:string;
quti?:string;
turboDizel?:string;
ogirlig?:string;
bomUzunlik?:string;
export interface ProductCardType extends MainProductCard {
image?: StaticImageData[];
title?: string;
y_turi?: string;
hajmi?: string;
tezlik?: string;
interkuler?: string;
quvvat?: string;
quti?: string;
turboDizel?: string;
ogirlig?: string;
bomUzunlik?: string;
}
export interface ProductTypes {
@@ -50,7 +50,7 @@ export interface innerCardTypes {
price?: number;
path: string;
// 🧩 Qoshimcha umumiy texnik xususiyatlar
// 🧩 Umumiy texnik xususiyatlar
weight_kg?: number; // Ogirligi (kg)
maxLength_m?: number; // Maksimum uzunligi (m)
maxHeight_m?: number; // Maksimum balandligi (m)
@@ -62,22 +62,43 @@ export interface innerCardTypes {
intercooler?: string; // Interkuler bor/yoq
enginePower_hp?: string; // Dvigatel quvvati (ot kuchi)
transmission?: string; // Otkazmalar qutisi turi
bom?:number; // Minora kranlar bom uzunligi
qazish?:number; // ekskavator qazish chuqurligi
pichoq?:number; // avtogreyder pichoq uzunligi
zichlash?:number; // katka asfalt zichlovchi
siqish?:number; // kampressor siqish bosimi
havo?:number; // kampressor havo sig'imi
kompressor_sig?:number; // kampressor sig'imi
bom?: number; // Minora kranlar bom uzunligi
qazish?: number; // ekskavator qazish chuqurligi
pichoq?: number; // avtogreyder pichoq uzunligi
zichlash?: number; // katka asfalt zichlovchi
siqish?: number; // kampressor siqish bosimi
havo?: number; // kampressor havo sig'imi
kompressor_sig?: number; // kampressor sig'imi
towingCapacity_tons?: number; // evakuator ko'taruvchi og'irlik
armLength_m?: number; // evakuator uzunligi
// 🟢 Qoshimcha shalanda / treller tipelar
wheelCount?: number; // Gildiraklar soni
brakingSystem?: string; // Tormoz tizimi
// 🟢 Asfalt mashinalari uchun qoshimcha
pavingWidth_m?: number; // Asfalt yotqizuvchi kengligi
pavingDepth_cm?: number; // Asfalt qatlamining chuqurligi
conveyorLength_m?: number; // Asfalt kochiruvchi konveyer uzunligi
conveyorCapacity_tons?: number; // Bir marta kochiradigan asfalt hajmi
// 🟢 Betonniy nasos mashinalari uchun qoshimcha
pumpLength_m?: number; // Beton nasosning uzatish (quvur) uzunligi (metr)
pumpCapacity_m3h?: number; // Betonni soatiga uzatish hajmi (m³/soat)
// 🔵 Vodovoz / Assenizator uchun qoshimchalar:
pumpPower_hp?: number; // Nasos quvvati
pumpType?: string; // Nasos turi
manipulatorCapacity_tons?: number; // manipulyator yuk kotarishi
manipulatorArm_m?: number; // manipulyator strela uzunligi
}
export const defaultDetail : innerCardTypes = {
id:1,
image:Kaimei1,
name:'Mashina topilmadi',
min_order_time:4,
price:600000,
path:''
}
export const defaultDetail: innerCardTypes = {
id: 1,
image: Kaimei1,
name: "Mashina topilmadi",
min_order_time: 4,
price: 600000,
path: "",
};

73
types/ymaps.d.ts vendored
View File

@@ -1,39 +1,66 @@
// src/types/ymaps.d.ts
declare namespace ymaps {
interface MapOptions {
center: number[];
zoom: number;
controls?: string[];
type ReadyCallback = () => void;
interface IEventEmitter {
add: (eventName: string, handler: (...args: any[]) => any) => void;
remove?: (eventName: string, handler: (...args: any[]) => any) => void;
fire?: (eventName: string, eventObject?: any) => void;
}
class Map {
constructor(container: HTMLElement, options: MapOptions);
geoObjects: {
add(obj: any): void;
};
controls: any;
interface IGeoObjectCollection {
add: (geoObject: any) => void;
remove?: (geoObject: any) => void;
removeAll?: () => void;
}
interface MapOptions {
center?: [number, number];
zoom?: number;
controls?: string[];
[key: string]: any;
}
class Map implements IEventEmitter {
constructor(container: HTMLElement | string, options?: MapOptions);
events: IEventEmitter;
geoObjects: IGeoObjectCollection;
setCenter(center: [number, number] | number[], zoom?: number): void;
getCenter(): [number, number];
setZoom(zoom: number, options?: any): void;
getZoom(): number;
destroy(): void;
}
interface PlacemarkOptions {
iconLayout?: string;
iconImageHref?: string;
iconImageSize?: [number, number];
iconImageOffset?: [number, number];
iconColor?: string;
draggable?: boolean;
[key: string]: any;
}
interface PlacemarkProperties {
balloonContent?: string;
class Placemark implements IEventEmitter {
constructor(coords: [number, number] | number[], properties?: any, options?: PlacemarkOptions);
properties: any;
events: IEventEmitter;
}
class Placemark {
constructor(
coords: number[],
properties?: PlacemarkProperties,
options?: PlacemarkOptions
);
}
function ready(callback: () => void): void; // ✅ shu qator qoshildi
function ready(callback: ReadyCallback): void;
}
interface Window {
ymaps: typeof ymaps;
declare global {
interface Window {
ymaps?: typeof ymaps;
}
}
declare module "ymaps" {
export = ymaps;
}