5
Sponsor

Testimonial

Testimonial rendered with email-safe, renderer-native components.

import { Testimonial } from "@/components/email/testimonial";
import { defaultTheme } from "@/components/email/theme-default";

export function TestimonialDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="left"
      appearance="plain"
      theme={{ ...defaultTheme, containerWidth: "640px" }}
    />
  );
}

Installation

$ pnpm dlx shadcn@latest add @emailcn/react-email/testimonial

Usage

import { Testimonial } from "@/components/email/testimonial";
<Testimonial layout="full-width" avatarTreatment="inline" />

Examples

Centered testimonial with CTA

With quote

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutCenteredVariantQuoteExampleDemo() {
  return <Testimonial layout="centered" variant="quote" />;
}

Text top

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutCenteredVariantTextTopExampleDemo() {
  return <Testimonial layout="centered" variant="text-top" />;
}

Text bottom

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutCenteredVariantTextBottomExampleDemo() {
  return <Testimonial layout="centered" variant="text-bottom" />;
}

Split testimonial with CTA

Image left

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutSplitPlacementLeftExampleDemo() {
  return <Testimonial layout="split" placement="left" />;
}

Image right

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutSplitPlacementRightExampleDemo() {
  return <Testimonial layout="split" placement="right" />;
}

Full width testimonial

Left aligned

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutFullWidthAlignmentLeftAppearancePlainAvatarTreatmentInlineExampleDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="left"
      appearance="plain"
      avatarTreatment="inline"
    />
  );
}

Centered

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutFullWidthAlignmentCenterAppearancePlainAvatarTreatmentInlineExampleDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="center"
      appearance="plain"
      avatarTreatment="inline"
    />
  );
}

Boxed left

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutFullWidthAlignmentLeftAppearanceBoxedAvatarTreatmentInlineExampleDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="left"
      appearance="boxed"
      avatarTreatment="inline"
    />
  );
}

Boxed centered

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutFullWidthAlignmentCenterAppearanceBoxedAvatarTreatmentInlineExampleDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="center"
      appearance="boxed"
      avatarTreatment="inline"
    />
  );
}

Accent left

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutFullWidthAlignmentLeftAppearanceAccentAvatarTreatmentInlineExampleDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="left"
      appearance="accent"
      avatarTreatment="inline"
    />
  );
}

Accent centered

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutFullWidthAlignmentCenterAppearanceAccentAvatarTreatmentInlineExampleDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="center"
      appearance="accent"
      avatarTreatment="inline"
    />
  );
}

Full width testimonial with overlapping avatar

Bottom left

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutFullWidthAlignmentLeftAvatarTreatmentOverlappingPlacementBottomExampleDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="left"
      avatarTreatment="overlapping"
      placement="bottom"
    />
  );
}

Centered

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutFullWidthAlignmentCenterAvatarTreatmentOverlappingPlacementBottomExampleDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="center"
      avatarTreatment="overlapping"
      placement="bottom"
    />
  );
}

Top left

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutFullWidthAlignmentLeftAvatarTreatmentOverlappingPlacementTopExampleDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="left"
      avatarTreatment="overlapping"
      placement="top"
    />
  );
}

Top centered

import { Testimonial } from "@/components/email/testimonial";

export function TestimonialLayoutFullWidthAlignmentCenterAvatarTreatmentOverlappingPlacementTopExampleDemo() {
  return (
    <Testimonial
      layout="full-width"
      alignment="center"
      avatarTreatment="overlapping"
      placement="top"
    />
  );
}

API Reference

PropTypeDefaultDescription
themeEmailThemedefaultThemeRenderer theme configuration.
quotestringLayout-specific built-in copySets the testimonial quote.
authorstringLayout-specific built-in authorSets the quoted person's name.
rolestringLayout-specific built-in roleSets the quoted person's role.
companystring"Monarch"Sets the company used by CTA layouts.
avatar{ src: string; alt?: string }Built-in avatarOverrides the testimonial avatar.
logo{ src: string; alt?: string }Appearance-specific built-in logoOverrides the customer logo.
layout"full-width" | "centered" | "split""full-width"Selects the testimonial's structural layout.
alignment"left" | "center""left"Aligns full-width testimonial content.
appearance"plain" | "boxed" | "accent""plain"Styles an inline full-width testimonial.
avatarTreatment"inline" | "overlapping""inline"Places the full-width avatar inline or across the card boundary.
placement"left" | "right" | "top" | "bottom"Layout-specificPositions the split image or overlapping avatar.
variant"quote" | "text-top" | "text-bottom""quote"Selects the centered CTA content treatment.
action{ href: string; label: string }Built-in case-study linkOverrides the action shown by centered and split CTA layouts.