← back to flat loading animatecompare with ground truth →
model output
Claude Sonnet 4.6
flat loading animate
A 0.93T 0.31
1Looking at the animation, I can see:
2
31. A "+" (plus/cross) shape made of colored dots that rotates to form an "×" (X) shape and back
42. Four arms of dots, each with a different color:
5 - Top: dark teal/slate (#2d5f6b or similar)
6 - Left: teal/green (#1aaa8a)
7 - Right: red/coral (#f05a5a)
8 - Bottom: orange/yellow (#f5a623)
93. Each arm has 3 dots of increasing size (small near center, large at tip)
104. The whole thing rotates 45° continuously
11
12The animation cycles: plus shape → rotate 45° → X shape → rotate back → plus shape
13
14<!DOCTYPE html>
15<html lang="en">
16<head>
17<meta charset="UTF-8">
18<meta name="viewport" content="width=device-width, initial-scale=1.0">
19<title>Plus X Animation</title>
20<style>
21 * { margin: 0; padding: 0; box-sizing: border-box; }
22 body {
23 background: #fff;
24 display: flex;
25 justify-content: center;
26 align-items: center;
27 min-height: 100vh;
28 }
29
30 .spinner {
31 position: relative;
32 width: 120px;
33 height: 120px;
34 animation: rotate 2s ease-in-out infinite;
35 }
36
37 @keyframes rotate {
38 0% { transform: rotate(0deg); }
39 40% { transform: rotate(45deg); }
40 60% { transform: rotate(45deg); }
41 100% { transform: rotate(90deg); }
42 }
43
44 .arm {
45 position: absolute;
46 top: 50%;
47 left: 50%;
48 display: flex;
49 align-items: center;
50 transform-origin: left center;
51 }
52
53 /* Each arm: 3 dots, sizes small→medium→large going outward */
54 .dot {
55 border-radius: 50%;
56 position: absolute;
57 }
58
59 /* TOP arm - dark teal */
60 .arm-top {
61 transform: rotate(-90deg) translateY(-50%);
62 top: 50%;
63 left: 50%;
64 }
65
66 /* BOTTOM arm - orange */
67 .arm-bottom {
68 transform: rotate(90deg) translateY(-50%);
69 top: 50%;
70 left: 50%;
71 }
72
73 /* LEFT arm - green teal */
74 .arm-left {
75 transform: rotate(180deg) translateY(-50%);
76 top: 50%;
77 left: 50%;
78 }
79
80 /* RIGHT arm - red/coral */
81 .arm-right {
82 transform: rotate(0deg) translateY(-50%);
83 top: 50%;
84 left: 50%;
85 }
86</style>
87</head>
88<body>
89<canvas id="c" width="120" height="120" style="display:none"></canvas>
90<div class="spinner" id="spinner"></div>
91
92<script>
93 const spinner = document.getElementById('spinner');
94
95 // Colors for each arm: top, right, bottom, left
96 const arms = [
97 { color: '#2d5f6b', angle: -90 }, // top - dark teal
98 { color: '#f05555', angle: 0 }, // right - red
99 { color: '#f5a623', angle: 90 }, // bottom - orange
100 { color: '#1aaa8a', angle: 180 }, // left - green teal
101 ];
102
103 // Dot sizes (px) from center outward: small, medium, large
104 const dotSizes = [8, 11, 16];
105 // Dot positions from center (px)
106 const dotPositions = [14, 28, 46];
107
108 arms.forEach(arm => {
109 const armEl = document.createElement('div');
110 armEl.style.cssText = `
111 position: absolute;
112 top: 50%;
113 left: 50%;
114 transform-origin: 0 0;
115 transform: rotate(${arm.angle}deg);
116 `;
117
118 dotSizes.forEach((size, i) => {
119 const dot = document.createElement('div');
120 dot.style.cssText = `
121 position: absolute;
122 width: ${size}px;
123 height: ${size}px;
124 border-radius: 50%;
125 background: ${arm.color};
126 left: ${dotPositions[i]}px;
127 top: ${-size/2}px;
128 `;
129 armEl.appendChild(dot);
130 });
131
132 spinner.appendChild(armEl);
133 });
134</script>
135</body>
136</html>