Компоненты/Раскрытие при наведении

Раскрытие при наведении

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
НазадКоманда при наведенииДалееВкладки по наведению

Слева — большое фото, справа — список крупных имён с номерами. При наведении курсора, касании или ведении пальцем по списку строка становится активной: имя темнеет и слегка наклоняется, а фото плавно проявляется из увеличенного масштаба. Строка под пальцем «примагничивается» к нему, а фото едва заметно смещается следом и медленно парит.

Активной строкой можно управлять снаружи через activeIndex и onActiveChange. Жесты и анимация работают на UI-потоке, а при «Уменьшении движения» парение, параллакс и магнитный эффект отключаются. Работает на iOS, Android и в вебе.

Вручную

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

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

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

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

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

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

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

Пропсы

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

Тип readonly IHoverRevealItem[]

style?

Тип StyleProp<ViewStyle>

imageAspect?

Тип number

imageMinHeight?

Тип number

label?

Тип string | null

defaultActiveIndex?

Тип number

activeIndex?

Тип number

onActiveChange?

Тип (index: number) => void

formatIndex?

Тип (index: number) => string

hideIndex?

Тип boolean

imageZoom?

Тип number

imageScaleDuration?

Тип number

disableParallax?

Тип boolean

disableFloat?

Тип boolean

disableMagnetic?

Тип boolean

disableSkew?

Тип boolean