Sora UI

Inline Testimonials

A flowing quote stream where each avatar reveals its author on hover, with Motion fading and blurring the rest.

Made by Axyl

Hover any avatar to reveal the author while the rest of the quote stream blurs out.

Loading...

Installation

File Structure

inline-testimonials.tsx

Usage

import {
  InlineTestimonials,
  type Testimonial,
} from '@/components/sora-ui/disclosure/inline-testimonials';

const testimonials: Testimonial[] = [
  {
    id: '1',
    text: 'Undoubtedly one of the best resources in the world.',
    author: {
      name: 'Benji Taylor',
      role: 'Head of Design @Base',
      avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=96&h=96&fit=crop&crop=faces',
    },
  },
];

export default function Page() {
  return <InlineTestimonials testimonials={testimonials} />;
}

Props

PropTypeDefault
testimonials?
Testimonial[]
-
avatarSize?
number
32
blurAmount?
number
5
blurOpacity?
number
0.25
fontSize?
number
30
alternate?
InlineTestimonialsAlternateConfig
{ pattern: true, opacity: 0.7 }
interaction?
"hover" | "focus" | "both"
"hover"
hoveredId?
string | null
-
defaultHoveredId?
string | null
-
onHoveredIdChange?
(id: string | null) => void
-
renderAvatar?
(testimonial: Testimonial, size: number) => ReactNode
-
label?
InlineTestimonialsLabelConfig
-
className?
string
-
classNames?
InlineTestimonialsClassNames
-

InlineTestimonialsLabelConfig

PropTypeDefault
accentColor?
string
"#f97316"
nameFontSize?
number
12
roleFontSize?
number
9
roleColor?
string
"var(--muted-foreground, #6b7280)"
roleLetterSpacing?
string
"0.1em"
roleUppercase?
boolean
true
offsetX?
number
avatarSize / 2
offsetY?
string
"150%"
slideX?
number
-6
transitionDuration?
number
0.16
ease?
Easing
"easeOut"

Accessibility

By default only mouse hover reveals the author label (interaction="hover"), matching a decorative quote stream. Set interaction="focus" or interaction="both" to also attach tabIndex and onFocus/onBlur to each item, making the label reachable by keyboard (Tab) and screen-reader focus.

When prefers-reduced-motion: reduce is set, useReducedMotion() disables the label's slide-in animation and the blur filter on dimmed items — only a plain opacity fade remains. No extra configuration needed.

The quote text is always in the DOM. The visible author label only mounts on hover/focus (via AnimatePresence), so each item also renders a sr-only "— Name, Role" string right after its quote — screen readers get the attribution unconditionally, without needing to trigger the hover/focus reveal.

Built by Axyl. A motion-first component registry for React.

Last updated: 7/10/2026