Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/metonym/svelte-accessible-accordion

Accessible accordion component
https://github.com/metonym/svelte-accessible-accordion

a11y accessible accordion svelte svelte-component svelte-components typescript-definitions wai-aria

Last synced: 10 days ago
JSON representation

Accessible accordion component

Awesome Lists containing this project

README

        

# svelte-accessible-accordion

[![NPM][npm]][npm-url]

> Accessible accordion component for Svelte

`svelte-accessible-accordion` implements [WAI-ARIA design guidelines for an Accordion](https://www.w3.org/TR/wai-aria-practices/examples/accordion/accordion.html).

**Note**: This component is _unstyled_ by design. See the [Styling section](#styling).

Try it in the [Svelte REPL](https://svelte.dev/repl/85be3a105c3f4fe0892150380914be96).

---

## Installation

**Yarn**

```bash
yarn add -D svelte-accessible-accordion
```

**NPM**

```bash
npm i -D svelte-accessible-accordion
```

**pnpm**

```bash
pnpm i -D svelte-accessible-accordion
```

## Usage

### Basic

```svelte

import { Accordion, AccordionItem } from "svelte-accessible-accordion";

Content 1
Content 2
Content 2

```

### Slottable title

Customize the accordion title by using the `"title"` slot.

```svelte


Title 1
Content 1

Content 2
Content 2

```

### Multiselectable items

By default, only one accordion item can be expanded at one time.

Set `multiselect` to allow multiple items to be expandable.

```svelte

Content 1
Content 2
Content 2

```

### Expanded items

Use the `expanded` prop to expand an accordion item.

```svelte

Content 1
Content 2
Content 2

```

Bind to the `expanded` prop on the accordion item.

```svelte

import { Accordion, AccordionItem } from "svelte-accessible-accordion";

let expanded;


Content

```

### Disabled items

Set `disabled` to `true` to disable an accordion item

```svelte

Content 1
Content 2
Content 2

```

## Styling

Style the component by targeting the `[data-accordion]` and `[data-accordion-item]` attributes.

```css
[data-accordion] {
list-style: none;
}

[data-accordion-item] button {
border: 0;
border-radius: 0;
border-bottom: 1px solid #e0e0e0;
background: none;
font: inherit;
line-height: inherit;
color: inherit;
cursor: pointer;
padding: 0.5rem 1rem;
width: 100%;
text-align: left;
}

[data-accordion-item] button[disabled] {
opacity: 0.5;
cursor: not-allowed;
}

[data-accordion-item] [role="region"] {
padding: 1rem;
}
```

The semantic element structure resembles the following:

```yml
- ul [data-accordion] # Accordion
- li [data-accordion-item] # AccordionItem
- button
- [role="region"]
```

## API

### `Accordion` props

| Name | Type | Default value |
| :---------- | :-------- | :------------ |
| multiselect | `boolean` | `false` |

### `AccordionItem` props

| Name | Value | Default value |
| :------- | :----------------------- | :------------------------------------- |
| id | `string` | `"item" + Math.random().toString(36)"` |
| title | `string` or `slot:title` | `"Title"` |
| expanded | `boolean` | `false` |
| disabled | `boolean` | `false` |
| ref | `HTMLButtonElement` | `null` |

#### Forwarded events

- on:click

## TypeScript

Svelte version 3.31 or greater is required to use this component with TypeScript.

TypeScript definitions are located in the [types folder](./types).

## [Changelog](CHANGELOG.md)

## License

[MIT](LICENSE)

[npm]: https://img.shields.io/npm/v/svelte-accessible-accordion.svg?style=for-the-badge&color=%23ff3e00
[npm-url]: https://npmjs.com/package/svelte-accessible-accordion