73 lines
4.3 KiB
JavaScript
73 lines
4.3 KiB
JavaScript
import React, { useState } from 'react';
|
|
import { motion } from 'framer-motion';
|
|
import { Wand2, Download, Star } from 'lucide-react';
|
|
import { Button } from './ui/Button';
|
|
|
|
export const Gallery = ({ items, title = "Most Popular Printables", onRestore }) => {
|
|
return (
|
|
<section className="py-12">
|
|
<div className="flex items-center gap-2 mb-8">
|
|
<h2 className="text-2xl font-bold text-slate-900">{title}</h2>
|
|
<Star className="text-yellow-400 fill-yellow-400" size={24} />
|
|
</div>
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
{items.map((item, index) => (
|
|
<motion.div
|
|
key={item.id}
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ delay: index * 0.1 }}
|
|
className="group bg-white rounded-3xl border-2 border-slate-100 overflow-hidden hover:border-primary-200 hover:shadow-xl hover:shadow-primary-100/50 transition-all duration-300"
|
|
>
|
|
<div className={`aspect-[3/4] p-6 flex flex-col items-center justify-center relative ${item.bgColor}`}>
|
|
{item.sections && item.sections.length > 0 && item.sections[0].content_svg ? (
|
|
<div className="w-full h-full bg-white rounded-xl shadow-sm border border-black/5 overflow-hidden relative">
|
|
<div
|
|
className="w-full h-full transform scale-90 origin-center"
|
|
dangerouslySetInnerHTML={{ __html: item.sections[0].content_svg }}
|
|
/>
|
|
{/* Overlay to prevent interaction with SVG parts */}
|
|
<div className="absolute inset-0 z-10"></div>
|
|
</div>
|
|
) : (
|
|
<div className="w-full h-full bg-white rounded-xl shadow-sm border border-black/5 flex flex-col items-center justify-center p-4 text-center">
|
|
{item.image ? (
|
|
<img src={item.image} alt={item.title} className="w-full h-full object-cover rounded-lg" />
|
|
) : (
|
|
<>
|
|
<h3 className="font-bold text-lg mb-2">{item.title}</h3>
|
|
<p className="text-sm text-slate-500 mb-4">{item.subtitle}</p>
|
|
<div className="text-4xl font-mono opacity-20">123</div>
|
|
</>
|
|
)}
|
|
</div>
|
|
)}
|
|
|
|
<div className="absolute inset-0 bg-black/0 group-hover:bg-black/5 transition-colors flex items-center justify-center opacity-0 group-hover:opacity-100 z-20">
|
|
<Button
|
|
className="shadow-xl"
|
|
onClick={() => onRestore && onRestore(item)}
|
|
>
|
|
<Wand2 className="mr-2" size={18} />
|
|
{onRestore ? "Open in Editor" : "View Sheet"}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="p-5">
|
|
<h3 className="font-bold text-lg text-slate-900 mb-1">{item.title}</h3>
|
|
<div className="flex items-center justify-between text-sm text-slate-500">
|
|
<span className="bg-slate-100 px-2 py-1 rounded-md font-medium text-slate-600">Age {item.age}</span>
|
|
<span className="flex items-center gap-1">
|
|
<Download size={14} /> {item.downloads} downloads
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</motion.div>
|
|
))}
|
|
</div>
|
|
</section>
|
|
);
|
|
};
|