Accordion
Default Accordion
<script>
import { AccordionItem, Accordion } from "flowbite-svelte";
</script>
<Accordion>
<AccordionItem>
{#snippet header()}My Header 1{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="text-gray-500 dark:text-gray-400">
Check out this guide to learn how to <a href="/" target="_blank" rel="noreferrer" class="text-blue-600 hover:underline dark:text-blue-500">get started</a>
and start developing websites even faster with components on top of Tailwind CSS.
</p>
</AccordionItem>
<AccordionItem>
{#snippet header()}My Header 2{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="mb-2 text-gray-500 dark:text-gray-400">Learn more about these technologies:</p>
<ul class="list-disc ps-5 text-gray-500 dark:text-gray-400">
<li>
<a href="/" target="_blank" rel="noreferrer" class="text-blue-600 hover:underline dark:text-blue-500">Lorem ipsum</a>
</li>
<li>
<a href="https://tailwindui.com/" rel="noreferrer" target="_blank" class="text-blue-600 hover:underline dark:text-blue-500">Tailwind UI</a>
</li>
</ul>
</AccordionItem>
</Accordion>
Open multiple
<script lang="ts">
import { Accordion, AccordionItem } from "flowbite-svelte";
</script>
<Accordion multiple>
<AccordionItem>
{#snippet header()}
Header 1-1
{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
<AccordionItem>
{#snippet header()}
Header 1-2
{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
</Accordion>
Open
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...
<script>
import { AccordionItem, Accordion } from "flowbite-svelte";
</script>
<Accordion>
<AccordionItem open>
{#snippet header()}Header 2-1{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
<AccordionItem>
{#snippet header()}Header 2-2{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
</Accordion>
Color
<script>
import { AccordionItem, Accordion } from "flowbite-svelte";
</script>
<Accordion activeClass="bg-blue-100 dark:bg-gray-800 text-blue-600 dark:text-white focus:ring-4 focus:ring-blue-200 dark:focus:ring-blue-800" inactiveClass="text-gray-500 dark:text-gray-400 hover:bg-blue-100 dark:hover:bg-gray-800">
<AccordionItem>
{#snippet header()}Header 2-1{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
<AccordionItem>
{#snippet header()}Header 2-2{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
</Accordion>
Flush
<script>
import { AccordionItem, Accordion } from "flowbite-svelte";
</script>
<Accordion flush>
<AccordionItem>
{#snippet header()}Header 2-1{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
<AccordionItem>
{#snippet header()}Header 2-2{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
</Accordion>
Arrow style
<script>
import { AccordionItem, Accordion } from "flowbite-svelte";
import { ChevronDoubleUpOutline, ChevronDoubleDownOutline } from "flowbite-svelte-icons";
</script>
<Accordion>
<AccordionItem>
{#snippet header()}Header 2-1{/snippet}
{#snippet arrowup()}
<ChevronDoubleUpOutline class="-me-0.5 h-6 w-6" />
{/snippet}
{#snippet arrowdown()}
<ChevronDoubleDownOutline class="-me-0.5 h-6 w-6" />
{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
<AccordionItem>
{#snippet header()}Header 2-2{/snippet}
{#snippet arrowup()}
<ChevronDoubleUpOutline class="-me-0.5 h-6 w-6" />
{/snippet}
{#snippet arrowdown()}
<ChevronDoubleDownOutline class="-me-0.5 h-6 w-6" />
{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
</Accordion>
Icon Accordion
<script>
import { AccordionItem, Accordion } from "flowbite-svelte";
import { CartSolid, CogOutline } from "flowbite-svelte-icons";
</script>
<Accordion>
<AccordionItem>
{#snippet header()}
<div class="flex items-center gap-2">
<CartSolid />
<span>My Header 1</span>
</div>
{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo...</p>
<p class="text-gray-500 dark:text-gray-400">
Check out this guide to learn how to <a href="/" target="_blank" rel="noreferrer" class="text-blue-600 hover:underline dark:text-blue-500">get started</a>
and start websites even faster with components on top of Tailwind CSS.
</p>
</AccordionItem>
<AccordionItem>
{#snippet header()}
<div class="flex items-center gap-2">
<CogOutline />
<span>My Header 2</span>
</div>
{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sintexplicabo...</p>
</AccordionItem>
</Accordion>
Multiple mode
<script lang="ts">
import { Accordion, AccordionItem } from "flowbite-svelte";
</script>
<Accordion multiple>
<AccordionItem>
{#snippet header()}
Header 1-1
{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
<AccordionItem>
{#snippet header()}
Header 1-2
{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
</Accordion>
Multiple mode 2
<script>
import { AccordionItem, Accordion, Button } from "flowbite-svelte";
const items = [false, false, false];
const open_all = () => items.forEach((_, i) => (items[i] = true));
const close_all = () => items.forEach((_, i) => (items[i] = false));
</script>
<Button onclick={open_all}>Open all</Button>
<Button onclick={close_all}>Close all</Button>
<Accordion multiple>
<AccordionItem bind:open={items[0]}>
{#snippet header()}My Header 1{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="text-gray-500 dark:text-gray-400">
Check out this guide to learn how to <a href="/" target="_blank" rel="noreferrer" class="text-blue-600 hover:underline dark:text-blue-500">get started</a>
and start developing websites even faster with components on top of Tailwind CSS.
</p>
</AccordionItem>
<AccordionItem bind:open={items[1]}>
{#snippet header()}My Header 2{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="mb-2 text-gray-500 dark:text-gray-400">Learn more about these technologies:</p>
</AccordionItem>
<AccordionItem bind:open={items[2]}>
{#snippet header()}My Header 3{/snippet}
<p>Something more</p>
</AccordionItem>
</Accordion>
Transitions
<script>
import { AccordionItem, Accordion } from "flowbite-svelte";
import { blur, fade } from "svelte/transition";
</script>
<Accordion>
<AccordionItem transitionParams={{ duration: 1000 }}>
{#snippet header()}Slide duration:1000{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
<AccordionItem transitionType={blur} transitionParams={{ duration: 300 }}>
{#snippet header()}Blur duration:300{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
<AccordionItem transitionType={fade} transitionParams={{ duration: 300 }}>
{#snippet header()}Fade duration:300{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
</AccordionItem>
</Accordion>
Nesting
<script>
import { AccordionItem, Accordion } from "flowbite-svelte";
</script>
<Accordion>
<AccordionItem open>
{#snippet header()}My Header 1{/snippet}
<Accordion>
<AccordionItem>
{#snippet header()}My Header 1{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="text-gray-500 dark:text-gray-400">
Check out this guide to learn how to <a href="/" target="_blank" rel="noreferrer" class="text-blue-600 hover:underline dark:text-blue-500">get started</a>
and start developing websites even faster with components on top of Tailwind CSS.
</p>
</AccordionItem>
<AccordionItem>
{#snippet header()}My Header 2{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="mb-2 text-gray-500 dark:text-gray-400">Learn more about these technologies:</p>
<ul class="list-disc ps-5 text-gray-500 dark:text-gray-400">
<li><a href="/" target="_blank" rel="noreferrer" class="text-blue-600 hover:underline dark:text-blue-500">Lorem ipsum</a></li>
<li><a href="https://tailwindui.com/" rel="noreferrer" target="_blank" class="text-blue-600 hover:underline dark:text-blue-500">Tailwind UI</a></li>
</ul>
</AccordionItem>
</Accordion>
</AccordionItem>
<AccordionItem>
{#snippet header()}My Header 2{/snippet}
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="mb-2 text-gray-500 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo ab necessitatibus sint explicabo ...</p>
<p class="mb-2 text-gray-500 dark:text-gray-400">Learn more about these technologies:</p>
<ul class="list-disc ps-5 text-gray-500 dark:text-gray-400">
<li><a href="/" target="_blank" rel="noreferrer" class="text-blue-600 hover:underline dark:text-blue-500">Lorem ipsum</a></li>
<li><a href="https://tailwindui.com/" rel="noreferrer" target="_blank" class="text-blue-600 hover:underline dark:text-blue-500">Tailwind UI</a></li>
</ul>
</AccordionItem>
</Accordion>
Transtion None
Content A
Content B
Content C
<script lang="ts">
import { AccordionItem, Accordion } from "flowbite-svelte";
</script>
<Accordion transitionType="none">
<AccordionItem>
{#snippet header()}My Header 1{/snippet}
Content A
</AccordionItem>
<AccordionItem>
{#snippet header()}My Header 2{/snippet}
Content B
</AccordionItem>
</Accordion>
<Accordion>
<AccordionItem transitionType="none">
{#snippet header()}transitionType: "none"{/snippet}
Content C
</AccordionItem>
<AccordionItem>
{#snippet header()}transitionType: default{/snippet}
Content D
</AccordionItem>
</Accordion>
Breakpoints
<script>
import { AccordionItem, useMediaQuery, P } from "flowbite-svelte";
const isMdAndUp = useMediaQuery("(min-width: 768px)");
</script>
<AccordionItem open={isMdAndUp()}>
{#snippet header()}Opens on tablets and desktop{/snippet}
<P>This content is visible on medium screens and larger.</P>
</AccordionItem>
<script>
import { AccordionItem, useBreakpoints, P } from "flowbite-svelte";
const breakpoints = useBreakpoints();
</script>
<AccordionItem open={breakpoints.md}>
{#snippet header()}Opens on medium screens+{/snippet}
<P>Content for tablets and desktop users.</P>
</AccordionItem>
<script>
import { AccordionItem, useCurrentBreakpoint, useBreakpoints, P } from "flowbite-svelte";
const breakpoints = useBreakpoints();
const getCurrentBreakpoint = useCurrentBreakpoint();
const currentBp = $derived(getCurrentBreakpoint());
</script>
<AccordionItem open={breakpoints.lg}>
{#snippet header()}Desktop Only (Current: {currentBp}){/snippet}
<P>This opens only on large screens and above.</P>
</AccordionItem>
<script>
import { AccordionItem, useMediaQuery, useBreakpoints, P } from "flowbite-svelte";
const breakpoints = useBreakpoints();
// Open from sm to lg (640px - 1023px)
const tabletRange = $derived(breakpoints.sm && !breakpoints.lg);
// Open on specific breakpoints only
const specificSizes = $derived((breakpoints.sm && !breakpoints.md) || (breakpoints.lg && !breakpoints.xl));
// Custom pixel range
const customRange = useMediaQuery("(min-width: 640px) and (max-width: 1023px)");
</script>
<AccordionItem open={tabletRange}>
{#snippet header()}Tablet Range (640px - 1023px){/snippet}
<P>Open on tablets, closed on phones and large desktops.</P>
</AccordionItem>
<AccordionItem open={specificSizes}>
{#snippet header()}Small phones OR Large desktops only{/snippet}
<P>Open on sm-only OR lg-only, closed on other sizes.</P>
</AccordionItem>
<AccordionItem open={customRange()}>
{#snippet header()}Custom Range{/snippet}
<P>Define exact pixel ranges for precise control.</P>
</AccordionItem>
Expanded by default on mobile for better accessibility, collapsed on larger screens to save space.
<script lang="ts">
import { Accordion, AccordionItem, P, useMediaQuery, useBreakpoints, useCurrentBreakpoint } from "flowbite-svelte";
// Different approaches to responsive behavior
const isMdAndUp = useMediaQuery("(min-width: 768px)");
const breakpoints = useBreakpoints();
const getCurrentBreakpoint = useCurrentBreakpoint();
const currentBp = $derived(getCurrentBreakpoint());
const tabletOnly = $derived(breakpoints.sm && !breakpoints.lg);
const mobileOnly = $derived(!breakpoints.sm);
</script>
<!-- Always open on medium+ screens -->
<Accordion>
<AccordionItem open={isMdAndUp()}>
{#snippet header()}
📱 Tablet & Desktop (Current: {currentBp})
{/snippet}
<P>Opens on tablets and larger screens. Stays closed on mobile.</P>
</AccordionItem>
<AccordionItem>
{#snippet header()}Always Interactive{/snippet}
<P>This accordion item behaves normally on all screen sizes.</P>
</AccordionItem>
</Accordion>
<!-- Open only in tablet range -->
<Accordion>
<AccordionItem open={tabletOnly}>
{#snippet header()}
📱 Tablet Only (640px - 1023px)
{/snippet}
<P>This opens automatically on tablets but closes on mobile phones and large desktop screens.</P>
</AccordionItem>
</Accordion>
<!-- Mobile-first approach -->
<Accordion>
<AccordionItem open={mobileOnly}>
{#snippet header()}
📱 Mobile Only (below 640px)
{/snippet}
<P>Expanded by default on mobile for better accessibility, collapsed on larger screens to save space.</P>
</AccordionItem>
</Accordion>