Customizable 3D, moving gradient for React. The v2 package is lean: it only ships the ShaderGradient renderer (and its canvas helper), while the stateless UI pieces now live in the separate @shadergradient/ui package.
- π¦ Installation
- π¦ Packages
- π» Usage
- π Examples
- π€ Conference Talks
- π Contributing
- π Future Plan
- βοΈ License
Framer Component (Copy this URL and paste it on Framer Canvas)
Install the core renderer and its peer deps.
# with yarn
yarn add @shadergradient/react @react-three/fiber three three-stdlib camera-controls
yarn add -D @types/three
# with npm
npm i @shadergradient/react @react-three/fiber three three-stdlib camera-controls
npm i -D @types/three
# with pnpm
pnpm add @shadergradient/react @react-three/fiber three three-stdlib camera-controls
pnpm add -D @types/three
Need the stateless control surfaces? Pull them from the @shadergradient/ui package (ESM build used by Framer/Figma), not from @shadergradient/react.
@shadergradient/react- Ships only the renderer:
ShaderGradientandShaderGradientCanvas. - No built-in store or controls. Use your own state or pair with
@shadergradient/ui.
- Ships only the renderer:
@shadergradient/ui- Stateless UI/control components extracted from the core package for Framer/Figma usage.
- Not published to npm; consumed as an ESM bundle (see
packages/ui).
shadergradient-old- Legacy v1 package that bundled store + UI. Keep using this only if you rely on the old with-store build.
Drop ShaderGradient inside ShaderGradientCanvas and drive it with props or a query string.
import { ShaderGradientCanvas, ShaderGradient } from '@shadergradient/react'
function App() {
return (
<ShaderGradientCanvas
style={{ position: 'absolute', inset: 0 }}
pixelDensity={1.5}
fov={45}
>
<ShaderGradient cDistance={32} cPolarAngle={125} />
</ShaderGradientCanvas>
)
}Load settings from a URL (for example, one copied from shadergradient.co/customize):
<ShaderGradientCanvas>
<ShaderGradient
control='query'
urlString='https://www.shadergradient.co/customize?animate=on&cDistance=3.6&cPolarAngle=90&color1=%2352ff89&color2=%23dbba95&color3=%23d0bce1&lightType=3d&shader=defaults&type=plane&uFrequency=5.5&uSpeed=0.4&uStrength=4'
/>
</ShaderGradientCanvas>type MeshT = {
type?: 'plane' | 'sphere' | 'waterPlane'
animate?: 'on' | 'off'
uTime?: number
uSpeed?: number
uStrength?: number
uDensity?: number
uFrequency?: number
uAmplitude?: number
range?: 'enabled' | 'disabled' | string
rangeStart?: number
rangeEnd?: number
loop?: 'on' | 'off'
loopDuration?: number
positionX?: number
positionY?: number
positionZ?: number
rotationX?: number
rotationY?: number
rotationZ?: number
color1?: string
color2?: string
color3?: string
reflection?: number
wireframe?: boolean
shader?: string
rotSpringOption?: any
posSpringOption?: any
}
type GradientT = MeshT & {
control?: 'query' | 'props'
isFigmaPlugin?: boolean
smoothTime?: number
cAzimuthAngle?: number
cPolarAngle?: number
cDistance?: number
cameraZoom?: number
lightType?: '3d' | 'env'
brightness?: number
envPreset?: 'city' | 'dawn' | 'lobby'
grain?: 'on' | 'off'
grainBlending?: number
zoomOut?: boolean
toggleAxis?: boolean
hoverState?: string
enableTransition?: boolean
enableCameraUpdate?: boolean
urlString?: string
onCameraUpdate?: (updates: Partial<GradientT>) => void
}ShaderGradientCanvas also accepts pixelDensity, fov, envBasePath, GL overrides (preserveDrawingBuffer, powerPreference), and lazy-load controls (lazyLoad, threshold, rootMargin).
- CRA Starter: CodeSandbox
- Next.js Starter (App Router): CodeSandbox
- Next.js Starter: CodeSandbox
- Vite + React 19 Starter: CodeSandbox
Figma and Framer demos still use the UI package internally:
pnpm install
pnpm dev
pnpm changeset
pnpm version-packages
then commit changes (message like v1.x.x)
# Release to npm
pnpm release
# Release it as ES Module (Hosted by GitHub Pages)
git push origin main- Detatch framer-motion peer depenency (Seperate UI & Store Package)
- Figma GIF Support
- More Shaders (Metalic, Glass, etc.)
- Three.js version upgrade
- Separate framer component bundles & shader gradient bundles
- Separate shader codes as a separate package, and make it reusable for JS, Vue, etc.
- Framer Plugin
- Webflow Support
- Wix Support
MIT Β© ruucm, stone-skipper

