Innovations
heroes /

Soft Gradient Hero

Two-column hero on a warm cream-to-emerald gradient with subtle decorative blurs; eyebrow, gradient-text headline, two CTAs, image right. Perfect for coaches, wellness, advisors. Extracted from the Genius Coaching production hero.

Preview

Source

tsx
import { ArrowRight } from "lucide-react";

export interface GradientSoftHeroProps {
  eyebrow?: string;
  headline?: string;
  highlightedText?: string;
  subhead?: string;
  primaryCta?: { label: string; href: string };
  secondaryCta?: { label: string; href: string };
  imageSrc?: string;
  imageAlt?: string;
  socialProofText?: string;
  /** Default = Genius Coaching warm-white #FAFAFA */
  bgFromColor?: string;
  /** Default = soft-sage with low alpha for gradient end */
  bgToColor?: string;
  /** Default = rich-gold #C9A227 (eyebrow + gradient start) */
  accentColor?: string;
  /** Default = electric-teal #14B8A6 (gradient end) */
  secondaryAccentColor?: string;
  /** Default = charcoal #2D3748 (CTA bg + headline base) */
  ctaColor?: string;
}

export default function GradientSoftHero({
  eyebrow = "Neuroscience-Backed Transformation",
  headline = "Your Genius Is Already Here.",
  highlightedText = "Let's Remove What's Blocking It.",
  subhead = "For high-performers who've tried everything—discover the neuroscience of why you're stuck and the path to lasting freedom.",
  primaryCta = { label: "Discover Your Genius Type", href: "/quiz" },
  secondaryCta = { label: "Book a Clarity Call", href: "/contact" },
  imageSrc = "/heroes/geniuscoaching/3VQ-Image.webp",
  imageAlt = "Team collaboration and coaching success",
  socialProofText = "Join 2,000+ leaders who've discovered their genius type",
  bgFromColor = "#FAFAFA",
  bgToColor = "rgba(143, 169, 143, 0.10)",
  accentColor = "#C9A227",
  secondaryAccentColor = "#14B8A6",
  ctaColor = "#2D3748",
}: GradientSoftHeroProps) {
  return (
    <section className="relative min-h-screen flex items-center pt-20 pb-16 overflow-hidden">
      {/* Soft gradient background */}
      <div
        aria-hidden
        className="absolute inset-0"
        style={{ background: `linear-gradient(135deg, ${bgFromColor} 0%, ${bgFromColor} 40%, ${bgToColor} 100%)` }}
      />
      {/* Decorative blurs */}
      <div
        aria-hidden
        className="absolute top-1/4 right-0 w-96 h-96 rounded-full blur-3xl"
        style={{ background: accentColor, opacity: 0.06 }}
      />
      <div
        aria-hidden
        className="absolute bottom-0 left-0 w-80 h-80 rounded-full blur-3xl"
        style={{ background: secondaryAccentColor, opacity: 0.06 }}
      />

      <div className="relative mx-auto max-w-7xl w-full px-4 sm:px-6 lg:px-8">
        <div className="grid lg:grid-cols-2 gap-12 lg:gap-16 items-center">
          {/* Content */}
          <div>
            <p className="font-medium mb-4" style={{ color: accentColor }}>
              {eyebrow}
            </p>
            <h1
              className="text-4xl sm:text-5xl lg:text-6xl font-bold leading-tight mb-6"
              style={{ color: ctaColor }}
            >
              {headline}{" "}
              <span
                className="bg-clip-text text-transparent"
                style={{
                  backgroundImage: `linear-gradient(90deg, ${accentColor}, ${secondaryAccentColor})`,
                }}
              >
                {highlightedText}
              </span>
            </h1>
            <p
              className="text-lg md:text-xl mb-8 max-w-xl"
              style={{ color: ctaColor, opacity: 0.8 }}
            >
              {subhead}
            </p>
            <div className="flex flex-col sm:flex-row gap-4">
              <a
                href={primaryCta.href}
                className="group inline-flex items-center justify-center gap-2 rounded-lg px-7 py-3.5 text-white font-semibold transition-all hover:-translate-y-0.5"
                style={{ background: ctaColor }}
              >
                {primaryCta.label}
                <ArrowRight className="w-5 h-5 transition-transform group-hover:translate-x-1" />
              </a>
              <a
                href={secondaryCta.href}
                className="inline-flex items-center justify-center rounded-lg border-2 px-7 py-3.5 font-semibold transition-colors hover:bg-black/5"
                style={{ borderColor: ctaColor, color: ctaColor }}
              >
                {secondaryCta.label}
              </a>
            </div>
            <p className="mt-8 text-sm opacity-60" style={{ color: ctaColor }}>
              {socialProofText}
            </p>
          </div>
          {/* Hero image */}
          <div className="relative aspect-square rounded-2xl overflow-hidden shadow-2xl">
            <img
              src={imageSrc}
              alt={imageAlt}
              width={800}
              height={800}
              loading="eager"
              fetchPriority="high"
              decoding="async"
              className="w-full h-full object-cover"
            />
          </div>
        </div>
      </div>
    </section>
  );
}
Claude Code Instructions

CLI Install

npx innovations add gradient-soft

Where to use it

Use this for coaching, consulting, wellness, advisor, or any premium-feeling personal brand. In Astro: --- import GradientSoftHero from '../components/innovations/heroes/gradient-soft'; --- <GradientSoftHero /> In Next.js: import GradientSoftHero from '@/components/innovations/heroes/gradient-soft'; CUSTOMIZATION: All copy + image are exposed as props with sensible defaults. <GradientSoftHero eyebrow="Your Eyebrow" headline="Headline part one" highlightedText="part two with gradient" subhead="Subhead text" primaryCta={{ label: "CTA", href: "/start" }} secondaryCta={{ label: "Secondary", href: "/contact" }} imageSrc="/your-image.webp" socialProofText="Trusted by 2,000+" /> PALETTE: amber + emerald (warm-to-cool gradient). To rebrand: Swap "amber-600 to emerald-600" gradient for your brand colors Swap "amber-700" eyebrow for your accent Swap "amber-300/15" + "emerald-300/15" decorative blurs NOTE: framer-motion was dropped from the original implementation to keep this component zero-JS. If you want fade-in animations, wrap each child in a motion.div in your project.