Details
<sl-details> | SlDetails
Details show a brief summary and expand to show additional content.
Examples
Basic Details Card
<sl-details summary="Toggle Me"> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </sl-details>
sl-details summary="Toggle Me" | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna | aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
import SlDetails from '@teamshares/shoelace/dist/react/details'; const App = () => ( <SlDetails summary="Toggle Me"> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </SlDetails> );
Details with Shadow
Use the shadow
property to add a box shadow to the details card. The shadow matches the
Card
component’s shadow.
<sl-details summary="Details with shadow" shadow> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </sl-details>
sl-details summary="Details with shadow" shadow=true | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna | aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
import { SlDetails } from '@teamshares/shoelace/dist/react'; const App = () => ( <SlDetails summary="Details with shadow" shadow> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </SlDetails> );
Disabled
Use the disable
attribute to prevent the details from expanding.
<sl-details summary="Disabled" disabled> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </sl-details>
sl-details summary="Disabled" disabled="true" | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna | aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
import SlDetails from '@teamshares/shoelace/dist/react/details'; const App = () => ( <SlDetails summary="Disabled" disabled> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </SlDetails> );
Customizing the Summary Icon
Use the expand-icon
and collapse-icon
slots to change the expand and collapse
icons, respectively. To disable the animation, override the rotate
property on the
summary-icon
part as shown below.
Note: Custom expand/collapse icons are not a standard pattern in our Design System, and there is no Figma component for this option. Please check with the design team before using this option.
<sl-details summary="Toggle Me" class="custom-icons"> <sl-icon name="plus" slot="expand-icon"></sl-icon> <sl-icon name="minus" slot="collapse-icon"></sl-icon> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </sl-details> <style> sl-details.custom-icons::part(summary-icon) { /* Disable the expand/collapse animation */ rotate: none; } </style>
sl-details summary="Toggle Me" class="custom-icons" sl-icon name="plus" slot="expand-icon" sl-icon name="minus" slot="collapse-icon" | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna | aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. css: sl-details.custom-icons::part(summary-icon) { /* Disable the expand/collapse animation */ rotate: none; }
import SlDetails from '@teamshares/shoelace/dist/react/details'; import SlIcon from '@teamshares/shoelace/dist/react/icon'; const css = ` sl-details.custom-icon::part(summary-icon) { /* Disable the expand/collapse animation */ rotate: none; } `; const App = () => ( <> <SlDetails summary="Toggle Me" class="custom-icon"> <SlIcon name="plus" slot="expand-icon" /> <SlIcon name="minus" slot="collapse-icon" /> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </SlDetails> <style>{css}</style> </> );
Header Actions
You can now include anchor tags and buttons with onClick
handlers within the
summary
slot.
<sl-details summary="Toggle Me"> <div slot="summary"> <a href="https://google.com">Link</a> <sl-button href="https://google.com" size="small">Button with href</sl-button> <sl-button size="small" onclick="() => {console.log('onClick called')}">Button with onClick</sl-button> </div> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </sl-details>
sl-details summary="Toggle Me" | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna | aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
import SlDetails from '@teamshares/shoelace/dist/react/details'; const App = () => ( <SlDetails summary="Toggle Me"> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </SlDetails> );
Grouping Details
Details are designed to function independently, but you can simulate a group or “accordion” where only one
is shown at a time by listening for the sl-show
event.
<div class="details-group-example"> <sl-details summary="First" open> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </sl-details> <sl-details summary="Second"> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </sl-details> <sl-details summary="Third"> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </sl-details> </div> <script> const container = document.querySelector('.details-group-example'); // Close all other details when one is shown container.addEventListener('sl-show', event => { if (event.target.localName === 'sl-details') { [...container.querySelectorAll('sl-details')].map(details => (details.open = event.target === details)); } }); </script> <style> .details-group-example sl-details:not(:last-of-type) { margin-bottom: var(--sl-spacing-2x-small); } </style>
.details-group-example sl-details summary="First" open="true" | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. sl-details summary="Second" | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. sl-details summary="Third" | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. javascript: const container = document.querySelector('.details-group-example'); // Close all other details when one is shown container.addEventListener('sl-show', event => { [...container.querySelectorAll('sl-details')].map(details => (details.open = event.target === details)); }); css: .details-group-example sl-details:not(:last-of-type) { margin-bottom: var(--sl-spacing-2x-small); }
Importing
If you’re using the autoloader or the traditional loader, you can ignore this section. Otherwise, feel free to use any of the following snippets to cherry pick this component.
To import this component from the CDN using a script tag:
<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.1.0/cdn/components/details/details.js"></script>
To import this component from the CDN using a JavaScript import:
import 'https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.1.0/cdn/components/details/details.js';
To import this component using a bundler:
import '@shoelace-style/shoelace/dist/components/details/details.js';
To import this component as a React component:
import SlDetails from '@shoelace-style/shoelace/dist/react/details';
Slots
Name | Description |
---|---|
(default) | The details’ main content. |
summary
|
The details’ summary. Alternatively, you can use the summary attribute. |
expand-icon
|
Optional expand icon to use instead of the default. Works best with <sl-icon> .
|
collapse-icon
|
Optional collapse icon to use instead of the default. Works best with <sl-icon> .
|
Learn more about using slots.
Properties
Scroll right to see the entire table
Name | Description | Reflects | Type | Default |
---|---|---|---|---|
open
|
Indicates whether or not the details is open. You can toggle this attribute to show and hide the
details, or you can use the show() and hide() methods and this attribute
will reflect the details’ open state.
|
|
boolean
|
false
|
summary
|
The summary to show in the header. If you need to display HTML, use the summary slot
instead.
|
string
|
- | |
disabled
|
Disables the details so it can’t be toggled. |
|
boolean
|
false
|
shadow
|
Option to add a box shadow to the details. Shadow matches card component shadow. |
|
boolean
|
false
|
updateComplete
|
A read-only promise that resolves when the component has finished updating. |
Learn more about attributes and properties.
Events
Name | React Event | Description | Event Detail |
---|---|---|---|
sl-show
|
onSlShow
|
Emitted when the details opens. | - |
sl-after-show
|
onSlAfterShow
|
Emitted after the details opens and all animations are complete. | - |
sl-hide
|
onSlHide
|
Emitted when the details closes. | - |
sl-after-hide
|
onSlAfterHide
|
Emitted after the details closes and all animations are complete. | - |
Learn more about events.
Methods
Name | Description | Arguments |
---|---|---|
show()
|
Shows the details. | - |
hide()
|
Hides the details | - |
Learn more about methods.
Parts
Name | Description |
---|---|
base
|
The component’s base wrapper. |
header
|
The header that wraps both the summary and the expand/collapse icon. |
summary
|
The container that wraps the summary. |
summary-icon
|
The container that wraps the expand/collapse icons. |
content
|
The details content. |
Learn more about customizing CSS parts.
Animations
Name | Description |
---|---|
details.show
|
The animation to use when showing details. You can use height: auto with this
animation.
|
details.hide
|
The animation to use when hiding details. You can use height: auto with this animation.
|
Learn more about customizing animations.
Dependencies
This component automatically imports the following dependencies.
-
<sl-icon>