158 production-ready, accessible, GDPR-compliant Astro components
Built by Wender Media — Web Agency from Halle (Saale), Germany
Live Playbook • Installation • Quick Start • Components • Design Tokens • Contributing
Interactive component playbook: astro.wendermedia.com
Browse all 158 components with live previews, props, and usage examples (Storybook).
npm install @wendermedia/astro-components
Or install directly from GitHub:
npm install git+https://github.com/arnoldwender/wm-project-astro-components.git
# Create a new project with pre-configured templates
npx @wendermedia/astro-components create my-project
# With a specific template
npx @wendermedia/astro-components create my-shop --template=ecommerce
# List available templates
npx @wendermedia/astro-components list
| Template | Description |
|---|---|
default |
Full-featured with all components |
minimal |
Lightweight with core components |
ecommerce |
Optimized for online shops |
blog |
Content-focused with SEO |
landing |
Single-page marketing sites |
---
import { SEO } from '@wendermedia/astro-components/seo';
import { Header, Footer } from '@wendermedia/astro-components/layout';
import { CookieConsent } from '@wendermedia/astro-components/accessibility';
---
<!DOCTYPE html>
<html lang="en">
<head>
<SEO
title="My Site"
description="Built with @wendermedia/astro-components"
siteName="My Site"
/>
</head>
<body>
<Header
navItems={[
{ label: 'Home', href: '/' },
{ label: 'About', href: '/about' },
]}
siteName="My Site"
/>
<main>
<slot />
</main>
<Footer siteName="My Site" />
<CookieConsent />
</body>
</html>
| Category | Components | Import Path |
|---|---|---|
| Layout | Header, Footer, Container, Grid, Section | @wendermedia/astro-components/layout |
| Layouts | Bento, Magazine, Dashboard, Portfolio, Newspaper, Split, Landing, Article, Docs, HeroLayout, ProductGrid | @wendermedia/astro-components/layouts |
| SEO | SEOHead, SchemaOrg/JsonLD, OpenGraph, TwitterCard, Canonical, RichSnippets, HreflangTags, Breadcrumbs | @wendermedia/astro-components/seo |
| Accessibility | CookieConsent, SkipLinks, FontResizer, ThemeToggle, BackToTop, FocusTrap, LanguageSwitcher, TextToSpeech, ScreenReaderOnly, LiveRegion, ReducedMotion, AccessibilityToolbar | @wendermedia/astro-components/accessibility |
| Navigation | Breadcrumbs, Pagination, MobileNav, Sidebar | @wendermedia/astro-components/navigation |
| UI | Accordion, Alert, Avatar, Badge, CommandPalette, Drawer, Dropdown, Modal, NewsTicker, Progress, Skeleton, Tabs, Toast, Tooltip | @wendermedia/astro-components/ui |
| Sections | Hero, CTA, Pricing, Team, Testimonials, FAQ, Features, Stats, Blog, Gallery, Contact, Timeline, Awards, Careers, CaseStudy, Comparison, Integrations, LogoCloud, Maintenance, Newsletter, Search, Video, and more | @wendermedia/astro-components/sections |
| E-commerce | Cart, ProductCard, ProductQuickView, Wishlist, AddToCartButton | @wendermedia/astro-components/ecommerce |
| Forms | ContactForm, Contact, Newsletter | @wendermedia/astro-components/forms |
| Media | VideoPlayer (YouTube/Vimeo/native), AudioPlayer, ImageGallery | @wendermedia/astro-components/media |
| Maps | GoogleMap (GDPR), OpenStreetMap | @wendermedia/astro-components/maps |
| Gallery | BeforeAfter (image comparison slider) | @wendermedia/astro-components/gallery |
| Images | OptimizedImage | @wendermedia/astro-components/images |
| Products | ProductCard (affiliate) | @wendermedia/astro-components/products |
| Social | SocialShare, SocialFollow | @wendermedia/astro-components/social |
| Content | ReadingProgress, ShareBar, TableOfContents | @wendermedia/astro-components/content |
| Design System | DesignSystemProvider, tokens, base styles, utilities | @wendermedia/astro-components/design-system |
---
import { VideoPlayer } from '@wendermedia/astro-components/media';
---
<!-- YouTube with consent gate -->
<VideoPlayer
provider="youtube"
videoId="dQw4w9WgXcQ"
title="Video Title"
requireConsent={true}
consentMessage="By playing, you agree to data processing by YouTube."
/>
<!-- Self-hosted video -->
<VideoPlayer
src="/videos/intro.mp4"
poster="/images/poster.jpg"
controls={true}
/>
---
import { Cart, ProductCard } from '@wendermedia/astro-components/ecommerce';
---
<ProductCard
id="prod-001"
name="Premium Headphones"
price={149.99}
image="/headphones.jpg"
showWishlist={true}
showQuickView={true}
/>
<Cart currency="EUR" locale="de-DE" checkoutUrl="/checkout" />
---
import { Breadcrumbs } from '@wendermedia/astro-components/navigation';
---
<Breadcrumbs
items={[
{ name: 'Home', url: '/' },
{ name: 'Products', url: '/products' },
{ name: 'Headphones', url: '/products/headphones' },
]}
showSchema={true}
/>
---
import { CookieConsent } from '@wendermedia/astro-components/accessibility';
---
<CookieConsent
showSettings={true}
analyticsEnabled={false}
marketingEnabled={false}
privacyUrl="/datenschutz"
position="bottom"
/>
Centralized design system powered by Style Dictionary:
npm run tokens:build
/* CSS Custom Properties */
@import '@wendermedia/astro-components/tokens/dist/tokens.css';
.button {
background: var(--color-brand-primary);
padding: var(--space-4) var(--space-8);
border-radius: var(--border-radius-lg);
}
// JavaScript / TypeScript
import { tokens } from '@wendermedia/astro-components/tokens';
const primaryColor = tokens.color.brand.primary.value;
// SCSS
@use '@wendermedia/astro-components/tokens/dist/tokens';
.button {
background: tokens.$color-brand-primary;
}
# Unit tests
npm run test
# With coverage
npm run test:coverage
# Accessibility tests (axe-core)
npm run test:a11y
import {
runA11yAudit,
expectNoA11yViolations,
} from '@wendermedia/astro-components/testing';
describe('MyComponent', () => {
it('has no accessibility violations', async () => {
const element = document.querySelector('.my-component');
await expectNoA11yViolations(element);
});
});
Browse all 158 components interactively at astro.wendermedia.com.
Run locally:
npm run storybook # Start dev server on port 6006
npm run build-storybook # Build static site
Connect to WordPress as a headless CMS:
import {
createWordPressClient,
fetchPosts,
fetchMenus,
} from '@wendermedia/astro-components/integrations/wordpress';
const wp = createWordPressClient({
url: 'https://your-wordpress-site.com',
});
const posts = await fetchPosts(wp, { perPage: 10 });
const menu = await fetchMenus(wp);
See the WordPress Integration Guide for full documentation.
@wendermedia/astro-components/
src/
accessibility/ # A11y components
content/ # Content components
design-system/ # Base styles & tokens
ecommerce/ # E-commerce components
forms/ # Form components
gallery/ # Gallery components
images/ # Image optimization
layout/ # Layout components
layouts/ # Page layout templates
maps/ # Map components
media/ # Media players
navigation/ # Navigation components
products/ # Product display
sections/ # Section templates
seo/ # SEO components
social/ # Social components
ui/ # UI primitives
integrations/ # Framework integrations (React, Vue, Svelte, Solid, WordPress)
tokens/ # Design tokens (Style Dictionary)
testing/ # Test utilities
cli/ # CLI scaffolding tool
templates/ # Project templates
docs/ # Documentation
@astrojs/react - React island support@astrojs/vue - Vue island support@astrojs/svelte - Svelte island support@astrojs/solid-js - Solid island supportGSAP - Hero animationsWe welcome contributions! Please read our Contributing Guide before submitting a Pull Request.
git checkout -b feat/amazing-featurenpm run testnpm run changesetPlease also review our Code of Conduct.
We use Changesets for version management:
npm run changeset # Add a changeset
npm run version # Update versions
npm run release # Publish release
See CHANGELOG.md for release history.
Arnold Wender
This project is licensed under the MIT License.
Copyright (c) 2007-2026 Wender Media - Arnold Wender.
Made with care by Wender Media in Halle (Saale), Germany
If you are a racist, fascist, or extremist of any kind or have another kind of mental disability that makes you discriminate against other human beings — please don't use my software.