Innovations
heroes /

Expert with Floating Quotes

Two-column hero with eyebrow + bullet list + CTA + avatar-stack social proof on the left, hero image with 4 floating testimonial bubbles on the right. Perfect for coaches, speakers, experts. Extracted from the Laurie Mabelis production hero.

Preview

Source

tsx
import { ArrowRight, Check, Star } from "lucide-react";

export interface ExpertFloatingQuote {
  /** Inner HTML allowed for <strong> emphasis. */
  quote: string;
  author: string;
  /** If avatarSrc is missing, avatarFallback (e.g. "$40K") fills the circle. */
  avatarSrc?: string;
  avatarFallback?: string;
  /** Where the bubble docks against the image. */
  position:
    | "top-left"
    | "top-right"
    | "mid-left"
    | "mid-right"
    | "bottom-left"
    | "bottom-right";
}

export interface ExpertFloatingQuotesProps {
  eyebrow?: string;
  headline?: string;
  highlightedText?: string;
  tagline?: string;
  description?: string;
  bullets?: string[];
  primaryCta?: { label: string; href: string };
  socialProof?: string;
  avatarStack?: { src: string; alt: string }[];
  imageSrc?: string;
  imageAlt?: string;
  floatingQuotes?: ExpertFloatingQuote[];
  /** Default = Laurie Mabelis brand-light-bg #F3F8FB */
  bgColor?: string;
  /** Default = brand-orange #FF6C00 */
  accentColor?: string;
  /** Default = brand-cta #FF6240 (gradient end) */
  accentGradientEnd?: string;
  /** Default = brand-orange-dark #E55F00 (CTA hover) */
  accentDark?: string;
  /** Default = brand-navy #000321 (headline + bullets) */
  navyColor?: string;
  /** Default = brand-body-text #607179 (description + bubble subline) */
  bodyColor?: string;
}

const positionClasses: Record<ExpertFloatingQuote["position"], string> = {
  "top-left": "top-4 -left-4",
  "top-right": "top-4 -right-4",
  "mid-left": "top-[50%] -left-4",
  "mid-right": "top-[25%] -right-4",
  "bottom-left": "bottom-4 -left-4",
  "bottom-right": "top-[75%] -right-4",
};

