@shader-core/vue

Vue components for Shader Core: with layers as children.
1,342
Install
npm install @shader-core/vue
Latest Version:1.0.0
Vue:3
License:Custom
Last Updated:Oct 2, 2026
Links: npm
Maintainer: uxraza

@shader-core/vue

Vue components for Shader Core: an animated WebGL2 background composed from layers that stack.

npm install @shader-core/vue

Vue 3.4+ is a peer dependency.

Use

<script setup>
import { Shader, Gradient, Curtains, Grain, Vignette } from '@shader-core/vue';
</script>

<template>
  <Shader style="position: fixed; inset: 0; z-index: -1">
    <Gradient colorA="#04060f" colorB="#0a1230" />
    <Curtains :scale="3.8" colorSheet="#3ddc97" colorFilament="#4361ee" />
    <Grain :intensity="0.25" />
    <Vignette :amount="0.5" />
  </Shader>
</template>

Children are layers, bottom to top, composed into one program and drawn in one pass. Each is typed from its schema, so a mistyped prop is a compile error rather than a uniform nobody sets.

Bind numbers with a colon. intensity="0.25" without it hands the layer the string "0.25", which is a uniform that silently never gets set — the one mistake this API makes easy, and the reason the editor's Vue export writes the colon for you.

Changing a prop updates a uniform. Adding, removing or reordering a child changes the stack and recompiles once, then it is cached — so a slider is free and a drag-to-reorder is not.

Children

<template>, v-if and v-for all work: grouping is transparent, and a false v-if leaves a comment placeholder that is simply dropped.

A component that wraps layers does not. <Shader> reads its children rather than rendering them, so a wrapper is opaque — inline the layers, or have the wrapper render its own <Shader>.

Props

Prop What it does
paused Stops the animation and keeps everything else. Unset it to resume.
quality auto (default), high or low. Caps the pixel budget on modest hardware.
reducedMotion static (default) or animate, under prefers-reduced-motion.
staticTime Renders one frame at this time, in seconds, and never animates.

Anything else — class, style, id — lands on the canvas, merged with the component's own styles rather than replacing them.

Errors are reported through @error, and logged to the console if nothing is listening. A background is not worth taking a page down for, so a failure leaves the canvas blank rather than throwing through your render.

<Shader @error="(e) => report(e)">…</Shader>

Per-layer entry points

Every layer also has its own module — @shader-core/vue/gradient — if you would rather not rely on tree-shaking.

Layers

Bases, opaque, for the bottom of a stack: Gradient, Mesh, Marble, Frost, Contours, Silk, Terrain, Maze, Rings, Sheen.

Light, additive: Curtains, Caustics, Rays, Glow, Ribbon.

Pattern, a shape over anything: Halftone, Solid — one soft object in real 3D.

Finishing, multiplied over everything below: Grain, Vignette, Grade.

Filter, last, transforming everything beneath: Tone.

Licence

Free to use, including commercially, on one condition: the credit comment stays in shader source you copy. Full terms in LICENSE.md.

Related Packages

vue-glsl

A simple WebGL components for fragment shader. Can be used with Shadertoys codes

924 20
gradflow-vue

Beautiful animated WebGL gradients for Vue and Nuxt

755 1
@twallpaper/vue

🌈 Multicolor gradient wallpaper created algorithmically and shimmers smoothly.

549 117
shaders

The design platform for web shaders

3,092,964 5,609
@fxshelf/starfield

Canvas 2D starfield tunnel for React and Vue — perspective fly-through, glitter...

302 0

Version History

Version Released Vue License
1.0.0 >=3.4 Custom
0.6.0 >=3.4 Custom
0.5.0 >=3.4 Custom
0.4.0 >=3.4 Custom
0.3.1 >=3.4 Custom