Interactive Aurora Liquid Mesh
🔵 InteractiveA gorgeous, hyper-vibrant liquid mesh gradient featuring swirling cosmic colors that flow dynamically and react beautifully to the cursor.
Responsive Horizontal Leaderboard
Slot ID: ca-pub-detail-below-preview
Interactive Settings
Medium Rectangle Block
Slot ID: ca-pub-detail-after-customization
Quick Copy Actions
Download File Packages
Keyboard Shortcuts
Responsive Horizontal Leaderboard
Slot ID: ca-pub-detail-before-related
More in Gradient
Loading Canvas Shader...
Animated Mesh Gradient
A gorgeous, fluid mesh gradient featuring soft colorful spheres blending into each other with organic movement.
Loading Canvas Shader...
Aurora Flow
An elegant recreation of the northern lights, showing soft waves of emerald green and violet drifting on a dark sky.
Loading Canvas Shader...
Sunset Gradient
A calming gradient transition mirroring a beautiful sunset, blending deep purples, fiery oranges, and golden yellows.
Interactive Aurora Liquid Mesh - CSS-only Gradient background for React & Tailwind
Integrate the Interactive Aurora Liquid Mesh directly into your website. This asset is rendered using pure CSS and HTML keyframes. It is optimized for zero layout-shifts and runs with high-performance hardware-accelerated processing.
⚡ Performance Specifications
- Render Mode: INTERACTIVE (CSS-only)
- Fluidity: Locked at 60fps dynamic loop
- Bundle Footprint: Zero external NPM dependencies
- SEO Indexing status: 100% Crawlable static semantic HTML
🛠️ Integration Capabilities
Our templates expose inline design tokens like --color-1 and --color-2 for infinite color palettes. This template is designed to fit inside hero elements, full-screen landing pages, and interactive presentation cards.
Technical Code Reference & Syntaxes for Googlebot & Crawlers
The snippets below display the direct, unminified source code utilized for rendering this background.
HTML & Inline CSS Snippet (Vanilla)
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive Aurora Liquid Mesh</title>
<style>
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
background: #09090b;
}
.vibrant-plasma {
position: relative;
width: 100%;
height: 100%;
background: #0d091e;
overflow: hidden;
filter: blur(40px) saturate(180%);
}
.plasma-blob {
position: absolute;
border-radius: 50%;
mix-blend-mode: screen;
opacity: 0.85;
}
.blob-1 {
width: 450px;
height: 450px;
background: radial-gradient(circle, #ff007f 0%, transparent 70%);
top: calc(10% + (var(--mouse-y, 0) * 80px));
left: calc(15% + (var(--mouse-x, 0) * 80px));
animation: blob-drift-1 12s infinite alternate ease-in-out;
}
.blob-2 {
width: 500px;
height: 500px;
background: radial-gradient(circle, #00f0ff 0%, transparent 70%);
bottom: calc(10% - (var(--mouse-y, 0) * 90px));
right: calc(15% - (var(--mouse-x, 0) * 90px));
animation: blob-drift-2 15s infinite alternate ease-in-out;
}
.blob-3 {
width: 400px;
height: 400px;
background: radial-gradient(circle, #7000ff 0%, transparent 70%);
top: calc(40% - (var(--mouse-y, 0) * 60px));
right: calc(30% + (var(--mouse-x, 0) * 60px));
animation: blob-drift-3 10s infinite alternate ease-in-out;
}
.blob-4 {
width: 350px;
height: 350px;
background: radial-gradient(circle, #ffb800 0%, transparent 70%);
bottom: calc(20% + (var(--mouse-y, 0) * 70px));
left: calc(40% - (var(--mouse-x, 0) * 70px));
animation: blob-drift-4 14s infinite alternate ease-in-out;
}
@keyframes blob-drift-1 {
0% { transform: translate(0, 0) scale(1); }
50% { transform: translate(60px, -40px) scale(1.15); }
100% { transform: translate(-30px, 50px) scale(0.9); }
}
@keyframes blob-drift-2 {
0% { transform: translate(0, 0) scale(1.1); }
50% { transform: translate(-50px, 60px) scale(0.85); }
100% { transform: translate(40px, -30px) scale(1.05); }
}
@keyframes blob-drift-3 {
0% { transform: translate(0, 0) scale(0.9); }
50% { transform: translate(30px, 40px) scale(1.1); }
100% { transform: translate(-40px, -50px) scale(1); }
}
@keyframes blob-drift-4 {
0% { transform: translate(0, 0) scale(1); }
50% { transform: translate(-40px, -30px) scale(1.2); }
100% { transform: translate(50px, 40px) scale(0.85); }
}
</style>
</head>
<body>
<div class="vibrant-plasma">
<div class="plasma-blob blob-1"></div>
<div class="plasma-blob blob-2"></div>
<div class="plasma-blob blob-3"></div>
<div class="plasma-blob blob-4"></div>
</div>
<script>
// Throttled interactive cursor coordinates mapping
(function() {
document.documentElement.style.setProperty('--mouse-x', '0');
document.documentElement.style.setProperty('--mouse-y', '0');
let targetX = 0, targetY = 0;
let currentX = 0, currentY = 0;
window.addEventListener('mousemove', (e) => {
targetX = (e.clientX / window.innerWidth) - 0.5;
targetY = (e.clientY / window.innerHeight) - 0.5;
});
window.addEventListener('mouseleave', () => {
targetX = 0;
targetY = 0;
});
function update() {
currentX += (targetX - currentX) * 0.08;
currentY += (targetY - currentY) * 0.08;
document.documentElement.style.setProperty('--mouse-x', currentX.toFixed(4));
document.documentElement.style.setProperty('--mouse-y', currentY.toFixed(4));
requestAnimationFrame(update);
}
requestAnimationFrame(update);
})();
</script>
</body>
</html>React Component Wrapper (TSX)
import React, { useEffect, useRef } from 'react';
export default function InteractiveAuroraLiquidMeshBackground() {
const containerRef = useRef<HTMLDivElement>(null);
useEffect(() => {
let targetX = 0, targetY = 0;
let currentX = 0, currentY = 0;
let frameId: number;
const handleMouseMove = (e: MouseEvent) => {
targetX = (e.clientX / window.innerWidth) - 0.5;
targetY = (e.clientY / window.innerHeight) - 0.5;
};
const handleMouseLeave = () => {
targetX = 0;
targetY = 0;
};
window.addEventListener('mousemove', handleMouseMove);
window.addEventListener('mouseleave', handleMouseLeave);
const updateCoordinates = () => {
currentX += (targetX - currentX) * 0.08;
currentY += (targetY - currentY) * 0.08;
if (containerRef.current) {
containerRef.current.style.setProperty('--mouse-x', currentX.toFixed(4));
containerRef.current.style.setProperty('--mouse-y', currentY.toFixed(4));
}
frameId = requestAnimationFrame(updateCoordinates);
};
frameId = requestAnimationFrame(updateCoordinates);
return () => {
window.removeEventListener('mousemove', handleMouseMove);
window.removeEventListener('mouseleave', handleMouseLeave);
cancelAnimationFrame(frameId);
};
}, []);
return (
<div
ref={containerRef}
style={{ width: '100%', height: '100%', position: 'relative', overflow: 'hidden' }}
>
<style dangerouslySetInnerHTML={{ __html: `
.vibrant-plasma {
position: relative;
width: 100%;
height: 100%;
background: #0d091e;
overflow: hidden;
filter: blur(40px) saturate(180%);
}
.plasma-blob {
position: absolute;
border-radius: 50%;
mix-blend-mode: screen;
opacity: 0.85;
}
.blob-1 {
width: 450px;
height: 450px;
background: radial-gradient(circle, #ff007f 0%, transparent 70%);
top: calc(10% + (var(--mouse-y, 0) * 80px));
left: calc(15% + (var(--mouse-x, 0) * 80px));
animation: blob-drift-1 12s infinite alternate ease-in-out;
}
.blob-2 {
width: 500px;
height: 500px;
background: radial-gradient(circle, #00f0ff 0%, transparent 70%);
bottom: calc(10% - (var(--mouse-y, 0) * 90px));
right: calc(15% - (var(--mouse-x, 0) * 90px));
animation: blob-drift-2 15s infinite alternate ease-in-out;
}
.blob-3 {
width: 400px;
height: 400px;
background: radial-gradient(circle, #7000ff 0%, transparent 70%);
top: calc(40% - (var(--mouse-y, 0) * 60px));
right: calc(30% + (var(--mouse-x, 0) * 60px));
animation: blob-drift-3 10s infinite alternate ease-in-out;
}
.blob-4 {
width: 350px;
height: 350px;
background: radial-gradient(circle, #ffb800 0%, transparent 70%);
bottom: calc(20% + (var(--mouse-y, 0) * 70px));
left: calc(40% - (var(--mouse-x, 0) * 70px));
animation: blob-drift-4 14s infinite alternate ease-in-out;
}
@keyframes blob-drift-1 {
0% { transform: translate(0, 0) scale(1); }
50% { transform: translate(60px, -40px) scale(1.15); }
100% { transform: translate(-30px, 50px) scale(0.9); }
}
@keyframes blob-drift-2 {
0% { transform: translate(0, 0) scale(1.1); }
50% { transform: translate(-50px, 60px) scale(0.85); }
100% { transform: translate(40px, -30px) scale(1.05); }
}
@keyframes blob-drift-3 {
0% { transform: translate(0, 0) scale(0.9); }
50% { transform: translate(30px, 40px) scale(1.1); }
100% { transform: translate(-40px, -50px) scale(1); }
}
@keyframes blob-drift-4 {
0% { transform: translate(0, 0) scale(1); }
50% { transform: translate(-40px, -30px) scale(1.2); }
100% { transform: translate(50px, 40px) scale(0.85); }
}
` }} />
{/* HTML Structure */}
<div
style={{ width: '100%', height: '100%' }}
dangerouslySetInnerHTML={{ __html: `
<div class="vibrant-plasma">
<div class="plasma-blob blob-1"></div>
<div class="plasma-blob blob-2"></div>
<div class="plasma-blob blob-3"></div>
<div class="plasma-blob blob-4"></div>
</div>
` }}
/>
</div>
);
}Next.js App Router Component (use client)
'use client';
import React, { useEffect, useRef } from 'react';
export default function InteractiveAuroraLiquidMeshBackground() {
const containerRef = useRef<HTMLDivElement>(null);
useEffect(() => {
let targetX = 0, targetY = 0;
let currentX = 0, currentY = 0;
let frameId: number;
const handleMouseMove = (e: MouseEvent) => {
targetX = (e.clientX / window.innerWidth) - 0.5;
targetY = (e.clientY / window.innerHeight) - 0.5;
};
const handleMouseLeave = () => {
targetX = 0;
targetY = 0;
};
window.addEventListener('mousemove', handleMouseMove);
window.addEventListener('mouseleave', handleMouseLeave);
const updateCoordinates = () => {
currentX += (targetX - currentX) * 0.08;
currentY += (targetY - currentY) * 0.08;
if (containerRef.current) {
containerRef.current.style.setProperty('--mouse-x', currentX.toFixed(4));
containerRef.current.style.setProperty('--mouse-y', currentY.toFixed(4));
}
frameId = requestAnimationFrame(updateCoordinates);
};
frameId = requestAnimationFrame(updateCoordinates);
return () => {
window.removeEventListener('mousemove', handleMouseMove);
window.removeEventListener('mouseleave', handleMouseLeave);
cancelAnimationFrame(frameId);
};
}, []);
return (
<div
ref={containerRef}
className="w-full h-full relative overflow-hidden"
>
<style dangerouslySetInnerHTML={{ __html: `
.vibrant-plasma {
position: relative;
width: 100%;
height: 100%;
background: #0d091e;
overflow: hidden;
filter: blur(40px) saturate(180%);
}
.plasma-blob {
position: absolute;
border-radius: 50%;
mix-blend-mode: screen;
opacity: 0.85;
}
.blob-1 {
width: 450px;
height: 450px;
background: radial-gradient(circle, #ff007f 0%, transparent 70%);
top: calc(10% + (var(--mouse-y, 0) * 80px));
left: calc(15% + (var(--mouse-x, 0) * 80px));
animation: blob-drift-1 12s infinite alternate ease-in-out;
}
.blob-2 {
width: 500px;
height: 500px;
background: radial-gradient(circle, #00f0ff 0%, transparent 70%);
bottom: calc(10% - (var(--mouse-y, 0) * 90px));
right: calc(15% - (var(--mouse-x, 0) * 90px));
animation: blob-drift-2 15s infinite alternate ease-in-out;
}
.blob-3 {
width: 400px;
height: 400px;
background: radial-gradient(circle, #7000ff 0%, transparent 70%);
top: calc(40% - (var(--mouse-y, 0) * 60px));
right: calc(30% + (var(--mouse-x, 0) * 60px));
animation: blob-drift-3 10s infinite alternate ease-in-out;
}
.blob-4 {
width: 350px;
height: 350px;
background: radial-gradient(circle, #ffb800 0%, transparent 70%);
bottom: calc(20% + (var(--mouse-y, 0) * 70px));
left: calc(40% - (var(--mouse-x, 0) * 70px));
animation: blob-drift-4 14s infinite alternate ease-in-out;
}
@keyframes blob-drift-1 {
0% { transform: translate(0, 0) scale(1); }
50% { transform: translate(60px, -40px) scale(1.15); }
100% { transform: translate(-30px, 50px) scale(0.9); }
}
@keyframes blob-drift-2 {
0% { transform: translate(0, 0) scale(1.1); }
50% { transform: translate(-50px, 60px) scale(0.85); }
100% { transform: translate(40px, -30px) scale(1.05); }
}
@keyframes blob-drift-3 {
0% { transform: translate(0, 0) scale(0.9); }
50% { transform: translate(30px, 40px) scale(1.1); }
100% { transform: translate(-40px, -50px) scale(1); }
}
@keyframes blob-drift-4 {
0% { transform: translate(0, 0) scale(1); }
50% { transform: translate(-40px, -30px) scale(1.2); }
100% { transform: translate(50px, 40px) scale(0.85); }
}
` }} />
{/* HTML Structure */}
<div
className="w-full h-full"
dangerouslySetInnerHTML={{ __html: `
<div class="vibrant-plasma">
<div class="plasma-blob blob-1"></div>
<div class="plasma-blob blob-2"></div>
<div class="plasma-blob blob-3"></div>
<div class="plasma-blob blob-4"></div>
</div>
` }}
/>
</div>
);
}Raw CSS Stylesheet Snippet
.vibrant-plasma {
position: relative;
width: 100%;
height: 100%;
background: #0d091e;
overflow: hidden;
filter: blur(40px) saturate(180%);
}
.plasma-blob {
position: absolute;
border-radius: 50%;
mix-blend-mode: screen;
opacity: 0.85;
}
.blob-1 {
width: 450px;
height: 450px;
background: radial-gradient(circle, #ff007f 0%, transparent 70%);
top: calc(10% + (var(--mouse-y, 0) * 80px));
left: calc(15% + (var(--mouse-x, 0) * 80px));
animation: blob-drift-1 12s infinite alternate ease-in-out;
}
.blob-2 {
width: 500px;
height: 500px;
background: radial-gradient(circle, #00f0ff 0%, transparent 70%);
bottom: calc(10% - (var(--mouse-y, 0) * 90px));
right: calc(15% - (var(--mouse-x, 0) * 90px));
animation: blob-drift-2 15s infinite alternate ease-in-out;
}
.blob-3 {
width: 400px;
height: 400px;
background: radial-gradient(circle, #7000ff 0%, transparent 70%);
top: calc(40% - (var(--mouse-y, 0) * 60px));
right: calc(30% + (var(--mouse-x, 0) * 60px));
animation: blob-drift-3 10s infinite alternate ease-in-out;
}
.blob-4 {
width: 350px;
height: 350px;
background: radial-gradient(circle, #ffb800 0%, transparent 70%);
bottom: calc(20% + (var(--mouse-y, 0) * 70px));
left: calc(40% - (var(--mouse-x, 0) * 70px));
animation: blob-drift-4 14s infinite alternate ease-in-out;
}
@keyframes blob-drift-1 {
0% { transform: translate(0, 0) scale(1); }
50% { transform: translate(60px, -40px) scale(1.15); }
100% { transform: translate(-30px, 50px) scale(0.9); }
}
@keyframes blob-drift-2 {
0% { transform: translate(0, 0) scale(1.1); }
50% { transform: translate(-50px, 60px) scale(0.85); }
100% { transform: translate(40px, -30px) scale(1.05); }
}
@keyframes blob-drift-3 {
0% { transform: translate(0, 0) scale(0.9); }
50% { transform: translate(30px, 40px) scale(1.1); }
100% { transform: translate(-40px, -50px) scale(1); }
}
@keyframes blob-drift-4 {
0% { transform: translate(0, 0) scale(1); }
50% { transform: translate(-40px, -30px) scale(1.2); }
100% { transform: translate(50px, 40px) scale(0.85); }
}