Skip to content
# Collapse **Also known as:** Collapsible, Disclosure ## Description Collapse is the container that opens and closes a section of a page. It renders no trigger of its own, so anything can drive it - a button, a switch, a link, a piece of state - and one trigger can drive several sections at once. It animates the real size of its content rather than a guessed maximum, downwards or sideways, all the way or down to a peek that keeps the first few lines readable. The pace of the transition - one for each direction if they differ - the padding, the background and the fade are all parameters, the start and the end of each transition are reported back, the closed content is taken out of the tab order and the accessibility tree, and it can still be reached by find-in-page. Content that is expensive to build can be kept out of the DOM until the section is opened, or dropped again once it is closed. ## Parameters | Name | Type | Default Value | Description | | :--- | :--- | :------------ | :---------- | | Background | `BitColorKind?` | null | The color kind of the background of the collapse. | | Body | `RenderFragment?` | null | Alias for the ChildContent parameter. | | ChildContent | `RenderFragment?` | null | The content of the collapse. | | Classes | `BitCollapseClassStyles?` | null | Custom CSS classes for different parts of the collapse. | | CollapseDuration | `int?` | null | The duration of the collapse transition in ms, which overrides Duration while the collapse is closing and leaves the opening alone. | | CollapsedSize | `string?` | null | The size the collapse keeps while it is collapsed, as any CSS length, which leaves a peek of the content on the page instead of closing it all the way. It is a width instead of a height while Horizontal is on. | | DefaultExpanded | `bool?` | null | The default value of the Expanded parameter, applied once at initialization and only while Expanded itself has not been set. | | Delay | `int?` | null | The delay of the expand/collapse transition in ms. | | Duration | `int?` | null | The duration of the expand/collapse transition in ms. Leaving it unset keeps the duration of the motion theme. A value set here is still collapsed to nothing by the reduced motion preference, which only ForceAnimation opts out of. It is what OnExpanded, OnCollapsed, NoClip, HiddenUntilFound and UnmountOnCollapse wait for. | | Easing | `string?` | null | The timing function of the expand/collapse transition, as any CSS easing value. | | ExpandDuration | `int?` | null | The duration of the expand transition in ms, which overrides Duration while the collapse is opening and leaves the closing alone. | | Expanded | `bool` | false | Determines whether the collapse is expanded or collapsed. | | ExpandedChanged | `EventCallback<bool>` | | The callback of the two-way binding of the Expanded parameter, raised with the new state. | | HiddenUntilFound | `bool` | false | Hands the closed content to the browser as hidden="until-found", so find-in-page and a navigation to a fragment inside the section reach into it and open it. Such a collapse ignores LazyRender and UnmountOnCollapse, since the content has to stay in the DOM to be found, and one that cannot open - disabled, or with a one-way Expanded - is not offered to find-in-page at all. | | Horizontal | `bool` | false | Collapses the content along the inline axis instead of the block one, so it opens sideways from the start edge. | | LabelledBy | `string?` | null | The id of the element that names the content region of the collapse, rendered as aria-labelledby. | | LazyRender | `bool` | false | Keeps the content out of the DOM until the collapse is expanded for the first time. A collapse that keeps a CollapsedSize or is searchable through HiddenUntilFound ignores it. | | NoAnimation | `bool` | false | Removes the expand/collapse transition, so the content appears and disappears at once. | | NoClip | `bool` | false | Stops clipping the content once the collapse has finished opening, so a focus ring, a shadow or a menu that reaches past the edges of the section is drawn in full. The clipping is put back the moment the collapse starts closing. | | NoFade | `bool` | false | Removes the fade of the content, leaving the size on its own to open and close the collapse. | | NoPadding | `bool` | false | Removes the padding the collapse puts around its content. | | OnChange | `EventCallback<bool>` | | Callback that is called when the Expanded value has changed by the component itself. | | OnCollapsed | `EventCallback` | | Callback that is called once the collapse has finished closing, which is the end of the collapse transition. | | OnCollapsing | `EventCallback` | | Callback that is called as the collapse starts closing, which is the start of the collapse transition. | | OnExpanded | `EventCallback` | | Callback that is called once the collapse has finished opening, which is the end of the expand transition. | | OnExpanding | `EventCallback` | | Callback that is called as the collapse starts opening, which is the start of the expand transition. | | Role | `string?` | null | The ARIA role of the content region of the collapse, which is region by default. An empty string renders no role at all. | | Styles | `BitCollapseClassStyles?` | null | Custom CSS styles for different parts of the collapse. | | UnmountOnCollapse | `bool` | false | Takes the content back out of the DOM once the collapse has closed, after the transition has had time to finish. A collapse that keeps a CollapsedSize or is searchable through HiddenUntilFound ignores it. | | AriaLabel | `string?` | null | Gets or sets the accessible label for the component, used by assistive technologies. | | Class | `string?` | null | Gets or sets the CSS class name(s) to apply to the rendered element. | | Dir | `BitDir?` | null | Gets or sets the text directionality for the component's content. | | ForceAnimation | `bool` | false | Gets or sets a value indicating whether the component's animations play at their full duration even when reduced motion is requested. | | HtmlAttributes | `Dictionary<string, object>` | new Dictionary<string, object>() | Captures additional HTML attributes to be applied to the rendered element, in addition to the component's parameters. | | Id | `string?` | null | Gets or sets the unique identifier for the component's root element. | | IsEnabled | `bool` | true | Gets or sets a value indicating whether the component is enabled and can respond to user interaction. | | Style | `string?` | null | Gets or sets the CSS style string to apply to the rendered element. | | TabIndex | `string?` | null | Gets or sets the tab order index for the component when navigating with the keyboard. | | Visibility | `BitVisibility` | BitVisibility.Visible | Gets or sets the visibility state (visible, hidden, or collapsed) of the component. | ## Public Members | Name | Type | Default Value | Description | | :--- | :--- | :------------ | :---------- | | ContentId | `string` | | The id of the content element of the collapse, which is the id of the root element with -content after it, so a trigger elsewhere on the page can point its aria-controls at the section it opens. | | CollapseAsync | `Task` | | Collapses the collapse, reporting the change through ExpandedChanged and OnChange. | | ExpandAsync | `Task` | | Expands the collapse, reporting the change through ExpandedChanged and OnChange. | | FocusAsync | `ValueTask` | | Moves the focus to the content region of the collapse, which is worth pairing with OnExpanded so the focus lands once the section has finished opening. | | ToggleAsync | `Task` | | Flips the collapse between expanded and collapsed, reporting the change through ExpandedChanged and OnChange. | | UniqueId | `Guid` | Guid.NewGuid() | Gets the readonly unique identifier for the component's root element, assigned when the component instance is constructed. | | RootElement | `ElementReference` | | Gets the reference to the root HTML element associated with this component. | ## Enums ### BitColorKind Enum | Name | Value | Description | | :--- | :--- | :---------- | | Primary | 0 | The primary color kind. | | Secondary | 1 | The secondary color kind. | | Tertiary | 2 | The tertiary color kind. | | Transparent | 3 | The transparent color kind. | ### BitVisibility Enum | Name | Value | Description | | :--- | :--- | :---------- | | Visible | 0 | The content of the component is visible. | | Hidden | 1 | The content of the component is hidden, but the space it takes on the page remains (visibility:hidden). | | Collapsed | 2 | The component is hidden (display:none). | ### BitDir Enum | Name | Value | Description | | :--- | :--- | :---------- | | Ltr | 0 | Ltr (left to right) is to be used for languages that are written from the left to the right (like English). | | Rtl | 1 | Rtl (right to left) is to be used for languages that are written from the right to the left (like Arabic). | | Auto | 2 | Auto lets the user agent decide. It uses a basic algorithm as it parses the characters inside the element until it finds a character with a strong directionality, then applies that directionality to the whole element. | ## Sub Classes ### BitCollapseClassStyles Properties | Name | Type | Default Value | Description | | :--- | :--- | :------------ | :---------- | | Root | `string?` | null | Custom CSS classes/styles for the root element of the BitCollapse. | | Expanded | `string?` | null | Custom CSS classes/styles for the root element of the BitCollapse in the expanded state. | | Collapsed | `string?` | null | Custom CSS classes/styles for the root element of the BitCollapse in the collapsed state. | | Content | `string?` | null | Custom CSS classes/styles for the content region of the BitCollapse, which is the element that fades between the two states and clips what is outside the collapsed size. | | Wrapper | `string?` | null | Custom CSS classes/styles for the wrapper the BitCollapse puts around its content, which is the element that carries the padding. | ## Examples \n**Basic**: ```razor In the beginning, there is silence a blank canvas yearning to be filled, a quiet space where creativity waits to awaken. These words are temporary, standing in place of ideas yet to come, a glimpse into the infinite possibilities that lie ahead. Think of this text as a bridge, connecting the empty spaces of now with the vibrant narratives of tomorrow. It whispers of the stories waiting to be told, of the thoughts yet to be shaped into meaning, and the emotions ready to resonate with every reader.
In this space, potential reigns supreme. It is a moment suspended in time, where imagination dances freely and each word has the power to transform into something extraordinary. Here lies the start of something new-an opportunity to craft, inspire, and create. Whether it's a tale of adventure, a reflection of truth, or an idea that sparks change, these lines are yours to fill, to shape, and to make uniquely yours. The journey begins here, in this quiet moment where everything is possible.
``` ```csharp private bool expanded = true; ``` \n**Binding & control**: ```razor The button above and the collapse share one value, so either of them can change it and both of them see it.
The bound value is currently @boundExpanded.
Toggle This section starts open because DefaultExpanded is set, and nothing on the page holds its state.
@defaultChangeLog
Expand Collapse Toggle ExpandAsync, CollapseAsync and ToggleAsync go through the same path a bound value does, so the change is reported once through both ExpandedChanged and OnChange. ``` ```csharp private bool boundExpanded = true; private string defaultChangeLog = string.Empty; private BitCollapse? defaultCollapseRef; private BitCollapse? imperativeCollapseRef; private void HandleDefaultChange(bool value) { defaultChangeLog = $"OnChange reported {value}."; } ``` \n**Horizontal**: ```razor
This panel opens sideways.
``` ```csharp private bool horizontalExpanded = true; ``` \n**Collapsed size**: ```razor In the beginning, there is silence a blank canvas yearning to be filled, a quiet space where creativity waits to awaken. These words are temporary, standing in place of ideas yet to come, a glimpse into the infinite possibilities that lie ahead. Think of this text as a bridge, connecting the empty spaces of now with the vibrant narratives of tomorrow. It whispers of the stories waiting to be told, of the thoughts yet to be shaped into meaning, and the emotions ready to resonate with every reader.
In this space, potential reigns supreme. It is a moment suspended in time, where imagination dances freely and each word has the power to transform into something extraordinary. Here lies the start of something new-an opportunity to craft, inspire, and create.
@(peekExpanded ? "Show less" : "Show more") ``` ```csharp private bool peekExpanded; ``` \n**Transition**: ```razor A thousand milliseconds after a two hundred millisecond wait, on an easing that overshoots at both ends. Nine hundred milliseconds to open, two hundred to close. The size opens and closes this section; the content never changes its opacity. There is no transition here at all, which is what a section that toggles as part of a larger change wants. ``` ```csharp private bool transitionExpanded = true; private bool paceExpanded = true; private bool noFadeExpanded = true; private bool noAnimationExpanded = true; ``` \n**Transition events**: ```razor @(eventsExpanded ? "Collapse" : "Expand") OnChange and the -ing callback land as soon as the button is pressed; the -ed one arrives six hundred milliseconds later, when this section has stopped moving. @foreach (var entry in eventsLog) {
@entry
} ``` ```csharp private bool eventsExpanded = true; private BitCollapse? eventsCollapseRef; private readonly List eventsLog = []; private void HandleEventsChange(bool value) => LogCollapseEvent($"OnChange({value.ToString().ToLower()})"); private void HandleEventsExpanding() => LogCollapseEvent("OnExpanding"); private void HandleEventsCollapsing() => LogCollapseEvent("OnCollapsing"); private void HandleEventsExpanded() => LogCollapseEvent("OnExpanded"); private void HandleEventsCollapsed() => LogCollapseEvent("OnCollapsed"); private void LogCollapseEvent(string name) { eventsLog.Insert(0, name); if (eventsLog.Count > 8) { eventsLog.RemoveAt(eventsLog.Count - 1); } } ``` \n**Padding & background**: ```razor The padding and the primary background of the component. A background of the secondary color kind. Content that carries its own surface and its own insets. ``` ```csharp private bool surfaceExpanded = true; ``` \n**Overflow**: ```razor
The glow around this card is cut off at the edge of the collapse.
The same glow is drawn in full once the section has finished opening.
``` ```csharp private bool clipExpanded = true; ``` \n**Rendering**: ```razor
This content was built the first time the section was opened, and has stayed since; the section has been opened @lazyOpenCount time(s).
``` ```csharp private bool lazyExpanded; private int lazyOpenCount; private bool unmountExpanded = true; ``` \n**Find in page**: ```razor The passphrase kept in this section is marmalade skies. Close the section, press Ctrl+F, search for it, and watch the browser open the collapse around the match. ``` ```csharp private bool findExpanded = true; ``` \n**Accessibility**: ```razor @(a11yExpanded ? "Hide shipping details" : "Show shipping details") Orders placed before 2 pm ship the same day. Read the full policy. Open and focus The focus ring around this section was put here by FocusAsync at the end of the expand transition, so the reader carries on inside the section rather than back at the button. ``` ```csharp private bool a11yExpanded; private bool focusExpanded; private BitCollapse? focusCollapseRef; private async Task HandleFocusExpanded() { if (focusCollapseRef is not null) { await focusCollapseRef.FocusAsync(); } } ``` \n**Style & Class**: ```razor In the beginning, there is silence a blank canvas yearning to be filled, a quiet space where creativity waits to awaken. These words are temporary, standing in place of ideas yet to come, a glimpse into the infinite possibilities that lie ahead. Think of this text as a bridge, connecting the empty spaces of now with the vibrant narratives of tomorrow. In this space, potential reigns supreme. It is a moment suspended in time, where imagination dances freely and each word has the power to transform into something extraordinary. Here lies the start of something new-an opportunity to craft, inspire, and create. ``` ```csharp private bool expandedClass = true; private bool expandedStyle = true; ``` \n**RTL**: ```razor لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد.
این بخش به سمت راست باز می شود.
``` ```csharp private bool expandedRtl = true; private bool expandedRtlHorizontal = true; ```