+
+
+A titled sheet holding a short piece of content. The `open` prop is driven by state and `onClose` resets it.
+
+
+
+
+
+
+
+ setOpen(true)}
+/>
+ setOpen(false)}
+ title="Bottom Sheet"
+>
+
+ The sheet slides up from the bottom edge and can be dismissed with the
+ close button, a backdrop click, or the Escape key.
+
+`} />
+
+
+
+Omitting `title` drops the header row and its close button. Provide another way out of the sheet, such as an action in the body, alongside the backdrop and Escape key.
+
+`title` is the only prop wired to `aria-labelledby`, so a headerless sheet has no accessible name of its own. Reserve this variant for short, self-describing bodies like the one below, and supply a `title` whenever the sheet needs to be announced by name.
+
+
+
+
+
+
+
+ setOpen(false)}>
+
+ Omitting the title renders the body only, with no header row and no
+ close button.
+
+ setOpen(false)}
+ />
+`} />
+
+
+
+The most common bottom sheet pattern: a short list of actions that apply to the item the user just selected. Picking an action closes the sheet.
+
+
+
+
+`maxHeight` caps how much of the viewport the sheet occupies, defaulting to `80vh`. Content taller than the cap scrolls within the body while the header stays fixed.
+
+
+
+
+`headerBackgroundColor` and `headerTextColor` override the theme defaults, and `closeButtonAriaLabel` names the close button for assistive technology. `headerTextColor` sets both the title and the close icon, so pick a pair that clears the WCAG AA 4.5:1 contrast ratio: `#000000` on `#00B39F` reaches 7.9:1, while white on the same background reaches only 2.6:1.
+
+
+
+
+
+
+
+ setOpen(false)}
+ title="Connection Removed"
+ headerBackgroundColor="#00B39F"
+ headerTextColor="#000000"
+ closeButtonAriaLabel="Close connection notice"
+>
+
+ The header background and text colors are overridden, and the close
+ button carries a specific accessible label.
+
+`} />
+
+
+
+A bottom sheet interrupts the page only as much as it needs to. It keeps the user anchored in the view they were already looking at, which makes it the right container for content that supports the current task rather than replacing it.
+
+- Present contextual actions for an item the user has just selected
+- Reveal supplementary detail about a row, card, or canvas node
+- Offer filters, sorting, or compact navigation on small screens
+- Collect a short piece of input without navigating away from the page
+
+
+
+
+When a user selects an item and several actions apply to it, a bottom sheet lists those actions in one reachable place without covering the surroundings of the item the way a centered dialog would.
+
+
Supplementary Details
+
+Use a bottom sheet to expand on something already visible on the page. The underlying context stays behind the backdrop, so the user does not lose their position in a long list or a large canvas.
+
+
+
+
+
+
+
+
+
+
Short Confirmations
+
+A small sheet with a tightened maximum height works well for a brief confirmation, where the message is one or two sentences and the choice is binary.
+
+
+
+
+
+
+- **Long multi-step flows.** A sheet capped at a fraction of the viewport is a poor host for a wizard. Use a full page or a Modal instead.
+- **Persistent side navigation.** Primary navigation that should stay on screen belongs in a permanent or persistent Drawer.
+- **Blocking errors that must be acknowledged.** A bottom sheet is dismissed by a backdrop click, so it is the wrong container for a message the user must not miss. Use a Modal.
+- **Content the user needs while interacting with the page.** A sheet sits above the page behind a backdrop. If the user must keep working underneath it, use a Popper or an inline panel.
+
+
+
Controls whether the sheet is visible. The component is fully controlled, so this value must come from state.
+
+
+
onClose
+
function
+
-
+
Called when the user dismisses the sheet through the close button, a backdrop click, or the Escape key.
+
+
+
title
+
string
+
-
+
Heading shown in the sheet header, and the only prop that supplies the accessible name of the sheet through aria-labelledby. When omitted the header, including the close button, is not rendered and the sheet is announced without a name.
+
+
+
children
+
node
+
-
+
Content rendered in the scrollable body of the sheet.
+
+
+
maxHeight
+
string
+
80vh
+
Upper bound on the height of the sheet. Content beyond this height scrolls within the body.
+
+
+
closeButtonAriaLabel
+
string
+
Close
+
Accessible label applied to the header close button.
+
+
+
headerBackgroundColor
+
string
+
theme surface.tint
+
Overrides the header background color.
+
+
+
headerTextColor
+
string
+
theme text.primary
+
Overrides the header title and close icon color. Pair it with a headerBackgroundColor that clears the WCAG AA 4.5:1 contrast ratio.
+
+
+- **Keep content short.** A bottom sheet is a glance, not a page. If the body needs heavy scrolling, the content belongs in a Modal or a dedicated route.
+- **Always give a title when the content needs framing.** The title is the only source of the accessible name of the sheet, so omit it only for short action lists whose own content makes the purpose obvious.
+- **Size deliberately.** Leave the maximum height at its 80vh default for browsing content, and tighten it for short confirmations so the sheet does not claim more of the screen than it needs.
+- **Keep actions inside the body.** The header holds the title and close button only. Place confirm and cancel buttons at the end of the body, aligned to the trailing edge.
+- **Do not stack sheets.** Opening a second sheet from within a sheet buries the context the user came from. Replace the content of the current sheet instead.
+- **Close on completion.** Once the user picks an action or submits input, close the sheet so the result is visible on the page underneath.
+- **Preserve the backdrop.** The dimmed backdrop signals that the page is paused. Do not layer other interactive surfaces over it while the sheet is open.
+- **Use theme colors first.** Reach for the header color overrides only for a deliberate treatment, check the result in both light and dark mode, and confirm the pair clears the WCAG AA 4.5:1 contrast ratio. Brand backgrounds such as `#00B39F` need a dark foreground rather than white.
+
+
+
+
+
+- The sheet renders as a modal surface, so focus is trapped inside it while it is open and returns to the trigger when it closes.
+- Supplying a title wires the heading to the sheet through `aria-labelledby`, giving it an accessible name. No other prop names the surface, so a headerless sheet has none: keep the body short and self-describing, and reach for a title as soon as the sheet carries anything a screen reader user would need announced up front.
+- The Escape key dismisses the sheet, matching the behavior users expect from every other modal surface in Sistent.
+- Set an explicit close button label, such as "Close design actions", when a page can open more than one sheet.
+- Keep interactive targets in the sheet at least 44 by 44 pixels so they remain comfortable to hit on touch devices.
diff --git a/src/collections/sistent/components/bottom-sheet/index.mdx b/src/collections/sistent/components/bottom-sheet/index.mdx
new file mode 100644
index 0000000000000..b6fc5aaf938be
--- /dev/null
+++ b/src/collections/sistent/components/bottom-sheet/index.mdx
@@ -0,0 +1,105 @@
+---
+name: "BottomSheet"
+title: BottomSheet
+published: true
+component: bottom-sheet
+description: A bottom sheet is a surface that slides up from the bottom edge of the screen to present supplementary content or actions without navigating away from the current view. It spans the full width, is capped to a maximum height, and can be dismissed with the close button, a backdrop click, or the Escape key.
+---
+
+import { useState } from "react";
+import { BottomSheet, Button, Typography, Box } from "@sistent/sistent";
+
+export const BasicBottomSheetDemo = () => {
+ const [open, setOpen] = useState(false);
+ return (
+
+ setOpen(true)}
+ />
+ setOpen(false)}
+ title="Deployment Details"
+ >
+
+ The bottom sheet is anchored to the bottom edge of the viewport and
+ slides up over the current page.
+
+
+ Dismiss it with the close button in the header, by clicking the
+ backdrop, or by pressing the Escape key.
+
+
+
+ );
+};
+
+Bottom sheets are surfaces anchored to the bottom edge of the screen. They slide up over the current page to reveal supplementary content, contextual details, or a short list of actions, and then slide back down once the user is done, leaving the underlying page exactly where it was.
+
+Because they originate from the bottom of the screen, bottom sheets sit within comfortable thumb reach on mobile devices, which makes them a natural fit for touch-first interfaces. On larger screens they read as a full-width panel that keeps the user anchored in their current context.
+
+
+
+
+
+A bottom sheet with a header title and body content. The sheet is controlled through the `open` prop and closed through the `onClose` callback.
+
+
+
+
+
+
+The Sistent BottomSheet component provides the following capabilities:
+
+
Bottom Anchored Surface
+
+The sheet is pinned to the bottom edge of the viewport, spans the full width, and carries rounded top corners so it reads as a surface rising from the edge of the screen rather than a floating dialog.
+
+
Optional Header
+
+Passing a `title` renders a header row containing the title and a close button. Omit `title` and the sheet renders content only, which suits compact action lists that need no heading. Because `title` is also what supplies the accessible name, a headerless sheet is announced without one, so keep that variant for bodies that describe themselves.
+
+
Height Control
+
+The `maxHeight` prop caps how much of the screen the sheet may occupy, defaulting to `80vh`. Content taller than that cap scrolls inside the sheet while the header stays fixed in place.
+
+
Themeable Header
+
+The header inherits `surface.tint` and `text.primary` from the active Sistent theme, and `headerBackgroundColor` and `headerTextColor` override those defaults when a specific treatment is needed.
+
+
Accessible by Default
+
+When a `title` is supplied it is wired to the sheet through `aria-labelledby`, focus is trapped inside the surface while it is open, and the close button carries an accessible label that can be customized with `closeButtonAriaLabel`. `title` is the only prop that names the sheet itself, so supply one whenever screen reader users need the surface announced by name.
+
+
Multiple Dismissal Paths
+
+The `onClose` callback fires from the header close button, a backdrop click, and the Escape key, so users always have a predictable way out of the sheet.
+
+
+
+
+Present a short list of actions that apply to an item the user has just selected, such as sharing, renaming, or deleting a resource.
+
+
Supplementary Details
+
+Reveal secondary information about a row in a table or a node on a canvas without pushing the user to a separate page.
+
+
Mobile Navigation and Filters
+
+Surface filters, sorting options, or a compact navigation menu on small screens, where a bottom anchored surface is easier to reach than a top or side panel.
+
+
Short Focused Forms
+
+Collect a small amount of input, such as a name or a single selection, while the underlying context stays visible behind the backdrop.