Accordion
Organizes content into collapsible sections, allowing users to focus on one section at a time.
	<script lang="ts">
  import { Accordion } from "bits-ui";
  import { CaretDown } from "$icons/index.js";
 
  const items = [
    {
      title: "What is the meaning of life?",
      content:
        "To become a better person, to help others, and to leave the world a better place than you found it."
    },
    {
      title: "How do I become a better person?",
      content:
        "Read books, listen to podcasts, and surround yourself with people who inspire you."
    },
    {
      title: "What is the best way to help others?",
      content: "Give them your time, attention, and love."
    }
  ];
 
  let value = $state<string[]>([]);
</script>
 
<Accordion.Root class="w-full sm:max-w-[70%]" type="multiple" bind:value>
  {#each items as item, i}
    <Accordion.Item value={`${i}`} class="group border-b border-dark-10 px-1.5">
      <Accordion.Header>
        <Accordion.Trigger
          class="flex w-full flex-1 items-center justify-between py-5 text-[15px] font-medium transition-all [&[data-state=open]>span>svg]:rotate-180"
        >
          {item.title}
          <span
            class="inline-flex size-8 items-center justify-center rounded-[7px] bg-transparent transition-all hover:bg-dark-10"
          >
            <CaretDown class="size-[18px] transition-all duration-200" />
          </span>
        </Accordion.Trigger>
      </Accordion.Header>
      <Accordion.Content
        class="overflow-hidden text-sm tracking-[-0.01em] data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
      >
        <div class="pb-[25px]">
          {item.content}
        </div>
      </Accordion.Content>
    </Accordion.Item>
  {/each}
</Accordion.Root>
	
Structure
	<script lang="ts">
	import { Accordion } from "bits-ui";
</script>
 
<Accordion.Root>
	<Accordion.Item>
		<Accordion.Header>
			<Accordion.Trigger />
		</Accordion.Header>
		<Accordion.Content />
	</Accordion.Item>
</Accordion.Root>
	
API Reference
The root accordion component used to set and manage the state of the accordion.
| Property | Type | Description | 
|---|---|---|
multiple  |  boolean |  Whether or not multiple accordion items can be active at the same time. Default:  false | 
disabled  |  boolean |  Whether or not the accordion is disabled. Default:  false | 
value  |  union   |  The active accordion item value. Default:  —— undefined | 
onValueChange  |  function   |  A callback function called when the active accordion item value changes. Default:  —— undefined | 
asChild  |  boolean |  Whether to use render delegation with this component or not. Default:  false | 
el  |  HTMLDivElement |  The underlying DOM element being rendered. You can bind to this to programatically interact with the element. Default:  —— undefined | 
| Slot Property | Type | Description | 
|---|---|---|
builder  |  object   |  The builder attributes and actions to apply to the element if using the   | 
| Data Attribute | Value | Description | 
|---|---|---|
data-orientation |  enum   |  The orientation of the accordion.  | 
data-accordion-root |   |  Present on the root element.  | 
An accordion item.
| Property | Type | Description | 
|---|---|---|
value *  Required |  string |  The value of the accordion item. Default:  —— undefined | 
disabled  |  boolean |  Whether or not the accordion item is disabled. Default:  false | 
asChild  |  boolean |  Whether to use render delegation with this component or not. Default:  false | 
el  |  HTMLDivElement |  The underlying DOM element being rendered. You can bind to this to programatically interact with the element. Default:  —— undefined | 
| Slot Property | Type | Description | 
|---|---|---|
builder  |  object   |  The builder attributes and actions to apply to the element if using the   | 
| Data Attribute | Value | Description | 
|---|---|---|
data-state |  enum   |  The state of the accordion item.  | 
data-disabled |   |  Present when the accordion item is disabled.  | 
data-accordion-item |  —— |  Present on the item element.  | 
The accordion item header, which wraps the trigger and makes it more accessible.
| Property | Type | Description | 
|---|---|---|
level  |  enum   |  The heading level to use for the header. This will be set as the  Default:  —— undefined | 
asChild  |  boolean |  Whether to use render delegation with this component or not. Default:  false | 
el  |  HTMLDivElement |  The underlying DOM element being rendered. You can bind to this to programatically interact with the element. Default:  —— undefined | 
| Slot Property | Type | Description | 
|---|---|---|
builder  |  object   |  The builder attributes and actions to apply to the element if using the   | 
| Data Attribute | Value | Description | 
|---|---|---|
data-heading-level |  enum   |  The heading level of the header.  | 
data-accordion-header |  —— |  Present on the header element.  | 
The accordion item trigger, which opens and closes the accordion item.
| Property | Type | Description | 
|---|---|---|
asChild  |  boolean |  Whether to use render delegation with this component or not. Default:  false | 
el  |  HTMLButtonElement |  The underlying DOM element being rendered. You can bind to this to programatically interact with the element. Default:  —— undefined | 
| Slot Property | Type | Description | 
|---|---|---|
builder  |  object   |  The builder attributes and actions to apply to the element if using the   | 
| Data Attribute | Value | Description | 
|---|---|---|
data-state |  enum   |  The state of the accordion item.  | 
data-disabled |  —— |  Present when the accordion item is disabled.  | 
data-value |  —— |  The value of the accordion item.  | 
data-accordion-trigger |  —— |  Present on the trigger element.  | 
The accordion item content, which is displayed when the item is open.
| Property | Type | Description | 
|---|---|---|
transition  |  function   |  A Svelte transition function to use when transitioning the content in and out. Default:  —— undefined | 
transitionConfig  |  TransitionConfig |  The configuration to apply to the transition. Default:  —— undefined | 
inTransition  |  function   |  A Svelte transition function to use when transitioning the content in and out. Default:  —— undefined | 
inTransitionConfig  |  TransitionConfig |  The configuration to apply to the transition. Default:  —— undefined | 
outTransition  |  function   |  A Svelte transition function to use when transitioning the content in and out. Default:  —— undefined | 
outTransitionConfig  |  TransitionConfig |  The configuration to apply to the transition. Default:  —— undefined | 
asChild  |  boolean |  Whether to use render delegation with this component or not. Default:  false | 
el  |  HTMLDivElement |  The underlying DOM element being rendered. You can bind to this to programatically interact with the element. Default:  —— undefined | 
| Slot Property | Type | Description | 
|---|---|---|
builder  |  object   |  The builder attributes and actions to apply to the element if using the   | 
| Data Attribute | Value | Description | 
|---|---|---|
data-state |  enum   |  The state of the accordion item.  | 
data-disabled |  —— |  Present when the accordion item is disabled.  | 
data-value |  —— |  The value of the accordion item.  | 
data-accordion-content |  —— |  Present on the content element.  | 
Examples
Multiple
Multiple accordion items open at the same time using the multiple prop.
	<Accordion.Root multiple>
	<!-- ... -->
</Accordion.Root>
	
Controlled
You can programmatically control the active of the accordion item(s) using the value prop.
	<script lang="ts">
	let value = "item-1";
</script>
 
<Accordion.Root bind:value>
	<Accordion.Item value="item-1">
		<Accordion.Header>
			<Accordion.Trigger />
		</Accordion.Header>
		<Accordion.Content />
	</Accordion.Item>
	<Accordion.Item value="item-2">
		<Accordion.Header>
			<Accordion.Trigger />
		</Accordion.Header>
		<Accordion.Content />
	</Accordion.Item>
</Accordion.Root>