const defaultAvatarStack = [
  { src: "https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=100&h=100&fit=crop&crop=face", alt: "" },
  { src: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop&crop=face", alt: "" },
  { src: "https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=100&h=100&fit=crop&crop=face", alt: "" },
  { src: "https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop&crop=face", alt: "" },
];

const defaultFloatingQuotes: ExpertFloatingQuote[] = [
  {
    quote: 'She is <strong>epically good.</strong>',
    author: "Joost de Bruin",
    avatarSrc: "https://images.leadconnectorhq.com/image/f_webp/q_80/r_1200/u_https://assets.cdn.filesafe.space/MIlJgDYFMB8RoNmvPXpT/media/6739da62732b00b40631c80f.png",
    position: "top-left",
  },
  {
    quote: '<strong>THE Speaking Expert</strong>',
    author: "Peter John Mather",
    avatarSrc: "https://images.leadconnectorhq.com/image/f_webp/q_80/r_1200/u_https://assets.cdn.filesafe.space/MIlJgDYFMB8RoNmvPXpT/media/6739da44732b000f0531c801.png",
    position: "mid-right",
  },
  {
    quote: '<strong>She is just magical.</strong>',
    author: "Noel Rippe",
    avatarSrc: "https://images.leadconnectorhq.com/image/f_webp/q_80/r_1200/u_https://assets.cdn.filesafe.space/MIlJgDYFMB8RoNmvPXpT/media/6739da51f5dd35c6337ecce0.jpeg",
    position: "mid-left",
  },
  {
    quote: '<strong>Landed a deal</strong> in 3 weeks!',
    author: "Richie Acosta",
    avatarFallback: "$40K",
    position: "bottom-right",
  },
];

export default function ExpertFloatingQuotesHero({
  eyebrow = "For Entrepreneurs, Coaches & Experts",
  headline = "Grow Your Profits Massively by Radically Improving Your",
  highlightedText = "Speaking Skills",
  tagline = "Even if you're an introvert who's never given a keynote",
  description = "I help entrepreneurs craft a signature talk, land their first (or next) paid speaking gig, and become the obvious expert in their industry.",
  bullets = [
    "TEDx-ready keynote in 8 weeks",
    "Clients who come to YOU",
    "Speaking fees from €500 to €10,000+",
  ],
  primaryCta = { label: "BOOK FREE STRATEGY CALL", href: "#contact" },
  socialProof = "Trusted by Impact Makers Worldwide",
  avatarStack = defaultAvatarStack,
  imageSrc = "https://images.leadconnectorhq.com/image/f_webp/q_80/r_1200/u_https://assets.cdn.filesafe.space/MIlJgDYFMB8RoNmvPXpT/media/6739d4ba21b02d559cd3559f.jpeg",
  imageAlt = "Laurie Mabelis on stage with Nick Santonastasso",
  floatingQuotes = defaultFloatingQuotes,
  bgColor = "#F3F8FB",
  accentColor = "#FF6C00",
  accentGradientEnd = "#FF6240",
  accentDark = "#E55F00",
  navyColor = "#000321",
  bodyColor = "#607179",
}: ExpertFloatingQuotesProps) {
  return (
    <section
      className="relative min-h-screen flex items-center overflow-hidden"
      style={{ background: bgColor }}
    >
      <div className="mx-auto max-w-7xl w-full px-4 sm:px-6 lg:px-8 py-12 md:py-20">
        <div className="grid lg:grid-cols-2 gap-12 items-center">
          {/* Left: copy + bullets + CTA + social proof */}
          <div className="space-y-6">
            <p
              className="font-semibold tracking-wider uppercase text-sm"
              style={{ color: accentColor }}
            >
              {eyebrow}
            </p>
            <h1
              className="font-black text-4xl md:text-5xl lg:text-6xl leading-tight"
              style={{ color: navyColor }}
            >
              {headline}{" "}
              <span
                className="bg-clip-text text-transparent"
                style={{
                  backgroundImage: `linear-gradient(135deg, ${accentColor} 0%, ${accentGradientEnd} 100%)`,
                }}
              >
                {highlightedText}
              </span>
            </h1>
            <p className="text-xl md:text-2xl font-medium" style={{ color: navyColor }}>
              {tagline}
            </p>
            <p className="text-lg leading-relaxed max-w-xl" style={{ color: bodyColor }}>
              {description}
            </p>
            <div className="flex flex-col gap-2 font-medium" style={{ color: navyColor }}>
              {bullets.map((b) => (
                <div key={b} className="flex items-center gap-2">
                  <Check className="w-5 h-5 flex-shrink-0" style={{ color: accentColor }} />
                  <span>{b}</span>
                </div>
              ))}
            </div>
            <div className="pt-4">
              <a
                href={primaryCta.href}
                className="inline-flex items-center gap-2 rounded-lg px-8 py-4 text-white font-bold text-lg transition-all hover:-translate-y-0.5"
                style={{
                  background: `linear-gradient(135deg, ${accentColor} 0%, ${accentDark} 100%)`,
                  boxShadow: `0 4px 20px ${accentColor}66`,
                }}
              >
                {primaryCta.label}
                <ArrowRight className="w-5 h-5" />
              </a>
            </div>
            <div className="flex items-center gap-4 pt-6">
              {avatarStack.length > 0 && (
                <div className="flex -space-x-3">
                  {avatarStack.map((a, i) => (
                    <img
                      key={i}
                      src={a.src}
                      alt={a.alt}
                      width={40}
                      height={40}
                      className="w-10 h-10 rounded-full border-2 border-white object-cover"
                    />
                  ))}
                </div>
              )}
              <div className="flex items-center gap-2">
                <Star className="w-5 h-5 text-yellow-400 fill-yellow-400" />
                <span className="font-medium" style={{ color: bodyColor }}>{socialProof}</span>
              </div>
            </div>
          </div>

          {/* Right: hero image with floating quote bubbles */}
          <div className="relative">
            <div className="relative rounded-2xl overflow-hidden shadow-2xl">
              <img
                src={imageSrc}
                alt={imageAlt}
                width={900}
                height={1100}
                loading="eager"
                fetchPriority="high"
                decoding="async"
                className="w-full h-auto object-cover"
              />
            </div>
            <div className="hidden md:block">
              {floatingQuotes.map((q, i) => (
                <div
                  key={i}
                  className={`absolute ${positionClasses[q.position]} bg-white rounded-xl shadow-xl p-3 w-[220px]`}
                >
                  <div className="flex items-start gap-2">
                    {q.avatarSrc ? (
                      <img
                        src={q.avatarSrc}
                        alt={q.author}
                        width={40}
                        height={40}
                        className="w-10 h-10 rounded-full object-cover flex-shrink-0"
                      />
                    ) : (
                      <div
                        className="w-10 h-10 rounded-full flex items-center justify-center text-white text-xs font-bold flex-shrink-0"
                        style={{ background: accentColor }}
                      >
                        {q.avatarFallback}
                      </div>
                    )}
                    <div>
                      <p
                        className="text-xs font-medium leading-tight"
                        style={{ color: navyColor }}
                        dangerouslySetInnerHTML={{ __html: q.quote }}
                      />
                      <p className="text-xs mt-1" style={{ color: bodyColor }}>
                        {q.author}
                      </p>
                    </div>
                  </div>
                </div>
              ))}
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}
Claude Code Instructions

CLI Install

npx innovations add expert-floating-quotes

Where to use it

Use this for personal-brand coaches, speakers, consultants, or experts who lean heavily on social proof. In Astro: --- import ExpertFloatingQuotesHero from '../components/innovations/heroes/expert-floating-quotes'; --- <ExpertFloatingQuotesHero /> In Next.js: import ExpertFloatingQuotesHero from '@/components/innovations/heroes/expert-floating-quotes'; CUSTOMIZATION: <ExpertFloatingQuotesHero eyebrow="Your eyebrow" headline="Your headline part 1" highlightedText="gradient part" tagline="Sub-tagline" description="Longer description..." bullets={["Promise 1", "Promise 2", "Promise 3"]} primaryCta={{ label: "BOOK CALL", href: "/contact" }} socialProof="Trusted by 5,000+" avatarStack={[{ src: "/a1.jpg", alt: "" }, ...]} imageSrc="/your-stage-photo.webp" floatingQuotes={[ { quote: "<strong>So good.</strong>", author: "Name", avatarSrc: "/q1.jpg", position: "top-left" }, ... ]} /> FLOATING QUOTES support 6 positions: top-left, top-right, mid-left, mid-right, bottom-left, bottom-right. The grid above the image stacks vertically on mobile (md:hidden). QUOTE HTML: each quote.quote prop allows inline <strong> for emphasis (rendered via dangerouslySetInnerHTML — safe because you control the strings; do NOT pass user input directly). AVATAR FALLBACK: when no avatarSrc is given, avatarFallback fills the circle with text (e.g. "$40K", "M+", "5★"). Useful for stats-flavored testimonials. PALETTE: orange + rose accent on cream background. To rebrand: Swap "from-orange-500 to-rose-500" gradient for your brand colors Swap "bg-orange-50/40" section bg Swap "bg-orange-500 hover:bg-orange-600" CTA + check-icon orange-500 Swap "text-orange-600" eyebrow