Zoeken...  ⌘K GitHub

IconEmoji icon

Emoji-icoon lijst of grid met naam en bodytekst per waarde/belofte. Ondersteunt grid- en lijstlayout.

/icon-emoji
src/components/icon/IconEmoji.astro
---
interface EmojiItem {
  emoji: string;
  emojiLabel?: string;
  name: string;
  body?: string;
}

interface Props {
  title?: string;
  subtitle?: string;
  items?: EmojiItem[];
  layout?: 'grid' | 'list';
}

const {
  title,
  subtitle,
  items = [],
  layout = 'grid',
} = Astro.props;
---

<section class:list={['bl-section', 'iem-section']}>
  <div class="bl-inner">
    <div class="iem">
      {(title || subtitle) && (
        <div class="iem__header">
          {title && <h2 class="iem__title">{title}</h2>}
          {subtitle && <p class="iem__subtitle">{subtitle}</p>}
        </div>
      )}
      <div class:list={['iem__items', layout === 'list' ? 'iem__items--list' : 'iem__items--grid']}>
        {items.map(item => (
          <div class="iem__item">
            <span class="iem__emoji" role="img" aria-label={item.emojiLabel ?? item.name}>{item.emoji}</span>
            <div class="iem__text">
              <p class="iem__name">{item.name}</p>
              {item.body && <p class="iem__body">{item.body}</p>}
            </div>
          </div>
        ))}
      </div>
    </div>
  </div>
</section>

<style>
  .iem-section { background: var(--color-bg, #fff); }
  .iem__header { text-align: center; margin-bottom: 3rem; }
  .iem__title {
    font-size: clamp(1.75rem, 3vw, 2.5rem);
    font-weight: 700;
    color: var(--color-primary, #0a0a0a);
    margin: 0 0 .5rem;
  }
  .iem__subtitle { font-size: 1rem; color: #666; margin: 0; }
  .iem__items--grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 2rem;
  }
  @media (max-width: 640px) { .iem__items--grid { grid-template-columns: 1fr; } }
  @media (min-width: 641px) and (max-width: 1023px) { .iem__items--grid { grid-template-columns: 1fr 1fr; } }
  .iem__items--list { display: flex; flex-direction: column; gap: 1.25rem; }
  .iem__item { display: flex; align-items: flex-start; gap: 1rem; }
  .iem__items--grid .iem__item {
    flex-direction: column;
    align-items: flex-start;
    padding: 1.5rem;
    background: #fff;
    border: 1px solid #eee;
    border-radius: 12px;
  }
  .iem__emoji { font-size: 2rem; flex-shrink: 0; }
  .iem__items--list .iem__emoji { font-size: 1.5rem; margin-top: .1rem; }
  .iem__name { font-size: 1rem; font-weight: 700; color: var(--color-primary, #0a0a0a); margin: 0 0 .3rem; }
  .iem__body { font-size: 1rem; color: #666; line-height: 1.55; margin: 0; }
</style>

Props

Prop Type Default Beschrijving
title string - Sectiekop
subtitle string - Ondertitel
items * { emoji: string; emojiLabel?: string; name: string; body?: string }[] - Items met emoji-icoon en tekst
layout 'grid' | 'list' 'grid' Weergave als grid of verticale lijst

* = verplicht