feat: integrate Cloudinary, add new fleet items and image gallery

This commit is contained in:
2026-04-16 20:52:12 +03:00
parent bac925b5bc
commit 0efef41f5d
94 changed files with 494 additions and 19 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -7,13 +7,15 @@ import Image from "next/image";
import { Metadata } from "next";
import { FLEET_ITEMS } from "@/lib/data";
import { FleetList } from "@/components/FleetList";
import { FleetGallery } from "@/components/FleetGallery";
import { ALL_CLOUDINARY_IMAGES } from "@/lib/gallery_data";
export const metadata: Metadata = {
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ç"];
const FLEET_CATEGORIES = ["Hepsi", "Mobil Vinç", "Sepetli Platform", "Hiyap", "Forklift", "Nakliyat", "İş Makinesi"];
export default function FleetPage() {
return (
@@ -47,6 +49,8 @@ export default function FleetPage() {
<FleetList items={FLEET_ITEMS} categories={FLEET_CATEGORIES} />
<FleetGallery images={ALL_CLOUDINARY_IMAGES} />
<LoadMeterSection />
<CTASection />
<Footer />

140
components/FleetGallery.tsx Normal file
View File

@@ -0,0 +1,140 @@
"use client";
import { useState } from "react";
import Image from "next/image";
import { motion, AnimatePresence } from "framer-motion";
import { X, ChevronLeft, ChevronRight } from "lucide-react";
interface FleetGalleryProps {
images: string[];
}
export function FleetGallery({ images }: FleetGalleryProps) {
const [selectedImage, setSelectedImage] = useState<number | null>(null);
const nextImage = () => {
if (selectedImage !== null) {
setSelectedImage((selectedImage + 1) % images.length);
}
};
const prevImage = () => {
if (selectedImage !== null) {
setSelectedImage((selectedImage - 1 + images.length) % images.length);
}
};
return (
<section className="py-24 bg-background px-6 md:px-12">
<div className="max-w-7xl mx-auto">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
className="mb-12"
>
<span className="text-primary font-headline font-bold text-xs tracking-[0.3em] uppercase mb-2 block">
SAHADAN KARELER
</span>
<h2 className="text-4xl md:text-5xl font-black text-on-surface uppercase tracking-tighter leading-none">
FİLOMUZ <span className="text-primary">AKSİYONDA</span>
</h2>
</motion.div>
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
{images.map((src, index) => (
<motion.div
key={src}
initial={{ opacity: 0, scale: 0.9 }}
whileInView={{ opacity: 1, scale: 1 }}
viewport={{ once: true }}
transition={{ delay: index * 0.1 }}
whileHover={{ scale: 0.98 }}
className="relative aspect-square cursor-pointer overflow-hidden group bg-surface-container-low"
onClick={() => setSelectedImage(index)}
>
<Image
src={src}
alt={`Fleet image ${index + 1}`}
fill
sizes="(max-width: 768px) 50vw, 25vw"
className="object-cover transition-transform duration-500 group-hover:scale-110 grayscale group-hover:grayscale-0"
/>
<div className="absolute inset-0 bg-primary/20 opacity-0 group-hover:opacity-100 transition-opacity duration-300 flex items-center justify-center">
<div className="w-12 h-12 rounded-full bg-white/10 backdrop-blur-md flex items-center justify-center border border-white/20">
<div className="w-1 h-4 bg-white rounded-full"></div>
<div className="w-4 h-1 bg-white rounded-full absolute"></div>
</div>
</div>
</motion.div>
))}
</div>
</div>
<AnimatePresence>
{selectedImage !== null && (
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
className="fixed inset-0 z-[100] flex items-center justify-center bg-black/95 backdrop-blur-sm p-4 md:p-12"
onClick={() => setSelectedImage(null)}
>
<motion.button
initial={{ opacity: 0, scale: 0.5 }}
animate={{ opacity: 1, scale: 1 }}
className="absolute top-8 right-8 text-white hover:text-primary transition-colors z-[110]"
onClick={(e) => {
e.stopPropagation();
setSelectedImage(null);
}}
>
<X size={40} strokeWidth={1} />
</motion.button>
<button
className="absolute left-4 md:left-8 text-white hover:text-primary transition-colors z-[110]"
onClick={(e) => {
e.stopPropagation();
prevImage();
}}
>
<ChevronLeft size={60} strokeWidth={1} />
</button>
<button
className="absolute right-4 md:right-8 text-white hover:text-primary transition-colors z-[110]"
onClick={(e) => {
e.stopPropagation();
nextImage();
}}
>
<ChevronRight size={60} strokeWidth={1} />
</button>
<motion.div
layoutId={images[selectedImage]}
className="relative w-full h-full flex items-center justify-center"
onClick={(e) => e.stopPropagation()}
>
<div className="relative w-full h-full max-w-5xl max-h-[80vh]">
<Image
src={images[selectedImage]}
alt="Full size fleet image"
fill
className="object-contain"
sizes="100vw"
priority
/>
</div>
</motion.div>
<div className="absolute bottom-10 left-1/2 -translate-x-1/2 text-white/50 font-label text-xs tracking-widest uppercase">
{selectedImage + 1} / {images.length}
</div>
</motion.div>
)}
</AnimatePresence>
</section>
);
}

View File

@@ -5,6 +5,7 @@ import Image from "next/image";
import Link from "next/link";
import { ArrowRight, Phone, MessageCircle } from "lucide-react";
import { siteConfig } from "@/lib/data";
import { cloudinaryUrl } from "@/lib/cloudinary";
export function Hero() {
const handleWhatsApp = () => {
@@ -18,7 +19,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="/images/Vinç hizmetleri/Ekran görüntüsü 2026-04-16 005221.png"
src={cloudinaryUrl("/images/Vinç hizmetleri/Ekran görüntüsü 2026-04-16 005221.png")}
alt="Industrial crane"
fill
priority

View File

@@ -4,22 +4,23 @@ import { motion } from "framer-motion";
import Image from "next/image";
import Link from "next/link";
import { ArrowRight } from "lucide-react";
import { cloudinaryUrl } from "@/lib/cloudinary";
const SERVICES = [
{
title: "Ağır Nakliyat",
description: "Gabari dışı yüklerin özel low-bed araçlarla taşınması.",
image: "/images/Nakliyat-Taşımacılık/Ekran görüntüsü 2026-04-16 005533.png"
image: cloudinaryUrl("/images/Nakliyat-Taşımacılık/Ekran görüntüsü 2026-04-16 005533.png")
},
{
title: "Mobil Vinç",
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"
image: cloudinaryUrl("/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: "/images/Sepetli platform hizmetleri/Ekran görüntüsü 2026-04-16 005332.png"
image: cloudinaryUrl("/images/Sepetli platform hizmetleri/Ekran görüntüsü 2026-04-16 005332.png")
}
];

8
lib/cloudinary.ts Normal file
View File

@@ -0,0 +1,8 @@
const CLOUDINARY_BASE = "https://res.cloudinary.com/du7xohbct/image/upload/aydogan";
export const cloudinaryUrl = (path: string) => {
if (!path || !path.startsWith("/images/")) return path;
const parts = path.replace("/images/", "").split("/");
const encodedParts = parts.map(part => encodeURIComponent(part));
return `${CLOUDINARY_BASE}/${encodedParts.join("/")}`;
};

View File

@@ -1,4 +1,5 @@
import { Settings, ArrowUp, Truck, Compass, Shield, Zap, Clock, MapPin, Phone, Mail } from "lucide-react";
import { cloudinaryUrl } from "./cloudinary";
export const siteConfig = {
name: "Aydoğan Nakliyat Vinç",
@@ -21,37 +22,37 @@ export const SERVICES = [
{
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"
image: cloudinaryUrl("/images/sandiviçpanelindirmekaldırma/1.png")
},
{
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"
image: cloudinaryUrl("/images/Konteyner nakliyesi Tiny house kaldırma/Ekran görüntüsü 2026-04-16 004957.png")
},
{
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"
image: cloudinaryUrl("/images/Jet ground kaldırma taşıma/Ekran görüntüsü 2026-04-16 005119.png")
},
{
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"
image: cloudinaryUrl("/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"
image: cloudinaryUrl("/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"
image: cloudinaryUrl("/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"
image: cloudinaryUrl("/images/Nakliyat-Taşımacılık/Ekran görüntüsü 2026-04-16 005533.png")
}
];
@@ -61,7 +62,7 @@ export const FLEET_ITEMS = [
description: "Endüstriyel ağır kaldırma operasyonları için maksimum stabilite ve erişim gücü.",
capacity: "300 Ton",
reach: "78 Metre",
image: "https://images.unsplash.com/photo-1504307651254-35680f356dfd?q=80&w=2070&auto=format&fit=crop",
image: cloudinaryUrl("/images/Vinç hizmetleri/Ekran görüntüsü 2026-04-16 005221.png"),
status: "Müsait",
category: "Mobil Vinç"
},
@@ -70,18 +71,54 @@ export const FLEET_ITEMS = [
description: "Şehir içi dar alanlarda yüksek manevra kabiliyeti ve pratik yükleme çözümü.",
capacity: "75 Ton",
reach: "32 Metre",
image: "https://images.unsplash.com/photo-1578319439584-104c94d37305?q=80&w=2070&auto=format&fit=crop",
image: cloudinaryUrl("/images/Jet ground kaldırma taşıma/Ekran görüntüsü 2026-04-16 005119.png"),
status: "Bakımda",
category: "Hiyap"
},
{
name: "Sepetli Platform 45M",
description: "Yüksek irtifa montaj ve bakım çalışmaları için güvenli çalışma sahası.",
capacity: "450 Kg",
reach: "45 Metre",
image: "https://images.unsplash.com/photo-1581092918056-0c4c3acd3789?q=80&w=2070&auto=format&fit=crop",
name: "30M Sepetli Platform (Tam Oransal)",
description: "30M dikey erişim, 22M yatay erişim ve tam oransal uzaktan kumanda sistemi ile ultra hassas çalışma alanı.",
capacity: "300 Kg",
reach: "30M / 22M",
image: cloudinaryUrl("/images/Sepetli platform hizmetleri/Ekran görüntüsü 2026-04-16 005336.png"),
status: "Müsait",
category: "Sepetli Platform"
},
{
name: "38 Ton Çift Kırma (Uzaktan Kumandalı)",
description: "38 Ton çift kırma kapasitesi, 40 Metre dikey ve 34 Metre yatay erişim ile sahadaki en presizyonel gücünüz.",
capacity: "20 Ton",
reach: "40M / 34M",
image: cloudinaryUrl("/images/Vinç hizmetleri/Ekran görüntüsü 2026-04-16 005229.png"),
status: "Müsait",
category: "Hiyap"
},
{
name: "3.5 Ton Forklift",
description: "Depo içi ve şantiye alanı yükleme/boşaltma işleri için yüksek manevra kabiliyetli 3.5 tonluk forklift.",
capacity: "3.5 Ton",
reach: "4.5 Metre",
image: cloudinaryUrl("/images/WhatsApp Image 2026-04-16 at 13.02.19.jpeg"),
status: "Müsait",
category: "Forklift"
},
{
name: "Tır & Kırkayak (Nakliyat)",
description: "Şehirler arası ve yerel nakliyat operasyonları için ağır vasıta lojistik desteği.",
capacity: "25-40 Ton",
reach: "Lojistik",
image: cloudinaryUrl("/images/Nakliyat-Taşımacılık/Ekran görüntüsü 2026-04-16 005538.png"),
status: "Müsait",
category: "Nakliyat"
},
{
name: "Kovalı Vinç (Kum & Toprak)",
description: "Kum, toprak ve inşaat malzemesi nakli için kovalı ekipman ile hızlı boşaltma ve atma.",
capacity: "1.5 m³ Kova",
reach: "Hiyap Destekli",
image: cloudinaryUrl("/images/Jet ground kaldırma taşıma/Ekran görüntüsü 2026-04-16 005124.png"),
status: "Müsait",
category: "İş Makinesi"
}
];
@@ -91,3 +128,16 @@ export const ABOUT_STATS = [
{ label: "Modern Araç Filosu", value: "25+" },
{ label: "Maksimum Kapasite", value: "SINIRSIZ" }
];
export const GALLERY_IMAGES = [
cloudinaryUrl("/images/Vinç hizmetleri/Ekran görüntüsü 2026-04-16 005221.png"),
cloudinaryUrl("/images/Vinç hizmetleri/Ekran görüntüsü 2026-04-16 005225.png"),
cloudinaryUrl("/images/Sepetli platform hizmetleri/Ekran görüntüsü 2026-04-16 005332.png"),
cloudinaryUrl("/images/Sepetli platform hizmetleri/Ekran görüntüsü 2026-04-16 005336.png"),
cloudinaryUrl("/images/Tekne yat kaldırma/Ekran görüntüsü 2026-04-16 005426.png"),
cloudinaryUrl("/images/Tekne yat kaldırma/Ekran görüntüsü 2026-04-16 005432.png"),
cloudinaryUrl("/images/Konteyner nakliyesi Tiny house kaldırma/Ekran görüntüsü 2026-04-16 004957.png"),
cloudinaryUrl("/images/Konteyner nakliyesi Tiny house kaldırma/Ekran görüntüsü 2026-04-16 005004.png"),
cloudinaryUrl("/images/sandiviçpanelindirmekaldırma/1.png"),
cloudinaryUrl("/images/sandiviçpanelindirmekaldırma/2.png"),
];

129
lib/gallery_data.ts Normal file
View File

@@ -0,0 +1,129 @@
export const ALL_CLOUDINARY_IMAGES = [
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361325/aydogan/Jet%20ground%20kald%C4%B1rma%20ta%C5%9F%C4%B1ma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005119.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361326/aydogan/Jet%20ground%20kald%C4%B1rma%20ta%C5%9F%C4%B1ma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005124.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361328/aydogan/Jet%20ground%20kald%C4%B1rma%20ta%C5%9F%C4%B1ma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005128.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361329/aydogan/Jet%20ground%20kald%C4%B1rma%20ta%C5%9F%C4%B1ma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005132.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361330/aydogan/Jet%20ground%20kald%C4%B1rma%20ta%C5%9F%C4%B1ma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005137.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361332/aydogan/Jet%20ground%20kald%C4%B1rma%20ta%C5%9F%C4%B1ma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005141.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361333/aydogan/Jet%20ground%20kald%C4%B1rma%20ta%C5%9F%C4%B1ma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005147.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361334/aydogan/Jet%20ground%20kald%C4%B1rma%20ta%C5%9F%C4%B1ma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005152.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361336/aydogan/Konteyner%20nakliyesi%20Tiny%20house%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20004957.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361337/aydogan/Konteyner%20nakliyesi%20Tiny%20house%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005004.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361338/aydogan/Konteyner%20nakliyesi%20Tiny%20house%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005009.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361340/aydogan/Konteyner%20nakliyesi%20Tiny%20house%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005014.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361341/aydogan/Konteyner%20nakliyesi%20Tiny%20house%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005020.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361342/aydogan/Konteyner%20nakliyesi%20Tiny%20house%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005025.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361343/aydogan/Konteyner%20nakliyesi%20Tiny%20house%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005030.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361345/aydogan/Konteyner%20nakliyesi%20Tiny%20house%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005035.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361346/aydogan/Konteyner%20nakliyesi%20Tiny%20house%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005040.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361347/aydogan/Konteyner%20nakliyesi%20Tiny%20house%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005044.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361349/aydogan/Nakliyat-Ta%C5%9F%C4%B1mac%C4%B1l%C4%B1k/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005533.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361350/aydogan/Nakliyat-Ta%C5%9F%C4%B1mac%C4%B1l%C4%B1k/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005538.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361352/aydogan/sandivi%C3%A7panelindirmekald%C4%B1rma/1.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361355/aydogan/sandivi%C3%A7panelindirmekald%C4%B1rma/2.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361357/aydogan/sandivi%C3%A7panelindirmekald%C4%B1rma/4.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361360/aydogan/sandivi%C3%A7panelindirmekald%C4%B1rma/Ads%C4%B1z.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361362/aydogan/Sepetli%20platform%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005332.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361363/aydogan/Sepetli%20platform%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005336.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361364/aydogan/Sepetli%20platform%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005341.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361366/aydogan/Sepetli%20platform%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005345.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361367/aydogan/Sepetli%20platform%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005350.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361368/aydogan/Sepetli%20platform%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005354.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361370/aydogan/Sepetli%20platform%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005358.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361371/aydogan/Tekne%20yat%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005426.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361372/aydogan/Tekne%20yat%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005432.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361373/aydogan/Tekne%20yat%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005438.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361374/aydogan/Tekne%20yat%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005442.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361376/aydogan/Tekne%20yat%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005447.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361378/aydogan/Tekne%20yat%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005451.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361379/aydogan/Tekne%20yat%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005456.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361381/aydogan/Tekne%20yat%20kald%C4%B1rma/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005501.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361382/aydogan/Vin%C3%A7%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005221.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361384/aydogan/Vin%C3%A7%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005225.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361385/aydogan/Vin%C3%A7%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005229.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361386/aydogan/Vin%C3%A7%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005233.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361389/aydogan/Vin%C3%A7%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005237.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361390/aydogan/Vin%C3%A7%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005240.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361392/aydogan/Vin%C3%A7%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005245.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361393/aydogan/Vin%C3%A7%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005250.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361394/aydogan/Vin%C3%A7%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005254.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361395/aydogan/Vin%C3%A7%20hizmetleri/Ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC%202026-04-16%20005258.png",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361397/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.54.06.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361396/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.54.06%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361398/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.54.35.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361401/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.54.56.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361400/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.54.56%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361404/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.55.21.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361402/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.55.21%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361403/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.55.21%20%282%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361405/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.55.41.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361407/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.55.42.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361406/aydogan/WhatsApp%20Image%202026-04-16%20at%2012.55.42%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361409/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.19.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361408/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.19%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361412/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.20.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361410/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.20%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361411/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.20%20%282%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361416/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.21.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361413/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.21%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361414/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.21%20%282%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361415/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.21%20%283%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361415/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.21%20%284%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361417/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.22.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361418/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.23.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361421/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.26.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361419/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.26%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361423/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.27.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361422/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.27%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361425/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.28.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361424/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.02.28%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361426/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.42.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361430/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.48.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361427/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.48%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361428/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.48%20%282%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361429/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.48%20%283%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361459/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361430/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361431/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2810%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361432/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2811%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361433/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2812%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361434/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2813%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361435/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2814%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361436/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2815%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361437/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2816%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361437/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2817%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361438/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2818%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361439/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2819%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361440/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%282%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361441/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2820%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361442/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2821%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361442/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2822%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361443/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2823%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361444/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2824%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361445/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2825%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361446/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2826%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361446/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2827%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361447/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2828%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361448/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2829%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361449/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%283%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361450/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2830%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361452/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%2831%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361453/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%284%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361453/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%285%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361455/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%286%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361456/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%287%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361457/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%288%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361458/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.53%20%289%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361465/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.54.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361459/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.54%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361460/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.54%20%282%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361461/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.54%20%283%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361462/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.54%20%284%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361462/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.54%20%285%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361463/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.54%20%286%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361464/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.54%20%287%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361467/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.55.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361466/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.55%20%281%29.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361468/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.56.jpg",
"https://res.cloudinary.com/du7xohbct/image/upload/v1776361467/aydogan/WhatsApp%20Image%202026-04-16%20at%2013.35.56%20%281%29.jpg",
];

View File

@@ -12,6 +12,10 @@ const nextConfig: NextConfig = {
protocol: 'https',
hostname: 'lh3.googleusercontent.com',
},
{
protocol: 'https',
hostname: 'res.cloudinary.com',
},
],
},
};

19
package-lock.json generated
View File

@@ -8,6 +8,7 @@
"name": "aydogan",
"version": "0.1.0",
"dependencies": {
"cloudinary": "^2.9.0",
"clsx": "^2.1.1",
"framer-motion": "^12.38.0",
"lucide-react": "^1.8.0",
@@ -2705,6 +2706,18 @@
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
"license": "MIT"
},
"node_modules/cloudinary": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.9.0.tgz",
"integrity": "sha512-F3iKMOy4y0zy0bi5JBp94SC7HY7i/ImfTPSUV07iJmRzH1Iz8WavFfOlJTR1zvYM/xKGoiGZ3my/zy64In0IQQ==",
"license": "MIT",
"dependencies": {
"lodash": "^4.17.21"
},
"engines": {
"node": ">=9"
}
},
"node_modules/clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -4962,6 +4975,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lodash": {
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
"license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",

View File

@@ -9,6 +9,7 @@
"lint": "eslint"
},
"dependencies": {
"cloudinary": "^2.9.0",
"clsx": "^2.1.1",
"framer-motion": "^12.38.0",
"lucide-react": "^1.8.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 843 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 726 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

View File

@@ -0,0 +1,56 @@
import { v2 as cloudinary } from 'cloudinary';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const envPath = path.resolve(__dirname, '../.env.local');
const envContent = fs.readFileSync(envPath, 'utf8');
const env = {};
envContent.split('\n').forEach(line => {
const [key, ...valueParts] = line.split('=');
if (key && valueParts.length > 0) {
let value = valueParts.join('=').trim();
if (value.startsWith('"') && value.endsWith('"')) {
value = value.substring(1, value.length - 1);
}
env[key] = value;
}
});
cloudinary.config({
cloud_name: env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME,
api_key: env.CLOUDINARY_API_KEY,
api_secret: env.CLOUDINARY_API_SECRET
});
async function listAllImages() {
let allImages = [];
let nextCursor = null;
console.log('Fetching image list from Cloudinary...');
do {
const result = await cloudinary.api.resources({
type: 'upload',
prefix: 'aydogan/',
max_results: 500,
next_cursor: nextCursor
});
allImages = allImages.concat(result.resources.map(res => res.secure_url));
nextCursor = result.next_cursor;
} while (nextCursor);
console.log(`Found ${allImages.length} images.`);
// Format the output for data.ts
const formattedList = allImages.map(url => ` "${url}",`).join('\n');
const fileContent = `export const ALL_CLOUDINARY_IMAGES = [\n${formattedList}\n];`;
fs.writeFileSync(path.resolve(__dirname, '../lib/gallery_data.ts'), fileContent);
console.log('Gallery data saved to lib/gallery_data.ts');
}
listAllImages().catch(err => console.error(err));

View File

@@ -0,0 +1,62 @@
import { v2 as cloudinary } from 'cloudinary';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
// Setup environment variables manually from .env.local
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const envPath = path.resolve(__dirname, '../.env.local');
const envContent = fs.readFileSync(envPath, 'utf8');
const env = {};
envContent.split('\n').forEach(line => {
const [key, ...valueParts] = line.split('=');
if (key && valueParts.length > 0) {
let value = valueParts.join('=').trim();
if (value.startsWith('"') && value.endsWith('"')) {
value = value.substring(1, value.length - 1);
}
env[key] = value;
}
});
cloudinary.config({
cloud_name: env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME,
api_key: env.CLOUDINARY_API_KEY,
api_secret: env.CLOUDINARY_API_SECRET
});
const IMAGES_DIR = path.resolve(__dirname, '../public/images');
async function uploadFiles(dir) {
const entries = fs.readdirSync(dir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(dir, entry.name);
if (entry.isDirectory()) {
await uploadFiles(fullPath);
} else if (entry.isFile() && /\.(png|jpg|jpeg|webp)$/i.test(entry.name)) {
const relativePath = path.relative(IMAGES_DIR, fullPath);
const folder = path.join('aydogan', path.dirname(relativePath)).replace(/\\/g, '/');
const publicId = path.basename(entry.name, path.extname(entry.name));
console.log(`Uploading: ${relativePath} to folder: ${folder}`);
try {
const result = await cloudinary.uploader.upload(fullPath, {
folder: folder,
public_id: publicId,
overwrite: true,
resource_type: 'image'
});
console.log(`Successfully uploaded: ${result.secure_url}`);
} catch (error) {
console.error(`Failed to upload ${relativePath}:`, error.message);
}
}
}
}
console.log('Starting upload to Cloudinary...');
uploadFiles(IMAGES_DIR)
.then(() => console.log('Upload finished!'))
.catch(err => console.error('Upload failed:', err));