Card

Flexible content containers with multiple variants for displaying grouped information.

Card Variants

Standard Card

Basic card with header, body, and footer

Card Title

Card subtitle text

This is a basic card with standard content. Cards are perfect for grouping related information together.

Card with Image

Image header card

Image Card

Beautiful card design with an image header.

Elevated Card

Shadow-based elevation

Elevated Card

This card uses shadow instead of border for a more elevated appearance.

Compact Card

Reduced padding variant

Compact Card

Less padding for dense layouts.

Card States

Status Cards

Cards with status indicators

Success

Operation completed successfully.

Warning

Please review this information.

Error

An error has occurred.

Information

Important information to note.

Horizontal Card

Side-by-side layout

Horizontal Layout

Image and content arranged side by side.

Real Estate Use Cases

Property Card

New
🏠 Property Image

€850,000

3 Bed 2 Bath 150m²

Modern apartment in city center with panoramic views.

Parking Balcony Elevator

Agent Card

John Smith

Senior Real Estate Agent

15+ years experience • 200+ properties sold

Implementation Guide

HTML Structure

<!-- Standard Card -->
<div class="lyd-card">
    <div class="lyd-card-header">
        <h3 class="lyd-card-title">Card Title</h3>
        <div class="lyd-card-subtitle">Optional subtitle</div>
    </div>
    <div class="lyd-card-body">
        <p>Your card content goes here.</p>
    </div>
    <div class="lyd-card-footer">
        <button class="lyd-button secondary">Cancel</button>
        <button class="lyd-button primary">Confirm</button>
    </div>
</div>

<!-- Image Card -->
<div class="lyd-card">
    <img src="image.jpg" alt="Description" class="lyd-card-image">
    <div class="lyd-card-body">
        <h3 class="lyd-card-title">Image Card</h3>
        <p>Content below the image.</p>
    </div>
</div>

Clickable Card JavaScript

// Make card clickable
document.querySelectorAll('.lyd-card.clickable').forEach(card => {
    card.addEventListener('click', () => {
        // Navigate to detail page
        window.location.href = card.dataset.href;
    });
});

// Card hover effects
document.querySelectorAll('.lyd-card').forEach(card => {
    card.addEventListener('mouseenter', () => {
        card.style.transform = 'translateY(-4px)';
    });
    
    card.addEventListener('mouseleave', () => {
        card.style.transform = 'translateY(0)';
    });
});

React/Next.js Component

// components/Card.tsx
import { ReactNode, HTMLAttributes } from 'react';

interface CardProps extends HTMLAttributes {
  title?: string;
  subtitle?: string;
  image?: string;
  footer?: ReactNode;
  variant?: 'default' | 'elevated' | 'compact';
  status?: 'success' | 'warning' | 'error' | 'info';
  horizontal?: boolean;
  clickable?: boolean;
  children: ReactNode;
}

export const Card = ({
  title,
  subtitle,
  image,
  footer,
  variant = 'default',
  status,
  horizontal = false,
  clickable = false,
  children,
  className = '',
  ...props
}: CardProps) => {
  const cardClasses = [
    'lyd-card',
    variant !== 'default' && variant,
    status,
    horizontal && 'horizontal',
    clickable && 'clickable',
    className
  ].filter(Boolean).join(' ');
  
  return (
    <div className={cardClasses} {...props}>
      {image && (
        <img src={image} alt="" className="lyd-card-image" />
      )}
      
      {horizontal ? (
        <div className="lyd-card-content">
          {(title || subtitle) && (
            <div className="lyd-card-header">
              {title && <h3 className="lyd-card-title">{title}</h3>}
              {subtitle && <div className="lyd-card-subtitle">{subtitle}</div>}
            </div>
          )}
          <div className="lyd-card-body">{children}</div>
          {footer && <div className="lyd-card-footer">{footer}</div>}
        </div>
      ) : (
        <>
          {(title || subtitle) && (
            <div className="lyd-card-header">
              {title && <h3 className="lyd-card-title">{title}</h3>}
              {subtitle && <div className="lyd-card-subtitle">{subtitle}</div>}
            </div>
          )}
          <div className="lyd-card-body">{children}</div>
          {footer && <div className="lyd-card-footer">{footer}</div>}
        </>
      )}
    </div>
  );
};

API Reference

Class Description
.lyd-card Base card container
.lyd-card-header Card header section
.lyd-card-title Card title text
.lyd-card-subtitle Card subtitle text
.lyd-card-body Card body content
.lyd-card-footer Card footer with actions
.lyd-card-image Card image element
.elevated Shadow-based card
.compact Reduced padding variant
.horizontal Horizontal layout
.clickable Interactive card
.success Success status indicator
.warning Warning status indicator
.error Error status indicator
.info Info status indicator

Accessibility & Best Practices

Semantic HTML

  • Use appropriate heading levels
  • Ensure content flow is logical
  • Article or section elements when appropriate
  • Meaningful alt text for images

Keyboard Navigation

  • Interactive elements are tabbable
  • Clear focus indicators
  • Logical tab order
  • Enter/Space for clickable cards

Screen Readers

  • Clear content structure
  • Descriptive headings
  • Status announcements
  • Link purpose is clear

Visual Design

  • Sufficient contrast
  • Clear visual hierarchy
  • Consistent spacing
  • Responsive layout