Zoeken...  ⌘K GitHub

LogoBar Social Proof

Rij met klanten- of partnerlogo's. Grayscale optioneel.

/logo-bar
src/components/social-proof/LogoBar.astro
---
/**
 * LogoBar
 * Horizontale rij met klanten- of partnerlogo's.
 *
 * Props:
 * - label?: string — tekst boven de logos ("Vertrouwd door")
 * - logos: Array<{ src: string; alt: string; href?: string }>
 * - grayscale?: boolean — logos zwart-wit (default: true)
 */
interface Props {
  label?: string;
  logos: { src: string; alt: string; href?: string }[];
  grayscale?: boolean;
}

const { label, logos, grayscale = true } = Astro.props;
---

<section class="logo-bar">
  <div class="logo-bar__inner">
    {label && <p class="logo-bar__label">{label}</p>}
    <ul class="logo-bar__list">
      {logos.map(logo => (
        <li class="logo-bar__item">
          {logo.href ? (
            <a href={logo.href} class="logo-bar__link" rel="noopener noreferrer" target="_blank">
              <img
                src={logo.src}
                alt={logo.alt}
                class:list={['logo-bar__logo', { 'logo-bar__logo--grayscale': grayscale }]}
                loading="lazy"
              />
            </a>
          ) : (
            <img
              src={logo.src}
              alt={logo.alt}
              class:list={['logo-bar__logo', { 'logo-bar__logo--grayscale': grayscale }]}
              loading="lazy"
            />
          )}
        </li>
      ))}
    </ul>
  </div>
</section>

<style>
  .logo-bar {
    padding: 3rem 1.5rem;
    background: var(--color-bg);
    border-top: 1px solid color-mix(in srgb, var(--color-text) 8%, transparent);
    border-bottom: 1px solid color-mix(in srgb, var(--color-text) 8%, transparent);
  }
  .logo-bar__inner {
    max-width: 1280px;
    margin: 0 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1.5rem;
  }
  .logo-bar__label {
    font-size: 0.8125rem;
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--color-muted);
    margin: 0;
    text-align: center;
  }
  .logo-bar__list {
    list-style: none;
    margin: 0; padding: 0;
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    gap: 2rem 3rem;
  }
  .logo-bar__item { display: flex; align-items: center; }
  .logo-bar__link { display: block; }
  .logo-bar__logo {
    height: 2rem;
    width: auto;
    max-width: 120px;
    object-fit: contain;
    display: block;
    opacity: 0.7;
    transition: opacity 0.2s;
  }
  .logo-bar__logo--grayscale { filter: grayscale(1); }
  .logo-bar__logo:hover,
  .logo-bar__link:hover .logo-bar__logo {
    opacity: 1;
    filter: none;
  }
</style>

Props

Prop Type Default Beschrijving
logos * { src: string; alt: string; href?: string }[] Logo afbeeldingen
label string Tekst boven de logos
grayscale boolean true Logos zwart-wit

* = verplicht