Zoeken...  ⌘K GitHub

ImageComparison image

Grid van vergelijkingsitems met label en noot.

/image-comparison
src/components/image/ImageComparison.astro
---
interface CompareItem {
  src?: string;
  alt: string;
  label: string;
  note?: string;
}

interface Props {
  items?: CompareItem[];
  title?: string;
}

const {
  items = [
    { alt: 'Optie A', label: 'Aanpak A', note: 'Traditioneel bureau' },
    { alt: 'Optie B', label: 'Aanpak B', note: 'BLURR methode' },
  ],
  title = 'Vergelijk het verschil',
} = Astro.props;
---

<section class="icmp">
  {title && <h2 class="icmp__title">{title}</h2>}
  <div class="icmp__grid" style={`grid-template-columns: repeat(${items.length}, 1fr)`}>
    {items.map((item, i) => (
      <div class:list={['icmp__item', i === items.length - 1 && 'icmp__item--featured']}>
        <div class="icmp__media">
          {item.src ? (
            <img class="icmp__img" src={item.src} alt={item.alt} />
          ) : (
            <div class="icmp__placeholder" aria-label={item.alt}></div>
          )}
        </div>
        <div class="icmp__meta">
          <p class="icmp__label">{item.label}</p>
          {item.note && <p class="icmp__note">{item.note}</p>}
        </div>
      </div>
    ))}
  </div>
</section>

<style>
  :root {
    --color-accent: #6366f1;
    --color-primary: #0a0a0a;
  }
  .icmp { padding: 2rem 0; }
  .icmp__title {
    font-size: 2rem;
    font-weight: 700;
    color: var(--color-primary, #0a0a0a);
    text-align: center;
    margin: 0 0 2rem;
  }
  .icmp__grid {
    display: grid;
    gap: 1.5rem;
  }
  .icmp__item {
    border: 1px solid #e0e0e0;
    border-radius: 12px;
    overflow: hidden;
  }
  .icmp__item--featured {
    border-color: var(--color-accent, #6366f1);
    box-shadow: 0 0 0 2px rgba(99,102,241,0.2);
  }
  .icmp__media {
    aspect-ratio: 4/3;
  }
  .icmp__img {
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
  .icmp__placeholder {
    width: 100%;
    height: 100%;
    background: linear-gradient(135deg, #e8e8f8 0%, #d0d0f0 100%);
  }
  .icmp__item--featured .icmp__placeholder {
    background: linear-gradient(135deg, #c8ccf8 0%, #a8acf0 100%);
  }
  .icmp__meta {
    padding: 1rem 1.25rem;
  }
  .icmp__label {
    font-size: 1rem;
    font-weight: 700;
    color: var(--color-primary, #0a0a0a);
    margin: 0 0 0.25rem;
  }
  .icmp__note {
    font-size: 0.85rem;
    color: #777;
    margin: 0;
  }
  .icmp__item--featured .icmp__label {
    color: var(--color-accent, #6366f1);
  }
  @media (max-width: 640px) {
    .icmp__grid { grid-template-columns: 1fr !important; }
  }
</style>

Props

Prop Type Default Beschrijving
items { src?: string; alt: string; label: string; note?: string }[] Vergelijkings-items
title string Titel boven het grid

* = verplicht