Tactile Claymorphic Spheres
🔵 InteractivePristine candy-colored claymorphic spheres casting deep, soft lifelike shadows, morphing and reacting beautifully to mouse coordinates.
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 Abstract
Loading Canvas Shader...
Viscous Chrome Fluid
A premium, edge-to-edge liquid chrome and viscous ink simulation responsive to high-velocity mouse cursor tracking.
Loading Canvas Shader...
Floating 3D Squares
Floating wireframe 3D-rotated square outlines drifting and spinning upwards on cosmic black.
Loading Canvas Shader...
Kinetic Gravity Well
An abstract, massive orbital simulation constructed from thousands of mathematically precise microscopic kinetic dots that violently react to cursor-driven gravity physics.
Tactile Claymorphic Spheres - CSS-only Abstract background for React & Tailwind
Integrate the Tactile Claymorphic Spheres 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>Tactile Claymorphic Spheres</title>
<style>
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
background: #09090b;
}
:root {
--color-bg: #f0edf5;
--color-1: #f43f5e;
--color-2: #3b82f6;
--color-1-light: color-mix(in srgb, var(--color-1) 35%, #fff 65%);
--color-2-light: color-mix(in srgb, var(--color-2) 35%, #fff 65%);
}
.clay-container {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
background: var(--color-bg);
position: relative;
overflow: hidden;
}
.clay-sphere {
position: absolute;
border-radius: 50%;
transition: transform 0.25s ease-out;
}
.cs-1 {
width: 48vmin;
height: 48vmin;
left: calc(50% - 28vmin + (var(--mouse-x, 0) * 6vmin));
top: calc(50% - 24vmin + (var(--mouse-y, 0) * 6vmin));
background: radial-gradient(circle at 35% 35%, var(--color-1-light) 0%, var(--color-1) 100%);
box-shadow:
1.5vmin 1.5vmin 4vmin color-mix(in srgb, var(--color-1) 15%, transparent),
-1.5vmin -1.5vmin 4vmin rgba(255, 255, 255, 0.9),
inset 1vmin 1vmin 2.5vmin rgba(255, 255, 255, 0.5),
inset -1vmin -1vmin 2.5vmin rgba(0, 0, 0, 0.15);
animation: clay-pulse 8s ease-in-out infinite alternate;
}
.cs-2 {
width: 36vmin;
height: 36vmin;
left: calc(50% + 2vmin - (var(--mouse-x, 0) * 8vmin));
top: calc(50% - 14vmin - (var(--mouse-y, 0) * 8vmin));
background: radial-gradient(circle at 35% 35%, var(--color-2-light) 0%, var(--color-2) 100%);
box-shadow:
1.5vmin 1.5vmin 4vmin color-mix(in srgb, var(--color-2) 15%, transparent),
-1.5vmin -1.5vmin 4vmin rgba(255, 255, 255, 0.9),
inset 1vmin 1vmin 2.5vmin rgba(255, 255, 255, 0.5),
inset -1vmin -1vmin 2.5vmin rgba(0, 0, 0, 0.15);
animation: clay-pulse 6s ease-in-out infinite alternate-reverse;
}
@keyframes clay-pulse {
0% { transform: scale(1) translateY(0) rotate(0deg); }
100% { transform: scale(1.1) translateY(-2vmin) rotate(15deg); }
}
</style>
</head>
<body>
<div class="clay-container">
<div class="clay-sphere cs-1"></div>
<div class="clay-sphere cs-2"></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 TactileClaymorphicSpheresBackground() {
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: `
:root {
--color-bg: #f0edf5;
--color-1: #f43f5e;
--color-2: #3b82f6;
--color-1-light: color-mix(in srgb, var(--color-1) 35%, #fff 65%);
--color-2-light: color-mix(in srgb, var(--color-2) 35%, #fff 65%);
}
.clay-container {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
background: var(--color-bg);
position: relative;
overflow: hidden;
}
.clay-sphere {
position: absolute;
border-radius: 50%;
transition: transform 0.25s ease-out;
}
.cs-1 {
width: 48vmin;
height: 48vmin;
left: calc(50% - 28vmin + (var(--mouse-x, 0) * 6vmin));
top: calc(50% - 24vmin + (var(--mouse-y, 0) * 6vmin));
background: radial-gradient(circle at 35% 35%, var(--color-1-light) 0%, var(--color-1) 100%);
box-shadow:
1.5vmin 1.5vmin 4vmin color-mix(in srgb, var(--color-1) 15%, transparent),
-1.5vmin -1.5vmin 4vmin rgba(255, 255, 255, 0.9),
inset 1vmin 1vmin 2.5vmin rgba(255, 255, 255, 0.5),
inset -1vmin -1vmin 2.5vmin rgba(0, 0, 0, 0.15);
animation: clay-pulse 8s ease-in-out infinite alternate;
}
.cs-2 {
width: 36vmin;
height: 36vmin;
left: calc(50% + 2vmin - (var(--mouse-x, 0) * 8vmin));
top: calc(50% - 14vmin - (var(--mouse-y, 0) * 8vmin));
background: radial-gradient(circle at 35% 35%, var(--color-2-light) 0%, var(--color-2) 100%);
box-shadow:
1.5vmin 1.5vmin 4vmin color-mix(in srgb, var(--color-2) 15%, transparent),
-1.5vmin -1.5vmin 4vmin rgba(255, 255, 255, 0.9),
inset 1vmin 1vmin 2.5vmin rgba(255, 255, 255, 0.5),
inset -1vmin -1vmin 2.5vmin rgba(0, 0, 0, 0.15);
animation: clay-pulse 6s ease-in-out infinite alternate-reverse;
}
@keyframes clay-pulse {
0% { transform: scale(1) translateY(0) rotate(0deg); }
100% { transform: scale(1.1) translateY(-2vmin) rotate(15deg); }
}
` }} />
{/* HTML Structure */}
<div
style={{ width: '100%', height: '100%' }}
dangerouslySetInnerHTML={{ __html: `
<div class="clay-container">
<div class="clay-sphere cs-1"></div>
<div class="clay-sphere cs-2"></div>
</div>
` }}
/>
</div>
);
}Next.js App Router Component (use client)
'use client';
import React, { useEffect, useRef } from 'react';
export default function TactileClaymorphicSpheresBackground() {
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: `
:root {
--color-bg: #f0edf5;
--color-1: #f43f5e;
--color-2: #3b82f6;
--color-1-light: color-mix(in srgb, var(--color-1) 35%, #fff 65%);
--color-2-light: color-mix(in srgb, var(--color-2) 35%, #fff 65%);
}
.clay-container {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
background: var(--color-bg);
position: relative;
overflow: hidden;
}
.clay-sphere {
position: absolute;
border-radius: 50%;
transition: transform 0.25s ease-out;
}
.cs-1 {
width: 48vmin;
height: 48vmin;
left: calc(50% - 28vmin + (var(--mouse-x, 0) * 6vmin));
top: calc(50% - 24vmin + (var(--mouse-y, 0) * 6vmin));
background: radial-gradient(circle at 35% 35%, var(--color-1-light) 0%, var(--color-1) 100%);
box-shadow:
1.5vmin 1.5vmin 4vmin color-mix(in srgb, var(--color-1) 15%, transparent),
-1.5vmin -1.5vmin 4vmin rgba(255, 255, 255, 0.9),
inset 1vmin 1vmin 2.5vmin rgba(255, 255, 255, 0.5),
inset -1vmin -1vmin 2.5vmin rgba(0, 0, 0, 0.15);
animation: clay-pulse 8s ease-in-out infinite alternate;
}
.cs-2 {
width: 36vmin;
height: 36vmin;
left: calc(50% + 2vmin - (var(--mouse-x, 0) * 8vmin));
top: calc(50% - 14vmin - (var(--mouse-y, 0) * 8vmin));
background: radial-gradient(circle at 35% 35%, var(--color-2-light) 0%, var(--color-2) 100%);
box-shadow:
1.5vmin 1.5vmin 4vmin color-mix(in srgb, var(--color-2) 15%, transparent),
-1.5vmin -1.5vmin 4vmin rgba(255, 255, 255, 0.9),
inset 1vmin 1vmin 2.5vmin rgba(255, 255, 255, 0.5),
inset -1vmin -1vmin 2.5vmin rgba(0, 0, 0, 0.15);
animation: clay-pulse 6s ease-in-out infinite alternate-reverse;
}
@keyframes clay-pulse {
0% { transform: scale(1) translateY(0) rotate(0deg); }
100% { transform: scale(1.1) translateY(-2vmin) rotate(15deg); }
}
` }} />
{/* HTML Structure */}
<div
className="w-full h-full"
dangerouslySetInnerHTML={{ __html: `
<div class="clay-container">
<div class="clay-sphere cs-1"></div>
<div class="clay-sphere cs-2"></div>
</div>
` }}
/>
</div>
);
}Raw CSS Stylesheet Snippet
:root {
--color-bg: #f0edf5;
--color-1: #f43f5e;
--color-2: #3b82f6;
--color-1-light: color-mix(in srgb, var(--color-1) 35%, #fff 65%);
--color-2-light: color-mix(in srgb, var(--color-2) 35%, #fff 65%);
}
.clay-container {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
background: var(--color-bg);
position: relative;
overflow: hidden;
}
.clay-sphere {
position: absolute;
border-radius: 50%;
transition: transform 0.25s ease-out;
}
.cs-1 {
width: 48vmin;
height: 48vmin;
left: calc(50% - 28vmin + (var(--mouse-x, 0) * 6vmin));
top: calc(50% - 24vmin + (var(--mouse-y, 0) * 6vmin));
background: radial-gradient(circle at 35% 35%, var(--color-1-light) 0%, var(--color-1) 100%);
box-shadow:
1.5vmin 1.5vmin 4vmin color-mix(in srgb, var(--color-1) 15%, transparent),
-1.5vmin -1.5vmin 4vmin rgba(255, 255, 255, 0.9),
inset 1vmin 1vmin 2.5vmin rgba(255, 255, 255, 0.5),
inset -1vmin -1vmin 2.5vmin rgba(0, 0, 0, 0.15);
animation: clay-pulse 8s ease-in-out infinite alternate;
}
.cs-2 {
width: 36vmin;
height: 36vmin;
left: calc(50% + 2vmin - (var(--mouse-x, 0) * 8vmin));
top: calc(50% - 14vmin - (var(--mouse-y, 0) * 8vmin));
background: radial-gradient(circle at 35% 35%, var(--color-2-light) 0%, var(--color-2) 100%);
box-shadow:
1.5vmin 1.5vmin 4vmin color-mix(in srgb, var(--color-2) 15%, transparent),
-1.5vmin -1.5vmin 4vmin rgba(255, 255, 255, 0.9),
inset 1vmin 1vmin 2.5vmin rgba(255, 255, 255, 0.5),
inset -1vmin -1vmin 2.5vmin rgba(0, 0, 0, 0.15);
animation: clay-pulse 6s ease-in-out infinite alternate-reverse;
}
@keyframes clay-pulse {
0% { transform: scale(1) translateY(0) rotate(0deg); }
100% { transform: scale(1.1) translateY(-2vmin) rotate(15deg); }
}