Unstable Aurora

A Skia-powered set featuring smooth visual transitions and flowing shader-based backgrounds.

Last updated on

Edit on GitHub

Manual

Install the following dependencies:

npm install react-native-reanimated @shopify/react-native-skia

Copy and paste the following code into your project. component/organisms/unstable_aurora

/** * Aurora Shader Component * Inspired by ReactBits * https://reactbits.dev/backgrounds/aurora */import React, { memo } from "react";import { StyleSheet } from "react-native";import {  Canvas,  Fill,  Skia,  Shader,  Uniforms,} from "@shopify/react-native-skia";import {  useSharedValue,  useFrameCallback,  useDerivedValue,} from "react-native-reanimated";import { SHADER_SOURCE } from "./conf";import type { UnstableAuroraProps as AuroraProps } from "./types";import { hexToRgb } from "./helper";const source = Skia.RuntimeEffect.Make(SHADER_SOURCE);export const UnstableAurora: React.FC<AuroraProps> &  React.FunctionComponent<AuroraProps> = memo<AuroraProps>(  ({    colors = ["#5227FF", "#7cff67", "#5227FF"],    speed = 1,    blend = 0.5,    direction = "bottom",    amplitude = 1,    style,  }: AuroraProps): React.ReactNode & React.ReactElement => {    const size = useSharedValue({ width: 0, height: 0 });    const time = useSharedValue<number>(0);    useFrameCallback(() => {      time.value += 0.016 * speed;    });    const [c0r, c0g, c0b] = hexToRgb<(typeof colors)[0]>(colors[0]);    const [c1r, c1g, c1b] = hexToRgb<(typeof colors)[1]>(colors[1]);    const [c2r, c2g, c2b] = hexToRgb<(typeof colors)[2]>(colors[2]);    const uniforms = useDerivedValue<Uniforms>(() => ({      uTime: time.value,      uAmplitude: amplitude,      uColor0: [c0r, c0g, c0b],      uColor1: [c1r, c1g, c1b],      uColor2: [c2r, c2g, c2b],      uResolution: [size.value.width, size.value.height],      uBlend: blend,      uDirection: direction === "top" ? -1.0 : 1.0,    }));    return (      <Canvas style={[styles.canvas, style]} onSize={size}>        <Fill>          <Shader source={source!} uniforms={uniforms} />        </Fill>      </Canvas>    );  },);const styles = StyleSheet.create({  canvas: {    flex: 1,  },});export default memo<AuroraProps>(UnstableAurora);

Usage

import React from "react";import { StyleSheet, Text, View } from "react-native";import { StatusBar } from "expo-status-bar";import { SymbolView } from "expo-symbols";import { UnstableAurora } from "@/components/organisms/unstable_aurora";import { useFonts } from "expo-font";export default function HomeScreen() {  const [fontLoaded] = useFonts({    SfProRounded: require("@/assets/fonts/sf-pro-rounded.ttf"),    HelveticaNowDisplay: require("@/assets/fonts/HelveticaNowDisplayMedium.ttf"),  });  return (    <View style={styles.container}>      <StatusBar style="light" />      <UnstableAurora        direction="top"        blend={0.9}        amplitude={0.91}        colors={["#00FF9C", "#5FD4FF", "#7A5CFF"]}      />      <View style={styles.overlay}>        <SymbolView          name="sparkles"          size={28}          tintColor="rgba(255,255,255,0.9)"        />        <Text          style={[            styles.title,            {              fontFamily: fontLoaded ? "HelveticaNowDisplay" : undefined,            },          ]}        >          Aurora        </Text>        <Text          style={[            styles.subtitle,            {              fontFamily: fontLoaded ? "SfProRounded" : undefined,            },          ]}        >          Procedural shader background        </Text>      </View>    </View>  );}const styles = StyleSheet.create({  container: {    flex: 1,    backgroundColor: "#000",  },  overlay: {    ...StyleSheet.absoluteFillObject,    alignItems: "center",    justifyContent: "center",    gap: 10,  },  title: {    color: "#fff",    fontSize: 28,  },  subtitle: {    color: "rgba(255,255,255,0.7)",    fontSize: 14,  },});

Props

React Native Reanimated
React Native Skia