150 lines
5.6 KiB
TypeScript
150 lines
5.6 KiB
TypeScript
'use client';
|
|
|
|
import { useEffect, useRef, useState } from 'react';
|
|
import styles from './Features.module.css';
|
|
|
|
const features = [
|
|
{
|
|
icon: (
|
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
|
<path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
|
|
</svg>
|
|
),
|
|
title: 'Automatización inteligente',
|
|
description:
|
|
'Crea flujos de trabajo sin código. Conecta apps, dispara acciones y elimina tareas manuales con nuestra IA incorporada.',
|
|
tag: 'IA',
|
|
},
|
|
{
|
|
icon: (
|
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
|
<path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2M9 11a4 4 0 100-8 4 4 0 000 8zM23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
|
|
</svg>
|
|
),
|
|
title: 'Colaboración en tiempo real',
|
|
description:
|
|
'Tu equipo siempre sincronizado. Comenta, asigna tareas y sigue el progreso de cada proyecto en tiempo real.',
|
|
tag: 'Equipos',
|
|
},
|
|
{
|
|
icon: (
|
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
|
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
|
|
</svg>
|
|
),
|
|
title: 'Analíticas avanzadas',
|
|
description:
|
|
'Paneles personalizables con métricas de negocio en tiempo real. Toma decisiones basadas en datos, no en suposiciones.',
|
|
tag: 'Analytics',
|
|
},
|
|
{
|
|
icon: (
|
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
|
<rect x="3" y="11" width="18" height="11" rx="2" ry="2" stroke="currentColor" strokeWidth="2" />
|
|
<path d="M7 11V7a5 5 0 0110 0v4" stroke="currentColor" strokeWidth="2" strokeLinecap="round" />
|
|
</svg>
|
|
),
|
|
title: 'Seguridad enterprise',
|
|
description:
|
|
'Cifrado end-to-end, SSO, auditoría de accesos y cumplimiento SOC 2 Tipo II. Tu información, siempre protegida.',
|
|
tag: 'Seguridad',
|
|
},
|
|
{
|
|
icon: (
|
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
|
<circle cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="2" />
|
|
<path d="M2 12h20M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z" stroke="currentColor" strokeWidth="2" />
|
|
</svg>
|
|
),
|
|
title: '200+ integraciones',
|
|
description:
|
|
'Conecta con Slack, Notion, GitHub, Salesforce y más. FlowSync se adapta a tu stack, no al revés.',
|
|
tag: 'Integraciones',
|
|
},
|
|
{
|
|
icon: (
|
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
|
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
|
|
</svg>
|
|
),
|
|
title: 'Soporte 24/7',
|
|
description:
|
|
'Equipo de soporte dedicado disponible en cualquier zona horaria. Tiempo de respuesta promedio: menos de 2 minutos.',
|
|
tag: 'Soporte',
|
|
},
|
|
];
|
|
|
|
export default function Features() {
|
|
const sectionRef = useRef<HTMLElement>(null);
|
|
|
|
useEffect(() => {
|
|
const observer = new IntersectionObserver(
|
|
(entries) => {
|
|
entries.forEach((entry) => {
|
|
if (entry.isIntersecting) {
|
|
entry.target.classList.add(styles.visible);
|
|
}
|
|
});
|
|
},
|
|
{ threshold: 0.1 }
|
|
);
|
|
|
|
const elements = sectionRef.current?.querySelectorAll(`.${styles.reveal}`);
|
|
elements?.forEach((el) => observer.observe(el));
|
|
return () => observer.disconnect();
|
|
}, []);
|
|
|
|
return (
|
|
<section className={`section ${styles.features}`} id="features" ref={sectionRef} aria-labelledby="features-heading">
|
|
<div className="container">
|
|
{/* Header */}
|
|
<div className={`${styles.reveal} ${styles.header}`}>
|
|
<span className="badge badge-accent">Características</span>
|
|
<h2 id="features-heading" className={styles.title}>
|
|
Todo lo que necesitas,
|
|
<br />
|
|
<span className={styles.titleAccent}>nada que no necesitas</span>
|
|
</h2>
|
|
<p className={styles.subtitle}>
|
|
Diseñado para equipos que quieren mover rápido sin romper cosas.
|
|
Potente cuando lo necesitas, simple cuando no.
|
|
</p>
|
|
</div>
|
|
|
|
{/* Grid */}
|
|
<div className={styles.grid}>
|
|
{features.map((feature, i) => (
|
|
<article
|
|
key={feature.title}
|
|
className={`${styles.reveal} ${styles.card}`}
|
|
style={{ transitionDelay: `${i * 0.08}s` }}
|
|
aria-label={feature.title}
|
|
>
|
|
<div className={styles.cardIcon}>{feature.icon}</div>
|
|
<div className={styles.cardContent}>
|
|
<div className={styles.cardTag}>{feature.tag}</div>
|
|
<h3 className={styles.cardTitle}>{feature.title}</h3>
|
|
<p className={styles.cardDesc}>{feature.description}</p>
|
|
</div>
|
|
</article>
|
|
))}
|
|
</div>
|
|
|
|
{/* Bottom CTA */}
|
|
<div className={`${styles.reveal} ${styles.bottomCta}`}>
|
|
<p className={styles.ctaText}>
|
|
¿Listo para transformar cómo trabaja tu equipo?
|
|
</p>
|
|
<button
|
|
className="btn btn-primary btn-lg"
|
|
id="features-cta-btn"
|
|
onClick={() => document.querySelector('#contact')?.scrollIntoView({ behavior: 'smooth' })}
|
|
>
|
|
Ver todas las funciones
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
);
|
|
}
|