Zoeken...  ⌘K GitHub

IconServices icon

IconServices component.

/icon-services
src/components/icon/IconServices.astro
---
/**
 * IconServices
 * Sectie-header + grid van dienst-kaarten. Elke kaart: icoon, naam, beschrijving
 * en optionele prijsregel.
 *
 * Props:
 * - title?: string
 * - subtitle?: string
 * - columns?: 2 | 3
 * - items?: Array<{ icon?: string; name: string; desc: string; price?: string }>
 */
interface Props {
  title?: string;
  subtitle?: string;
  columns?: 2 | 3;
  items?: { icon?: string; name: string; desc: string; price?: string }[];
}

const {
  title = 'Onze diensten',
  subtitle = 'Alles wat een groeiend merk nodig heeft, onder één dak.',
  columns = 3,
  items = [
    { icon: '→', name: 'Search advertising', desc: 'Search-, shopping- en performance-campagnes.', price: 'Vanaf €750/maand' },
    { icon: '→', name: 'Social advertising', desc: 'Sociale campagnes met bewezen creatives.', price: 'Vanaf €750/maand' },
    { icon: '→', name: 'Brand identity', desc: 'Logo, huisstijl en complete merkgids.', price: 'Vanaf €2.500' },
    { icon: '→', name: 'Website', desc: 'Snel, mooi en gebouwd voor conversie.', price: 'Vanaf €3.500' },
    { icon: '→', name: 'SEO', desc: 'Organische groei met content en techniek.', price: 'Vanaf €850/maand' },
    { icon: '→', name: 'Social media', desc: 'Contentkalender, creatives en community.', price: 'Vanaf €650/maand' },
  ],
} = Astro.props;
---

<section class="bl-section isv">
  <div class="bl-inner isv__inner">
    {(title || subtitle) && (
      <div class="isv__header">
        {title && <h2 class="isv__title">{title}</h2>}
        {subtitle && <p class="isv__subtitle">{subtitle}</p>}
      </div>
    )}
    <div class={`isv__grid isv__grid--cols-${columns}`}>
      {items.map(item => (
        <div class="isv__item">
          {item.icon && <span class="isv__emoji" aria-hidden="true">{item.icon}</span>}
          <div class="isv__content">
            <h3 class="isv__name">{item.name}</h3>
            <p class="isv__desc">{item.desc}</p>
            {item.price && <p class="isv__price">{item.price}</p>}
          </div>
        </div>
      ))}
    </div>
  </div>
</section>

<style>
.isv__header{margin-bottom:3rem}
.isv__title{font-size:clamp(1.75rem,3vw,2.5rem);font-weight:700;color:var(--color-primary, #0a0a0a);margin:0 0 .5rem}
.isv__subtitle{font-size:1.05rem;color:var(--color-muted, #555);margin:0}
.isv__grid{display:grid;gap:1.5rem}
.isv__grid--cols-3{grid-template-columns:repeat(3,1fr)}
.isv__grid--cols-2{grid-template-columns:repeat(2,1fr)}
.isv__item{display:flex;gap:1rem;padding:1.5rem;background:#fff;border:1px solid #eee;border-radius:12px;align-items:flex-start;transition:border-color .2s,box-shadow .2s}
.isv__item:hover{border-color:#6366f14d;box-shadow:0 4px 16px #6366f114}
.isv__emoji{font-size:1.75rem;flex-shrink:0;margin-top:.1rem}
.isv__name{font-size:1.0625rem;font-weight:700;color:var(--color-primary, #0a0a0a);margin:0 0 .35rem}
.isv__desc{font-size:1rem;color:var(--color-muted, #555);line-height:1.55;margin:0 0 .5rem}
.isv__price{font-size:.9375rem;font-weight:700;color:var(--color-accent, #6366f1);margin:0}
@media (max-width: 900px){.isv__grid--cols-3{grid-template-columns:1fr 1fr}}
@media (max-width: 600px){.isv__grid{grid-template-columns:1fr}}
</style>