Zoeken...  ⌘K GitHub

SocialProofBanner Social Proof

Compacte inline vertrouwensbalk met avatar-stack en sterren.

/social-proof-banner
src/components/social-proof/SocialProofBanner.astro
---
/**
 * SocialProofBanner
 * Compacte inline vertrouwensbalk met avatar-stack en korte tekst.
 */
interface Props {
  avatars?: string[];
  text: string;
  sub?: string;
  rating?: number;
  reviewCount?: number;
  bg?: 'white' | 'light' | 'dark';
}
const { avatars = [], text, sub, rating = 5, reviewCount, bg = 'light' } = Astro.props;
---
<div class={`spb spb--${bg}`}>
  <div class="spb-inner">
    {avatars.length > 0 && (
      <div class="spb-avatars">
        {avatars.slice(0,5).map((a, i) => (
          <img src={a} alt="" class="spb-avatar" style={`z-index:${5-i}`} />
        ))}
      </div>
    )}
    <div class="spb-text">
      <span class="spb-main">{text}</span>
      {sub && <span class="spb-sub">{sub}</span>}
    </div>
    {rating > 0 && (
      <div class="spb-rating">
        <div class="spb-stars">
          {Array.from({length: Math.round(rating)}).map(() => <span>★</span>)}
        </div>
        {reviewCount && <span class="spb-count">{reviewCount}+ reviews</span>}
      </div>
    )}
  </div>
</div>
<style>
  .spb { padding: 1rem 2rem; }
  .spb--white { background: #fff; border: 1px solid #e5e7eb; border-radius: 0.75rem; }
  .spb--light { background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 0.75rem; }
  .spb--dark { background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.1); border-radius: 0.75rem; }
  .spb-inner { max-width: 700px; margin: 0 auto; display: flex; align-items: center; gap: 1.25rem; flex-wrap: wrap; justify-content: center; }
  .spb-avatars { display: flex; }
  .spb-avatar { width: 32px; height: 32px; border-radius: 50%; object-fit: cover; border: 2px solid #fff; margin-left: -8px; }
  .spb-avatar:first-child { margin-left: 0; }
  .spb-text { display: flex; flex-direction: column; }
  .spb-main { font-size: 0.9375rem; font-weight: 700; }
  .spb--white .spb-main, .spb--light .spb-main { color: #0a0a0a; }
  .spb--dark .spb-main { color: #fff; }
  .spb-sub { font-size: 0.8125rem; }
  .spb--white .spb-sub, .spb--light .spb-sub { color: #6b7280; }
  .spb--dark .spb-sub { color: rgba(255,255,255,0.45); }
  .spb-rating { display: flex; flex-direction: column; align-items: center; }
  .spb-stars { color: #f59e0b; font-size: 0.875rem; letter-spacing: 0.05em; }
  .spb-count { font-size: 0.75rem; }
  .spb--white .spb-count, .spb--light .spb-count { color: #9ca3af; }
  .spb--dark .spb-count { color: rgba(255,255,255,0.3); }
</style>

Props

Prop Type Default Beschrijving
text * string Hoofd vertrouwenstekst
avatars string[] URLs van klantavatars (max 5)
sub string Subtekst
rating number Sterrenwaardering
reviewCount number Aantal reviews
bg 'white' | 'light' | 'dark' Achtergrond variant

* = verplicht