Sheet_side Examples
Copy-ready examples with live previews.
Basic usage
Controlled sheet (isOpen / onOpenChange) with body content.
Live preview
Side sheet
Body (short)
Contenido corto para validar layout.
Basic
import { useState } from "react";
import Sheet_side from "@/_components/sheet/side/Sheet_side";
import { Button } from "@/_components/buttons_variants/buttons/Button";
export default function Example() {
const [open, setOpen] = useState(false);
return (
<>
<Button onClick={() => setOpen(true)}>Open</Button>
<Sheet_side
isOpen={open}
onOpenChange={setOpen}
title="Side sheet"
side="right"
size="medium"
showScrim
contentBody={<div style={{ padding: 12 }}>Body</div>}
/>
</>
);
}Sizes
Use size to switch between minimized / small / medium / large / full.
Live preview
Body (short)
Contenido corto para validar layout.
small (right)
Body (short)
Contenido corto para validar layout.
large (left)
Body (long)
Item 1 — contenido largo para probar scroll interno.
Item 2 — contenido largo para probar scroll interno.
Item 3 — contenido largo para probar scroll interno.
Item 4 — contenido largo para probar scroll interno.
Item 5 — contenido largo para probar scroll interno.
Item 6 — contenido largo para probar scroll interno.
Item 7 — contenido largo para probar scroll interno.
Item 8 — contenido largo para probar scroll interno.
Item 9 — contenido largo para probar scroll interno.
Item 10 — contenido largo para probar scroll interno.
Item 11 — contenido largo para probar scroll interno.
Item 12 — contenido largo para probar scroll interno.
Item 13 — contenido largo para probar scroll interno.
Item 14 — contenido largo para probar scroll interno.
Item 15 — contenido largo para probar scroll interno.
Item 16 — contenido largo para probar scroll interno.
full (right)
Body (long)
Item 1 — contenido largo para probar scroll interno.
Item 2 — contenido largo para probar scroll interno.
Item 3 — contenido largo para probar scroll interno.
Item 4 — contenido largo para probar scroll interno.
Item 5 — contenido largo para probar scroll interno.
Item 6 — contenido largo para probar scroll interno.
Item 7 — contenido largo para probar scroll interno.
Item 8 — contenido largo para probar scroll interno.
Item 9 — contenido largo para probar scroll interno.
Item 10 — contenido largo para probar scroll interno.
Item 11 — contenido largo para probar scroll interno.
Item 12 — contenido largo para probar scroll interno.
Item 13 — contenido largo para probar scroll interno.
Item 14 — contenido largo para probar scroll interno.
Item 15 — contenido largo para probar scroll interno.
Item 16 — contenido largo para probar scroll interno.
Sizes
import { useState } from "react";
import Sheet_side from "@/_components/sheet/side/Sheet_side";
import { Button } from "@/_components/buttons_variants/buttons/Button";
export default function Example() {
const [open, setOpen] = useState(false);
return (
<>
<Button onClick={() => setOpen(true)}>Open</Button>
<Sheet_side
isOpen={open}
onOpenChange={setOpen}
title="Large sheet"
side="left"
size="large"
showScrim
contentBody={<div style={{ padding: 12 }}>Long content</div>}
/>
</>
);
}Side / offset / radius / scrim
Common layout controls for how the sheet is positioned and shaped.
Live preview
Playground sheet
Body (long)
Item 1 — contenido largo para probar scroll interno.
Item 2 — contenido largo para probar scroll interno.
Item 3 — contenido largo para probar scroll interno.
Item 4 — contenido largo para probar scroll interno.
Item 5 — contenido largo para probar scroll interno.
Item 6 — contenido largo para probar scroll interno.
Item 7 — contenido largo para probar scroll interno.
Item 8 — contenido largo para probar scroll interno.
Item 9 — contenido largo para probar scroll interno.
Item 10 — contenido largo para probar scroll interno.
Item 11 — contenido largo para probar scroll interno.
Item 12 — contenido largo para probar scroll interno.
Item 13 — contenido largo para probar scroll interno.
Item 14 — contenido largo para probar scroll interno.
Item 15 — contenido largo para probar scroll interno.
Item 16 — contenido largo para probar scroll interno.
Variants
import Sheet_side from "@/packages/ui/src/_components/sheet/side/Sheet_side";
export default function Example() {
return (
<Sheet_side
isOpen
onOpenChange={() => {}}
title="Sheet"
side="right"
size="medium"
offset="md"
radius="lg"
style="standard"
showScrim
contentBody={<div style={{ padding: 12 }}>Body</div>}
contentFooter={<div style={{ padding: 12 }}>Footer</div>}
/>
);
}No scrim
Disable background overlay with showScrim={false}.
Live preview
No scrim
Body (short)
Contenido corto para validar layout.
No scrim
import { useState } from "react";
import Sheet_side from "@/_components/sheet/side/Sheet_side";
import { Button } from "@/_components/buttons_variants/buttons/Button";
export default function Example() {
const [open, setOpen] = useState(false);
return (
<>
<Button onClick={() => setOpen(true)}>Open</Button>
<Sheet_side
isOpen={open}
onOpenChange={setOpen}
title="No scrim"
side="left"
size="medium"
showScrim={false}
contentBody={<div style={{ padding: 12 }}>Body</div>}
/>
</>
);
}On this page
Sheet_side Props
Side sheet (left/right) controlled via `isOpen` and `onOpenChange`. Designed for navigation, settings panels, filters, etc.
This component commonly uses `position: fixed` for the overlay/sheet layers.
If you render it inside a constrained container (docs/live preview), ensure you create a containing block so fixed layers don't escape.
Tip: keep `contentBody` reasonably sized and let it scroll internally for long content.
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
| isOpen | boolean | Yes | n/a | Controls visibility of the sheet. |
| onOpenChange | (next: boolean) => void | Yes | n/a | Called when the sheet requests to open/close (scrim click, close button, drag, etc). |
| title | string | No | undefined | Header text text. |
| side | "left" | "right" | No | "right" | Which side the sheet comes from. (Values: left, right) |
| size | "minimized" | "small" | "medium" | "large" | "full" | No | "medium" | Width preset of the sheet. (Values: minimized, small, medium, large, full) |
| style | "standard" | No | "standard" | Visual style preset. (Values: standard) |
| radius | "none" | "sm" | "md" | "lg" | "xl" | No | "none" | Corner radius preset. (Values: none, sm, md, lg, xl) |
| offset | "none" | "sm" | "md" | "lg" | "top-sm" | "top-md" | "top-lg" | No | "none" | Inset preset. Use `top-*` to keep space at the top (useful when there is a fixed header). (Values: none, sm, md, lg, top-sm, top-md, top-lg) |
| showScrim | boolean | No | false | Shows a background overlay behind the sheet. |
| contentBody | React.ReactNode | No | undefined | Main content (scrollable area). |
| contentFooter | React.ReactNode | No | undefined | Optional footer area (actions). |
useHorizontalDrag Props
Hook used by Sheet_side to support horizontal drag-to-close gestures (left/right). Treat this as an advanced/internal building block.
The hook typically listens to pointer/touch events and updates the sheet transform during drag.
Use it only when you need custom behavior beyond what Sheet_side already provides.
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
| enabled | boolean | No | true | Enables the drag gesture handling. |
| side | "left" | "right" | No | "right" | Sheet side (affects drag direction and close threshold logic). (Values: left, right) |
| sheetRef | React.RefObject<HTMLElement | null> | Yes | n/a | Ref to the sheet element that is being dragged. |
| threshold | number | No | 80 | Minimum drag distance (px) required to trigger close. |
| onClose | () => void | Yes | n/a | Called when the gesture decides the sheet should close. |
| scrimRef | React.RefObject<HTMLElement | null> | No | undefined | Optional ref to the scrim/overlay element (useful to coordinate pointer events). |
Components