Skip to main content

Landing Page Components

The landing module provides high-converting marketing components designed specifically for RespondeIA’s WhatsApp AI automation platform.

Components Overview

Hero

Eye-catching hero section with CTA buttons and social proof

Features

Grid showcase of product features with icons

Testimonials

Customer success stories with ratings

FAQ

Collapsible frequently asked questions

Hero

The hero section is the first thing visitors see - featuring a compelling headline, value proposition, CTAs, and key metrics.

Usage

modules/landing/screens/LandingScreen.tsx
import { Hero } from "../components";

export const LandingScreen = () => {
  return (
    <main className="min-h-screen bg-white">
      <Hero />
      {/* Other sections */}
    </main>
  );
};

Features

  • Animated Badge: New feature announcement with pulsing indicator
  • Gradient Headline: Large, bold headline with blue gradient on key phrase
  • Dual CTAs: Primary (“Comenzar prueba gratuita”) and secondary (“Ver demostración”) buttons
  • Trust Indicators: “7 días gratis · Sin tarjeta · Cancelación en cualquier momento”
  • Social Proof Metrics: 4 key stats (2,400+ empresas, 98% satisfacción, etc.)
  • Background Pattern: Subtle dot matrix pattern for visual interest
  • Staggered Animations: Each element reveals with <Reveal> component

Component Structure

modules/landing/components/Hero.tsx
<section className="relative overflow-hidden pt-16 pb-20 md:pt-24 md:pb-32"
  style={{ background: "linear-gradient(180deg, #f0f6ff 0%, #ffffff 55%)" }}>
  
  {/* Dot pattern background */}
  <div className="absolute inset-0 z-0 opacity-[0.4]"
    style={{
      backgroundImage: "radial-gradient(#cbd5e1 1px, transparent 1px)",
      backgroundSize: "24px 24px",
    }}
  />

  <div className="container relative z-10 mx-auto px-4 text-center">
    {/* Badge */}
    <Reveal delay={100}>
      <div className="mb-8 flex justify-center">
        <div className="inline-flex items-center gap-2 rounded-full border border-blue-100 bg-white/80 px-4 py-1.5">
          <span className="flex h-2 w-2 rounded-full bg-blue-600 animate-pulse" />
          <span className="text-[13px] font-semibold text-blue-700">
            Nuevo: Integración con MercadoPago
          </span>
        </div>
      </div>
    </Reveal>

    {/* Headline */}
    <Reveal delay={300}>
      <h1 className="mx-auto mb-6 max-w-4xl text-[40px] font-black leading-[1.1] tracking-tighter text-zinc-900 md:text-[64px]">
        Automatizá la atención al cliente en WhatsApp con{" "}
        <span className="bg-gradient-to-r from-[#2563eb] via-[#3b82f6] to-[#60a5fa] bg-clip-text text-transparent">
          inteligencia artificial
        </span>
      </h1>
    </Reveal>

    {/* Subtitle */}
    <Reveal delay={500}>
      <p className="mx-auto mb-10 max-w-2xl text-[16px] leading-relaxed text-zinc-500 md:text-[18px]">
        Respondé consultas, agendá turnos y cerrá ventas automáticamente. Sin código, sin fricción —{" "}
        <span className="text-zinc-800 font-medium">activo en menos de 10 minutos.</span>
      </p>
    </Reveal>

    {/* CTAs */}
    <Reveal delay={700}>
      <div className="mb-12 flex flex-col items-center justify-center gap-4 sm:flex-row">
        <Button className="h-14 w-full rounded-2xl bg-[#2563eb] px-10 text-[16px] font-bold" asChild>
          <Link href={ROUTES.AUTH.REGISTER}>Comenzar prueba gratuita</Link>
        </Button>
        <Button variant="outline" className="h-14 w-full rounded-2xl" asChild>
          <Link href="/quickstart">Ver demostración</Link>
        </Button>
      </div>
      <div className="text-[14px] font-medium text-zinc-400">
        7 días gratis · Sin tarjeta de crédito · Cancelación en cualquier momento
      </div>
    </Reveal>

    {/* Statistics */}
    <div className="mt-20 grid grid-cols-2 gap-8 border-t border-zinc-100 pt-16 md:grid-cols-4">
      {stats.map((stat, i) => (
        <Reveal key={i} delay={900 + i * 100}>
          <div className="flex flex-col gap-1">
            <span className="text-3xl font-black text-zinc-900">{stat.label}</span>
            <span className="text-[13px] font-medium text-zinc-400">{stat.sub}</span>
          </div>
        </Reveal>
      ))}
    </div>
  </div>
