Hero Showcase Split
High-impact landing hero section with dual-column layout, glowing typography, CTAs, and interactive live preview card.
sectionsherolandingshowcasesplit
Live Preview
NEW: ASTRO 5 PRODUCTION SUITE
Craft stunning web apps at lightspeed
A cohesive collection of 150+ dark-mode first, accessible Astro components. Zero dependencies, pure vanilla CSS, full TypeScript support.
$
npm install astro-component-kit astrocomponents.dev/preview
⚡
Production SSR Ready
Zero JavaScript hydration overhead by default.
Score100
A11yAA
Speed0.2s
Usage
Copy and paste this code into your Astro page:
astro
---
import { HeroShowcaseSplit } from 'astro-component-kit';
---
<HeroShowcaseSplit /> ---
import { HeroShowcaseSplit } from 'astro-component-kit';
---
<HeroShowcaseSplit /> Manual Installation
If you are not using the npm package, create a new file src/components/sections/HeroShowcaseSplit.astro and paste the following code:
astro
---
/**
* HeroShowcaseSplit — Two-column modern landing hero section with install command, action CTAs, and interactive preview widget.
*
* @param {string} badge - Header lead badge. Default is 'NEW: ASTRO 5 SUITE'.
* @param {string} title - Primary headline string.
* @param {string} subtitle - Subtitle paragraph text.
* @param {string} primaryCtaText - Primary CTA button text.
* @param {string} primaryCtaHref - Primary CTA link.
* @param {string} secondaryCtaText - Secondary button text.
* @param {string} secondaryCtaHref - Secondary link.
*/
interface Props {
badge?: string;
title?: string;
subtitle?: string;
primaryCtaText?: string;
primaryCtaHref?: string;
secondaryCtaText?: string;
secondaryCtaHref?: string;
}
const {
badge = 'NEW: ASTRO 5 PRODUCTION SUITE',
title = 'Craft stunning web apps at lightspeed',
subtitle = 'A cohesive collection of 150+ dark-mode first, accessible Astro components. Zero dependencies, pure vanilla CSS, full TypeScript support.',
primaryCtaText = 'Explore Components',
primaryCtaHref = '/docs/glass-button',
secondaryCtaText = 'View on GitHub',
secondaryCtaHref = 'https://github.com/konstantinWDK/astro-components',
} = Astro.props;
---
<section class="split-hero">
<div class="split-hero__inner">
<div class="split-hero__content">
<div class="split-hero__badge">
<span class="dot"></span>
<span>{badge}</span>
</div>
<h1 class="split-hero__title">{title}</h1>
<p class="split-hero__subtitle">{subtitle}</p>
<div class="split-hero__actions">
<a href={primaryCtaHref} class="btn btn--primary">
{primaryCtaText}
<span aria-hidden="true">→</span>
</a>
<a href={secondaryCtaHref} target="_blank" rel="noopener" class="btn btn--secondary">
{secondaryCtaText}
</a>
</div>
<div class="split-hero__install">
<span class="prompt">$</span>
<code>npm install astro-component-kit</code>
</div>
</div>
<div class="split-hero__visual">
<div class="glass-device">
<div class="glass-device__bar">
<span class="d-dot d-dot--red"></span>
<span class="d-dot d-dot--yellow"></span>
<span class="d-dot d-dot--green"></span>
<span class="glass-device__url">astrocomponents.dev/preview</span>
</div>
<div class="glass-device__body">
<slot>
<div class="mock-widget">
<span class="mock-icon">⚡</span>
<h4>Production SSR Ready</h4>
<p>Zero JavaScript hydration overhead by default.</p>
<div class="mock-metrics">
<div><span>Score</span><strong>100</strong></div>
<div><span>A11y</span><strong>AA</strong></div>
<div><span>Speed</span><strong>0.2s</strong></div>
</div>
</div>
</slot>
</div>
</div>
</div>
</div>
</section>
<style>
.split-hero {
position: relative;
padding: 6rem 1.5rem;
width: 100%;
overflow: hidden;
font-family: var(--font-sans, system-ui, sans-serif);
}
.split-hero__inner {
max-width: 1240px;
margin: 0 auto;
display: grid;
grid-template-columns: 1.1fr 0.9fr;
gap: 4rem;
align-items: center;
}
.split-hero__content {
display: flex;
flex-direction: column;
align-items: flex-start;
}
.split-hero__badge {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 0.35rem 0.85rem;
background: rgba(184, 134, 11, 0.12);
border: 1px solid rgba(184, 134, 11, 0.35);
border-radius: var(--r-full, 9999px);
font-size: 0.75rem;
font-weight: 800;
color: var(--c-accent, #fef3c7);
margin-bottom: 1.5rem;
letter-spacing: 0.05em;
}
.split-hero__badge .dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: #d4a017;
box-shadow: 0 0 8px #d4a017;
}
.split-hero__title {
font-size: clamp(2.4rem, 5vw, 3.8rem);
font-weight: 900;
line-height: 1.1;
letter-spacing: -0.04em;
color: var(--c-text-1, #ffffff);
margin: 0 0 1.25rem 0;
}
.split-hero__subtitle {
font-size: 1.05rem;
color: var(--c-text-2, #a3a3a3);
line-height: 1.65;
margin: 0 0 2rem 0;
max-width: 540px;
}
.split-hero__actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-bottom: 2rem;
}
.btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 0.85rem 1.8rem;
font-size: 0.92rem;
font-weight: 700;
border-radius: var(--r-md, 12px);
text-decoration: none;
transition: all 0.25s ease;
}
.btn--primary {
background: linear-gradient(135deg, #d4a017, #b8860b);
color: #050505;
box-shadow: 0 4px 20px rgba(184, 134, 11, 0.35);
}
.btn--primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(184, 134, 11, 0.5);
}
.btn--secondary {
background: rgba(255, 255, 255, 0.04);
backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.1);
color: var(--c-text-1, #ffffff);
}
.btn--secondary:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
transform: translateY(-2px);
}
.split-hero__install {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 0.6rem 1.1rem;
background: rgba(0, 0, 0, 0.4);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: var(--r-md, 10px);
font-family: var(--font-mono, monospace);
font-size: 0.85rem;
color: var(--c-primary-light, #d4a017);
}
.split-hero__install .prompt {
color: var(--c-text-3, #737373);
}
/* Visual mock preview container */
.glass-device {
background: rgba(14, 14, 18, 0.85);
backdrop-filter: blur(24px);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: var(--r-xl, 24px);
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6);
overflow: hidden;
}
.glass-device__bar {
display: flex;
align-items: center;
gap: 6px;
padding: 0.8rem 1rem;
background: rgba(0, 0, 0, 0.3);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.d-dot { width: 10px; height: 10px; border-radius: 50%; }
.d-dot--red { background: #ef4444; }
.d-dot--yellow { background: #f59e0b; }
.d-dot--green { background: #10b981; }
.glass-device__url {
margin-left: auto;
font-size: 0.75rem;
color: var(--c-text-3, #737373);
font-family: var(--font-mono, monospace);
}
.glass-device__body {
padding: 2.5rem;
}
.mock-widget {
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
}
.mock-icon {
font-size: 2.5rem;
background: rgba(184, 134, 11, 0.15);
border: 1px solid rgba(184, 134, 11, 0.3);
width: 64px;
height: 64px;
border-radius: 50%;
display: grid;
place-items: center;
}
.mock-widget h4 {
font-size: 1.25rem;
font-weight: 800;
color: var(--c-text-1, #ffffff);
margin: 0;
}
.mock-widget p {
font-size: 0.85rem;
color: var(--c-text-2, #a3a3a3);
margin: 0;
max-width: 280px;
}
.mock-metrics {
display: flex;
gap: 24px;
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid rgba(255, 255, 255, 0.08);
width: 100%;
justify-content: center;
}
.mock-metrics div {
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
}
.mock-metrics span { font-size: 0.7rem; color: var(--c-text-3, #737373); text-transform: uppercase; }
.mock-metrics strong { font-size: 1.1rem; color: var(--c-primary-light, #d4a017); }
@media (max-width: 900px) {
.split-hero__inner {
grid-template-columns: 1fr;
gap: 3rem;
}
}
</style> ---
/**
* HeroShowcaseSplit — Two-column modern landing hero section with install command, action CTAs, and interactive preview widget.
*
* @param {string} badge - Header lead badge. Default is 'NEW: ASTRO 5 SUITE'.
* @param {string} title - Primary headline string.
* @param {string} subtitle - Subtitle paragraph text.
* @param {string} primaryCtaText - Primary CTA button text.
* @param {string} primaryCtaHref - Primary CTA link.
* @param {string} secondaryCtaText - Secondary button text.
* @param {string} secondaryCtaHref - Secondary link.
*/
interface Props {
badge?: string;
title?: string;
subtitle?: string;
primaryCtaText?: string;
primaryCtaHref?: string;
secondaryCtaText?: string;
secondaryCtaHref?: string;
}
const {
badge = 'NEW: ASTRO 5 PRODUCTION SUITE',
title = 'Craft stunning web apps at lightspeed',
subtitle = 'A cohesive collection of 150+ dark-mode first, accessible Astro components. Zero dependencies, pure vanilla CSS, full TypeScript support.',
primaryCtaText = 'Explore Components',
primaryCtaHref = '/docs/glass-button',
secondaryCtaText = 'View on GitHub',
secondaryCtaHref = 'https://github.com/konstantinWDK/astro-components',
} = Astro.props;
---
<section class="split-hero">
<div class="split-hero__inner">
<div class="split-hero__content">
<div class="split-hero__badge">
<span class="dot"></span>
<span>{badge}</span>
</div>
<h1 class="split-hero__title">{title}</h1>
<p class="split-hero__subtitle">{subtitle}</p>
<div class="split-hero__actions">
<a href={primaryCtaHref} class="btn btn--primary">
{primaryCtaText}
<span aria-hidden="true">→</span>
</a>
<a href={secondaryCtaHref} target="_blank" rel="noopener" class="btn btn--secondary">
{secondaryCtaText}
</a>
</div>
<div class="split-hero__install">
<span class="prompt">$</span>
<code>npm install astro-component-kit</code>
</div>
</div>
<div class="split-hero__visual">
<div class="glass-device">
<div class="glass-device__bar">
<span class="d-dot d-dot--red"></span>
<span class="d-dot d-dot--yellow"></span>
<span class="d-dot d-dot--green"></span>
<span class="glass-device__url">astrocomponents.dev/preview</span>
</div>
<div class="glass-device__body">
<slot>
<div class="mock-widget">
<span class="mock-icon">⚡</span>
<h4>Production SSR Ready</h4>
<p>Zero JavaScript hydration overhead by default.</p>
<div class="mock-metrics">
<div><span>Score</span><strong>100</strong></div>
<div><span>A11y</span><strong>AA</strong></div>
<div><span>Speed</span><strong>0.2s</strong></div>
</div>
</div>
</slot>
</div>
</div>
</div>
</div>
</section>
<style>
.split-hero {
position: relative;
padding: 6rem 1.5rem;
width: 100%;
overflow: hidden;
font-family: var(--font-sans, system-ui, sans-serif);
}
.split-hero__inner {
max-width: 1240px;
margin: 0 auto;
display: grid;
grid-template-columns: 1.1fr 0.9fr;
gap: 4rem;
align-items: center;
}
.split-hero__content {
display: flex;
flex-direction: column;
align-items: flex-start;
}
.split-hero__badge {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 0.35rem 0.85rem;
background: rgba(184, 134, 11, 0.12);
border: 1px solid rgba(184, 134, 11, 0.35);
border-radius: var(--r-full, 9999px);
font-size: 0.75rem;
font-weight: 800;
color: var(--c-accent, #fef3c7);
margin-bottom: 1.5rem;
letter-spacing: 0.05em;
}
.split-hero__badge .dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: #d4a017;
box-shadow: 0 0 8px #d4a017;
}
.split-hero__title {
font-size: clamp(2.4rem, 5vw, 3.8rem);
font-weight: 900;
line-height: 1.1;
letter-spacing: -0.04em;
color: var(--c-text-1, #ffffff);
margin: 0 0 1.25rem 0;
}
.split-hero__subtitle {
font-size: 1.05rem;
color: var(--c-text-2, #a3a3a3);
line-height: 1.65;
margin: 0 0 2rem 0;
max-width: 540px;
}
.split-hero__actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-bottom: 2rem;
}
.btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 0.85rem 1.8rem;
font-size: 0.92rem;
font-weight: 700;
border-radius: var(--r-md, 12px);
text-decoration: none;
transition: all 0.25s ease;
}
.btn--primary {
background: linear-gradient(135deg, #d4a017, #b8860b);
color: #050505;
box-shadow: 0 4px 20px rgba(184, 134, 11, 0.35);
}
.btn--primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(184, 134, 11, 0.5);
}
.btn--secondary {
background: rgba(255, 255, 255, 0.04);
backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.1);
color: var(--c-text-1, #ffffff);
}
.btn--secondary:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
transform: translateY(-2px);
}
.split-hero__install {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 0.6rem 1.1rem;
background: rgba(0, 0, 0, 0.4);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: var(--r-md, 10px);
font-family: var(--font-mono, monospace);
font-size: 0.85rem;
color: var(--c-primary-light, #d4a017);
}
.split-hero__install .prompt {
color: var(--c-text-3, #737373);
}
/* Visual mock preview container */
.glass-device {
background: rgba(14, 14, 18, 0.85);
backdrop-filter: blur(24px);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: var(--r-xl, 24px);
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6);
overflow: hidden;
}
.glass-device__bar {
display: flex;
align-items: center;
gap: 6px;
padding: 0.8rem 1rem;
background: rgba(0, 0, 0, 0.3);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.d-dot { width: 10px; height: 10px; border-radius: 50%; }
.d-dot--red { background: #ef4444; }
.d-dot--yellow { background: #f59e0b; }
.d-dot--green { background: #10b981; }
.glass-device__url {
margin-left: auto;
font-size: 0.75rem;
color: var(--c-text-3, #737373);
font-family: var(--font-mono, monospace);
}
.glass-device__body {
padding: 2.5rem;
}
.mock-widget {
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
}
.mock-icon {
font-size: 2.5rem;
background: rgba(184, 134, 11, 0.15);
border: 1px solid rgba(184, 134, 11, 0.3);
width: 64px;
height: 64px;
border-radius: 50%;
display: grid;
place-items: center;
}
.mock-widget h4 {
font-size: 1.25rem;
font-weight: 800;
color: var(--c-text-1, #ffffff);
margin: 0;
}
.mock-widget p {
font-size: 0.85rem;
color: var(--c-text-2, #a3a3a3);
margin: 0;
max-width: 280px;
}
.mock-metrics {
display: flex;
gap: 24px;
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid rgba(255, 255, 255, 0.08);
width: 100%;
justify-content: center;
}
.mock-metrics div {
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
}
.mock-metrics span { font-size: 0.7rem; color: var(--c-text-3, #737373); text-transform: uppercase; }
.mock-metrics strong { font-size: 1.1rem; color: var(--c-primary-light, #d4a017); }
@media (max-width: 900px) {
.split-hero__inner {
grid-template-columns: 1fr;
gap: 3rem;
}
}
</style>