Accordion

Collapsible content panels for organizing information with smooth animations and professional styling.

Accordion Variants

Single Accordion

Standard accordion with smooth expand/collapse animation

This luxury penthouse offers breathtaking panoramic views of the city skyline. Features include floor-to-ceiling windows, premium finishes, and a private terrace.

Accordion Group

Multiple accordions grouped together

Area: 185 m²

Rooms: 3 Bedrooms, 2 Bathrooms

Features: Open-plan living, Modern kitchen, Home office

  • 24/7 Concierge Service
  • Fitness Center & Spa
  • Rooftop Terrace
  • Underground Parking

District: City Center

Public Transport: 2 min to U-Bahn

Nearby: Shopping, Restaurants, Parks

Glassmorphism Style

Premium glassmorphism effect with blur

Smart home technology, Climate control, Security system, Premium appliances

Real Estate Use Cases

Property FAQ

The price includes the property, one parking space, and a storage unit. Kitchen appliances and built-in wardrobes are also included.

Yes, pets are welcome in the building. There is a dedicated pet area and nearby parks for walking.

Service Charge: €450/month

Includes: Heating, water, maintenance, concierge

Not included: Electricity, internet

Implementation Guide

HTML Usage

<!-- Single Accordion -->
<div class="lyd-accordion">
    <button class="lyd-accordion-header">
        <span>Accordion Title</span>
        <svg class="lyd-accordion-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
        </svg>
    </button>
    <div class="lyd-accordion-content">
        <p>Content goes here...</p>
    </div>
</div>

<!-- Accordion Group -->
<div class="lyd-accordion-group">
    <div class="lyd-accordion">
        <button class="lyd-accordion-header active">
            <span>First Section</span>
            <svg class="lyd-accordion-icon">...</svg>
        </button>
        <div class="lyd-accordion-content active">
            <p>First content...</p>
        </div>
    </div>
    <!-- More accordions... -->
</div>

React/Next.js Integration

// components/Accordion.tsx
import { useState, ReactNode } from 'react';

interface AccordionProps {
  title: string;
  children: ReactNode;
  defaultOpen?: boolean;
  variant?: 'default' | 'bordered' | 'glassmorphism';
}

export const Accordion = ({ 
  title, 
  children, 
  defaultOpen = false,
  variant = 'default' 
}: AccordionProps) => {
  const [isOpen, setIsOpen] = useState(defaultOpen);
  
  return (
    <div className={`lyd-accordion ${variant}`}>
      <button 
        className={`lyd-accordion-header ${isOpen ? 'active' : ''}`}
        onClick={() => setIsOpen(!isOpen)}
      >
        <span>{title}</span>
        <svg className="lyd-accordion-icon" viewBox="0 0 24 24">
          <path d="M19 9l-7 7-7-7" />
        </svg>
      </button>
      <div className={`lyd-accordion-content ${isOpen ? 'active' : ''}`}>
        {children}
      </div>
    </div>
  );
};

JavaScript Implementation

// Accordion functionality
document.querySelectorAll('.lyd-accordion-header').forEach(header => {
  header.addEventListener('click', () => {
    const accordion = header.parentElement;
    const content = accordion.querySelector('.lyd-accordion-content');
    const isOpen = header.classList.contains('active');
    
    // Toggle current accordion
    header.classList.toggle('active');
    content.classList.toggle('active');
    
    // Optional: Close other accordions in group
    if (accordion.parentElement.classList.contains('lyd-accordion-group')) {
      const siblings = accordion.parentElement.querySelectorAll('.lyd-accordion');
      siblings.forEach(sibling => {
        if (sibling !== accordion) {
          sibling.querySelector('.lyd-accordion-header').classList.remove('active');
          sibling.querySelector('.lyd-accordion-content').classList.remove('active');
        }
      });
    }
  });
});

API Reference

Class Description
.lyd-accordion Base accordion container
.lyd-accordion-header Clickable header button
.lyd-accordion-content Collapsible content container
.lyd-accordion-icon Chevron icon that rotates
.lyd-accordion-group Container for multiple accordions
.active Applied to open accordion elements
.bordered Adds border styling
.glassmorphism Glassmorphism effect variant

Accessibility & Best Practices

Keyboard Navigation

  • Tab to navigate between accordions
  • Enter/Space to toggle accordion
  • Arrow keys for navigation within group

Screen Reader Support

  • Use semantic button elements
  • Add aria-expanded attribute
  • Include aria-controls for content
  • Provide clear labels

Best Practices

  • Keep titles concise and descriptive
  • Use icons consistently
  • Provide smooth animations
  • Consider mobile touch targets
  • Allow keyboard-only usage