</section>

Animation Delays

The Hero uses cascading reveals for a polished entrance:
  • Badge: 100ms delay
  • Headline: 300ms delay
  • Subtitle: 500ms delay
  • CTAs: 700ms delay
  • Stat 1: 900ms delay
  • Stat 2: 1000ms delay
  • Stat 3: 1100ms delay
  • Stat 4: 1200ms delay

Social Proof Data

const stats = [
  { label: "2.400+", sub: "empresas activas" },
  { label: "98%", sub: "satisfacción" },
  { label: "8 min", sub: "tiempo de setup" },
  { label: "1.4s", sub: "respuesta promedio" },
];

Features

A 3-column grid showcasing the platform’s core capabilities with icons and descriptions.

Usage

import { Features } from "../components";

<Features />;

Features Data

The component displays 6 features from a static array:
modules/landing/components/Features.tsx
const features = [
  {
    title: "IA conversacional",
    description: "Respuestas naturales entrenadas con la información de tu negocio.",
    icon: "💬",
  },
  {
    title: "Agenda automática",
    description: "El asistente gestiona turnos y citas directamente en la conversación.",
    icon: "📅",
  },
  {
    title: "CRM integrado",
    description: "Registro centralizado de contactos con historial completo.",
    icon: "👥",
  },
  {
    title: "Analytics en tiempo real",
    description: "Tasa de resolución y satisfacción en un solo panel.",
    icon: "📊",
  },
  {
    title: "Traspaso controlado",
    description: "Cuando la consulta requiere atención humana, el sistema transfiere con contexto.",
    icon: "🔄",
  },
  {
    title: "Respuesta inmediata",
    description: "Menos de dos segundos de latencia promedio, disponible 24/7.",
    icon: "⚡",
  },
];

Component Structure

<section className="py-20 bg-white">
  <div className="container mx-auto px-4 max-w-4xl">
    {/* Section Header */}
    <div className="flex items-center gap-2 mb-4">
      <div className="h-px w-8 bg-blue-600" />
      <span className="text-[12px] font-bold tracking-widest text-blue-600 uppercase">
        Funcionalidades
      </span>
    </div>
    <h2 className="mb-4">Todo lo que necesita tu operación</h2>
    <p className="mb-12 max-w-xl text-zinc-500">
      Una plataforma diseñada para escalar sin agregar personal.
    </p>

    {/* Grid */}
    <div className="grid grid-cols-1 md:grid-cols-3 gap-6">
      {features.map((f, i) => (
        <Reveal key={i} delay={(i % 3) * 100}>
          <div className="rounded-[40px] border border-zinc-100 p-8 shadow-sm">
            <div className="mb-4 flex h-12 w-12 items-center justify-center rounded-xl bg-blue-50 text-xl">
              {f.icon}
            </div>
            <h3 className="text-lg mb-2">{f.title}</h3>
            <p className="text-zinc-500 text-[0.95rem] leading-relaxed">{f.description}</p>
          </div>
        </Reveal>
      ))}
    </div>
  </div>
</section>

Visual Design

  • Card Styling: Large border radius (rounded-[40px]) for modern look
  • Icon Container: Blue background (bg-blue-50) with 12x12 size
  • Typography: text-lg for title, text-[0.95rem] for description
  • Grid Layout: 3 columns on desktop, single column on mobile
  • Row Animation: Features in each row animate with 100ms stagger

Testimonials

Customer testimonials displayed in a 3-column grid with ratings, quotes, and author information.

Usage

import { Testimonials } from "../components";

<Testimonials />;

Testimonials Data

