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