Zoeken...  ⌘K GitHub

ImageGrid2x2 image

2×2 beeldengrid met optioneel bijschrift per foto.

/image-grid-2x2
src/components/image/ImageGrid2x2.astro
---
interface GridImage {
  src?: string;
  alt: string;
  caption?: string;
}

interface Props {
  images?: GridImage[];
  title?: string;
}

const {
  images = [
    { alt: 'Project Alpha', caption: 'Branding & Identiteit' },
    { alt: 'Project Beta', caption: 'Web Development' },
    { alt: 'Project Gamma', caption: 'Performance Ads' },
    { alt: 'Project Delta', caption: 'Social Media' },
  ],
  title = 'Ons werk',
} = Astro.props;
---

<section class="ig22">
  {title && <h2 class="ig22__title">{title}</h2>}
  <div class="ig22__grid">
    {images.slice(0, 4).map((img) => (
      <div class="ig22__item">
        {img.src ? (
          <img class="ig22__img" src={img.src} alt={img.alt} />
        ) : (
          <div class="ig22__placeholder" aria-label={img.alt}></div>
        )}
        {img.caption && <span class="ig22__caption">{img.caption}</span>}
      </div>
    ))}
  </div>
</section>

<style>
  :root {
    --color-accent: #6366f1;
    --color-primary: #0a0a0a;
  }
  .ig22 { padding: 3rem 0; }
  .ig22__title {
    font-size: 2rem;
    font-weight: 700;
    color: var(--color-primary, #0a0a0a);
    margin: 0 0 2rem;
    text-align: center;
  }
  .ig22__grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1rem;
  }
  .ig22__item {
    position: relative;
    overflow: hidden;
    border-radius: 8px;
    aspect-ratio: 4/3;
  }
  .ig22__img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform 0.3s ease;
  }
  .ig22__item:hover .ig22__img { transform: scale(1.04); }
  .ig22__placeholder {
    width: 100%;
    height: 100%;
    background: linear-gradient(135deg, #e0e0f0 0%, #c8c8e8 100%);
  }
  .ig22__caption {
    position: absolute;
    bottom: 0.75rem;
    left: 0.75rem;
    background: rgba(10,10,10,0.7);
    color: #fff;
    font-size: 0.8rem;
    font-weight: 600;
    padding: 0.25rem 0.6rem;
    border-radius: 4px;
  }
  @media (max-width: 640px) {
    .ig22__grid { grid-template-columns: 1fr; }
  }
</style>

Props

Prop Type Default Beschrijving
images { src?: string; alt: string; caption?: string }[] Maximaal 4 afbeeldingen
title string Titel boven het grid

* = verplicht