API reference
Everything you need, nothing you don’t.
Cheat sheet
Quick formulas that map to a visual mood.
| Effect | Math logic | Visual feeling |
|---|---|---|
| Breathe | sin(t) * 0.5 + 0.5 | Smooth pulsing (0 to 1) |
| Glitch | sin(t) + sin(t * 10) * 0.1 | Electric vibration |
| Orbit | x: sin(t), y: cos(t) | Perfect circular motion |
| Chaos | sin(t + sin(t)) | Organic drift |
API reference
Minimal surface area, designed to stay predictable.
SineWaveGenerator Options
| Option | Type | Default | Description |
|---|---|---|---|
el |
string | HTMLCanvasElement |
required | Canvas element or CSS selector |
waves |
Wave[] |
[] |
Array of wave configuration objects |
pixelRatio |
number |
devicePixelRatio |
Device pixel ratio override |
maxPixelRatio |
number |
2 |
Maximum pixel ratio cap for memory/perf |
autoResize |
boolean |
true |
Automatically resize canvas on window resize |
Wave Options
| Option | Type | Default | Description |
|---|---|---|---|
amplitude |
number |
10 |
Wave height in pixels |
wavelength |
number |
100 |
Distance between wave peaks in pixels |
segmentLength |
number |
10 |
Rendering segment length (lower = smoother) |
phase |
number |
random | Initial phase offset (radians) |
speed |
number |
random 0.5-1.0 | Animation speed multiplier |
easing |
function |
Ease.sineInOut |
Easing function for wave shape |
rotate |
number |
0 |
Rotation angle in degrees |
strokeStyle |
string | null |
null |
Custom stroke color (CSS color or CanvasGradient) |
Methods
| Method | Returns | Description |
|---|---|---|
start() |
this |
Start the animation loop (uses
requestAnimationFrame)
|
stop() |
this |
Stop the animation loop and unbind events |
resize() |
this |
Manually trigger canvas resize and gradient rebuild |
addWave(config) |
this |
Add a wave dynamically at runtime |
removeWave(index) |
this |
Remove wave by index |
setWaves(waves) |
this |
Replace all waves in a single update |
setQualityPreset(preset) |
this |
Apply a memory/performance preset: quality, balanced, battery |
destroy() |
this |
Stop animation, unbind events, clear waves |
Easing Functions
| Function | Description |
|---|---|
Ease.sineInOut |
Smooth sine curve (default) |
Ease.sineIn |
Accelerating sine curve |
Ease.sineOut |
Decelerating sine curve |
Ease.linear |
Linear (no easing) |
Browser support
Works everywhere the Canvas API is available.
| Browser | Version | Status |
|---|---|---|
| Chrome / Edge | 60+ | Full support |
| Firefox | 55+ | Full support |
| Safari | 11+ | Full support |
| iOS Safari | 11+ | Full support |
| Samsung Internet | 8+ | Full support |
Requires HTMLCanvasElement.getContext("2d") and
requestAnimationFrame. No WebGL needed.
Framework guides
Use sine-wave-generator with any UI framework.
React
import { useEffect, useRef } from "react";
function Wave() {
const ref = useRef(null);
useEffect(() => {
const gen = new SineWaveGenerator({
el: ref.current,
waves: [{ amplitude: 30, wavelength: 140 }],
});
gen.start();
return () => gen.stop();
}, []);
return <canvas ref={ref} />;
}
Vue 3
<template>
<canvas ref="canvas" />
</template>
<script setup>
import { ref, onMounted, onUnmounted } from "vue";
const canvas = ref(null);
let gen;
onMounted(() => {
gen = new SineWaveGenerator({
el: canvas.value,
waves: [{ amplitude: 30, wavelength: 140 }],
});
gen.start();
});
onUnmounted(() => gen?.stop());
</script>
Angular
@Component({
template: `<canvas #wave></canvas>`
})
export class WaveComponent implements AfterViewInit, OnDestroy {
@ViewChild("wave") canvas!: ElementRef;
private gen?: SineWaveGenerator;
ngAfterViewInit() {
this.gen = new SineWaveGenerator({
el: this.canvas.nativeElement,
waves: [{ amplitude: 30, wavelength: 140 }],
});
this.gen.start();
}
ngOnDestroy() { this.gen?.stop(); }
}
Performance
Tune defaults for smoothness, with knobs for heavy scenes.
requestAnimationFrame
All rendering uses requestAnimationFrame for
battery-efficient 60fps. The loop auto-pauses when the tab is
hidden.
IntersectionObserver
Demos on this page use IntersectionObserver to start animations only when visible, saving CPU and battery.
prefers-reduced-motion
When prefers-reduced-motion: reduce is active,
animations slow down to respect motion preferences.
Cap pixel ratio
Use maxPixelRatio to avoid oversized buffers on high-DPI screens.
Increase segment length
Larger segments reduce per-frame points while preserving visual flow.
Reduce wave count
More waves increases draw cost; balance layering with frame budget.
Important: If you set a high
maxPixelRatio, memory use grows quickly on large
canvases.
Memory grows with
(width × height × maxPixelRatio²). For quick tuning, try
setQualityPreset("quality"),
setQualityPreset("balanced"), or
setQualityPreset("battery").
Troubleshooting
Common questions and solutions.
Why is my canvas blurry on Retina screens?
The library handles DPI scaling automatically. If you see blur,
ensure you are not setting width/height
attributes on the canvas manually. Let the library manage sizing
via resize(). You can also lower
maxPixelRatio to trade sharpness for performance.
Why isn't the wave moving?
Make sure you call generator.start() after setup.
Also check that speed is a positive number. If
prefers-reduced-motion is enabled in your OS,
animations will slow down to respect the setting.
How do I resize the canvas when the window changes?
Set autoResize: true (the default). For containers
that resize independently of the window, call
generator.resize() manually inside a
ResizeObserver callback.
Can I use this with server-side rendering (SSR)?
The library requires the DOM and Canvas API. Guard your import
with a typeof window !== "undefined" check or use
dynamic imports in Next.js/Nuxt.
Does this library support WebGL?
No. The library uses the 2D Canvas API exclusively. This keeps the bundle small and avoids GPU driver issues. For most wave visualizations, 2D Canvas provides sufficient performance.