Skip to content
# Collapse ## Description Collapse opens and closes a section of a page. It renders no trigger of its own, so anything can drive it, and it animates the real size of its content - downwards or sideways, all the way or down to a peek. Closed content leaves the tab order and the accessibility tree yet stays reachable by find-in-page, and expensive content can stay out of the DOM until it is opened. ## 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 (or --bit-Collapse-duration). The reduced motion preference still collapses it unless ForceAnimation is set. OnExpanded, OnCollapsed, NoClip, HiddenUntilFound and UnmountOnCollapse wait for the transition the browser actually plays. | | 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. | | ExpandOnPrint | `bool` | false | Prints the collapse expanded, whatever its state on the screen. Such a collapse ignores LazyRender and UnmountOnCollapse, since the content has to be in the DOM to be printed. | | 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, is searchable through HiddenUntilFound or prints expanded through ExpandOnPrint 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. It is the place to move the focus back to the trigger when it is inside the section, since the closed content can no longer hold it. | | 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, and with it no aria-label or aria-labelledby, since ARIA prohibits naming an element with no role - as it does under none, presentation and generic, which drop the name the same way. | | 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, is searchable through HiddenUntilFound or prints expanded through ExpandOnPrint 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. | | Disabled | `bool` | false | Gets or sets a value indicating whether the component is disabled and cannot respond to user interaction. | | 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. An attribute written on the component wins over an entry of the same name. | | Id | `string?` | null | Gets or sets the unique identifier for the component's root element. | | 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 focusable while it is on the screen, even when a TabIndex of -1 takes it out of the tab order. 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. | ## CSS Variables Public CSS custom properties read off the component's root. Set one on `:root` to restyle every instance, on any ancestor to restyle the ones inside it, or on the `Style` of one instance to restyle it and every instance nested inside it, which inherits the value too - a parameter changes one alone, as does the real CSS property on its `Style` / `Styles` when that property does not inherit (`opacity`); an inherited one (`color`, `font-family`) reaches the nested instances that do not set it themselves. | Name | Default Value | Description | | :--- | :------------ | :---------- | | `--bit-Collapse-color` | --bit-clr-fg-pri | Color of the text. | | `--bit-Collapse-background` | --bit-clr-bg-pri | Background of the section. The Background parameter wins over it. | | `--bit-Collapse-padding` | spacing(1.5) (12px) | Room between the edges of the section and its content. NoPadding wins over it. | | `--bit-Collapse-font-size` | --bit-tpg-fs-sm | Size of the text. | | `--bit-Collapse-focus-color` | --bit-clr-pri-focus | Color of the focus ring of the content region. | | `--bit-Collapse-duration` | --bit-mot-duration-long | Pace of the expand/collapse transition. Duration, ExpandDuration and CollapseDuration win over it, and reduced motion collapses it unless ForceAnimation is set. | | `--bit-Collapse-easing` | --bit-mot-easing | Timing function of the transition. The Easing parameter wins over it. | | `--bit-Collapse-peek-fade` | unset | Length of the fade on the trailing edge of a closed CollapsedSize peek, which shows there is more to read. No fade by default. | ## 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. ``` ```csharp private bool expanded = true; ``` \n**Binding & control**: ```razor The button and the collapse share one value: @boundExpanded.
Expand Collapse Toggle
Starts open through DefaultExpanded; nothing on the page holds its state.
@changeLog
``` ```csharp private bool boundExpanded = true; private string changeLog = string.Empty; private BitCollapse? collapseRef; private bool collapseDisabled; private void HandleChange(bool value) => changeLog = $"OnChange({value.ToString().ToLower()})"; ``` \n**Padding & background**: ```razor Default: padding and the primary background. Secondary background. Transparent, no padding: the content carries its own surface and insets. ``` ```csharp private bool surfaceExpanded = true; ``` \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
Duration="1000" Delay="200" and an overshooting Easing
A thousand milliseconds after a two hundred millisecond wait.
ExpandDuration="900" CollapseDuration="200"
Opens slowly, closes quickly.
NoFade
The content never changes its opacity.
NoAnimation
Appears and disappears at once. ``` ```csharp private bool transitionExpanded = true; ``` \n**Transition events**: ```razor @(eventsExpanded ? "Collapse" : "Expand") The -ing callback lands at once; the -ed one six hundred milliseconds later. @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**Overflow**: ```razor
Default: the glow is cut off at the edge.
NoClip: the glow is drawn in full once the section is open.
``` ```csharp private bool clipExpanded = true; ``` \n**Rendering & printing**: ```razor
LazyRender
Built on the first open, kept since. Opened @lazyOpenCount time(s).
UnmountOnCollapse
ExpandOnPrint
On paper this section is always open. ``` ```csharp private bool renderingExpanded; private int lazyOpenCount; ``` \n**Find in page**: ```razor The passphrase kept in this section is marmalade skies. Close the section, press Ctrl+F and search for it. ``` ```csharp private bool findExpanded = true; ``` \n**Accessibility**: ```razor Orders placed before 2 pm ship the same day. Read the full policy. Open and focus FocusAsync put the focus here at the end of the expand transition. Close ``` ```csharp private bool a11yExpanded; private bool focusExpanded; private BitButton? focusTriggerRef; private BitCollapse? focusCollapseRef; private async Task HandleFocusExpanded() { if (focusCollapseRef is not null) { await focusCollapseRef.FocusAsync(); } } private async Task HandleFocusCollapsing() { if (focusTriggerRef is not null) { await focusTriggerRef.FocusAsync(); } } ``` \n**Cascading parameters**: ```razor Secondary background, no padding, a slower pace. The same, from the same BitParams. Keeps its own padding. ``` ```csharp private bool cascadingExpanded = true; private readonly BitCollapseParams[] collapseParams = [ new() { Background = BitColorKind.Secondary, NoPadding = true, Duration = 700, } ]; ``` \n**Style & Class**: ```razor A styled root. Styles for the expanded root and the wrapper. Classes for the expanded root and the wrapper. ``` ```csharp private bool styleExpanded = true; ``` \n**RTL**: ```razor
لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد.
این بخش از سمت راست باز می شود.
``` ```csharp private bool rtlExpanded = true; ```