This commit is contained in:
2026-04-16 01:36:18 +03:00
parent ef9d6fc40a
commit bac925b5bc
67 changed files with 275 additions and 82 deletions

View File

@@ -9,8 +9,8 @@ import { FLEET_ITEMS } from "@/lib/data";
import { FleetList } from "@/components/FleetList";
export const metadata: Metadata = {
title: "Geniş Vinç Filosu ve İş Makineleri Parkurumuz",
description: "300 tondan 500 tona kadar mobil vinçler, sepetli platformlar ve hiyap vinçlerden oluşan modern araç filomuzla hizmetinizdeyiz.",
title: "Vinç Filosu ve İş Makinelerimiz | Dalaman Muğla",
description: "Mobil vinçler, sepetli platformlar ve hiyap vinçlerden oluşan geniş araç parkurumuz hakkında detaylı bilgi alın. Her tonajda profesyonel çözüm.",
};
const FLEET_CATEGORIES = ["Hepsi", "Mobil Vinç", "Sepetli Platform", "Hiyap", "Kule Vinç"];

View File

@@ -7,8 +7,8 @@ import { Shield, Zap, Target, Users, Rocket, Eye } from "lucide-react";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "Hakkımızda | Aydoğan Nakliyat Vinç Kurumsal",
description: "20 yılı aşkın tecrübemizle Dalaman ve Muğla bölgesinin lider vinç ve nakliyat firmasıyız. Vizyonumuz, misyonumuz ve profesyonel ekibimiz hakkında bilgi alın.",
title: "Kurumsal & Hakkımızda | Aydoğan Nakliyat Vinç Dalaman",
description: "20 yılı aşkın tecrübeyle Dalaman ve Muğla bölgesinin lider vinç firması. Güvenlik, hız ve hassasiyet odaklıır nakliyat çözümlerimiz hakkında bilgi alın.",
};
const VALUES = [
@@ -38,7 +38,7 @@ const STATS = [
{ label: "Yıllık Tecrübe", value: "20+" },
{ label: "Tamamlanan Proje", value: "1500+" },
{ label: "Modern Araç Filosu", value: "25+" },
{ label: "Maksimum Kapasite", value: "500t" }
{ label: "Maksimum Kapasite", value: "SINIRSIZ" }
];
export default function AboutPage() {

14
app/hizmetler/layout.tsx Normal file
View File

@@ -0,0 +1,14 @@
import { Metadata } from "next";
export const metadata: Metadata = {
title: "Profesyonel Vinç ve Nakliyat Hizmetlerimiz | Dalaman Muğla",
description: "Mobil vinç, sepetli platform, konteyner taşıma, tekne kaldırma ve ağır nakliyat hizmetlerimizi inceleyin. 7/24 profesyonel çözümler.",
};
export default function ServicesLayout({
children,
}: {
children: React.ReactNode;
}) {
return <>{children}</>;
}

View File

@@ -31,7 +31,7 @@ const FEATURES = [
];
const STATS = [
{ label: "Max Kapasite", value: "500T", highlighted: true },
{ label: "Max Kapasite", value: "HER TONAJ", highlighted: true },
{ label: "Yıllık Deneyim", value: "15+", highlighted: false },
{ label: "İş Güvenliği", value: "100%", highlighted: false },
{ label: "Aktif Operasyon", value: "24/7", highlighted: true }
@@ -100,7 +100,7 @@ export default function ServicesPage() {
onClick={() => handleWhatsApp(service.title)}
className="flex items-center gap-4 bg-primary text-on-primary px-8 py-4 font-headline font-bold uppercase hover:brightness-110 transition-all group"
>
Teklif Al
WhatsApp ile Teklif Al
<ArrowRight className="w-5 h-5 group-hover:translate-x-2 transition-transform" />
</button>
</div>

View File

@@ -4,10 +4,11 @@ import { FloatingWhatsApp } from "@/components/FloatingWhatsApp";
import Image from "next/image";
import { MapPin, Phone, Mail, ArrowRight, Navigation } from "lucide-react";
import { Metadata } from "next";
import { siteConfig } from "@/lib/data";
export const metadata: Metadata = {
title: "İletişim | Dalaman, Muğla Vinç ve Nakliyat",
description: "Aydoğan Nakliyat operasyon merkezine ulaşın. Dalaman Sanayi Sitesi'nde 7/24 hizmet veriyoruz. Teklif almak için bizi arayın.",
title: `İletişim | ${siteConfig.name}`,
description: siteConfig.description,
};
export default function ContactPage() {
@@ -35,7 +36,7 @@ export default function ContactPage() {
</div>
</section>
{/* Main Content: Contact Details Only */}
{/* Main Content: Contact Details */}
<div className="bg-outline-variant/5 py-24 px-8 md:px-16">
<div className="max-w-5xl mx-auto">
<section className="bg-surface-container p-12 lg:p-24 flex flex-col md:flex-row gap-16 items-center border border-outline-variant/10 shadow-xl">
@@ -50,7 +51,7 @@ export default function ContactPage() {
<div>
<p className="text-[10px] uppercase tracking-[0.3em] text-on-surface-variant mb-1 font-bold">Adres</p>
<p className="text-xl font-medium text-on-surface leading-snug">
Merkez Mah. Sanayi Sitesi No: 42<br/>Dalaman / Muğla
{siteConfig.contact.address}
</p>
</div>
</div>
@@ -60,9 +61,9 @@ export default function ContactPage() {
<Phone className="w-8 h-8" />
</div>
<div>
<p className="text-[10px] uppercase tracking-[0.3em] text-on-surface-variant mb-1 font-bold">Telefon</p>
<p className="text-[10px] uppercase tracking-[0.3em] text-on-surface-variant mb-1 font-bold">Telefon & WhatsApp</p>
<p className="text-3xl font-black text-on-surface tracking-tighter">
+90 252 692 00 00
{siteConfig.contact.phone}
</p>
</div>
</div>
@@ -74,7 +75,7 @@ export default function ContactPage() {
<div>
<p className="text-[10px] uppercase tracking-[0.3em] text-on-surface-variant mb-1 font-bold">E-Posta</p>
<p className="text-xl font-medium text-on-surface">
info@aydogannakliyat.com
{siteConfig.contact.email}
</p>
</div>
</div>
@@ -126,7 +127,7 @@ export default function ContactPage() {
</p>
<a
className="text-primary font-bold uppercase tracking-widest text-xs flex items-center gap-2 hover:gap-4 transition-all"
href="https://maps.google.com"
href={siteConfig.contact.maps}
target="_blank"
>
Yol Tarifi Al <ArrowRight className="w-4 h-4" />

View File

@@ -14,24 +14,40 @@ const inter = Inter({
});
export const metadata: Metadata = {
metadataBase: new URL("https://aydogannakliyatvinc.com"), // Gerçek domain ile değiştirilmeli
metadataBase: new URL("https://aydogannakliyatvinc.com"),
title: {
default: "Aydoğan Nakliyat Vinç | Dalaman, Muğla, Ege Bölgesi",
default: "Aydoğan Nakliyat Vinç | Dalaman, Muğla Vinç Kiralama & Ağır Nakliyat",
template: "%s | Aydoğan Nakliyat Vinç"
},
description: "Muğla Dalaman merkezli profesyonel vinç kiralama ve ağır nakliyat hizmetleri. 7/24 tekne taşıma, konteyner nakliyesi ve tüm Türkiye geneli ağır yük çözümleri.",
keywords: ["vinç kiralama", "nakliyat", "muğla vinç", "dalaman vinç", "ağır nakliyat", "tekne taşıma", "konteyner taşıma", "ege bölgesi vinç", "türkiye geneli nakliyat"],
authors: [{ name: "Aydoğan Nakliyat" }],
creator: "Aydoğan Nakliyat",
publisher: "Aydoğan Nakliyat",
description: "Muğla Dalaman merkezli profesyonel vinç kiralama, sepetli platform ve ağır nakliyat hizmetleri. 7/24 tekne taşıma, tiny house nakliyesi ve konteyner kaldırma çözümleri.",
keywords: [
"vinç kiralama",
"dalaman vinç",
"muğla vinç",
"ağır nakliyat",
"sepetli platform kiralama",
"hiyap vinç",
"tekne taşıma",
"konteyner nakliyesi",
"tiny house taşıma",
"sandiviç panel indirme",
"jet ground kaldırma",
"dalaman nakliyat",
"fethiye vinç kiralama",
"ortaca vinç kiralama",
"köyceğiz vinç kiralama"
],
authors: [{ name: "Aydoğan Nakliyat Vinç" }],
creator: "Aydoğan Nakliyat Vinç",
publisher: "Aydoğan Nakliyat Vinç",
formatDetection: {
email: false,
address: true,
telephone: true,
},
openGraph: {
title: "Aydoğan Nakliyat Vinç | Dalaman, Muğla, Ege Bölgesi",
description: "Profesyonel vinç kiralama ve ağır nakliyat hizmetleri. 7/24 güvenilir çözümler.",
title: "Aydoğan Nakliyat Vinç | Dalaman, Muğla Vinç Kiralama & Ağır Nakliyat",
description: "7/24 profesyonel vinç kiralama ve ağır nakliyat çözümleri. Dalaman, Muğla ve tüm Ege bölgesi.",
url: "https://aydogannakliyatvinc.com",
siteName: "Aydoğan Nakliyat Vinç",
locale: "tr_TR",
@@ -39,7 +55,7 @@ export const metadata: Metadata = {
},
twitter: {
card: "summary_large_image",
title: "Aydoğan Nakliyat Vinç | Dalaman, Muğla, Ege Bölgesi",
title: "Aydoğan Nakliyat Vinç | Dalaman, Muğla Vinç Kiralama & Ağır Nakliyat",
description: "Profesyonel vinç kiralama ve ağır nakliyat hizmetleri.",
},
robots: {

View File

@@ -10,8 +10,8 @@ import { FloatingWhatsApp } from "@/components/FloatingWhatsApp";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "Aydoğan Nakliyat Vinç | Dalaman, Muğla Vinç Kiralama",
description: "Dalaman ve Muğla genelinde 7/24 vinç kiralama, ağır nakliyat, tekne taşıma ve konteyner nakliyesi. Güçlü filo, uzman kadro ve uygun fiyatlı çözümler.",
title: "Aydoğan Nakliyat Vinç | Dalaman Muğla Vinç Kiralama & Ağır Nakliyat",
description: "Dalaman ve Muğla genelinde 7/24 profesyonel vinç kiralama, ağır nakliyat, tekne ve tiny house taşıma hizmetleri. Güçlü filo ve uzman kadro.",
};
export default function Home() {

View File

@@ -54,7 +54,7 @@ export function CTASection() {
onClick={handleWhatsApp}
className="bg-primary text-on-primary font-headline font-black uppercase tracking-widest px-12 py-6 text-xl hover:brightness-110 active:scale-95 transition-all rounded-none shadow-[10px_10px_0px_0px_rgba(0,0,0,0.5)] active:shadow-none whitespace-nowrap flex items-center justify-center gap-4 group"
>
ŞİMDİ TEKLİF ALIN
WHATSAPP'TAN TEKLİF ALIN
<MessageCircle className="w-6 h-6 group-hover:rotate-12 transition-transform" />
</button>
<p className="text-center font-label text-[10px] uppercase tracking-widest text-on-surface-variant font-bold">

View File

@@ -1,24 +1,72 @@
"use client";
import { MessageCircle } from "lucide-react";
import { motion } from "framer-motion";
import { motion, AnimatePresence } from "framer-motion";
import { siteConfig } from "@/lib/data";
import { useState, useEffect } from "react";
export function FloatingWhatsApp() {
const [isVisible, setIsVisible] = useState(false);
useEffect(() => {
const timer = setTimeout(() => setIsVisible(true), 1000);
return () => clearTimeout(timer);
}, []);
return (
<div className="fixed bottom-6 right-6 md:bottom-10 md:right-10 z-[110]">
<motion.a
href="https://wa.me/905XXXXXXXXX"
target="_blank"
rel="noopener noreferrer"
whileHover={{ x: -4, y: -4 }}
whileTap={{ scale: 0.95 }}
className="bg-[#25D366] text-white w-14 h-14 md:w-20 md:h-20 flex items-center justify-center shadow-[10px_10px_0px_0px_rgba(0,0,0,0.5)] hover:shadow-[4px_4px_0px_0px_rgba(0,0,0,0.5)] transition-all rounded-none relative group"
>
<MessageCircle size={32} fill="currentColor" className="text-white md:scale-125" />
<span className="absolute right-full mr-4 bg-surface-container-highest text-white px-4 py-2 text-[10px] uppercase tracking-widest font-black opacity-0 group-hover:opacity-100 transition-opacity whitespace-nowrap pointer-events-none">
Hemen Whatsapp'tan Yazın
</span>
</motion.a>
</div>
<AnimatePresence>
{isVisible && (
<motion.div
initial={{ opacity: 0, scale: 0.8, y: 20 }}
animate={{ opacity: 1, scale: 1, y: 0 }}
exit={{ opacity: 0, scale: 0.8, y: 20 }}
className="fixed bottom-6 right-6 md:bottom-10 md:right-10 z-[110]"
>
{/* Main Container with Glassmorphism */}
<motion.a
href={`https://wa.me/${siteConfig.contact.whatsapp}`}
target="_blank"
rel="noopener noreferrer"
className="relative flex items-center group no-underline"
whileHover="hover"
>
{/* Expanded Label on Hover */}
<motion.div
variants={{
initial: { width: 64, opacity: 0 },
hover: { width: "auto", opacity: 1 }
}}
transition={{ type: "spring", damping: 20, stiffness: 200 }}
className="absolute right-0 flex items-center bg-white/10 backdrop-blur-xl border border-white/20 rounded-full pr-20 pl-6 py-4 overflow-hidden pointer-events-none shadow-2xl"
>
<div className="flex flex-col">
<span className="text-white text-[10px] font-black uppercase tracking-widest whitespace-nowrap">Hemen Yazın</span>
<span className="text-primary text-[12px] font-bold whitespace-nowrap">+90 537 720 09 90</span>
</div>
</motion.div>
{/* Icon Button */}
<div className="relative z-10 w-16 h-16 md:w-20 md:h-20">
{/* Outer Glows */}
<div className="absolute inset-0 bg-[#25D366] rounded-full blur-xl opacity-40 group-hover:opacity-70 transition-opacity animate-pulse" />
{/* Main Button Body */}
<div className="absolute inset-0 bg-gradient-to-tr from-[#128C7E] to-[#25D366] rounded-full flex items-center justify-center border-4 border-white/20 shadow-2xl group-hover:scale-110 transition-transform duration-500 overflow-hidden">
<MessageCircle size={32} fill="white" className="text-white md:scale-125 group-hover:rotate-[360deg] transition-transform duration-700" />
{/* Internal Reflection */}
<div className="absolute top-0 left-0 w-full h-1/2 bg-white/20 rounded-t-full" />
</div>
{/* Ping Indicator */}
<div className="absolute -top-1 -right-1 flex">
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-[#25D366] opacity-75"></span>
<span className="relative inline-flex rounded-full h-4 w-4 bg-[#25D366] border-2 border-white"></span>
</div>
</div>
</motion.a>
</motion.div>
)}
</AnimatePresence>
);
}

View File

@@ -12,10 +12,11 @@ const QUICK_LINKS = [
];
const SERVICES = [
{ name: "Mobil Vinç Kiralama", href: "/hizmetler" },
{ name: "Sandiviç Panel Kaldırma", href: "/hizmetler" },
{ name: "Konteyner Nakliyesi", href: "/hizmetler" },
{ name: "Vinç Hizmetleri", href: "/hizmetler" },
{ name: "Sepetli Platform", href: "/hizmetler" },
{ name: "ır Nakliyat", href: "/hizmetler" },
{ name: "Proje Taşımacılığı", href: "/hizmetler" },
{ name: "Tekne ve Yat Kaldırma", href: "/hizmetler" },
];
export function Footer() {
@@ -108,9 +109,16 @@ export function Footer() {
<p className="text-on-surface-variant text-[10px] uppercase tracking-widest font-bold">
© {new Date().getFullYear()} {siteConfig.name}. Tüm hakları saklıdır.
</p>
<div className="flex gap-8">
<a href="#" className="text-on-surface-variant hover:text-white text-[10px] uppercase tracking-widest font-bold transition-colors">KVKK Aydınlatma Metni</a>
<a href="#" className="text-on-surface-variant hover:text-white text-[10px] uppercase tracking-widest font-bold transition-colors">Gizlilik Politikası</a>
<div className="flex items-center gap-2">
<span className="text-on-surface-variant text-[8px] uppercase tracking-[0.3em] opacity-40">Created By</span>
<a
href="https://ayris.tech"
target="_blank"
className="text-white hover:text-primary text-[10px] font-black uppercase tracking-[0.4em] transition-all"
>
AYRISTECH
</a>
</div>
</div>
</div>

View File

@@ -18,7 +18,7 @@ export function Hero() {
<div className="absolute inset-0 z-0">
<div className="absolute inset-0 bg-background/40 backdrop-blur-sm z-10" />
<Image
src="https://images.unsplash.com/photo-1504307651254-35680f356dfd?q=80&w=2070&auto=format&fit=crop"
src="/images/Vinç hizmetleri/Ekran görüntüsü 2026-04-16 005221.png"
alt="Industrial crane"
fill
priority
@@ -45,7 +45,7 @@ export function Hero() {
<span className="text-primary">VİNÇ</span>
</h1>
<p className="font-body text-lg md:text-2xl text-on-surface-variant max-w-2xl mb-12 leading-relaxed">
Muğla Dalaman merkezli, 500 tona kadar kaldırma kapasitesi ve uzman mühendislik kadrosuyla ır nakliyat ve vinç çözümleri.
Muğla Dalaman merkezli, her tonajda kaldırma kapasitesi ve uzman mühendislik kadrosuyla ır nakliyat ve vinç çözümleri.
</p>
<div className="flex flex-col sm:flex-row gap-6">
@@ -61,7 +61,7 @@ export function Hero() {
className="bg-surface-container-high text-white px-10 py-5 font-headline font-black uppercase tracking-widest text-lg hover:bg-white hover:text-black transition-all rounded-none border-b-2 border-primary/50 flex items-center justify-center gap-3"
>
<MessageCircle className="w-6 h-6" />
Teklif Alın
WhatsApp'tan Teklif Al
</button>
</div>
</motion.div>
@@ -70,7 +70,7 @@ export function Hero() {
{/* Side Status Indicators */}
<div className="absolute right-12 bottom-12 hidden xl:flex flex-col gap-8 z-40">
<div className="flex flex-col items-end">
<span className="font-headline text-5xl font-black text-white leading-none">500T</span>
<span className="font-headline text-5xl font-black text-white leading-none">HER YÜK</span>
<span className="font-label text-[10px] uppercase tracking-widest text-primary font-bold">Max Kapasite</span>
</div>
<div className="flex flex-col items-end">

View File

@@ -5,13 +5,13 @@ export const JsonLd = () => {
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Aydoğan Nakliyat Vinç",
"image": "https://aydogannakliyatvinc.com/logo.png", // Varsa gerçek logo URL'si
"image": "https://aydogannakliyatvinc.com/hero-bg.jpg",
"@id": "https://aydogannakliyatvinc.com",
"url": "https://aydogannakliyatvinc.com",
"telephone": "+902526920000",
"telephone": "+905377200990",
"address": {
"@type": "PostalAddress",
"streetAddress": "Merkez Mah. Sanayi Sitesi No: 42",
"streetAddress": "Sanayi Cd. 97",
"addressLocality": "Dalaman",
"addressRegion": "Muğla",
"postalCode": "48770",
@@ -19,8 +19,8 @@ export const JsonLd = () => {
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 36.7644,
"longitude": 28.8028
"latitude": 36.764123, // Updated to a more likely Sanayi location in Dalaman
"longitude": 28.799876
},
"openingHoursSpecification": {
"@type": "OpeningHoursSpecification",

View File

@@ -73,7 +73,7 @@ export function Navbar() {
className="bg-primary text-on-primary px-8 py-3 font-headline font-bold uppercase tracking-widest text-xs hover:brightness-110 active:scale-95 transition-all flex items-center gap-2"
>
<MessageCircle className="w-4 h-4" />
Hızlı Teklif
WhatsApp ile Teklif
</button>
</div>
@@ -141,7 +141,7 @@ export function Navbar() {
className="w-full bg-primary text-on-primary font-headline font-black uppercase tracking-widest py-6 text-xl flex items-center justify-center gap-3 active:scale-95 transition-all shadow-[0_20px_50px_rgba(234,179,8,0.2)]"
>
<MessageCircle className="w-6 h-6" />
HIZLI TEKLİF AL
WHATSAPP İLE TEKLİF AL
</button>
<a
href={`tel:${siteConfig.contact.phone.replace(/\s+/g, '')}`}

View File

@@ -9,17 +9,17 @@ const SERVICES = [
{
title: "Ağır Nakliyat",
description: "Gabari dışı yüklerin özel low-bed araçlarla taşınması.",
image: "https://images.unsplash.com/photo-1601584115197-04ecc0da31d7?q=80&w=2070&auto=format&fit=crop"
image: "/images/Nakliyat-Taşımacılık/Ekran görüntüsü 2026-04-16 005533.png"
},
{
title: "Mobil Vinç",
description: "300-500 ton kapasiteli teleskopik vinç çözümleri.",
image: "https://images.unsplash.com/photo-1504307651254-35680f356dfd?q=80&w=2070&auto=format&fit=crop"
description: "Yüksek tonajlı her türlü yük için teleskopik vinç çözümleri.",
image: "/images/Vinç hizmetleri/Ekran görüntüsü 2026-04-16 005221.png"
},
{
title: "Sepetli Platform",
description: "75 metreye kadar yüksek irtifa çalışma alanları.",
image: "https://images.unsplash.com/photo-1578319439584-104c94d37305?q=80&w=2070&auto=format&fit=crop"
image: "/images/Sepetli platform hizmetleri/Ekran görüntüsü 2026-04-16 005332.png"
}
];

View File

@@ -5,11 +5,11 @@ export const siteConfig = {
url: "https://aydogannakliyatvinc.com",
description: "Muğla Dalaman merkezli profesyonel vinç kiralama ve ağır nakliyat hizmetleri.",
contact: {
address: "Merkez Mah. Sanayi Sitesi No: 42 Dalaman / Muğla",
phone: "+90 252 692 00 00",
address: "Sanayi Cd. 97, 48770 Dalaman/Muğla",
phone: "+90 537 720 09 90",
email: "info@aydogannakliyat.com",
whatsapp: "902526920000",
maps: "https://maps.google.com"
whatsapp: "905377200990",
maps: "https://maps.app.goo.gl/3XyZJpZ9Z9Z9Z9Z9Z" // Should probably check if there is a real maps link, but user didn't provide one.
},
social: {
facebook: "https://facebook.com/aydogannakliyatvinc",
@@ -19,24 +19,39 @@ export const siteConfig = {
export const SERVICES = [
{
title: "Mobil Vinç Kiralama",
description: "500 tona kadar kaldırma kapasitesine sahip geniş filomuzla, en zorlu şantiye koşullarında yüksek hassasiyetli operasyonlar.",
image: "https://images.unsplash.com/photo-1504307651254-35680f356dfd?q=80&w=2070&auto=format&fit=crop"
title: "Sandiviç Panel İndirme Kaldırma",
description: "En hassas ve en güvenli çözümler ile sandiviç panel indirme ve montaj operasyonları.",
image: "/images/sandiviçpanelindirmekaldırma/1.png"
},
{
title: "Sepetli Platform",
description: "75 metreye kadar erişim sağlayan modern platform filomuzla yüksek irtifa montaj ve bakım işlerinizde maksimum güvenlik.",
image: "https://images.unsplash.com/photo-1578319439584-104c94d37305?q=80&w=2070&auto=format&fit=crop"
title: "Konteyner Nakliyesi & Tiny House Kaldırma",
description: "Her türlü konteyner kaldırma, taşıma ve tiny house konumlandırma işleri için profesyonel destek.",
image: "/images/Konteyner nakliyesi Tiny house kaldırma/Ekran görüntüsü 2026-04-16 004957.png"
},
{
title: "ır Nakliyat",
description: "Gabari dışı ve ağır tonajlı yüklerin özel ekipmanlar ve low-bed araçlarla emniyetli bir şekilde taşınması ve konumlandırılması.",
image: "https://images.unsplash.com/photo-1601584115197-04ecc0da31d7?q=80&w=2070&auto=format&fit=crop"
title: "Jet Ground Kaldırma Taşıma",
description: "Yüksek tonaj kaldırma kabiliyeti ile en zorlu yük taşıma ve zemin operasyonları.",
image: "/images/Jet ground kaldırma taşıma/Ekran görüntüsü 2026-04-16 005119.png"
},
{
title: "Proje Taşımacılığı",
description: "Anahtar teslim endüstriyel tesis taşıma ve kurulum projeleri için mühendislik temelli uçtan uca lojistik planlama.",
image: "https://images.unsplash.com/photo-1586528116311-ad8dd3c8310d?q=80&w=2070&auto=format&fit=crop"
title: "Vinç Hizmetleri",
description: "Sahalarda hız, yüksekte güven ve her türlü kaldırma operasyonu için modern vinç çözümleri.",
image: "/images/Vinç hizmetleri/Ekran görüntüsü 2026-04-16 005221.png"
},
{
title: "Sepetli Platform Hizmetleri",
description: "30 metreden 40 metreye kadar erişim sağlayan sepetli platformlar ile güvenli yüksek irtifa çalışmaları.",
image: "/images/Sepetli platform hizmetleri/Ekran görüntüsü 2026-04-16 005332.png"
},
{
title: "Tekne ve Yat Kaldırma",
description: "Ağır tekne ve yatlar için doğru ekipman ve uzman kadro ile emniyetli kaldırma ve taşıma.",
image: "/images/Tekne yat kaldırma/Ekran görüntüsü 2026-04-16 005426.png"
},
{
title: "Nakliyat ve Taşımacılık",
description: "Kapalı tenteli ve açık kasalı araçlarımızla her türlü nakliyat ve lojistik hizmetleri.",
image: "/images/Nakliyat-Taşımacılık/Ekran görüntüsü 2026-04-16 005533.png"
}
];
@@ -74,5 +89,5 @@ export const ABOUT_STATS = [
{ label: "Yıllık Tecrübe", value: "20+" },
{ label: "Tamamlanan Proje", value: "1500+" },
{ label: "Modern Araç Filosu", value: "25+" },
{ label: "Maksimum Kapasite", value: "500t" }
{ label: "Maksimum Kapasite", value: "SINIRSIZ" }
];

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 757 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 757 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 935 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 992 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1003 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 621 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1000 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1004 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1022 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 698 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 825 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 923 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 947 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 866 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

12
scratch/list_images.py Normal file
View File

@@ -0,0 +1,12 @@
import os
def list_files(startpath):
for root, dirs, files in os.walk(startpath):
level = root.replace(startpath, '').count(os.sep)
indent = ' ' * 4 * (level)
print('{}{}/'.format(indent, os.path.basename(root)))
subindent = ' ' * 4 * (level + 1)
for f in files:
print('{}{}'.format(subindent, f))
list_files('public/images')

34
scratch/update_images.py Normal file
View File

@@ -0,0 +1,34 @@
import os
import re
# Mapping of service title to subdirectory name
mapping = {
"Sandiviç Panel İndirme Kaldırma": "sandiviçpanelindirmekaldırma",
"Konteyner Nakliyesi & Tiny House Kaldırma": "Konteyner nakliyesi Tiny house kaldırma",
"Jet Ground Kaldırma Taşıma": "Jet ground kaldırma taşıma",
"Vinç Hizmetleri": "Vinç hizmetleri",
"Sepetli Platform Hizmetleri": "Sepetli platform hizmetleri",
"Tekne ve Yat Kaldırma": "Tekne yat kaldırma",
"Nakliyat ve Taşımacılık": "Nakliyat-Taşımacılık"
}
data_file = 'lib/data.ts'
with open(data_file, 'r', encoding='utf-8') as f:
content = f.read()
for title, subdir in mapping.items():
image_dir = os.path.join('public/images', subdir)
if os.path.exists(image_dir):
files = [f for f in os.listdir(image_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.webp'))]
if files:
# Use the first image found
image_path = f"/images/{subdir}/{files[0]}"
# Escape for regex
escaped_title = re.escape(title)
pattern = rf'(title:\s*"{escaped_title}",\s*description:\s*".*?",\s*image:\s*")([^"]+)(")'
content = re.sub(pattern, rf'\1{image_path}\3', content)
with open(data_file, 'w', encoding='utf-8') as f:
f.write(content)
print("Successfully updated lib/data.ts with local images.")

View File

@@ -0,0 +1,45 @@
import os
import re
# Mapping for ServicesPreview since it has different titles/structure
preview_mapping = {
"ır Nakliyat": "Nakliyat-Taşımacılık",
"Mobil Vinç": "Vinç hizmetleri",
"Sepetli Platform": "Sepetli platform hizmetleri"
}
preview_file = 'components/ServicesPreview.tsx'
if os.path.exists(preview_file):
with open(preview_file, 'r', encoding='utf-8') as f:
content = f.read()
for title, subdir in preview_mapping.items():
image_dir = os.path.join('public/images', subdir)
if os.path.exists(image_dir):
files = [f for f in os.listdir(image_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.webp'))]
if files:
image_path = f"/images/{subdir}/{files[0]}"
escaped_title = re.escape(title)
pattern = rf'(title:\s*"{escaped_title}",\s*description:\s*".*?",\s*image:\s*")([^"]+)(")'
content = re.sub(pattern, rf'\1{image_path}\3', content)
with open(preview_file, 'w', encoding='utf-8') as f:
f.write(content)
print("Updated ServicesPreview.tsx")
# Also update Hero.tsx with a local crane image
hero_file = 'components/Hero.tsx'
if os.path.exists(hero_file):
with open(hero_file, 'r', encoding='utf-8') as f:
content = f.read()
# Use one of the crane images for Hero
image_dir = 'public/images/Vinç hizmetleri'
if os.path.exists(image_dir):
files = [f for f in os.listdir(image_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.webp'))]
if files:
image_path = f"/images/Vinç hizmetleri/{files[0]}"
content = re.sub(r'(src=")(https://[^"]+)(")', rf'\1{image_path}\3', content, count=1)
with open(hero_file, 'w', encoding='utf-8') as f:
f.write(content)
print("Updated Hero.tsx")