Компоненты/Затмение

Затмение

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
НазадDynamic IslandДалееРезиновая карусель

Полное солнечное затмение: вокруг чёрного диска Луны переливается корона с лучами и стримерами, по краю тлеет красная хромосфера с протуберанцами, а на фоне мерцают звёзды. Палец (или курсор в вебе) сдвигает Луну, и когда из-за её края выглядывает Солнце, вспыхивает бриллиантовое кольцо с лучами и бликами объектива. Стоит отпустить — диск сам время от времени смещается.

Шейдер считается целиком на GPU через Skia, время и сглаженное положение пальца живут на UI-потоке Reanimated — React не перерисовывается на каждом кадре. Анимация замирает, когда включено «Уменьшение движения», приложение свёрнуто или передан paused. Работает на iOS, Android и в вебе.

Вручную

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

npm install @shopify/react-native-skia react-native-reanimated react-native-gesture-handler
pnpm add @shopify/react-native-skia react-native-reanimated react-native-gesture-handler
yarn add @shopify/react-native-skia react-native-reanimated react-native-gesture-handler
bun add @shopify/react-native-skia react-native-reanimated react-native-gesture-handler

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

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

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

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

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

По умолчанию компонент занимает ширину родителя и высоту height. Чтобы растянуть его фоном на весь экран, передайте fill.

Пропсы

Пропс
Описание
speed?

Тип number

size?

Тип number

color?

Тип string

corona?

Тип number

interactive?

Тип boolean

paused?

Тип boolean

fill?

Тип boolean

width?

Тип number

height?

Тип number

borderRadius?

Тип number

children?

Тип ReactNode

style?

Тип StyleProp<ViewStyle>