
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
react-native-zero-sheet
Advanced tools
Мощный и гибкий компонент bottom sheet для React Native с поддержкой drag-to-close, автоматической обработкой клавиатуры и адаптивными размерами
Мощный и гибкий компонент bottom sheet для React Native с поддержкой drag-to-close, автоматической обработкой клавиатуры и адаптивными размерами.
Примечание: Название "zero" означает, что библиотека работает без дополнительных зависимостей (кроме стандартных для React Native).

npm install react-native-zero-sheet
# или
yarn add react-native-zero-sheet
Библиотека требует react-native-safe-area-context для работы с safe area insets:
npm install react-native-safe-area-context
# или
yarn add react-native-safe-area-context
Убедитесь, что ваш корневой компонент обернут в SafeAreaProvider:
import { SafeAreaProvider } from 'react-native-safe-area-context';
function App() {
return <SafeAreaProvider>{/* Ваш код */}</SafeAreaProvider>;
}
import React, { useRef } from 'react';
import { View, Button, Text } from 'react-native';
import ZeroSheet, { ZeroSheetHandle } from 'react-native-zero-sheet';
function App() {
const sheetRef = useRef<ZeroSheetHandle>(null);
return (
<View>
<Button title="Открыть Sheet" onPress={() => sheetRef.current?.open()} />
<ZeroSheet
ref={sheetRef}
header={
<View style={{ padding: 20 }}>
<Text style={{ fontSize: 20, fontWeight: 'bold' }}>Заголовок</Text>
</View>
}
footer={
<View style={{ padding: 20 }}>
<Button title="Закрыть" onPress={() => sheetRef.current?.close()} />
</View>
}
>
<View style={{ padding: 20 }}>
<Text>Контент модального окна</Text>
</View>
</ZeroSheet>
</View>
);
}
Вы можете обернуть ваше приложение в ZeroSheetProvider для установки настроек по умолчанию для всех ZeroSheet компонентов. Если настройки не заданы напрямую в компоненте, они будут браться из провайдера:
import React from 'react';
import { ZeroSheetProvider } from 'react-native-zero-sheet';
function App() {
return (
<ZeroSheetProvider
backgroundColor="#f5f5f5"
draggableHeight={30}
customStyles={{
container: { borderTopLeftRadius: 30, borderTopRightRadius: 30 },
draggableIcon: { backgroundColor: '#ccc' },
}}
>
{/* Ваше приложение */}
</ZeroSheetProvider>
);
}
Теперь все ZeroSheet компоненты будут использовать эти настройки по умолчанию, но вы можете переопределить их для конкретного компонента:
// Использует настройки из провайдера
<ZeroSheet visible={visible}>
<Content />
</ZeroSheet>
// Переопределяет backgroundColor из провайдера
<ZeroSheet visible={visible} backgroundColor="#ffffff">
<Content />
</ZeroSheet>
import React, { useState } from 'react';
import { View, Button, Text } from 'react-native';
import ZeroSheet from 'react-native-zero-sheet';
function App() {
const [visible, setVisible] = useState(false);
return (
<View>
<Button title="Открыть" onPress={() => setVisible(true)} />
<ZeroSheet
visible={visible}
onChange={(open) => setVisible(open)}
header={
<View style={{ padding: 20 }}>
<Text style={{ fontSize: 20 }}>Заголовок</Text>
</View>
}
>
<View style={{ padding: 20 }}>
<Text>Контент</Text>
</View>
</ZeroSheet>
</View>
);
}
<ZeroSheet
visible={visible}
fixedHeaderHeight={60}
fixedFooterHeight={80}
fixedContentHeight={400}
header={<HeaderComponent />}
footer={<FooterComponent />}
>
<ContentComponent />
</ZeroSheet>
<ZeroSheet
visible={visible}
backgroundColor="#f5f5f5"
buttonColor="#ffffff"
draggableHeight={30}
customStyles={{
wrapper: { backgroundColor: 'rgba(0,0,0,0.5)' },
container: { borderTopLeftRadius: 30, borderTopRightRadius: 30 },
draggableIcon: { backgroundColor: '#ccc', width: 40, height: 4 },
}}
>
<ContentComponent />
</ZeroSheet>
<ZeroSheet
visible={visible}
draggable={false}
backdrop={false}
closeByBackdropClick={false}
>
<ContentComponent />
</ZeroSheet>
<ZeroSheet
visible={visible}
onSheetOpen={() => console.log('Sheet открывается')}
onSheetOpened={() => console.log('Sheet открыт')}
onSheetClose={() => console.log('Sheet закрывается')}
onSheetClosed={() => console.log('Sheet закрыт')}
onManualClose={() => console.log('Закрытие вручную')}
onChange={(open) => console.log('Состояние изменилось:', open)}
>
<ContentComponent />
</ZeroSheet>
<ZeroSheet
visible={visible}
renderBackground={
<Image
source={require('./background.png')}
style={{ width: '100%', height: '100%' }}
/>
}
>
<ContentComponent />
</ZeroSheet>
<ZeroSheet visible={visible} noTopInset={true} noBottomInset={true}>
<ContentComponent />
</ZeroSheet>
По умолчанию скролл включается автоматически, если контент превышает доступную область. Вы можете принудительно управлять скроллом:
// Автоматическое определение (по умолчанию)
<ZeroSheet visible={visible}>
<ContentComponent />
</ZeroSheet>
// Принудительно включить скролл
<ZeroSheet visible={visible} scrollEnabled={true}>
<ContentComponent />
</ZeroSheet>
// Принудительно отключить скролл
<ZeroSheet visible={visible} scrollEnabled={false}>
<ContentComponent />
</ZeroSheet>
Провайдер для установки настроек по умолчанию для всех ZeroSheet компонентов.
| Prop | Type | Default | Description |
|---|---|---|---|
draggable | boolean | true | Включить возможность перетаскивания для закрытия |
draggableHeight | number | 25 | Высота области для перетаскивания |
backdrop | boolean | true | Показывать затемненный фон |
closeByBackdropClick | boolean | true | Закрывать при клике на фон |
backgroundColor | string | '#fff' | Цвет фона sheet |
buttonColor | string | - | Цвет нижней области (safe area) |
noTopInset | boolean | false | Не добавлять верхний safe area inset |
noBottomInset | boolean | false | Не добавлять нижний safe area inset |
customStyles | CustomStyles | {} | Кастомные стили |
Примечание: Все настройки из провайдера могут быть переопределены в конкретном компоненте ZeroSheet. При объединении customStyles стили из props имеют приоритет над стилями из провайдера.
| Prop | Type | Default | Description |
|---|---|---|---|
visible | boolean | - | Контролируемое состояние видимости |
onChange | (open: boolean) => void | - | Колбэк при изменении состояния |
draggable | boolean | true | Включить возможность перетаскивания для закрытия |
draggableHeight | number | 25 | Высота области для перетаскивания |
backdrop | boolean | true | Показывать затемненный фон |
closeByBackdropClick | boolean | true | Закрывать при клике на фон |
backgroundColor | string | '#fff' | Цвет фона sheet |
buttonColor | string | - | Цвет нижней области (safe area) |
noTopInset | boolean | false | Не добавлять верхний safe area inset |
noBottomInset | boolean | false | Не добавлять нижний safe area inset |
header | React.ReactNode | - | Контент заголовка |
footer | React.ReactNode | - | Контент футера |
fixedHeaderHeight | number | - | Фиксированная высота заголовка |
fixedFooterHeight | number | - | Фиксированная высота футера |
fixedContentHeight | number | - | Фиксированная высота контента (будет ограничена максимальной доступной высотой с учетом header, footer, keyboard, insets и draggable области) |
before | React.ReactNode | - | Элемент перед контентом |
renderBackground | React.ReactNode | - | Кастомный фон sheet |
customStyles | CustomStyles | {} | Кастомные стили |
scrollEnabled | boolean | - | Управление скроллом контента (если не задано, определяется автоматически по размеру контента) |
onSheetOpen | () => void | - | Колбэк при начале открытия |
onSheetOpened | () => void | - | Колбэк после открытия |
onSheetClose | () => void | - | Колбэк при начале закрытия |
onSheetClosed | () => void | - | Колбэк после закрытия |
onManualClose | () => void | - | Колбэк при ручном закрытии (drag или backdrop) |
children | React.ReactNode | - | Контент sheet |
type CustomStyles = {
wrapper?: ViewStyle;
container?: ViewStyle;
draggableIcon?: ViewStyle;
};
interface ZeroSheetHandle {
open: () => void;
close: () => void;
expand: () => void; // Алиас для open()
}
Библиотека также экспортирует внутренние компоненты для более гибкого использования:
ZeroSheetHeader - компонент заголовка с автоматической анимацией высотыZeroSheetContent - компонент контента с поддержкой скроллаZeroSheetFooter - компонент футера с автоматической анимацией высотыЭти компоненты автоматически используются внутри ZeroSheet, но могут быть использованы напрямую при необходимости.
Библиотека полностью типизирована с TypeScript. Все типы экспортируются:
import ZeroSheet, {
ZeroSheetHandle,
ZeroSheetProvider,
ZeroSheetProviderProps,
} from 'react-native-zero-sheet';
FAQs
Мощный и гибкий компонент bottom sheet для React Native с поддержкой drag-to-close, автоматической обработкой клавиатуры и адаптивными размерами
We found that react-native-zero-sheet demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.