
Il menu che si apre dal pulsante
Menu, Transizioni, Testo
Gratis
Le storie di un piccolo museo del disegno fatte solo di tipografia, nello stile minimal: ogni storia è una frase grande. Le parole entrano una dopo l’altra mentre gli assi del carattere si aprono, e la storia si legge da sola nel suo tempo, lettera per lettera, mentre si riempie la barra sottile in alto: la parola nel colore d’accento prende colore e inclinazione solo quando viene letta. Tocco a destra avanti, a sinistra indietro, pressione lunga in pausa.
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>One-sentence stories</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/roboto-flex@5.3.0/full.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the stories of a small museum of drawing, Velum, made of type alone: every story is one sentence. Its words
come in one after the other while the font's width and weight open up, and the story reads itself in its own
time, letter by letter, while the thin bar at the top fills: the word in the accent colour takes its colour
and its slant only when it is read. A tap on the right goes on, on the left back; holding stops the time.
The sentences are written by script.js, from STORIES -->
<section class="stories" aria-label="Stories from Velum" aria-roledescription="stories" data-stories data-autoclic>
<div class="viewer" data-viewer>
<div class="bars" aria-hidden="true" data-bars></div>
<div class="head" data-head>
<span class="head__name">Velum</span>
<span class="head__when" aria-hidden="true">
<span class="head__ago" data-ago></span>
<span class="head__paused" data-paused-word>Paused</span>
</span>
<button class="head__pause" type="button" aria-label="Pause the stories" data-pause>
<svg class="i-pause" viewBox="0 0 24 24" aria-hidden="true"><path d="M8.5 5.5v13M15.5 5.5v13"/></svg>
<svg class="i-play" viewBox="0 0 24 24" aria-hidden="true"><path d="M8 5.8v12.4l10-6.2z"/></svg>
</button>
</div>
<div class="text" aria-hidden="true" data-text>
<div class="measure" data-measure></div>
</div>
<p class="sr" data-now></p>
<button class="tap tap--back" type="button" aria-label="Previous story" data-back>
<svg class="tap__sign" viewBox="0 0 24 24" aria-hidden="true"><path d="M14.5 5.5L8 12l6.5 6.5"/></svg>
</button>
<button class="tap tap--next" type="button" aria-label="Next story" data-next>
<svg class="tap__sign" viewBox="0 0 24 24" aria-hidden="true"><path d="M9.5 5.5L16 12l-6.5 6.5"/></svg>
</button>
<div class="foot" data-foot>
<span class="foot__rule" aria-hidden="true" data-rule></span>
<p class="label" aria-hidden="true" data-label>
<span class="label__what" data-what></span>
<span class="label__when" data-when></span>
</p>
<button class="again" type="button" hidden data-again>
<span class="again__word">Watch again</span>
<svg class="again__sign" viewBox="0 0 24 24" aria-hidden="true"><path d="M18.4 9.2A7 7 0 1 0 19 13.6"/><path d="M19.2 4.8v4.6h-4.6"/></svg>
</button>
</div>
</div>
<p class="sr" aria-live="polite" aria-atomic="true" 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.
37 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 «Le storie di una frase» da Animorio e adattala al mio sitoOgni frase si scrive prima in un gemello invisibile, largo quanto lo spazio della frase, con gli assi finali (wdth WIDTH, wght WEIGHT, la parola d’accento più pesante e già inclinata) e text-wrap: balance, così il browser va a capo e pareggia le righe. Una ricerca per bisezione trova la misura più grande, fino a BIGGEST, in cui la frase sta in altezza e nessuna parola sfora. Poi ogni parola si rifà vera, in posizione assoluta dove il gemello l’aveva messa: da lì gli assi possono muoverla senza che la riga si muova.
Ogni parola ha tre proprietà personalizzate, --wd, --wg e --wa, che GSAP anima e che le lettere leggono in font-variation-settings. Le parole nuove partono da una larghezza NARROW mai più larga di quella finale e da un peso sottile, salgono di TRAVEL em con back.out(1,5), un pixel oltre e indietro, e il peso arriva con back.out(1,8): un capello pesante, poi si assesta. Siccome una parola ferma alla sua sinistra si allarga solo verso la sua larghezza finale, non tocca mai la vicina. Quelle vecchie salgono, si stringono e perdono peso in power2.in.
La coreografia si calcola dalla geometria: per ogni parola vecchia si tiene il rettangolo che occupa uscendo (posto più corsa) e l’istante in cui sarà del tutto trasparente; ogni parola nuova, nel suo ordine di lettura e con STAGGER secondi dalla precedente, aspetta il più tardo di quelli che il suo rettangolo d’entrata tocca. Andando avanti le parole vanno dalla prima, tornando indietro dall’ultima e in basso.
Il tempo della storia è un tween GSAP di DURATION secondi; da lui si riempie la barra e corre la testa di lettura, con un indice per lettera (gli spazi contano come un respiro). Ogni lettera va con uno smoothstep largo 3,2 lettere da UNREAD all’inchiostro pieno e dal grado -150 a 0: l’asse GRAD di Roboto Flex cambia lo spessore senza cambiare la larghezza, quindi niente si sposta; la lettera sotto la testa prende un colpo di grado in più. Le lettere d’accento passano dall’inchiostro al vermiglio e da slnt 0 a -10 con la stessa curva. Kerning e legature sono spenti, perché lettere con impostazioni diverse non si spostino di frazioni di pixel.
Le zone del tocco sono due pulsanti veri, Previous story e Next story. Una pressione oltre HOLD secondi non cambia storia: la velocità del tempo va a zero in 0,26 s con power2.out (timeScale del tween), così barra e lettura frenano insieme, e riparte con power1.in. Indietro sulla prima storia il tempo si riavvolge in 0,45 s e la lettura con lui. Il tempo e Paused si scambiano in una fessura: uno esce in alto, l’altro sale da sotto. Un clic da script sul visore (l’anteprima della libreria) fa un giro: prima storia, avanti, indietro, una pressione lunga, avanti fino alla fine.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
DURATION | script.js | 5 | I secondi che dura ogni storia: la frase si legge nei primi quattro quinti. |
HOLD | script.js | 0.2 | I secondi che deve durare una pressione per fermare il tempo invece di cambiare storia. |
STAGGER | script.js | 0.05 | I secondi fra l’entrata di una parola e quella dopo. |
TRAVEL | script.js | 0.3 | Di quanto salgono o scendono le parole entrando e uscendo, in em. |
NARROW | script.js | 34 | La larghezza del carattere (da 25 a 151) da cui le parole entrano e a cui escono; mai più larga di WIDTH. |
WIDTH | script.js | 60 | La larghezza del carattere della frase posata, da 25 a 151: più stretta, la frase viene più grande. |
WEIGHT | script.js | 540 | Il peso della frase, da 100 a 1000. |
ACCENT_WEIGHT | script.js | 690 | Il peso della parola fra asterischi, quella che prende il colore d’accento. |
UNREAD | script.js | 0.34 | Quanto inchiostro hanno le lettere prima che la storia le legga, da 0 a 1. |
BIGGEST | script.js | 72 | La misura più grande che una frase può avere, in pixel su un visore largo 320. |
STORIES | script.js | [['The north wing *reopens* on Saturday.', 'North wing', 'Saturday, 10 am', '2 h'], …] | Le storie: la frase (la parola fra asterischi prende l’accento), l’etichetta, la sua seconda metà e quanto tempo fa. |
LAST | script.js | You are all *caught up*. | La frase dopo l’ultima storia, sopra Watch again. |
Per le storie di un museo, di una galleria, di una rivista o di una casa editrice, dove la cosa da dire è una frase: un’apertura, una mostra, un orario, un numero nuovo. O come annunci a tempo in cima a una pagina, senza immagini da preparare.
Il visore è largo 320 pixel e alto come un telefono, e su schermi bassi si stringe tenendo le proporzioni: le misure dentro sono in cqw e la frase si rimisura. Si tocca a destra e a sinistra e si tiene premuto col dito; il tocco lungo non apre il menu del sistema e non seleziona il testo. Stesse animazioni del computer.
Il tempo parte fermo (il pulsante dice Play) e le storie non vanno avanti da sole. Le parole non salgono e non cambiano assi: la frase vecchia svanisce, poi la nuova compare sfumando parola per parola, già letta, con la parola d’accento già colorata e inclinata. Il tempo frena e riparte senza rallentare.
GSAP 3.15.0, Roboto Flex (font variabile, con gli assi della larghezza, del peso, del grado e dell’inclinazione) 5.3.0.
Compressi con gzip, i tre file della demo pesano 12 KB; le librerie: GSAP 28 KB.
Provata il 16 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.