Disclosure
A collapsible section of content composed of a heading that expands and collapses a panel.
| install | yarn add @adobe/react-spectrum |
|---|---|
| added | 3.38.0 |
| usage | import {Disclosure, DisclosureTitle, DisclosurePanel} from '@adobe/react-spectrum' |
Example#
<Disclosure>
<DisclosureTitle>System Requirements</DisclosureTitle>
<DisclosurePanel>
Details about system requirements here.
</DisclosurePanel>
</Disclosure>
<Disclosure>
<DisclosureTitle>System Requirements</DisclosureTitle>
<DisclosurePanel>
Details about system requirements here.
</DisclosurePanel>
</Disclosure>
<Disclosure>
<DisclosureTitle>
System Requirements
</DisclosureTitle>
<DisclosurePanel>
Details about
system requirements
here.
</DisclosurePanel>
</Disclosure>
Content#
Disclosure follows the ARIA Disclosure pattern and consists of two children: DisclosureTitle and DisclosurePanel. The DisclosureTitle controls the expansion of the DisclosurePanel and the contents inside.
Disclosure can be used as a standalone collapsible section of content. However, multiple discosures can be combined to form an Accordion.
Internationalization#
In order to internationalize a disclosure, all text content within the disclosure should be localized.
Events#
Disclosure accepts an onExpandedChange prop which is triggered when it is expanded or collapsed. The example below uses onExpandedChange to programmatically control disclosure expansion.
function ControlledExpansion() {
let [isExpanded, setIsExpanded] = React.useState<boolean>(false);
return (
<>
<Disclosure isExpanded={isExpanded} onExpandedChange={setIsExpanded}>
<DisclosureTitle>System Requirements</DisclosureTitle>
<DisclosurePanel>
Details about system requirements here.
</DisclosurePanel>
</Disclosure>
<div style={{ marginTop: '20px' }}>
{isExpanded
? 'The disclosure is expanded'
: 'The disclosure is collapsed'}
</div>
</>
);
}
function ControlledExpansion() {
let [isExpanded, setIsExpanded] = React.useState<boolean>(
false
);
return (
<>
<Disclosure
isExpanded={isExpanded}
onExpandedChange={setIsExpanded}
>
<DisclosureTitle>
System Requirements
</DisclosureTitle>
<DisclosurePanel>
Details about system requirements here.
</DisclosurePanel>
</Disclosure>
<div style={{ marginTop: '20px' }}>
{isExpanded
? 'The disclosure is expanded'
: 'The disclosure is collapsed'}
</div>
</>
);
}
function ControlledExpansion() {
let [
isExpanded,
setIsExpanded
] = React.useState<
boolean
>(false);
return (
<>
<Disclosure
isExpanded={isExpanded}
onExpandedChange={setIsExpanded}
>
<DisclosureTitle>
System
Requirements
</DisclosureTitle>
<DisclosurePanel>
Details about
system
requirements
here.
</DisclosurePanel>
</Disclosure>
<div
style={{
marginTop:
'20px'
}}
>
{isExpanded
? 'The disclosure is expanded'
: 'The disclosure is collapsed'}
</div>
</>
);
}
Props#
Disclosure#
| Name | Type | Description |
children | React.ReactNode | The contents of the disclosure. The first child should be the header, and the second child should be the panel. |
isQuiet | boolean | Whether the Disclosure should be displayed with a quiet style. |
id | Key | An id for the disclosure when used within a DisclosureGroup, matching the id used in
|
isDisabled | boolean | Whether the disclosure is disabled. |
isExpanded | boolean | Whether the disclosure is expanded (controlled). |
defaultExpanded | boolean | Whether the disclosure is expanded by default (uncontrolled). |
Events
| Name | Type | Description |
onExpandedChange | (
(isExpanded: boolean
)) => void | Handler that is called when the disclosure's expanded state changes. |
Layout
| Name | Type | Description |
flex | Responsive<string
| number
| boolean> | When used in a flex layout, specifies how the element will grow or shrink to fit the space available. See MDN. |
flexGrow | Responsive<number> | When used in a flex layout, specifies how the element will grow to fit the space available. See MDN. |
flexShrink | Responsive<number> | When used in a flex layout, specifies how the element will shrink to fit the space available. See MDN. |
flexBasis | Responsive<number | string> | When used in a flex layout, specifies the initial main size of the element. See MDN. |
alignSelf | Responsive<'auto'
| 'normal'
| 'start'
| 'end'
| 'center'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'stretch'> | Overrides the |
justifySelf | Responsive<'auto'
| 'normal'
| 'start'
| 'end'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'center'
| 'left'
| 'right'
| 'stretch'> | Specifies how the element is justified inside a flex or grid container. See MDN. |
order | Responsive<number> | The layout order for the element within a flex or grid container. See MDN. |
gridArea | Responsive<string> | When used in a grid layout, specifies the named grid area that the element should be placed in within the grid. See MDN. |
gridColumn | Responsive<string> | When used in a grid layout, specifies the column the element should be placed in within the grid. See MDN. |
gridRow | Responsive<string> | When used in a grid layout, specifies the row the element should be placed in within the grid. See MDN. |
gridColumnStart | Responsive<string> | When used in a grid layout, specifies the starting column to span within the grid. See MDN. |
gridColumnEnd | Responsive<string> | When used in a grid layout, specifies the ending column to span within the grid. See MDN. |
gridRowStart | Responsive<string> | When used in a grid layout, specifies the starting row to span within the grid. See MDN. |
gridRowEnd | Responsive<string> | When used in a grid layout, specifies the ending row to span within the grid. See MDN. |
slot | string | null | A slot name for the component. Slots allow the component to receive props from a parent
component. An explicit |
Spacing
| Name | Type | Description |
margin | Responsive<DimensionValue> | The margin for all four sides of the element. See MDN. |
marginTop | Responsive<DimensionValue> | The margin for the top side of the element. See MDN. |
marginBottom | Responsive<DimensionValue> | The margin for the bottom side of the element. See MDN. |
marginStart | Responsive<DimensionValue> | The margin for the logical start side of the element, depending on layout direction. See MDN. |
marginEnd | Responsive<DimensionValue> | The margin for the logical end side of an element, depending on layout direction. See MDN. |
marginX | Responsive<DimensionValue> | The margin for both the left and right sides of the element. See MDN. |
marginY | Responsive<DimensionValue> | The margin for both the top and bottom sides of the element. See MDN. |
Sizing
| Name | Type | Description |
width | Responsive<DimensionValue> | The width of the element. See MDN. |
minWidth | Responsive<DimensionValue> | The minimum width of the element. See MDN. |
maxWidth | Responsive<DimensionValue> | The maximum width of the element. See MDN. |
height | Responsive<DimensionValue> | The height of the element. See MDN. |
minHeight | Responsive<DimensionValue> | The minimum height of the element. See MDN. |
maxHeight | Responsive<DimensionValue> | The maximum height of the element. See MDN. |
Positioning
| Name | Type | Description |
position | Responsive<'static'
| 'relative'
| 'absolute'
| 'fixed'
| 'sticky'> | Specifies how the element is positioned. See MDN. |
top | Responsive<DimensionValue> | The top position for the element. See MDN. |
bottom | Responsive<DimensionValue> | The bottom position for the element. See MDN. |
left | Responsive<DimensionValue> | The left position for the element. See
MDN. Consider using |
right | Responsive<DimensionValue> | The right position for the element. See
MDN. Consider using |
start | Responsive<DimensionValue> | The logical start position for the element, depending on layout direction. See MDN. |
end | Responsive<DimensionValue> | The logical end position for the element, depending on layout direction. See MDN. |
zIndex | Responsive<number> | The stacking order for the element. See MDN. |
isHidden | Responsive<boolean> | Hides the element. |
Accessibility
| Name | Type | Description |
aria-label | string | Defines a string value that labels the current element. |
aria-labelledby | string | Identifies the element (or elements) that labels the current element. |
aria-describedby | string | Identifies the element (or elements) that describes the object. |
aria-details | string | Identifies the element (or elements) that provide a detailed, extended description for the object. |
Advanced
| Name | Type | Description |
UNSAFE_className | string | Sets the CSS className for the element. Only use as a last resort. Use style props instead. |
UNSAFE_style | CSSProperties | Sets inline style for the element. Only use as a last resort. Use style props instead. |
DisclosureTitle#
| Name | Type | Default | Description |
children | React.ReactNode | — | The contents of the disclosure header. |
level | number | 3 | The heading level of the disclosure header. |
Layout
| Name | Type | Description |
flex | Responsive<string
| number
| boolean> | When used in a flex layout, specifies how the element will grow or shrink to fit the space available. See MDN. |
flexGrow | Responsive<number> | When used in a flex layout, specifies how the element will grow to fit the space available. See MDN. |
flexShrink | Responsive<number> | When used in a flex layout, specifies how the element will shrink to fit the space available. See MDN. |
flexBasis | Responsive<number | string> | When used in a flex layout, specifies the initial main size of the element. See MDN. |
alignSelf | Responsive<'auto'
| 'normal'
| 'start'
| 'end'
| 'center'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'stretch'> | Overrides the |
justifySelf | Responsive<'auto'
| 'normal'
| 'start'
| 'end'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'center'
| 'left'
| 'right'
| 'stretch'> | Specifies how the element is justified inside a flex or grid container. See MDN. |
order | Responsive<number> | The layout order for the element within a flex or grid container. See MDN. |
gridArea | Responsive<string> | When used in a grid layout, specifies the named grid area that the element should be placed in within the grid. See MDN. |
gridColumn | Responsive<string> | When used in a grid layout, specifies the column the element should be placed in within the grid. See MDN. |
gridRow | Responsive<string> | When used in a grid layout, specifies the row the element should be placed in within the grid. See MDN. |
gridColumnStart | Responsive<string> | When used in a grid layout, specifies the starting column to span within the grid. See MDN. |
gridColumnEnd | Responsive<string> | When used in a grid layout, specifies the ending column to span within the grid. See MDN. |
gridRowStart | Responsive<string> | When used in a grid layout, specifies the starting row to span within the grid. See MDN. |
gridRowEnd | Responsive<string> | When used in a grid layout, specifies the ending row to span within the grid. See MDN. |
Spacing
| Name | Type | Description |
margin | Responsive<DimensionValue> | The margin for all four sides of the element. See MDN. |
marginTop | Responsive<DimensionValue> | The margin for the top side of the element. See MDN. |
marginBottom | Responsive<DimensionValue> | The margin for the bottom side of the element. See MDN. |
marginStart | Responsive<DimensionValue> | The margin for the logical start side of the element, depending on layout direction. See MDN. |
marginEnd | Responsive<DimensionValue> | The margin for the logical end side of an element, depending on layout direction. See MDN. |
marginX | Responsive<DimensionValue> | The margin for both the left and right sides of the element. See MDN. |
marginY | Responsive<DimensionValue> | The margin for both the top and bottom sides of the element. See MDN. |
Sizing
| Name | Type | Description |
width | Responsive<DimensionValue> | The width of the element. See MDN. |
minWidth | Responsive<DimensionValue> | The minimum width of the element. See MDN. |
maxWidth | Responsive<DimensionValue> | The maximum width of the element. See MDN. |
height | Responsive<DimensionValue> | The height of the element. See MDN. |
minHeight | Responsive<DimensionValue> | The minimum height of the element. See MDN. |
maxHeight | Responsive<DimensionValue> | The maximum height of the element. See MDN. |
Positioning
| Name | Type | Description |
position | Responsive<'static'
| 'relative'
| 'absolute'
| 'fixed'
| 'sticky'> | Specifies how the element is positioned. See MDN. |
top | Responsive<DimensionValue> | The top position for the element. See MDN. |
bottom | Responsive<DimensionValue> | The bottom position for the element. See MDN. |
left | Responsive<DimensionValue> | The left position for the element. See
MDN. Consider using |
right | Responsive<DimensionValue> | The right position for the element. See
MDN. Consider using |
start | Responsive<DimensionValue> | The logical start position for the element, depending on layout direction. See MDN. |
end | Responsive<DimensionValue> | The logical end position for the element, depending on layout direction. See MDN. |
zIndex | Responsive<number> | The stacking order for the element. See MDN. |
isHidden | Responsive<boolean> | Hides the element. |
Accessibility
| Name | Type | Description |
id | string | The element's unique identifier. See MDN. |
aria-label | string | Defines a string value that labels the current element. |
aria-labelledby | string | Identifies the element (or elements) that labels the current element. |
aria-describedby | string | Identifies the element (or elements) that describes the object. |
aria-details | string | Identifies the element (or elements) that provide a detailed, extended description for the object. |
Advanced
| Name | Type | Description |
UNSAFE_className | string | Sets the CSS className for the element. Only use as a last resort. Use style props instead. |
UNSAFE_style | CSSProperties | Sets inline style for the element. Only use as a last resort. Use style props instead. |
DisclosurePanel#
| Name | Type | Default | Description |
children | React.ReactNode | — | The contents of the accordion panel. |
labelElementType | ElementType | 'label' | The HTML element used to render the label, e.g. 'label', or 'span'. |
label | ReactNode | — | The content to display as the label. |
Events
Layout
| Name | Type | Description |
flex | Responsive<string
| number
| boolean> | When used in a flex layout, specifies how the element will grow or shrink to fit the space available. See MDN. |
flexGrow | Responsive<number> | When used in a flex layout, specifies how the element will grow to fit the space available. See MDN. |
flexShrink | Responsive<number> | When used in a flex layout, specifies how the element will shrink to fit the space available. See MDN. |
flexBasis | Responsive<number | string> | When used in a flex layout, specifies the initial main size of the element. See MDN. |
alignSelf | Responsive<'auto'
| 'normal'
| 'start'
| 'end'
| 'center'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'stretch'> | Overrides the |
justifySelf | Responsive<'auto'
| 'normal'
| 'start'
| 'end'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'center'
| 'left'
| 'right'
| 'stretch'> | Specifies how the element is justified inside a flex or grid container. See MDN. |
order | Responsive<number> | The layout order for the element within a flex or grid container. See MDN. |
gridArea | Responsive<string> | When used in a grid layout, specifies the named grid area that the element should be placed in within the grid. See MDN. |
gridColumn | Responsive<string> | When used in a grid layout, specifies the column the element should be placed in within the grid. See MDN. |
gridRow | Responsive<string> | When used in a grid layout, specifies the row the element should be placed in within the grid. See MDN. |
gridColumnStart | Responsive<string> | When used in a grid layout, specifies the starting column to span within the grid. See MDN. |
gridColumnEnd | Responsive<string> | When used in a grid layout, specifies the ending column to span within the grid. See MDN. |
gridRowStart | Responsive<string> | When used in a grid layout, specifies the starting row to span within the grid. See MDN. |
gridRowEnd | Responsive<string> | When used in a grid layout, specifies the ending row to span within the grid. See MDN. |
Spacing
| Name | Type | Description |
margin | Responsive<DimensionValue> | The margin for all four sides of the element. See MDN. |
marginTop | Responsive<DimensionValue> | The margin for the top side of the element. See MDN. |
marginBottom | Responsive<DimensionValue> | The margin for the bottom side of the element. See MDN. |
marginStart | Responsive<DimensionValue> | The margin for the logical start side of the element, depending on layout direction. See MDN. |
marginEnd | Responsive<DimensionValue> | The margin for the logical end side of an element, depending on layout direction. See MDN. |
marginX | Responsive<DimensionValue> | The margin for both the left and right sides of the element. See MDN. |
marginY | Responsive<DimensionValue> | The margin for both the top and bottom sides of the element. See MDN. |
Sizing
| Name | Type | Description |
width | Responsive<DimensionValue> | The width of the element. See MDN. |
minWidth | Responsive<DimensionValue> | The minimum width of the element. See MDN. |
maxWidth | Responsive<DimensionValue> | The maximum width of the element. See MDN. |
height | Responsive<DimensionValue> | The height of the element. See MDN. |
minHeight | Responsive<DimensionValue> | The minimum height of the element. See MDN. |
maxHeight | Responsive<DimensionValue> | The maximum height of the element. See MDN. |
Positioning
| Name | Type | Description |
position | Responsive<'static'
| 'relative'
| 'absolute'
| 'fixed'
| 'sticky'> | Specifies how the element is positioned. See MDN. |
top | Responsive<DimensionValue> | The top position for the element. See MDN. |
bottom | Responsive<DimensionValue> | The bottom position for the element. See MDN. |
left | Responsive<DimensionValue> | The left position for the element. See
MDN. Consider using |
right | Responsive<DimensionValue> | The right position for the element. See
MDN. Consider using |
start | Responsive<DimensionValue> | The logical start position for the element, depending on layout direction. See MDN. |
end | Responsive<DimensionValue> | The logical end position for the element, depending on layout direction. See MDN. |
zIndex | Responsive<number> | The stacking order for the element. See MDN. |
isHidden | Responsive<boolean> | Hides the element. |
Accessibility
| Name | Type | Default | Description |
role | 'group' | 'region' | 'group' | The accessibility role for the disclosure's panel. |
id | string | — | The element's unique identifier. See MDN. |
aria-label | string | — | Defines a string value that labels the current element. |
aria-labelledby | string | — | Identifies the element (or elements) that labels the current element. |
aria-describedby | string | — | Identifies the element (or elements) that describes the object. |
aria-details | string | — | Identifies the element (or elements) that provide a detailed, extended description for the object. |
Advanced
| Name | Type | Description |
UNSAFE_className | string | Sets the CSS className for the element. Only use as a last resort. Use style props instead. |
UNSAFE_style | CSSProperties | Sets inline style for the element. Only use as a last resort. Use style props instead. |
Visual Options#
Disabled#
<Disclosure isDisabled>
<DisclosureTitle>System Requirements</DisclosureTitle>
<DisclosurePanel>
Details about system requirements here.
</DisclosurePanel>
</Disclosure>
<Disclosure isDisabled>
<DisclosureTitle>System Requirements</DisclosureTitle>
<DisclosurePanel>
Details about system requirements here.
</DisclosurePanel>
</Disclosure>
<Disclosure isDisabled>
<DisclosureTitle>
System Requirements
</DisclosureTitle>
<DisclosurePanel>
Details about
system requirements
here.
</DisclosurePanel>
</Disclosure>
Expanded#
<Disclosure defaultExpanded>
<DisclosureTitle>System Requirements</DisclosureTitle>
<DisclosurePanel>
Details about system requirements here.
</DisclosurePanel>
</Disclosure>
<Disclosure defaultExpanded>
<DisclosureTitle>System Requirements</DisclosureTitle>
<DisclosurePanel>
Details about system requirements here.
</DisclosurePanel>
</Disclosure>
<Disclosure
defaultExpanded
>
<DisclosureTitle>
System Requirements
</DisclosureTitle>
<DisclosurePanel>
Details about
system requirements
here.
</DisclosurePanel>
</Disclosure>
Quiet#
<Disclosure isQuiet>
<DisclosureTitle>System Requirements</DisclosureTitle>
<DisclosurePanel>
Details about system requirements here.
</DisclosurePanel>
</Disclosure>
<Disclosure isQuiet>
<DisclosureTitle>System Requirements</DisclosureTitle>
<DisclosurePanel>
Details about system requirements here.
</DisclosurePanel>
</Disclosure>
<Disclosure isQuiet>
<DisclosureTitle>
System Requirements
</DisclosureTitle>
<DisclosurePanel>
Details about
system requirements
here.
</DisclosurePanel>
</Disclosure>