
Il menu che si apre dal pulsante
Menu, Transizioni, Testo
Gratis
Nello stile minimal: la ricerca di un diario personale che finisce la parola mentre scrivi. Il resto dell’argomento aspetta dopo il cursore, nello stesso carattere ma sottile e stretto, e ogni lettera scritta sopra si inchiostra prendendo peso e larghezza su una molla. La riga del campo si stringe sotto la parola scritta e una linea tratteggiata misura quello che resta; Tab la completa, le frecce scelgono un altro argomento e la fine della parola rotola al nuovo.
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">
<title>The search that finishes the word</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 search of a personal journal. Typing, the field finishes the word: the rest of the best topic waits
after the caret in hairline, condensed letters, and every letter typed over it inks in. The thin line of the
field closes in under the word written, and a dotted line measures what is left to write. Tab, the right
arrow or a tap on the grey letters complete it; the arrows choose another topic; Enter searches.
The letters and the rows are made by the script from the list at the top of script.js -->
<div class="finish" data-finish data-autoclic>
<div class="finish__field" data-field>
<svg class="finish__lens" viewBox="0 0 24 24" aria-hidden="true"><path d="M10.5 4.75a5.75 5.75 0 1 0 0 11.5a5.75 5.75 0 1 0 0-11.5zM14.75 14.75l4.75 4.75"/></svg>
<div class="finish__wrap" data-wrap>
<div class="finish__shake" data-shake>
<span class="finish__holder" aria-hidden="true" data-holder>Search the journal</span>
<div class="finish__track" aria-hidden="true" data-track>
<span class="finish__text" data-text></span>
<span class="finish__caret" data-caret></span>
</div>
</div>
<input class="finish__input" id="finish-input" type="text" inputmode="search" enterkeyhint="search" role="combobox" aria-label="Search the journal" aria-autocomplete="both" aria-expanded="false" aria-controls="finish-list" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" maxlength="20" data-input>
</div>
<button class="finish__key" type="button" tabindex="-1" aria-label="Complete the word" data-key>
<span class="key__tab" aria-hidden="true">tab</span>
<svg class="key__arrow" viewBox="0 0 20 20" aria-hidden="true"><path d="M4 10h11.5M11 5.5l4.5 4.5L11 14.5"/></svg>
</button>
<span class="finish__rule" aria-hidden="true">
<span class="rule__ink" data-ink></span>
<span class="rule__dots" data-dots></span>
<span class="rule__tick" data-tick></span>
</span>
</div>
<div class="finish__room" data-room>
<span class="finish__band" aria-hidden="true" data-band></span>
<ul class="finish__list" id="finish-list" role="listbox" aria-label="Topics" data-list></ul>
<p class="finish__note" data-note></p>
</div>
<p class="sr" role="status" aria-live="polite" data-said></p>
</div>
</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.
85 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 «La ricerca che finisce la parola» da Animorio e adattala al mio sitoL’input c’è ed è vero, con role combobox, aria-autocomplete both, aria-expanded e aria-activedescendant, ma il suo testo e il suo cursore sono trasparenti: tiene la tastiera, la selezione, l’incolla e gli screen reader. Le lettere che si vedono sono span disegnati dallo script, una per carattere e con la crenatura spenta, nello stesso carattere e alla stessa misura dell’input, così un clic cade sul punto giusto. Il cursore è un segmento blu messo dopo la lettera giusta, misurata con getBoundingClientRect.
A ogni cambiamento syncLetters() mette in fila le lettere scritte e poi la fine dell’argomento scelto, e la confronta con gli span che ci sono già: finché il carattere è lo stesso (senza badare alle maiuscole) lo span resta e cambia solo stato, inchiostrato o grigio. Il resto se ne va: gli span vengono tolti dalla riga dove stanno, rimessi in posizione assoluta allo stesso punto e fatti cadere e svanire, così le lettere rimaste si richiudono subito. Le nuove si aprono da una fessura, dall’asse wdth a 25 a quello del grigio.
Roboto Flex ha gli assi wght da 100 a 1000 e wdth da 25 a 151: le lettere da scrivere stanno a GHOST (peso 130, larghezza 70), quelle scritte a INKED (470 e 100). GSAP porta i due assi con una curva a molla smorzata scritta come funzione, che passa la meta di pochi punti e torna, e a ogni fotogramma riscrive font-variation-settings. Il colore passa dal grigio al nero con una transizione CSS, ritardata come il peso quando la parola si completa a onda, una lettera ogni STAGGER secondi.
La riga blu ha due capi e la linea tratteggiata un terzo, ognuno su una molla vera (rigidità e smorzamento di SPRING, passo limitato a 1/30 di secondo e diviso in passi da 1/240). A ogni fotogramma il ciclo misura dove finiscono l’ultima lettera scritta e l’ultima grigia, anche a metà della loro animazione, e le molle le inseguono: così la riga si stringe dalla larghezza intera a sotto la prima lettera e poi cresce lettera per lettera. Il ciclo resta acceso solo finché qualcosa si muove, e si riaccende al resize perché le misure sono in pixel.
search() tiene gli argomenti che cominciano con le lettere scritte, coi più letti prima; l’argomento scelto resta lo stesso finché combacia, così cancellando non cambia sotto le dita. Le righe sono in posizione assoluta: quelle che non valgono più svaniscono in 0,12 secondi, le altre aspettano e scivolano al posto nuovo con un piccolo eccesso, le nuove salgono una dopo l’altra. Le frecce o il puntatore spostano la fascia e fanno rotolare la fine nel campo; Tab e la freccia a destra la completano solo se c’è, altrimenti Tab fa il suo lavoro.
Un clic da script (detail 0, quello dell’anteprima della libreria) avvia una timeline di GSAP di circa 9 secondi che scrive senza prendere il fuoco: p, poi o (la fine passa da Photography a Poetry), la freccia in giù su Pottery, t sopra la t grigia, Tab, Invio, e infine Esc riporta tutto a riposo. Mentre il giro è in corso gli altri clic da script si ignorano; un tocco o un tasto veri lo fermano subito.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
TOPICS | script.js | [['Photography', 14], ['Poetry', 11], ['Pottery', 9], …] | Gli argomenti del diario e quanti articoli ha ognuno. |
SHOWN | script.js | 5 | Quanti argomenti mostra al massimo la lista. |
UNIT | script.js | ['essay', 'essays'] | La parola dopo il numero, per uno e per più di uno. |
GHOST | script.js | [130, 70] | Il peso e la larghezza delle lettere ancora da scrivere. |
INKED | script.js | [470, 100] | Il peso e la larghezza delle lettere scritte. |
STAGGER | script.js | 0.04 | I secondi fra una lettera e la successiva che si inchiostra quando la parola si completa. |
SETTLE | script.js | 0.55 | I secondi in cui una lettera si inchiostra e si assesta. |
SPRING | script.js | [420, 35] | La molla della riga sotto la parola: rigidità e smorzamento. |
TRIES | script.js | ['Photography', 'Bread', 'Walking'] | Gli argomenti proposti quando non c’è niente di scritto. |
Per la ricerca di un blog, di un diario, di una documentazione, di un negozio con categorie dai nomi corti o del campo dei tag di un’app: ovunque le parole da cercare sono poche e conosciute e conviene finirle per chi scrive, come fa la barra degli indirizzi del browser. La funzione search() è la sola da cambiare per chiedere gli argomenti a un server.
Il campo prende la larghezza dello schermo meno 32 pixel e le parole scendono a 27 pixel, così anche Photography sta comoda; il campo dice alla tastiera di mostrare il tasto per cercare. Sul telefono non c’è il tasto Tab: al suo posto, a destra del campo, c’è un tondo con una freccia disegnata, e anche un tocco sulle lettere grigie completa la parola. Le righe restano alte 46 pixel per il dito e un tocco ne sceglie una e la cerca. Assi, molle e rotolamenti sono gli stessi del computer.
Niente molle, cadute né rotolamenti: la riga blu salta subito sotto la parola, la fine grigia compare e sparisce in dissolvenza già al suo posto, le righe della lista appaiono e svaniscono senza muoversi e la fascia salta da una riga all’altra. Le lettere si inchiostrano cambiando peso e larghezza in un quinto di secondo, senza onda né eccesso, e il campo non sobbalza e non scuote la testa.
GSAP 3.15.0, Roboto Flex (font variabile, assi wght e wdth) 5.3.0.
Compressi con gzip, i tre file della demo pesano 12 KB; le librerie: GSAP 28 KB.
Provata il 18 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.