Компоненты/Шторка с упорами

Шторка с упорами

Pro
28 сентября 2026

Нижняя шторка с несколькими высотами-упорами, которая доводится до ближайшей с учётом скорости жеста и закрывается резким смахиванием вниз.

Установка

import { useEffect, useMemo } from "react";
import Animated, { useSharedValue } from "react-native-reanimated";
import { StyleSheet, View } from "react-native";

Установка через CLIPro

Команда станет доступна после оформления Pro.

Оформить ProВойти

Файлы

index.tsx
НазадВыбор датыДалееКарусель Dia

Шторка выезжает снизу на пружине и останавливается на одном из упоров — долей высоты экрана. Её можно тянуть за ручку или за содержимое, когда оно прокручено к началу: после отпускания она доводится до ближайшего упора с учётом скорости жеста, выше верхнего упора сопротивляется, а резкое смахивание вниз закрывает её. Тап по затемнению, кнопка «Назад» на Android и Escape в вебе тоже закрывают шторку.

Оберните экран в DetentDrawerProvider: с fixed шторка рисуется поверх всей страницы, а с scaleBackground страница позади отступает и слегка уменьшается по мере открытия. Жесты и пружины работают на UI-потоке, при «Уменьшении движения» шторка просто проявляется без пружины. Работает на iOS, Android и в вебе.

Вручную

Поставьте зависимости:

npm install react-native-reanimated react-native-gesture-handler
pnpm add react-native-reanimated react-native-gesture-handler
yarn add react-native-reanimated react-native-gesture-handler
bun add react-native-reanimated react-native-gesture-handler

Скопируйте эти файлы в src/shared/components/organisms/detent-drawer/:

index.tsx
import { useEffect, useMemo } from "react";
import Animated, { useSharedValue } from "react-native-reanimated";
import { StyleSheet, View } from "react-native";
// Полный исходник открывается с подпиской Pro
export interface DetentDrawerProps {
speed?: number;
intensity?: number;
palette?: "aurora" | "mono";
interactive?: boolean;
}
export function DetentDrawer({
speed = 1,
intensity = 0.6,
interactive = true,
}: DetentDrawerProps) {
const progress = useSharedValue(0);
const frame = useMemo(() => createFrame(speed), [speed]);
useEffect(() => {
// …

Код доступен по подпискеPro

Исходник «Шторка с упорами» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.

Оформить ProВойти

Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.

Использование

usage.tsx
import { useEffect, useMemo } from "react";
import Animated, { useSharedValue } from "react-native-reanimated";
import { StyleSheet, View } from "react-native";
// Полный исходник открывается с подпиской Pro
export interface DetentDrawerProps {
speed?: number;
intensity?: number;
palette?: "aurora" | "mono";
interactive?: boolean;
}
export function DetentDrawer({
speed = 1,
intensity = 0.6,
interactive = true,
}: DetentDrawerProps) {
const progress = useSharedValue(0);
const frame = useMemo(() => createFrame(speed), [speed]);
useEffect(() => {
// …

Код доступен по подпискеPro

Исходник «Шторка с упорами» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.

Оформить ProВойти

Упоры detents — доли высоты контейнера, initialDetent — индекс упора, на котором шторка открывается.

Пропсы

Пропс
Описание
open

Тип boolean

onClose

Тип () => void

detents?

Тип readonly number[]

initialDetent?

Тип number

onProgress?

Тип (progress: number) => void

fixed?

Тип boolean

scaleBackground?

Тип boolean

radius?

Тип number

maxWidth?

Тип number

children?

Тип ReactNode

style?

Тип StyleProp<ViewStyle>

label?

Тип string