Zoeken...  ⌘K GitHub

HeroSplitAngle Hero

Split-hero met schuine scheidingslijn: tekstkolom links (eyebrow, kop, sub, twee CTA's), beeld rechts dat onder de hoek doorloopt.

/hero-split-angle
src/components/hero/HeroSplitAngle.astro
---
/**
 * HeroSplitAngle
 * Split-hero met schuine scheidingslijn: tekstkolom links (eyebrow, kop, sub,
 * twee CTA's), beeld rechts dat onder de hoek doorloopt. Beide kolommen liggen
 * binnen .bl-inner zodat de H1 op de pagina-rail uitlijnt. Accent instelbaar.
 *
 * Props: zie interface. Alle copy is prop-driven.
 */
interface Props {
  eyebrow?: string;
  headline: string;
  sub?: string;
  primaryCta?: { label: string; href: string };
  ghostCta?: { label: string; href: string };
  image?: { src: string; alt?: string };
  accent?: string;
}

const {
  eyebrow,
  headline,
  sub,
  primaryCta,
  ghostCta,
  image,
  accent = '#6366f1',
} = Astro.props;
---

<section class:list={['bl-section', 'hsa']} style={`--hsa-accent:${accent}`}>
  <div class="bl-inner hsa-inner">
    <div class="hsa-text">
      {eyebrow && <span class="hsa-eyebrow">{eyebrow}</span>}
      <h1 class="hsa-headline">{headline}</h1>
      {sub && <p class="hsa-sub">{sub}</p>}
      {(primaryCta || ghostCta) && (
        <div class="hsa-actions">
          {primaryCta && <a href={primaryCta.href} class="hsa-btn hsa-btn--primary">{primaryCta.label}</a>}
          {ghostCta && <a href={ghostCta.href} class="hsa-btn hsa-btn--ghost">{ghostCta.label}</a>}
        </div>
      )}
    </div>
    {image && (
      <div class="hsa-visual">
        <img data-allow-img src={image.src} alt={image.alt ?? ''} class="hsa-img" loading="eager" fetchpriority="high" decoding="async" />
      </div>
    )}
  </div>
</section>

<style>
.hsa{background:var(--color-bg, #fff);overflow:hidden}
.hsa-inner{display:grid;grid-template-columns:1fr;gap:2.5rem;align-items:stretch}
.hsa-text{display:flex;flex-direction:column;justify-content:center;background:var(--color-bg, #fff);z-index:1}
.hsa-eyebrow{font-size:.8125rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--hsa-accent);margin-bottom:1.25rem}
.hsa-headline{font-size:clamp(2.25rem,4vw,4rem);font-weight:800;letter-spacing:-.03em;line-height:1.1;color:var(--color-primary, #0a0a0a);margin:0 0 1.25rem}
.hsa-sub{font-size:1.0625rem;color:var(--color-muted, #6b7280);line-height:1.65;margin:0 0 2.5rem;max-width:440px}
.hsa-actions{display:flex;gap:.75rem;flex-wrap:wrap}
.hsa-btn{display:inline-flex;align-items:center;padding:.8125rem 1.75rem;border-radius:.5rem;font-size:.9375rem;font-weight:600;text-decoration:none;transition: opacity, transform, background-color, color, border-color, box-shadow, filter .2s}
.hsa-btn--primary{background:var(--hsa-accent);color:#fff}
.hsa-btn--primary:hover{opacity:.9;transform:translateY(-1px)}
.hsa-btn--ghost{border:1.5px solid #cbd5e1;color:#374151}
.hsa-btn--ghost:hover{border-color:#94a3b8}
.hsa-visual{position:relative;overflow:hidden;border-radius:calc(var(--radius, .5rem) * 2);min-height:280px}
.hsa-img{width:100%;height:100%;object-fit:cover;display:block}
@media (min-width:860px){
  .hsa-inner{grid-template-columns:1.05fr .95fr;gap:0;min-height:78vh}
  .hsa-text{padding:4rem clamp(2rem,4vw,4rem) 4rem 0;clip-path:polygon(0 0,100% 0,86% 100%,0 100%)}
  .hsa-visual{margin-left:-7%;border-radius:0}
}
</style>

Props

Prop Type Default Beschrijving
eyebrow string - Eyebrow boven de kop
headline * string - H1-kop
sub string - Ondertitel
primaryCta { label: string; href: string } - Primaire knop
ghostCta { label: string; href: string } - Ghost-knop
image { src: string; alt?: string } - Beeld rechts
accent string '#6366f1' Accent-kleur

* = verplicht