Retour au catalogue

Header Banner

En-tete plein ecran avec image de fond, overlay degrade et texte centre.

headersimple Dark Responsive a11y
boldelegantrestauranteventreal-estateuniversalfullscreen
Theme
"use client";

import { motion } from "framer-motion";

interface HeaderBannerProps {
  title?: string;
  subtitle?: string;
  backgroundImage?: string;
  overlayOpacity?: number;
}

const ease: [number, number, number, number] = [0.16, 1, 0.3, 1];

export default function HeaderBanner({
  title = "Titre de la page",
  subtitle = "",
  backgroundImage = "",
  overlayOpacity = 0.6,
}: HeaderBannerProps) {
  return (
    <section
      className="relative py-24 lg:py-32 overflow-hidden"
      style={{ background: "var(--color-background-dark)" }}
    >
      {backgroundImage && (
        <div
          className="absolute inset-0 bg-cover bg-center"
          style={{ backgroundImage: `url(${backgroundImage})` }}
        >
          <div
            className="absolute inset-0"
            style={{
              background: `var(--color-background-dark)`,
              opacity: overlayOpacity,
            }}
          />
        </div>
      )}

      <div className="relative mx-auto max-w-4xl px-6 text-center">
        <motion.h1
          initial={{ opacity: 0, y: 20 }}
          animate={{ opacity: 1, y: 0 }}
          transition={{ duration: 0.7, ease }}
          className="text-3xl md:text-5xl lg:text-6xl font-bold tracking-tight"
          style={{ color: "var(--color-foreground-on-dark)" }}
        >
          {title}
        </motion.h1>

        {subtitle && (
          <motion.p
            initial={{ opacity: 0, y: 16 }}
            animate={{ opacity: 1, y: 0 }}
            transition={{ duration: 0.6, ease, delay: 0.15 }}
            className="mt-5 text-base lg:text-lg max-w-2xl mx-auto leading-relaxed"
            style={{ color: "var(--color-foreground-on-dark)", opacity: 0.8 }}
          >
            {subtitle}
          </motion.p>
        )}
      </div>

      <motion.div
        initial={{ opacity: 0 }}
        animate={{ opacity: 1 }}
        transition={{ duration: 1, delay: 0.4 }}
        className="absolute bottom-0 left-0 right-0 h-24"
        style={{
          background: `linear-gradient(to top, var(--color-background), transparent)`,
        }}
      />
    </section>
  );
}

Avis

Header Banner — React Header Section — Incubator