Retour au catalogue

CTA Banner

Bandeau CTA slim pleine largeur avec texte et bouton. Ideal pour promotions et annonces.

ctasimple Both Responsive a11y
boldminimaluniversalecommercesaasfullscreen
Theme
"use client";

import { motion } from "framer-motion";
import { ArrowRight, X } from "lucide-react";
import { useState } from "react";

interface CtaBannerProps {
  text?: string;
  ctaLabel?: string;
  ctaUrl?: string;
  dismissible?: boolean;
}

export default function CtaBanner({
  text = "Offre speciale : -20% sur tous nos services ce mois-ci",
  ctaLabel = "En profiter",
  ctaUrl = "#offer",
  dismissible = true,
}: CtaBannerProps) {
  const [visible, setVisible] = useState(true);

  if (!visible) return null;

  return (
    <motion.section
      initial={{ opacity: 0, y: -8 }}
      animate={{ opacity: 1, y: 0 }}
      exit={{ opacity: 0, y: -8 }}
      transition={{ duration: 0.35, ease: [0.16, 1, 0.3, 1] }}
      className="relative w-full"
      style={{
        background: "var(--color-accent)",
        paddingTop: "0.75rem",
        paddingBottom: "0.75rem",
      }}
    >
      <div
        className="mx-auto flex items-center justify-center gap-4 flex-wrap"
        style={{
          maxWidth: "var(--container-max-width)",
          paddingLeft: "var(--container-padding-x)",
          paddingRight: "var(--container-padding-x)",
        }}
      >
        <p
          className="text-sm font-medium"
          style={{ color: "var(--color-foreground)" }}
        >
          {text}
        </p>

        <a
          href={ctaUrl}
          className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-full text-xs font-semibold transition-transform hover:scale-105"
          style={{
            background: "var(--color-foreground)",
            color: "var(--color-accent)",
            textDecoration: "none",
          }}
        >
          {ctaLabel}
          <ArrowRight className="h-3 w-3" />
        </a>

        {dismissible && (
          <button
            onClick={() => setVisible(false)}
            className="absolute right-4 top-1/2 -translate-y-1/2 p-1 rounded-full opacity-60 hover:opacity-100 transition-opacity"
            style={{ color: "var(--color-foreground)" }}
            aria-label="Fermer"
          >
            <X className="h-4 w-4" />
          </button>
        )}
      </div>
    </motion.section>
  );
}

Avis

CTA Banner — React Cta Section — Incubator