oneshotlm
Compare all models on this prompt →

Animated loader · nova-2-lite-v1

Using the pre-provided gsap.min.js (global gsap), create a looping animated loading sequence on a dark background: morphing rounded shapes and a staggered row of dots orchestrated on a GSAP timeline with smooth easing.

⛨ sandboxed Open in new tab ↗
transcript · 18 messages
user

Using the pre-provided gsap.min.js (global gsap), create a looping animated loading sequence on a dark background: morphing rounded shapes and a staggered row of dots orchestrated on a GSAP timeline with smooth easing.

assistant
thinking
[REDACTED].
read {"path":"gsap.min.js"}
toolResult

/*! * GSAP 3.12.5 * https://gsap.com * * @license Copyright 2024, GreenSock. All rights reserved. * Subject to the terms at https://gsap.com/standard-license or for Club GSAP members, the agreement issued with that membership. * @author: Jack Doyle, jack@greensock.com */ [Showing lines 1-9 of 12 (50.0KB limit). Use offset=10 to continue.]

assistant
thinking
[REDACTED].
write index.html (2387 bytes)
toolResult

Successfully wrote 2387 bytes to index.html

assistant
thinking
[REDACTED].
edit {"path":"index.html","edits":[{"oldText":".shape {\n position:absolute;\n border-radius:50%;\n background:#0ff;\n opacity:.7;\n
toolResult

Successfully replaced 1 block(s) in index.html.

assistant
thinking
[REDACTED].
edit {"path":"index.html","edits":[{"newText":"document.addEventListener('DOMContentLoaded', () => {\n const shapes = gsap.utils.toArray('.shape
toolResult

Successfully replaced 1 block(s) in index.html.

assistant
thinking
[REDACTED].
bash {"command":"ls -l index.html"}
toolResult

-rw-r--r--. 1 node node 2579 Aug 1 20:11 index.html

assistant
thinking
[REDACTED].
bash {"command":"head -n 30 index.html"}
toolResult

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Looping Loading Sequence</title> <style> body { margin:0; background:#111; overflow:hidden; height:100vh; display:flex; justify-content:center; align-items:center; font-family:system-ui, sans-serif; } .scene { position:relative; width:300px; height:300px; } .shape { position:absolute; border-radius:50%; background:#0ff; opacity:.7; width:60px; height:60px; }

assistant
thinking
[REDACTED].
read {"path":"index.html"}
toolResult

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Looping Loading Sequence</title> <style> body { margin:0; background:#111; overflow:hidden; height:100vh; display:flex; justify-content:center; align-items:center; font-family:system-ui, sans-serif; } .scene { position:relative; width:300px; height:300px; } .shape { position:absolute; border-radius:50%; background:#0ff; opacity:.7; width:60px; height:60px; } .dots { position:absolute; width:100%; display:flex; justify-content:space-around; bottom:20px; } .dot { position:relative; width:8px; height:8px; background:#ff0; border-radius:50%; } </style> <script src="gsap.min.js"></script> <script> document.addEventListener('DOMContentLoaded', () => { const shapes = gsap.utils.toArray('.shape'); const dots = gsap.utils.toArray('.dot'); // Store initial random positions for shapes const initialPositions = []; shapes.forEach((shape, i) => { const x = gsap.utils.random(50, 250); const y = gsap.utils.random(50, 250); gsap.set(shape, { x, y, scale: 0.2, borderRadius: '20%' }); initialPositions.push({ x, y }); }); // Master timeline – loops forever const master = gsap.timeline({ repeat: -1, defaults: { ease: 'sine.inOut' } }); // Morphing shape animations (run in parallel) master.to(shapes[0], { duration: 2, scale: 1.2, borderRadius: '80%', x: '+=50', y: '+=30' }, 'start'); master.to(shapes[1], { duration: 2, scale: 1.5, borderRadius: '60%', x: '-=30', y: '+=70' }, 'start'); master.to(shapes[2], { duration: 2, scale: 1.3, borderRadius: '90%', x: '-=20', y: '-=20' }, 'start'); // Return shapes to initial positions completing a cycle master.to(shapes, { duration: 2, scale: 0.2, borderRadius: '20%', x: initialPositions.map(p => p.x), y: initialPositions.map(p => p.y) }, '+=2'); // Continuous staggered dot pulse master.to(dots, { duration: 1, opacity: 0.2, scale: 0.5, stagger: 0.15, repeat: -1, yoyo: true }, '+=1'); }); </script> </head> <body> <div class="scene"> <div class="shape" id="shape1"></div> <div class="shape" id="shape2"></div> <div class="shape" id="shape3"></div> <div class="dots"> <div class="dot" id="dot1"></div> <div class="dot" id="dot2"></div> <div class="dot" id="dot3"></div> <div class="dot" id="dot4"></div> </div> </div> </body> </html>

assistant
thinking
[REDACTED].
bash {"command":"cat index.html"}
toolResult

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Looping Loading Sequence</title> <style> body { margin:0; background:#111; overflow:hidden; height:100vh; display:flex; justify-content:center; align-items:center; font-family:system-ui, sans-serif; } .scene { position:relative; width:300px; height:300px; } .shape { position:absolute; border-radius:50%; background:#0ff; opacity:.7; width:60px; height:60px; } .dots { position:absolute; width:100%; display:flex; justify-content:space-around; bottom:20px; } .dot { position:relative; width:8px; height:8px; background:#ff0; border-radius:50%; } </style> <script src="gsap.min.js"></script> <script> document.addEventListener('DOMContentLoaded', () => { const shapes = gsap.utils.toArray('.shape'); const dots = gsap.utils.toArray('.dot'); // Store initial random positions for shapes const initialPositions = []; shapes.forEach((shape, i) => { const x = gsap.utils.random(50, 250); const y = gsap.utils.random(50, 250); gsap.set(shape, { x, y, scale: 0.2, borderRadius: '20%' }); initialPositions.push({ x, y }); }); // Master timeline – loops forever const master = gsap.timeline({ repeat: -1, defaults: { ease: 'sine.inOut' } }); // Morphing shape animations (run in parallel) master.to(shapes[0], { duration: 2, scale: 1.2, borderRadius: '80%', x: '+=50', y: '+=30' }, 'start'); master.to(shapes[1], { duration: 2, scale: 1.5, borderRadius: '60%', x: '-=30', y: '+=70' }, 'start'); master.to(shapes[2], { duration: 2, scale: 1.3, borderRadius: '90%', x: '-=20', y: '-=20' }, 'start'); // Return shapes to initial positions completing a cycle master.to(shapes, { duration: 2, scale: 0.2, borderRadius: '20%', x: initialPositions.map(p => p.x), y: initialPositions.map(p => p.y) }, '+=2'); // Continuous staggered dot pulse master.to(dots, { duration: 1, opacity: 0.2, scale: 0.5, stagger: 0.15, repeat: -1, yoyo: true }, '+=1'); }); </script> </head> <body> <div class="scene"> <div class="shape" id="shape1"></div> <div class="shape" id="shape2"></div> <div class="shape" id="shape3"></div> <div class="dots"> <div class="dot" id="dot1"></div> <div class="dot" id="dot2"></div> <div class="dot" id="dot3"></div> <div class="dot" id="dot4"></div> </div> </div> </body> </html>

assistant
thinking
[REDACTED].

TAKE IT TO CODE

A single self-contained HTML file — copy it and open in any browser, or reuse the prompt with your own pi-agent run.

RUN

modelnova-2-lite-v1
vendorAmazon · Nova
harnesspi-agent
generated2026-08-01

EVALUATION

2/5 working

Small looping shapes with staggered dots animate but shrink oddly, minimal visual content on dark background.

Vision grade · anthropic/claude-sonnet-5

MEASUREMENTS

Raw readings from the capture, not a verdict — the grade above is the only judgement. Percentages are how much of the screen changed; the measure under-reports sparse motion on a dark background.

idle motion1.7%
on click0.6%
on drag0.1%
on wheel0.1%
on enter + space0.1%
on arrow keys0.1%
on w/a/s/d0.1%
frame spread13.6 / 255
console errors0
js errors none

METRICS

runtime119.3s
tokens in29k
tokens out17k
cached0
cost / run$0.0502