Retour au catalogue
Security Features
Features securite en grid avec icones (Shield, Lock, etc.) et descriptions. Format card avec icone a gauche.
securitysimple Both Responsive a11y
corporateminimalsaasuniversalgrid
Theme
"use client";
import { motion } from "framer-motion";
import { Shield, Lock, Eye, Key, Server, RefreshCw } from "lucide-react";
import type { LucideIcon } from "lucide-react";
interface SecurityFeature {
icon?: string;
title: string;
description: string;
}
interface SecurityFeaturesProps {
title?: string;
description?: string;
features?: SecurityFeature[];
}
const EASE = [0.16, 1, 0.3, 1] as const;
const iconMap: Record<string, LucideIcon> = {
shield: Shield,
lock: Lock,
eye: Eye,
key: Key,
server: Server,
refresh: RefreshCw,
};
export default function SecurityFeatures({
title = "Securite renforcee",
description = "Des couches de protection a chaque niveau",
features = [],
}: SecurityFeaturesProps) {
return (
<section
style={{
padding: "var(--section-padding-y) 0",
background: "var(--color-background)",
}}
>
<div
style={{
maxWidth: "var(--container-max-width)",
margin: "0 auto",
padding: "0 var(--container-padding-x)",
}}
>
<motion.div
initial={{ opacity: 0, y: 16 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, ease: EASE }}
style={{ textAlign: "center", marginBottom: "3rem" }}
>
<h2
style={{
fontFamily: "var(--font-sans)",
fontSize: "clamp(1.75rem, 3.5vw, 2.75rem)",
fontWeight: 700,
color: "var(--color-foreground)",
marginBottom: "0.75rem",
}}
>
{title}
</h2>
<p style={{ fontSize: "1.0625rem", color: "var(--color-foreground-muted)", maxWidth: "520px", margin: "0 auto" }}>
{description}
</p>
</motion.div>
<div
style={{
display: "grid",
gridTemplateColumns: "repeat(auto-fit, minmax(280px, 1fr))",
gap: "1.25rem",
}}
>
{features.map((feat, i) => {
const Icon = feat.icon ? iconMap[feat.icon] ?? Shield : Shield;
return (
<motion.div
key={i}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.45, delay: i * 0.06, ease: EASE }}
style={{
padding: "1.5rem",
borderRadius: "var(--radius-lg)",
background: "var(--color-background-alt)",
border: "1px solid var(--color-border)",
display: "flex",
gap: "1rem",
alignItems: "flex-start",
}}
>
<div
style={{
width: 40,
height: 40,
borderRadius: "var(--radius-md)",
background: "var(--color-accent-subtle)",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
}}
>
<Icon style={{ width: 20, height: 20, color: "var(--color-accent)" }} />
</div>
<div>
<h3
style={{
fontFamily: "var(--font-sans)",
fontSize: "1rem",
fontWeight: 600,
color: "var(--color-foreground)",
marginBottom: "0.375rem",
}}
>
{feat.title}
</h3>
<p style={{ fontSize: "0.875rem", color: "var(--color-foreground-muted)", lineHeight: 1.6 }}>
{feat.description}
</p>
</div>
</motion.div>
);
})}
</div>
</div>
</section>
);
}