Hamburger

This commit is contained in:
Şahan Hasret
2025-10-21 22:16:20 +03:00
parent d9ff0b1ef0
commit 08fb440e57
7 changed files with 1785 additions and 276 deletions

286
app/medya/page.tsx Normal file
View File

@@ -0,0 +1,286 @@
'use client';
import { useState } from 'react';
import Header from "@/components/Header";
import Footer from "@/components/Footer";
export default function MediaGallery() {
const [selectedTab, setSelectedTab] = useState<'all' | 'video' | 'photo'>('all');
const [selectedMedia, setSelectedMedia] = useState<number | null>(null);
const mediaItems = [
{
id: 1,
type: 'video',
title: 'A2 Metro Hattı Genel Tanıtım',
thumbnail: 'https://images.pexels.com/photos/17152223/pexels-photo-17152223.jpeg',
videoUrl: 'https://www.youtube.com/embed/b9q88QDEcKg',
date: '15 Ekim 2025',
duration: '5:32',
description: 'A2 Metro Hattı projesinin genel tanıtımı ve istasyonların detayları'
},
{
id: 2,
type: 'photo',
title: 'Dikimevi İstasyonu İnşaat Çalışmaları',
thumbnail: 'https://images.pexels.com/photos/17302615/pexels-photo-17302615.jpeg',
date: '12 Ekim 2025',
description: 'Dikimevi metro istasyonunda devam eden kazı ve inşaat çalışmaları'
},
{
id: 3,
type: 'photo',
title: 'Tuzluçayır İstasyonu Temel Atma',
thumbnail: 'https://images.pexels.com/photos/33950678/pexels-photo-33950678.jpeg',
date: '10 Ekim 2025',
description: 'Tuzluçayır istasyonunun temel atma töreni anları'
},
{
id: 4,
type: 'video',
title: 'Metro İnşaatı İlerleme Raporu',
thumbnail: 'https://images.pexels.com/photos/253647/pexels-photo-253647.jpeg',
videoUrl: 'https://www.youtube.com/embed/b9q88QDEcKg',
date: '8 Ekim 2025',
duration: '8:15',
description: 'Ekim ayı metro inşaatı ilerleme raporu ve gelecek hedefler'
},
{
id: 5,
type: 'photo',
title: 'Modern İstasyon Tasarımları',
thumbnail: 'https://images.pexels.com/photos/17152223/pexels-photo-17152223.jpeg',
date: '5 Ekim 2025',
description: 'Yeni nesil metro istasyonlarının modern iç mekan tasarımları'
},
{
id: 6,
type: 'video',
title: 'Çevre Dostu Metro Projesi',
thumbnail: 'https://images.pexels.com/photos/17302615/pexels-photo-17302615.jpeg',
videoUrl: 'https://www.youtube.com/embed/b9q88QDEcKg',
date: '1 Ekim 2025',
duration: '6:45',
description: 'Metro projesinde kullanılan çevre dostu teknolojiler ve sürdürülebilir yaklaşımlar'
},
{
id: 7,
type: 'photo',
title: 'İşçi Güvenliği Eğitimi',
thumbnail: 'https://images.pexels.com/photos/33950678/pexels-photo-33950678.jpeg',
date: '28 Eylül 2025',
description: 'İnşaat sahalarında iş güvenliği eğitimleri'
},
{
id: 8,
type: 'photo',
title: 'Ray Döşeme Çalışmaları',
thumbnail: 'https://images.pexels.com/photos/253647/pexels-photo-253647.jpeg',
date: '25 Eylül 2025',
description: 'Metro hattında ray döşeme işlemlerinin başlaması'
},
];
const filteredMedia = selectedTab === 'all'
? mediaItems
: mediaItems.filter(item => item.type === selectedTab);
const selectedMediaItem = selectedMedia !== null
? mediaItems.find(item => item.id === selectedMedia)
: null;
return (
<div className="min-h-screen bg-[#003366]">
<Header />
<main className="pt-32 pb-16">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
{/* Başlık */}
<div className="text-center mb-12">
<h1 className="text-4xl font-bold text-white mb-4">
Medya Galerisi
</h1>
<p className="text-lg text-[#F8F9FA] max-w-2xl mx-auto">
A2 Metro Hattı projesi ile ilgili videolar ve fotoğraflar
</p>
</div>
{/* Tab Menü */}
<div className="flex justify-center space-x-4 mb-8">
<button
onClick={() => setSelectedTab('all')}
className={`px-6 py-3 rounded-lg font-semibold transition-all duration-300 ${
selectedTab === 'all'
? 'bg-[#00B4D8] text-white shadow-lg scale-105'
: 'bg-white text-[#004B87] hover:bg-gray-100'
}`}
>
Tümü
</button>
<button
onClick={() => setSelectedTab('video')}
className={`px-6 py-3 rounded-lg font-semibold transition-all duration-300 flex items-center space-x-2 ${
selectedTab === 'video'
? 'bg-[#00B4D8] text-white shadow-lg scale-105'
: 'bg-white text-[#004B87] hover:bg-gray-100'
}`}
>
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/>
</svg>
<span>Videolar</span>
</button>
<button
onClick={() => setSelectedTab('photo')}
className={`px-6 py-3 rounded-lg font-semibold transition-all duration-300 flex items-center space-x-2 ${
selectedTab === 'photo'
? 'bg-[#00B4D8] text-white shadow-lg scale-105'
: 'bg-white text-[#004B87] hover:bg-gray-100'
}`}
>
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86l-3 3.87L9 13.14 6 17h12l-3.86-5.14z"/>
</svg>
<span>Fotoğraflar</span>
</button>
</div>
{/* Medya Grid */}
{!selectedMediaItem ? (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{filteredMedia.map((item) => (
<div
key={item.id}
onClick={() => setSelectedMedia(item.id)}
className="bg-white rounded-xl overflow-hidden shadow-lg hover:shadow-2xl transition-all duration-300 hover:-translate-y-2 cursor-pointer group"
>
{/* Thumbnail */}
<div className="relative h-56 overflow-hidden">
<img
src={item.thumbnail}
alt={item.title}
className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-500"
/>
{/* Video Badge */}
{item.type === 'video' && (
<div className="absolute inset-0 flex items-center justify-center bg-black/30 group-hover:bg-black/40 transition-colors">
<div className="w-16 h-16 rounded-full bg-[#00B4D8] flex items-center justify-center group-hover:scale-110 transition-transform">
<svg className="w-8 h-8 text-white ml-1" fill="currentColor" viewBox="0 0 24 24">
<path d="M8 5v14l11-7z"/>
</svg>
</div>
</div>
)}
{/* Duration Badge */}
{item.type === 'video' && (
<div className="absolute bottom-3 right-3 px-2 py-1 bg-black/75 text-white text-xs rounded">
{item.duration}
</div>
)}
{/* Photo Badge */}
{item.type === 'photo' && (
<div className="absolute top-3 right-3 px-3 py-1 bg-[#00B4D8] text-white text-xs rounded-full font-semibold">
FOTO
</div>
)}
</div>
{/* Content */}
<div className="p-5">
<div className="flex items-center space-x-2 text-sm text-gray-500 mb-2">
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/>
</svg>
<span>{item.date}</span>
</div>
<h3 className="text-lg font-bold text-[#004B87] mb-2 line-clamp-2 group-hover:text-[#00B4D8] transition-colors">
{item.title}
</h3>
<p className="text-gray-600 text-sm line-clamp-2">
{item.description}
</p>
</div>
</div>
))}
</div>
) : (
/* Medya Detayı */
<div className="bg-white rounded-2xl shadow-2xl overflow-hidden animate-fadeIn">
<div className="p-6 lg:p-8">
{/* Geri Butonu */}
<button
onClick={() => setSelectedMedia(null)}
className="flex items-center space-x-2 text-[#00B4D8] hover:text-[#004B87] font-semibold mb-6 transition-colors"
>
<svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<span>Galeriye Dön</span>
</button>
{/* Video Player veya Büyük Fotoğraf */}
{selectedMediaItem?.type === 'video' ? (
<div className="relative w-full mb-6" style={{ paddingBottom: '56.25%' }}>
<iframe
className="absolute top-0 left-0 w-full h-full rounded-lg"
src={selectedMediaItem.videoUrl}
title={selectedMediaItem.title}
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
</div>
) : (
<div className="mb-6 rounded-lg overflow-hidden">
<img
src={selectedMediaItem?.thumbnail}
alt={selectedMediaItem?.title}
className="w-full h-auto"
/>
</div>
)}
{/* Bilgiler */}
<div className="flex items-center space-x-2 text-sm text-gray-500 mb-4">
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/>
</svg>
<span>{selectedMediaItem?.date}</span>
{selectedMediaItem?.type === 'video' && (
<>
<span className="text-gray-300"></span>
<span>{selectedMediaItem?.duration}</span>
</>
)}
</div>
<h1 className="text-3xl font-bold text-[#004B87] mb-4">
{selectedMediaItem?.title}
</h1>
<p className="text-gray-700 text-lg leading-relaxed">
{selectedMediaItem?.description}
</p>
{/* Paylaş */}
<div className="mt-8 pt-6 border-t border-gray-200">
<div className="flex items-center justify-between">
<div className="flex items-center space-x-4">
<span className="text-sm text-gray-500">Paylaş:</span>
<button className="text-[#00B4D8] hover:text-[#004B87] transition-colors">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"/>
</svg>
</button>
</div>
</div>
</div>
</div>
</div>
)}
</div>
</main>
<Footer />
</div>
);
}