first commit
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
'use client'
|
||||
|
||||
import { useRef } from 'react'
|
||||
import { useTranslations } from 'next-intl'
|
||||
import { motion, useInView } from 'framer-motion'
|
||||
import Image from 'next/image'
|
||||
import { BedDouble, Bath, Maximize2 } from 'lucide-react'
|
||||
import { MOCK_UNITS } from '@/lib/mock'
|
||||
|
||||
export default function UnitsSection() {
|
||||
const t = useTranslations('units')
|
||||
const ref = useRef<HTMLDivElement>(null)
|
||||
const isInView = useInView(ref, { once: true, margin: '-80px' })
|
||||
|
||||
return (
|
||||
<section id="daireler" className="bg-vesta-cream py-24 md:py-32">
|
||||
<div ref={ref} className="container mx-auto px-6">
|
||||
{/* Başlık */}
|
||||
<div className="text-center mb-16">
|
||||
<motion.p
|
||||
initial={{ opacity: 0, y: 15 }}
|
||||
animate={isInView ? { opacity: 1, y: 0 } : {}}
|
||||
transition={{ duration: 0.5 }}
|
||||
className="text-vesta-earth text-xs tracking-[0.3em] uppercase mb-3"
|
||||
>
|
||||
{t('label')}
|
||||
</motion.p>
|
||||
<motion.h2
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
animate={isInView ? { opacity: 1, y: 0 } : {}}
|
||||
transition={{ duration: 0.6, delay: 0.1 }}
|
||||
className="text-vesta-dark text-3xl md:text-5xl font-serif font-light"
|
||||
>
|
||||
{t('title')}
|
||||
</motion.h2>
|
||||
</div>
|
||||
|
||||
{/* Daire listesi */}
|
||||
<div className="grid md:grid-cols-2 gap-8">
|
||||
{MOCK_UNITS.map((unit, i) => (
|
||||
<motion.div
|
||||
key={unit.id}
|
||||
initial={{ opacity: 0, y: 30 }}
|
||||
animate={isInView ? { opacity: 1, y: 0 } : {}}
|
||||
transition={{ duration: 0.6, delay: 0.1 * i }}
|
||||
className="group bg-white rounded-2xl overflow-hidden shadow-sm hover:shadow-xl transition-shadow duration-400"
|
||||
>
|
||||
{/* Görsel */}
|
||||
<div className="relative aspect-video overflow-hidden">
|
||||
<Image
|
||||
src={unit.imageUrl || 'https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=800'}
|
||||
alt={unit.typeTr}
|
||||
fill
|
||||
className="object-cover transition-transform duration-700 group-hover:scale-105"
|
||||
/>
|
||||
{/* Müsaitlik badge */}
|
||||
<div className={`absolute top-4 right-4 px-3 py-1 rounded-full text-xs font-medium ${
|
||||
unit.available
|
||||
? 'bg-vesta-forest text-white'
|
||||
: 'bg-gray-400 text-white'
|
||||
}`}>
|
||||
{unit.available ? t('available') : t('notAvailable')}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* İçerik */}
|
||||
<div className="p-6">
|
||||
<div className="flex items-start justify-between mb-3">
|
||||
<h3 className="text-vesta-dark text-xl font-serif font-medium">
|
||||
{unit.typeTr}
|
||||
</h3>
|
||||
<span className="text-vesta-earth text-2xl font-serif font-light">
|
||||
{unit.size} <span className="text-sm">{t('sqm')}</span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<p className="text-vesta-dark/60 text-sm leading-relaxed mb-5 line-clamp-2">
|
||||
{unit.descTr}
|
||||
</p>
|
||||
|
||||
{/* Özellikler */}
|
||||
<div className="flex items-center gap-5 pt-4 border-t border-gray-100">
|
||||
<div className="flex items-center gap-1.5 text-vesta-dark/50 text-sm">
|
||||
<BedDouble className="w-4 h-4" />
|
||||
<span>{unit.rooms} {t('rooms')}</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-1.5 text-vesta-dark/50 text-sm">
|
||||
<Bath className="w-4 h-4" />
|
||||
<span>{unit.bathrooms} {t('bath')}</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-1.5 text-vesta-dark/50 text-sm">
|
||||
<Maximize2 className="w-4 h-4" />
|
||||
<span>{unit.size} {t('sqm')}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Katalog CTA */}
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
animate={isInView ? { opacity: 1, y: 0 } : {}}
|
||||
transition={{ duration: 0.6, delay: 0.5 }}
|
||||
className="text-center mt-12"
|
||||
>
|
||||
<a
|
||||
href="https://indd.adobe.com/view/6b17e969-ae44-481c-861f-684806e8c3b2"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center gap-2 bg-vesta-dark text-white px-8 py-4 rounded-full text-sm tracking-wide hover:bg-vesta-forest transition-colors duration-300"
|
||||
>
|
||||
Proje Kataloğunu İncele
|
||||
</a>
|
||||
</motion.div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user