modules/landing/components/Testimonials.tsx
const testimonials = [
  {
    quote: "Redujimos el 80% de los mensajes repetitivos. El equipo ahora se enfoca en tareas de mayor valor. El retorno fue evidente en el primer mes.",
    author: "María García",
    role: "Directora — Clínica Dental Norte",
    initials: "MG",
  },
  {
    quote: "En tres días el bot ya estaba respondiendo. Las reservas online subieron un 40% el primer mes sin ningún esfuerzo adicional del equipo.",
    author: "Juan Rodríguez",
    role: "Propietario — Restaurante El Molino",
    initials: "JR",
  },
  {
    quote: "Atendemos clientes a las 3am sin personal adicional. Calculamos que recuperamos la inversión en las primeras dos semanas de uso.",
    author: "Laura Pérez",
    role: "Socia — Inmobiliaria Palermo",
    initials: "LP",
  },
];

Component Structure

<section className="py-20 bg-white">
  <div className="container mx-auto px-4">
    {/* Header */}
    <div className="flex items-center gap-2 mb-4">
      <div className="h-px w-8 bg-blue-600" />
      <span className="text-[12px] font-bold tracking-widest text-blue-600 uppercase">
        Casos de Uso
      </span>
    </div>
    <h2 className="mb-12">Resultados comprobados</h2>

    {/* Grid */}
    <div className="grid grid-cols-1 md:grid-cols-3 gap-6">
      {testimonials.map((t, i) => (
        <Reveal key={i} delay={i * 100}>
          <div className="flex flex-col rounded-[40px] border border-zinc-100 p-10 shadow-sm">
            {/* 5-star rating */}
            <div className="flex gap-1 mb-6">
              {[...Array(5)].map((_, i) => (
                <span key={i} className="text-orange-400 text-sm"></span>
              ))}
            </div>

            {/* Quote */}
            <p className="text-[1.1rem] italic text-zinc-700 leading-relaxed mb-8">
              "{t.quote}"
            </p>

            {/* Author */}
            <div className="flex items-center gap-4">
              <div className="h-12 w-12 rounded-full bg-[#0f172a] flex items-center justify-center text-white font-bold text-sm">
                {t.initials}
              </div>
              <div>
                <h4 className="font-bold text-zinc-900">{t.author}</h4>
                <p className="text-sm text-zinc-400">{t.role}</p>
              </div>
            </div>
          </div>
        </Reveal>
      ))}
    </div>
  </div>
</section>

Card Elements

