DeepSeek V3.2 vs Kimi K2.5: Flower Animation on CanopyWave
Both models produce beautiful flowers. Only one actually loops.
bots.so
Two reasoning-focused models, same prompt. The interesting question isn’t which flower looks better — it’s which model actually read the prompt carefully enough to build a loop.
Prompt
“Create a gorgeous flower growing from brown dirt, as an animated loop using only HTML and CSS.”
Pure HTML/CSS · No JavaScript · Single file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Animated Flower</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background: linear-gradient(to bottom, #87CEEB 0%, #E0F7FF 100%);
overflow: hidden;
}
.scene {
position: relative;
width: 300px;
height: 400px;
}
.dirt {
position: absolute;
bottom: 0;
width: 100%;
height: 120px;
background: linear-gradient(to top, #8B4513 0%, #A0522D 100%);
border-radius: 50% 50% 0 0;
box-shadow:
inset 0 10px 20px rgba(0,0,0,0.3),
0 5px 15px rgba(0,0,0,0.4);
overflow: hidden;
}
.dirt::before {
content: '';
position: absolute;
top: 10px;
left: 20%;
width: 60px;
height: 30px;
background: #654321;
border-radius: 50%;
opacity: 0.6;
}
.dirt::after {
content: '';
position: absolute;
top: 25px;
right: 25%;
width: 40px;
height: 20px;
background: #5D4037;
border-radius: 50%;
opacity: 0.5;
}
.stem {
position: absolute;
bottom: 120px;
left: 50%;
width: 12px;
height: 0;
background: linear-gradient(to top, #2E7D32, #4CAF50);
transform: translateX(-50%);
border-radius: 6px;
animation: growStem 4s ease-out forwards;
transform-origin: bottom;
}
.leaf {
position: absolute;
width: 40px;
height: 25px;
background: #4CAF50;
border-radius: 50% 0 50% 50%;
transform-origin: right bottom;
opacity: 0;
}
.leaf.left {
left: 50%;
bottom: 180px;
transform: translateX(-20px) rotate(-30deg);
animation: growLeafLeft 1s 3.5s ease-out forwards;
}
.leaf.right {
left: 50%;
bottom: 230px;
transform: translateX(10px) rotate(30deg) scaleX(-1);
animation: growLeafRight 1s 4s ease-out forwards;
}
.flower {
position: absolute;
left: 50%;
bottom: 250px;
transform: translateX(-50%);
opacity: 0;
animation: bloom 2s 5s ease-out forwards;
}
.petal {
position: absolute;
width: 50px;
height: 70px;
background: linear-gradient(to bottom, #FF4081, #F50057);
border-radius: 50% 50% 40% 40%;
transform-origin: bottom center;
box-shadow: inset 0 -10px 20px rgba(255,255,255,0.3);
}
.petal:nth-child(1) { transform: rotate(0deg); }
.petal:nth-child(2) { transform: rotate(45deg); }
.petal:nth-child(3) { transform: rotate(90deg); }
.petal:nth-child(4) { transform: rotate(135deg); }
.petal:nth-child(5) { transform: rotate(180deg); }
.petal:nth-child(6) { transform: rotate(225deg); }
.petal:nth-child(7) { transform: rotate(270deg); }
.petal:nth-child(8) { transform: rotate(315deg); }
.center {
position: absolute;
width: 40px;
height: 40px;
background: radial-gradient(circle, #FFD700, #FF9800);
border-radius: 50%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 2;
box-shadow:
inset 0 0 10px rgba(255,152,0,0.5),
0 0 20px rgba(255,152,0,0.3);
}
.sparkle {
position: absolute;
width: 6px;
height: 6px;
background: #FFF;
border-radius: 50%;
opacity: 0;
}
.sparkle:nth-child(1) {
top: 5px;
left: 15px;
animation: sparkle 2s 6s infinite;
}
.sparkle:nth-child(2) {
top: 15px;
right: 5px;
animation: sparkle 2s 6.5s infinite;
}
.sparkle:nth-child(3) {
bottom: 10px;
left: 10px;
animation: sparkle 2s 7s infinite;
}
@keyframes growStem {
0% {
height: 0;
}
100% {
height: 250px;
}
}
@keyframes growLeafLeft {
0% {
transform: translateX(-20px) rotate(-30deg) scale(0);
opacity: 0;
}
100% {
transform: translateX(-20px) rotate(-30deg) scale(1);
opacity: 1;
}
}
@keyframes growLeafRight {
0% {
transform: translateX(10px) rotate(30deg) scaleX(-1) scale(0);
opacity: 0;
}
100% {
transform: translateX(10px) rotate(30deg) scaleX(-1) scale(1);
opacity: 1;
}
}
@keyframes bloom {
0% {
transform: translateX(-50%) scale(0);
opacity: 0;
}
70% {
transform: translateX(-50%) scale(1.1);
opacity: 1;
}
100% {
transform: translateX(-50%) scale(1);
opacity: 1;
}
}
@keyframes sparkle {
0%, 100% {
opacity: 0;
transform: scale(0);
}
50% {
opacity: 1;
transform: scale(1);
}
}
.scene:hover .stem {
animation: growStem 4s ease-out forwards, wiggleStem 2s 6s infinite;
}
@keyframes wiggleStem {
0%, 100% { transform: translateX(-50%) rotate(0deg); }
25% { transform: translateX(-50%) rotate(1deg); }
75% { transform: translateX(-50%) rotate(-1deg); }
}
</style>
</head>
<body>
<div class="scene">
<div class="dirt"></div>
<div class="stem"></div>
<div class="leaf left"></div>
<div class="leaf right"></div>
<div class="flower">
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="center">
<div class="sparkle"></div>
<div class="sparkle"></div>
<div class="sparkle"></div>
</div>
</div>
</div>
<script>
document.querySelector('.scene').addEventListener('animationend', function() {
this.classList.add('completed');
});
</script>
</body>
</html> <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flower Growth Animation</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: linear-gradient(to bottom, #87CEEB 0%, #E0F6FF 100%);
height: 100vh;
overflow: hidden;
display: flex;
justify-content: center;
align-items: flex-end;
}
.scene {
position: relative;
width: 400px;
height: 600px;
display: flex;
justify-content: center;
align-items: flex-end;
}
.dirt {
position: absolute;
bottom: 0;
width: 100%;
height: 120px;
background:
radial-gradient(circle at 20% 30%, #5c4033 2px, transparent 2px),
radial-gradient(circle at 60% 50%, #4a3728 3px, transparent 3px),
radial-gradient(circle at 80% 20%, #6b4423 2px, transparent 2px),
radial-gradient(circle at 40% 70%, #3d2817 4px, transparent 4px),
linear-gradient(to bottom, #4a3728, #2f1f16);
border-radius: 50% 50% 0 0 / 20px 20px 0 0;
box-shadow: inset 0 10px 20px rgba(0,0,0,0.5);
z-index: 10;
}
.flower-container {
position: relative;
bottom: 100px;
display: flex;
flex-direction: column;
align-items: center;
transform-origin: bottom center;
animation: sway 4s ease-in-out infinite;
}
.stem {
width: 8px;
height: 250px;
background: linear-gradient(to right, #1a4015, #2d5a27, #1a4015);
border-radius: 4px;
transform-origin: bottom center;
animation: growStem 8s ease-out infinite;
position: relative;
}
.leaf {
position: absolute;
width: 40px;
height: 20px;
background: linear-gradient(45deg, #2d5a27, #4a8f3c);
border-radius: 0 100% 0 100%;
opacity: 0;
animation: growLeaf 8s ease-out infinite;
}
.leaf.left {
left: -35px;
top: 100px;
transform: rotate(-30deg);
animation-delay: 0.5s;
}
.leaf.right {
right: -35px;
top: 140px;
transform: rotate(120deg) scaleX(-1);
animation-delay: 0.8s;
}
.flower-head {
position: absolute;
top: -60px;
left: 50%;
transform: translateX(-50%) scale(0);
width: 120px;
height: 120px;
animation: bloom 8s ease-out infinite;
}
.petal {
position: absolute;
width: 40px;
height: 60px;
background: linear-gradient(to bottom, #ff6b9d, #ff8fab, #ffc2d1);
border-radius: 50% 50% 50% 50% / 80% 80% 20% 20%;
transform-origin: bottom center;
left: 40px;
top: 30px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.petal:nth-child(1) { transform: rotate(0deg) translateY(-30px); }
.petal:nth-child(2) { transform: rotate(45deg) translateY(-30px); background: linear-gradient(to bottom, #ff8fab, #ffb3c6, #ffd6e0); }
.petal:nth-child(3) { transform: rotate(90deg) translateY(-30px); }
.petal:nth-child(4) { transform: rotate(135deg) translateY(-30px); background: linear-gradient(to bottom, #ff8fab, #ffb3c6, #ffd6e0); }
.petal:nth-child(5) { transform: rotate(180deg) translateY(-30px); }
.petal:nth-child(6) { transform: rotate(225deg) translateY(-30px); background: linear-gradient(to bottom, #ff8fab, #ffb3c6, #ffd6e0); }
.petal:nth-child(7) { transform: rotate(270deg) translateY(-30px); }
.petal:nth-child(8) { transform: rotate(315deg) translateY(-30px); background: linear-gradient(to bottom, #ff8fab, #ffb3c6, #ffd6e0); }
.center {
position: absolute;
width: 30px;
height: 30px;
background: radial-gradient(circle at 30% 30%, #ffed4e, #ffd700, #ffaa00);
border-radius: 50%;
left: 45px;
top: 45px;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
z-index: 20;
}
.particle {
position: absolute;
width: 4px;
height: 4px;
background: rgba(255, 215, 0, 0.6);
border-radius: 50%;
animation: float 8s linear infinite;
}
.particle:nth-child(1) { left: 20%; animation-delay: 0s; }
.particle:nth-child(2) { left: 50%; animation-delay: 2s; }
.particle:nth-child(3) { left: 80%; animation-delay: 4s; }
@keyframes growStem {
0%, 100% { transform: scaleY(0); }
20% { transform: scaleY(0); }
50% { transform: scaleY(1); }
90% { transform: scaleY(1); }
}
@keyframes growLeaf {
0%, 100% { opacity: 0; transform: scale(0) rotate(-30deg); }
40% { opacity: 0; transform: scale(0) rotate(-30deg); }
55% { opacity: 1; transform: scale(1) rotate(-30deg); }
90% { opacity: 1; transform: scale(1) rotate(-30deg); }
}
@keyframes bloom {
0%, 100% { transform: translateX(-50%) scale(0) rotate(0deg); }
50% { transform: translateX(-50%) scale(0) rotate(0deg); }
65% { transform: translateX(-50%) scale(0.5) rotate(180deg); }
80% { transform: translateX(-50%) scale(1) rotate(360deg); }
90% { transform: translateX(-50%) scale(1) rotate(360deg); }
}
@keyframes sway {
0%, 100% { transform: rotate(-2deg); }
50% { transform: rotate(2deg); }
}
@keyframes float {
0% { transform: translateY(0) translateX(0); opacity: 0; }
10% { opacity: 1; }
90% { opacity: 1; }
100% { transform: translateY(-300px) translateX(20px); opacity: 0; }
}
.sparkle {
position: absolute;
width: 6px;
height: 6px;
background: white;
border-radius: 50%;
filter: blur(1px);
animation: sparkle 3s ease-in-out infinite;
}
.sparkle:nth-child(1) { top: 20%; left: 30%; animation-delay: 0s; }
.sparkle:nth-child(2) { top: 40%; left: 70%; animation-delay: 1s; }
.sparkle:nth-child(3) { top: 60%; left: 20%; animation-delay: 2s; }
@keyframes sparkle {
0%, 100% { opacity: 0; transform: scale(0); }
50% { opacity: 0.8; transform: scale(1); }
}
</style>
</head>
<body>
<div class="scene">
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<div class="sparkle"></div>
<div class="sparkle"></div>
<div class="sparkle"></div>
<div class="dirt"></div>
<div class="flower-container">
<div class="flower-head">
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="petal"></div>
<div class="center"></div>
</div>
<div class="stem">
<div class="leaf left"></div>
<div class="leaf right"></div>
</div>
</div>
</div>
</body>
</html> Model A
DeepSeek V3.2
CanopyWave
Model B
Kimi K2.5
CanopyWave
Green highlights the leading metric per row. Fewer tokens = more efficient. More lines = more detail.
Did they loop?
Kimi K2.5 — Yes. All animations share an 8-second infinite cycle using percentage-based keyframes. Stem at 0-30%, leaves at 30-50%, bloom at 50-80%, fade at 90-100%, repeat. This is architecturally the correct way to build a CSS animation loop.
DeepSeek V3.2 — No. The stem, leaves, and bloom use forwards — they play once and hold. Sparkle particles loop, and there’s a stem wiggle on infinite, but the core growth sequence never restarts. It’s a one-shot with decorative looping on top.
Prompt checklist
| Requirement | DeepSeek V3.2 | Kimi K2.5 |
|---|---|---|
| Flower | Yes — 8 petals | Yes — 8 petals, alternating colors |
| Brown dirt | Yes | Yes — with particle texture |
| Growing animation | Yes | Yes |
| Loop | No — one-shot growth | Yes — full infinite cycle |
| CSS only | Yes | Yes |
Verdict
Kimi follows the prompt. DeepSeek builds a polished scene but treats “animated loop” as optional. If prompt adherence matters — and it should — Kimi wins.
Part of our Model Animation Benchmark series on CanopyWave. Subscribe for new comparisons.
Get the signal, skip the noise.
Weekly digest of new models and provider updates across 40+ compute providers. Curated for AI builders who ship.