Пропсы корня
| Проп | Тип | По умолчанию |
|---|---|---|
snapPoints | Array<${number}px | number> | — |
Высоты, на которых останавливается шторка, как детенты нативной шторки: доля высоты области просмотра (0.5) или высота в пикселях ('200px'). Шторка подстраивается под содержимое, если у SheetContent нет CSS-высоты, а точка привязки выше её высоты останавливается на её верхнем краю. Без точек привязки шторка открывается полностью. | ||
activeSnapPoint | number | — |
Текущая активная точка привязки (контролируемо) — индекс в snapPoints. | ||
defaultSnapPoint | number | — |
Точка привязки, в которой открывается шторка в неконтролируемом режиме, — индекс в snapPoints. По умолчанию — самая нижняя. | ||
onChangeActiveSnapPoint | (activeSnapPoint: number) => void | — |
| Колбэк, вызываемый, когда пользователь перемещает шторку к другой точке привязки. | ||
steppedSnapPoints | boolean | false |
| Перемещает не больше чем на одну точку привязки за одно перетаскивание, как бы далеко или быстро оно ни было. | ||
defaultOpen | boolean | false |
| Определяет, открыта ли шторка изначально (неконтролируемо). | ||
open | boolean | — |
| Управляет тем, открыта ли шторка сейчас (контролируемо). | ||
onChangeOpen | (value: boolean) => void | — |
| Колбэк, вызываемый при изменении состояния открытия. | ||
children | ReactNode | ReactNode[] | — |
| Содержимое, рендерящееся внутри шторки. Может включать любые элементы раскладки или формы. | ||
Дочерние части
SheetTrigger
Действие открытия шторки. Выставляет aria-haspopup="dialog" и aria-expanded.
| Проп | Тип | По умолчанию |
|---|---|---|
asChild | boolean | — |
Если true, рендерит триггер как собственный элемент через Slot. Позволяет гибко компоновать с собственными элементами вроде <a>, <div> или кнопок-иконок. | ||
ref | Ref<HTMLButtonElement> | — |
| Ref, передаваемый на нижележащий элемент триггера. Полезен для управления фокусом или внешнего управления. | ||
Также принимает все атрибуты <button>.
SheetContent
Нативный модальный <dialog>.
| Проп | Тип | По умолчанию |
|---|---|---|
ref | Ref<HTMLDialogElement> | — |
Ref, передаваемый на нативный элемент <dialog>. Полезен для управления фокусом, измерений или хуков анимации. | ||
shadowed | boolean | — |
| Добавляет панели шторки тень. Создаёт глубину и отделяет её от фона. | ||
blurred | boolean | false |
| Размывает страницу за шторкой. | ||
overlay | boolean | true |
| Затемняет страницу за шторкой. При false страница остаётся видимой, а шторка — модальной. | ||
closedBy | ModalDialogClosedBy | 'any' |
Какие действия пользователя закрывают шторку, как нативный атрибут closedby: any — клик по подложке, свайп вниз или Escape, closerequest — только Escape, none — ничего из этого. | ||
Также принимает все атрибуты <dialog>.
- Сам не выставляет
idиaria-labelledby: назовите его черезaria-labelledby, указывающий наidвашего заголовка, или черезaria-label.onCancelиonCloseвыполняются после внутренних обработчиков.refуказывает на элемент<dialog>. blurred(по умолчаниюfalse) размывает страницу за шторкой.overlay(по умолчаниюtrue) затемняет страницу;falseделает::backdropпрозрачным, при этом шторка остаётся модальной.shadowedдобавляет тень поверхности.- Имеет горизонтальные отступы (
clamp(var(--spacing-12), 3vw, var(--spacing-16))) и нижний отступ (var(--spacing-12)плюс отступ безопасной зоны). Прокручиваемая область внутри — элемент сoverflow: auto. - Закрывается при отправке
<form method="dialog">внутри неё, в том числе сclosedBy='none'. Закрытие идёт черезonChangeOpen(false), аvalueкнопки отправки становитсяreturnValueдиалога. closedByзадаёт, какие действия пользователя закрывают шторку, как нативный атрибутclosedby:'any'(клик по подложке, свайп вниз илиEscape, по умолчанию),'closerequest'(толькоEscape) или'none'. ИспользуйтеclosedBy='none'для шторки, которую нельзя закрыть.- Перетаскивание следует за пальцем, сопротивляется за верхней и нижней точками привязки и останавливается на той точке, куда донесла бы инерция, поэтому резкий взмах может проскочить точку привязки. С
closedBy='any'перетаскивание вниз ниже самой нижней точки привязки закрывает шторку. - Остаётся смонтированной, только пока открыта и пока идёт переход закрытия.
SheetHandle
Ручка в верхней части шторки. Это всегда <button> без собственного имени, поэтому передайте aria-label, например Resize sheet. Если у шторки несколько точек привязки, ручка перемещает её на следующую точку, а с верхней — обратно на самую нижнюю. Иначе она disabled и aria-hidden.
| Проп | Тип | По умолчанию |
|---|---|---|
ref | Ref<HTMLButtonElement> | — |
Ref, передаваемый на <button> ручки. | ||
Также принимает все атрибуты <button>.
SheetClose
Закрывает шторку по клику. У неё нет стилей, иконки и aria-label по умолчанию: отрендерите внутри свою кнопку через asChild и подпишите её.
| Проп | Тип | По умолчанию |
|---|---|---|
asChild | boolean | — |
Если true, рендерит действие закрытия как дочерний элемент через Slot, поэтому любая ваша кнопка закрывает шторку. | ||
ref | Ref<HTMLButtonElement> | — |
| Ref, передаваемый на нижележащую кнопку. | ||
Также принимает все атрибуты <button>.
- Закрытие идёт через
onChangeOpen(false), поэтому проигрывается переход закрытия, а контролирующий родитель может оставить шторку открытой. - Используйте её для отдельной кнопки закрытия, например крестика в шапке. Для кнопок, которые отвечают на шторку (Cancel, Confirm,
returnValue), используйте<form method="dialog">. БезasChildона рендеритtype="button", поэтому работает и внутри вашей собственной формы, не отправляя её; сasChildзадайте своей кнопкеtype="button".
minimal-composition.tsx · 46 строк
import { useId, type CSSProperties } from 'react';
import {
Button,
Heading,
Icon,
IconButton,
Sheet,
SheetClose,
SheetContent,
SheetHandle,
SheetTrigger,
Text,Типы
SheetPropsSheetContentPropsSheetClosePropsSheetTriggerPropsSheetHandleProps
Модель состояния
- Состояние открытия может быть контролируемым через
openили неконтролируемым черезdefaultOpen. - Каждый запрос на закрытие (клик по подложке,
Escape, свайп, клик поSheetClose, отправка<form method="dialog">) идёт черезonChangeOpen(false); контролируемая шторка остаётся открытой, покаopenне станетfalse. - Пока шторка открыта, прокрутка страницы блокируется через CSS (
html:has(dialog:modal) { overflow: hidden }), как уDialogиDrawer. - Точки привязки влияют на видимую модель взаимодействия, а не только на раскладку.
- Шторка подстраивается под содержимое вплоть до высоты вьюпорта. Задайте CSS-высоту на
SheetContent(style={{ height: '80dvh' }}или класс), чтобы сделать высоту фиксированной. Точки привязки — доли высоты вьюпорта или высоты в пикселях, и точка выше высоты шторки останавливается у её верха, так что с коротким содержимым шторка остаётся по размеру содержимого. БезsnapPointsшторка останавливается полностью открытой. defaultSnapPoint,activeSnapPointи значениеonChangeActiveSnapPoint— индексы вsnapPointsв том порядке, в котором вы их передали, независимо от визуального порядка.- Шторка открывается на самой нижней точке привязки, если
defaultSnapPointне говорит иначе, и неконтролируемая шторка снова открывается там же. onChangeActiveSnapPointсрабатывает, только когда пользователь перемещает шторку на другую точку привязки.steppedSnapPointsперемещает шторку не больше чем на одну точку привязки за перетаскивание и сопротивляется движению дальше.- Взмах проносит шторку через точки привязки дальше, чем к закрытию: лёгкий взмах вниз с самой нижней точки оставляет её открытой, а взмах с более высокой точки останавливает её на точке привязки.
closedBy='none'наSheetContentстоит оставлять для сценариев с понятным путём завершения.useSheetContextдоступен для продвинутых обёрток и контролов. Он возвращает{ open, changeOpen, contentRef, height, viewport, offsets, activeSnapPoint, changeActiveSnapPoint, steppedSnapPoints }и больше не предоставляетcontentId,contextиз floating-ui,triggerProps,contentProps,transitionStatusиisMounted.