
Il pulsante da far scorrere
Pulsanti, Fisica, Transizioni
NuovaGratis
La build di un’app fatta come una perforatrice di nastro d’epoca: la testina punzona nel nastro color crema i byte veri del pacchetto compilato, otto fori per colonna più il foro di trascinamento, il nastro esce fra due rulli, si piega e cade a terra in pieghe con una fisica vera, e i coriandoli dei fori piovono in un vassoio. Alla fine la taglierina stacca il nastro; se si inceppa si accartoccia a fisarmonica finché Retry non lo taglia via.
Una cartella che funziona da sola: index.html, style.css, script.js e le librerie da CDN. Nelle schede React e Vue la stessa demo è già un componente, che spegne le sue animazioni quando esce dalla pagina.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>The punched tape build</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/instrument-sans@5.3.0/wdth.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/jetbrains-mono@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the build panel of a web app's deploy tool, with the build shown as a vintage paper tape punch: the head
punches the compiled bytes into the cream tape, eight bits a column with the feed hole, the punched tape comes
out of the machine and falls in folds on the floor, and the chads rain into a tray. Done, the cutter snips the
tape. The machine and the tape are drawn by script.js on the canvas; the words and the button are HTML -->
<section class="build" aria-labelledby="build-title" data-build>
<div class="build__head">
<div class="build__words">
<h2 class="build__title" id="build-title"><span class="build__swap" data-title>Production build</span></h2>
<p class="build__meta"><span class="build__swap" data-meta>1,204 modules · last built 2 h ago</span></p>
</div>
<p class="build__figure" aria-hidden="true">
<span class="build__pct" data-pct>v2.8</span>
<svg class="build__tick" viewBox="0 0 24 24" data-tick><path d="M5.5 12.6l4.1 4.1L18.6 7.4" pathLength="1"/></svg>
</p>
</div>
<div class="build__bay" role="progressbar" aria-labelledby="build-title" aria-valuemin="0" aria-valuemax="100"
aria-valuenow="0" aria-valuetext="Not building" data-bay>
<canvas class="build__paint" aria-hidden="true" data-paint></canvas>
<canvas class="build__paint build__ghost" aria-hidden="true" data-ghost></canvas>
</div>
<div class="build__foot">
<p class="build__file"><span class="build__swap" data-file>main · 3f9c2a1</span></p>
<button class="pill" type="button" data-action data-autoclic><span class="pill__label" data-label>Build</span></button>
</div>
<p class="sr" role="status" aria-live="polite" data-live></p>
</section>
</main>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script>
<script src="script.js"></script>
</body>
</html>Cambia valori, colori e testi con le manopole e guarda l’animazione rispondere dal vivo. Oppure scrivi tu nel codice. Poi scarica la cartella con le tue modifiche.
32 valori da cambiare
Col connettore di Animorio, Claude Code la prende da qui con tutta la sua guida e la adatta al tuo progetto. Incolla questa richiesta:
Prendi «Il nastro perforato» da Animorio e adattala al mio sitoIl nastro uscito dalla macchina è una fila di punti, uno ogni 4 unità di nastro, mossi con l’integrazione di Verlet (la velocità è la differenza fra la posizione di adesso e quella di prima) a tre sottopassi per fotogramma, col passo limitato a 1/30 di secondo. Sei giri di vincoli tengono la lunghezza dei tratti e tirano ogni punto verso la retta dei suoi vicini: è la rigidità della carta, che fa sporgere il nastro prima di piegarlo. Il pavimento ha l’attrito, e i punti più lontani di tre posti si respingono sotto le 3,3 unità, così gli strati del mucchio si appoggiano invece di passarsi attraverso.
Gli ultimi punti, quelli ancora fra i rulli, non sono liberi: stanno sulla linea d’uscita, alla distanza da cui sono già usciti. Il nastro cresce aggiungendo un punto ogni 4 unità, e un punto liberato si porta dietro la velocità dei rulli perché la sua posizione di prima è quella del fotogramma prima. La perforatrice va a tutta velocità finché il compilatore ha moduli pronti e aspetta quando non ne ha, a scatti come una vera.
La larghezza del nastro va dentro la pagina: ogni tratto della catena diventa un quadrilatero, il suo bordo più quello stesso bordo spostato di mezza larghezza a destra e di quattro decimi in su. La faccia che si vede prende luce secondo l’angolo del tratto (sdraiato a terra è chiaro, appeso è più scuro), il bordo vicino è un filo più scuro, e i tratti si dipingono dal più lontano al più vicino ordinandoli per x ÷ 0,5 − y ÷ 0,4, così gli strati più alti del mucchio coprono quelli sotto. Sul pavimento cade la loro ombra, spostata a destra quanto più il tratto è alto.
Il testo del pacchetto compilato si trasforma in byte ASCII a sette bit con la parità pari sull’ottavo: ogni colonna, un decimo di pollice come nel nastro vero, ha i fori dei bit a uno su otto piste e il foro piccolo di trascinamento fra la terza e la quarta. Una colonna si segna quando passa sotto i punzoni, e ogni foro si disegna nel punto del nastro dove sta, interpolato lungo il suo tratto e girato col tratto: segue ogni piega. I coriandoli cadono svolazzando e, toccato il mucchio, rotolano giù come sabbia finché il pendio è dolce; poi si dipingono una volta sola nel canvas del vassoio.
Quando si inceppa la testina si ferma ma i rulli spingono ancora 60 unità: i punti nuovi vengono tirati verso una fisarmonica sotto l’uscita, e al taglio ogni punto accartocciato si ricorda la distanza fra i suoi vicini, così il pezzo cade tenendo le pieghe. La taglierina, una timeline GSAP con power3.in e un ritorno elastico, rompe il legame fra due punti: il nastro oltre la lama diventa un pezzo a sé e cade, e ne comincia uno nuovo fra i rulli.
La macchina è un role=progressbar con aria-valuenow e aria-valuetext in moduli, il pannello ha aria-busy mentre lavora e una riga aria-live dice quando la build parte, fallisce e finisce. Il pulsante cambia parola (Build, Cancel, Retry, Build again) e la pillola prende la larghezza nuova con un rimbalzo; un clic da script, quello dell’anteprima, non annulla mai. Con il movimento ridotto la fisica gira lo stesso, ma il canvas si aggiorna ogni mezzo secondo in dissolvenza da un fermo immagine all’altro, e i coriandoli vanno direttamente nel vassoio.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
SECONDS | script.js | 6.5 | Quanto dura una build nella demo, in secondi (una vera segue i suoi moduli). |
MODULES | script.js | 1204 | I moduli da compilare. |
FAIL_EVERY | script.js | 2 | Nella demo, una build su quante si inceppa (0 mai). |
FAIL_AT | script.js | 0.56 | Fin dove arriva la build che si inceppa, da 0 a 1. |
TAPE | script.js | 100 | Quanto nastro esce al secondo dalla perforatrice, in pixel. |
STIFFNESS | script.js | 0.5 | Quanto è rigida la carta: 0 molle come stoffa, 1 rigida come cartoncino. |
GRAVITY | script.js | 1500 | Quanto forte cade il nastro, in pixel al secondo quadrato. |
CHADS | script.js | 0.4 | Quanti coriandoli dei fori si vedono cadere: 0 nessuno, 1 tutti. |
PAYLOAD | script.js | 'import{h as e,render as t}from"./vendor-9c1e.js";const n=[{path:"/",load:()=>import("./home-3a7f.js")},{path:"/checkout",load:()=>import("./checkout-b21d.js")}];t(e(App,{routes:n}),document.getElementById("app"));' | I byte perforati nel nastro, un carattere per colonna. |
Per un’attesa di qualche secondo con un esito: una build, una compilazione, un’esportazione di dati, una stampa, un backup in un’app per sviluppatori o con un gusto d’epoca. Il nastro che si accumula dice bene «quanto lavoro è stato fatto»; per un caricamento di mezzo secondo è troppo.
Il pannello prende la larghezza dello schermo meno 32 pixel (358 a 390) e il disegno si rimpicciolisce con lui tenendo le proporzioni; il canvas dipinge alla densità vera dello schermo, fino a due volte. Il pulsante col dito si schiaccia e rimbalza; la scritta si allarga sull’asse della larghezza solo sotto il mouse.
Niente nastro che scorre né coriandoli che cadono: la fisica gira lo stesso, ma il canvas cambia ogni mezzo secondo con una dissolvenza da un fermo immagine all’altro, la testina non batte, i coriandoli vanno subito nel vassoio e la taglierina taglia senza scendere. Le parole nuove e la spunta arrivano in dissolvenza.
GSAP 3.15.0, Instrument Sans (font variabile) 5.3.0, JetBrains Mono (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 17 KB; le librerie: GSAP 28 KB.
Provata il 8 ottobre 2026
Puoi usarla nei tuoi progetti e in quelli dei tuoi clienti. Non puoi rivenderla né ridistribuirla così com’è. GSAP resta sotto la sua licenza Standard. Licenza completa.
Con l’email e la password del tuo account.
oppure con l’email
Hai fatto l’accesso come .
Con l’account scarichi lo zip di ogni animazione e di ogni pacchetto, gratis.