Mesh Gradient <mv-mesh-gradient>
Animated WebGL mesh gradient: three soft ribbons of color wander over a base color on a tilted, folding plane, blended in Oklab so contrasting brand hues never meet in a muddy patch; optionally the plane leans toward the pointer. Self-contained (no shader runtime to install), it pauses off screen, shares the page's WebGL context budget and keeps a still frame under reduced motion.
| Category | Backgrounds |
|---|---|
| Type | WebGL element (<mv-mesh-gradient>) |
| Status | stable |
| Keywords | safe-rewrite, webgl, shader, gradient, mesh, oklab, hero |
When to use
- A polished SaaS or fintech hero needs a fluid, four-color brand gradient
- Contrasting brand hues must blend smoothly without muddy patches
- A launch page wants its gradient to respond gently to the pointer
Avoid when
- The gradient must run without WebGL and stay very light; the CSS aurora is cheaper → use Aurora Background instead
- A still brand gradient behind a section is enough → use Backdrop instead
Install
node scripts/add.mjs mesh-gradient --out ./src/marvelousAI agent with the Marvelous UI MCP server: install_components({ slugs: ["mesh-gradient"], target_dir: "<absolute path>/src/marvelous", framework: "react" }).
Files copied (dependencies included): tokens/tokens.css, core/base.css, core/canvas.js, core/dom.js, core/element.js, core/motion.js, core/observe.js, core/webgl.js, components/mesh-gradient/mesh-gradient.js, components/mesh-gradient/mesh-gradient.css.
Usage
Canonical markup, to start from and customize with attributes, data-* and CSS variables:
<mv-mesh-gradient data-fill></mv-mesh-gradient>
<div style="position:relative;display:grid;place-items:center;height:100%;min-height:320px;color:white;text-align:center;pointer-events:none">
<div>
<p style="margin:0;font:700 clamp(1.6rem,4vw,2.6rem)/1.1 var(--mv-font-sans);letter-spacing:-.03em;text-shadow:0 4px 24px rgb(0 0 0 / .35)">Payments that flow</p>
<p style="margin:.5rem 0 0;opacity:.85;font-size:.9rem;text-shadow:0 2px 12px rgb(0 0 0 / .3)"><mv-mesh-gradient colors="…"></p>
</div>
</div>API
Attributes
| Name | Type | Default | Description |
|---|---|---|---|
colors | CSS colors (4) | var(--mv-accent), #ff5c8a, #5ec8f2, #ffc15e | Base color, then the three ribbons (tokens accepted, re-read on theme change). Fewer than four colors repeat. |
scale | number | 1 | Size of the flows. |
rotation | number | -0.22 | Tilt of the plane, in radians. |
flow | number | 1 | Amplitude of the folds (0 = flat ribbons). |
speed | number | 1 | Time multiplier. |
paused | boolean | Freezes the animation on the current frame. | |
interactive | boolean | The plane leans toward the pointer while it is over the element. | |
dpr | number | 1.5 | Max pixel density (capped at 2). |
data-fill | boolean | Fills the positioned parent (absolute, inset 0). |
Content structure
| Name | Description |
|---|---|
children | Content placed inside the element sits above the gradient. |
Accessibility
Decorative: the canvas is aria-hidden and never takes pointer events. The loop stops off screen and in hidden tabs; reduced motion (OS or <html data-motion="reduce">) and paused keep a still, representative frame. Without WebGL2 a static CSS mesh is shown instead; forced colors and print hide the canvas.