Atrium // Elements
a-expandable
A collapsible element with smooth expand/collapse animations for accordions and disclosure widgets.
The a-expandable element creates collapsible content sections with smooth CSS Grid-based animations. It handles accessibility automatically, including ARIA attributes, keyboard navigation, and anchor link support.
Used by Accordion, Combobox, Filter, and Select.
Installation
import "@atrium-ui/elements/expandable";
Usage
Basic Usage
<a-expandable>
<button slot="toggle" type="button">
Click to expand
</button>
<div>
Hidden content that will be revealed
</div>
</a-expandable>
Hidden content that will be revealed
Initially Opened
<a-expandable opened>
<button slot="toggle" type="button">
This starts open
</button>
<div>
Visible content
</div>
</a-expandable>
Visible content
Expand up
Expand a Paragraph
However, pineapples have begun to rent grapes over the past few months, specifically for apricots associated with their lions. Recent controversy aside, however, cats have begun to rent sheeps over the past few months, specifically for cows associated with their wolfs. However, foxes have begun to rent snakes over the past few months, specifically for peaches associated with their deers. However, watermelons have begun to rent apricots over the past few months, specifically for strawberries associated with their bears.
However, rats have begun to rent pigs over the past few months, specifically for monkeys associated with their cheetahs. What we don't know for sure is whether or not however, elephants have begun to rent watermelons over the past few months, specifically for currants associated with their lobsters! As far as he is concerned, however, giraffes have begun to rent puppies over the past few months, specifically for hamsters associated with their prunes! However, peaches have begun to rent pandas over the past few months, specifically for squirrels associated with their grapes.
Programmatic Control
const expandable = document.querySelector('a-expandable');
// Open the expandable
expandable.open();
// Close the expandable
expandable.close();
// Toggle the state
expandable.toggle();
// Check current state
if (expandable.opened) {
console.log('Currently expanded');
}
Listening for Changes
const expandable = document.querySelector('a-expandable');
expandable.addEventListener('change', (event) => {
console.log('Expanded:', event.target.opened);
});
Styling
The expandable uses CSS Grid for smooth height animations. Customise timing with CSS custom properties:
a-expandable {
--transition-speed: 0.33s;
--animation-easing: ease;
}
/* Faster animation */
a-expandable.fast {
--transition-speed: 0.15s;
}
/* Slower, more dramatic */
a-expandable.slow {
--transition-speed: 0.5s;
--animation-easing: cubic-bezier(0.4, 0, 0.2, 1);
}
Styling the Toggle
a-expandable [slot="toggle"] {
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
}
/* Rotate icon when opened */
a-expandable[opened] [slot="toggle"] .icon {
transform: rotate(180deg);
}
Accessibility
- ARIA Attributes: Automatically sets
aria-expandedon the toggle andaria-labelledbyon the content region. - Keyboard Support: Toggle responds to Enter and Space keys when focused.
- Focus Management: Focusable elements inside collapsed content are removed from tab order.
- Anchor Links: When a URL hash matches an element inside the expandable, it automatically opens to reveal the content.
- Scroll Into View: When opened or closed, the expandable scrolls into view to prevent content from shifting off-screen.
- Hidden Until Found: Uses
hidden="until-found"for browser find-in-page support (where available).
CSS Custom Properties
| Property | Default | Description |
|---|---|---|
--transition-speed | 0.33s | Duration of the expand/collapse animation |
--animation-easing | ease | Easing function for the animation |
Expandable
A element that can collapse and expand its content with an animation.
Example
<a-expandable opened class="accordion">
<button slot="toggle" type="button">
<div class="headline">Title</div>
</button>
<div>Content</div>
</a-expandable> Attributes
| Name | Type | Default value | Description |
|---|---|---|---|
direction
|
undefined | undefined |
What direction to open |
opened
|
undefined | undefined |
Wether the eleemnt is open or not |
Events
| Name | Description |
|---|---|
change
|
Emitted when the element open state changes |