Rating Stars
element
5 orange stars () displayed at top of each card
Quote
string
Italic text in text-[1.1rem] size with relaxed leading
Avatar
element
Dark circle (bg-[#0f172a]) with white initials
Author Name
string
Bold text showing customer name
Role
string
Muted text showing title and company

FAQ

Collapsible accordion of frequently asked questions using shadcn/ui Accordion component.

Usage

import { Faq } from "../components";

<Faq />;

FAQ Data

modules/landing/components/Faq.tsx
const faqs = [
  {
    value: "tech",
    q: "¿Se requiere conocimiento técnico?",
    a: "No. Todo se configura desde un panel visual guiado. No es necesario escribir código ni contar con un equipo de IT.",
  },
  {
    value: "whatsapp",
    q: "¿Puedo usar mi número de WhatsApp actual?",
    a: "Sí. Podés migrar tu número existente a la API oficial de Meta. El proceso es guiado y tarda menos de diez minutos.",
  },
  {
    value: "time",
    q: "¿Quanto tiempo lleva la configuración inicial?",
    a: "El promedio de nuestros clientes es de 8 minutos desde el registro hasta el bot activo respondiendo mensajes.",
  },
  {
    value: "commitment",
    q: "¿Hay compromiso de permanencia?",
    a: "No. La suscripción se puede cancelar en cualquier momento desde el panel, sin cargos adicionales ni gestiones externas.",
  },
];

Component Structure

<section className="pt-10 bg-white pb-1">
  <div className="container mx-auto px-4 max-w-3xl">
    {/* Header */}
    <Reveal>
      <div className="flex items-center gap-2 mb-4">
        <div className="h-px w-8 bg-blue-600" />
        <span className="text-[12px] font-bold tracking-widest text-blue-600 uppercase">
          Preguntas Frecuentes
        </span>
      </div>
      <h2 className="mb-12">Antes de empezar</h2>
    </Reveal>

    {/* Accordion */}
    <Accordion type="single" collapsible className="w-full space-y-2">
      {faqs.map((faq, i) => (
        <Reveal key={faq.value} delay={i * 100}>
          <AccordionItem value={faq.value} className="border-b border-zinc-100 py-2">
            <AccordionTrigger className="hover:no-underline group">
              <h4 className="text-left text-[17px] font-bold text-zinc-900 group-hover:text-blue-600 transition-colors">
                {faq.q}
              </h4>
            </AccordionTrigger>
            <AccordionContent>
              <p className="text-zinc-500 leading-relaxed max-w-2xl pt-2">
                {faq.a}
              </p>
            </AccordionContent>
          </AccordionItem>
        </Reveal>
      ))}
    </Accordion>
  </div>
</section>

Accordion Props

type
'single' | 'multiple'
default:"single"
Controls whether multiple items can be open simultaneously. Set to "single" for exclusive expansion.
collapsible
boolean
default:"false"
When true, allows the open item to be collapsed.

Styling Details

  • Question Hover: Blue text on hover with smooth transition
  • Answer Text: Muted zinc-500 color with relaxed line height
  • Border: Subtle zinc-100 bottom border between items
  • Max Width: max-w-3xl container for optimal reading width

Complete Landing Page Example

modules/landing/screens/LandingScreen.tsx
import {
  Faq,
  Features,
  FinalCTA,
  Hero,
  Methodology,
  Testimonials,
} from "../components";

export const LandingScreen = () => {
  return (
    <main className="min-h-screen bg-white">
      <Hero />
      <Methodology />
      <Features />
      <Testimonials />
      <Faq />
      <FinalCTA />
    </main>
  );
};

Animation System

All landing components use the <Reveal> animation wrapper from /components/animations/Reveal.tsx:3.

Usage Pattern

import { Reveal } from "@/components/animations/Reveal";

<Reveal delay={300}>
  <div>{/* Content to animate */}</div>
</Reveal>

Animation Strategy

Cascading Delays: Each element has increasing delay (100ms, 300ms, 500ms, etc.) for dramatic entrance

Customization Guide

Modify the stats array in Hero.tsx to show different metrics:
const stats = [
  { label: "5,000+", sub: "empresas activas" },
  { label: "99.5%", sub: "uptime" },
  // ...
];
Extend the features array - the grid automatically adapts:
const features = [
  // existing features...
  {
    title: "Nueva funcionalidad",
    description: "Descripción de la característica",
    icon: "🚀",
  },
];
Swap emoji icons for Lucide React icons:
import { MessageSquare, Calendar, Users } from "lucide-react";

const features = [
  { title: "IA conversacional", icon: MessageSquare, ... },
  { title: "Agenda automática", icon: Calendar, ... },
  // ...
];

// In render:
<IconComponent className="h-6 w-6" />
Replace static data with API call:
const { data: testimonials } = useQuery({
  queryKey: ['testimonials'],
  queryFn: fetchTestimonials,
});

Best Practices

Animation Performance: The Reveal component likely uses IntersectionObserver for scroll-triggered animations. Keep delay values reasonable (< 1000ms) to avoid perceived lag.
Content Strategy: The landing page uses specific psychological triggers:
  • Hero: Social proof + urgency (“7 días gratis”)
  • Features: Solution-focused benefits
  • Testimonials: Specific results (“80% reduction”, “40% increase”)
  • FAQ: Addressing common objections
Mobile Responsiveness: All grids collapse to single column on mobile. Test CTAs are easily tappable (min 44x44px touch targets).

Reveal Animation

Scroll-triggered animation wrapper component

shadcn/ui Accordion

Collapsible accordion component API

ROUTES Config

Application routing constants

Landing Screen

Complete landing page composition

Build docs developers (and LLMs) love