clip / apps /frontend /src /components /FeaturesSection.tsx
Husr's picture
first commit
d988ae4
'use client';
type Feature = {
title: string;
description: string;
icon: JSX.Element;
color: string;
isSpecial?: boolean;
specialIcon?: JSX.Element;
};
const features: Feature[] = [
{
title: "Real-time Sync",
description: "Changes appear instantly across all connected devices",
color: "primary",
icon: (
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
)
},
{
title: "File Sharing",
description: "Upload and share files seamlessly across all connected devices",
color: "blue-500",
icon: (
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12" />
</svg>
)
},
{
title: "Password Protection",
description: "Add an extra layer of security with password-protected clipboards",
color: "purple-500",
icon: (
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 11c0 3.517-1.009 6.799-2.753 9.571m-3.44-2.04l.054-.09A13.916 13.916 0 008 11a4 4 0 118 0c0 1.017-.07 2.019-.203 3m-2.118 6.844A21.88 21.88 0 0015.171 17m3.839 1.132c.645-2.266.99-4.659.99-7.132A8 8 0 008 4.07M3 15.364c.64-1.319 1-2.8 1-4.364 0-1.457.39-2.823 1.07-4" />
</svg>
)
},
{
title: "No Login Required",
description: "Just create or join a clipboard with a 4-digit code",
color: "secondary",
icon: (
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
</svg>
)
},
{
title: "Persistent Storage",
description: "Clipboards stay available indefinitely without automatic expiration",
color: "accent",
icon: (
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
</svg>
)
},
{
title: "End-to-End Encrypted",
description: "Your clipboard data is fully encrypted and secure",
color: "emerald-500",
isSpecial: true,
icon: (
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
</svg>
),
specialIcon: (
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 text-emerald-500/30" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
</svg>
)
}
];
export default function FeaturesSection() {
return (
<div className="grid grid-cols-1 gap-6">
{/* Section Title */}
<div className="text-center mb-4">
<h2 className="text-2xl sm:text-3xl font-bold text-text-primary">Powerful Features</h2>
<p className="text-text-secondary mt-2 max-w-2xl mx-auto">Everything you need for seamless clipboard sharing</p>
</div>
{/* First four features in a 4-column grid */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
{features.slice(0, 4).map((feature, index) => (
<div
key={index}
className={`p-4 rounded-lg border border-surface-hover bg-surface/50 backdrop-blur-sm ${feature.isSpecial ? 'relative overflow-hidden group' : ''}`}
>
{feature.isSpecial && (
<div className="absolute -right-6 -top-6 w-12 h-12 bg-emerald-500/10 rounded-full group-hover:scale-150 transition-transform duration-500"></div>
)}
<div className={`w-10 h-10 bg-${feature.color}/10 rounded-full flex items-center justify-center mb-3 ${feature.isSpecial ? 'relative z-10' : ''}`}>
<span className={`text-${feature.color}`}>{feature.icon}</span>
</div>
<h3 className={`text-lg font-medium text-text-primary mb-1 ${feature.isSpecial ? 'relative z-10' : ''}`}>{feature.title}</h3>
<p className={`text-text-secondary text-sm ${feature.isSpecial ? 'relative z-10' : ''}`}>{feature.description}</p>
{feature.isSpecial && feature.specialIcon && (
<div className="absolute bottom-1 right-1">
{feature.specialIcon}
</div>
)}
</div>
))}
</div>
{/* Last two features centered in the middle */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 max-w-xl mx-auto w-full">
{features.slice(4).map((feature, index) => (
<div
key={index + 4}
className="p-4 rounded-lg border border-surface-hover bg-surface/50 backdrop-blur-sm"
>
<div className={`w-10 h-10 bg-${feature.color}/10 rounded-full flex items-center justify-center mb-3`}>
<span className={`text-${feature.color}`}>{feature.icon}</span>
</div>
<h3 className="text-lg font-medium text-text-primary mb-1">{feature.title}</h3>
<p className="text-text-secondary text-sm">{feature.description}</p>
</div>
))}
</div>
</div>
);
}