Accordion
A wrapper for animations, made with Tailwind CSS. Works seamlessly with any children component.
accordion
Section 1
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam dignissim diam ac enim finibus, ut luctus est porttitor. Etiam ultrices turpis tellus.
Section 2
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam dignissim diam ac enim finibus, ut luctus est porttitor. Etiam ultrices turpis tellus.
Section 3
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam dignissim diam ac enim finibus, ut luctus est porttitor. Etiam ultrices turpis tellus.
use leptos::prelude::*; use crate::components::ui::accordion::{ Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionTitle, }; #[component] pub fn DemoAccordion() -> impl IntoView { const DEMO_TEXT_ACCORDION: &str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam dignissim diam ac enim finibus, ut luctus est porttitor. Etiam ultrices turpis tellus."; let active_accordion = RwSignal::new(0u8); let toggle_accordion = move |num: u8| { active_accordion.update(|current| { *current = if *current == num { 0 } else { num }; }); }; view! { <Accordion class="max-w-[500px]"> <AccordionItem class:active=move || active_accordion.get() == 1> <AccordionHeader on:click=move |_| toggle_accordion(1)> <AccordionTitle>Section 1</AccordionTitle> </AccordionHeader> <AccordionContent> <p>{DEMO_TEXT_ACCORDION}</p> </AccordionContent> </AccordionItem> <AccordionItem class:active=move || active_accordion.get() == 2> <AccordionHeader on:click=move |_| toggle_accordion(2)> <AccordionTitle>Section 2</AccordionTitle> </AccordionHeader> <AccordionContent> <p>{DEMO_TEXT_ACCORDION}</p> </AccordionContent> </AccordionItem> <AccordionItem class:active=move || active_accordion.get() == 3> <AccordionHeader on:click=move |_| toggle_accordion(3)> <AccordionTitle>Section 3</AccordionTitle> </AccordionHeader> <AccordionContent> <p>{DEMO_TEXT_ACCORDION}</p> </AccordionContent> </AccordionItem> </Accordion> } }
Installation
You can run either of the following commands:
# cargo install ui-cli --forceui add demo_accordionui add accordion
Update the imports to match your project setup.
Copy and paste the following code into your project:
components/ui/accordion.rs
use icons::ChevronDown; use leptos::prelude::*; use leptos_ui::clx; mod components { use super::*; clx! {Accordion, div, "accordion w-full rounded-lg overflow-hidden shadow-lg"} clx! {AccordionTitle, h3, "m-0 text-base font-medium"} clx! {AccordionItem, div, "bg-card/70 border-b border-input accordion__item group last:border-b-0"} clx! {AccordionContent, div, "accordion__content max-h-0 overflow-hidden px-5 transition-all duration-300 ease-in-out group-[.active]:max-h-[200px] group-[.active]:pt-0 group-[.active]:pb-[15px]"} clx! {HeaderRoot, div, "accordion__header py-[15px] px-5 transition-colors duration-300 ease-in-out hover:bg-card flex justify-between items-center hover:cursor-pointer group-[.active]:bg-card"} } pub use components::*; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ✨ FUNCTIONS ✨ */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ #[component] pub fn AccordionHeader(children: Children) -> impl IntoView { view! { <HeaderRoot> {children()} <ChevronDown class="size-4 transition-transform duration-300 ease-in-out group-[.active]:rotate-180" /> </HeaderRoot> } }
Update the imports to match your project setup.
Usage
// Coming soon 🦀