
Il menu sotto il foglio
Menu, 3D, Fisica, Transizioni
NuovaGratis
Un selettore per il giorno di consegna di un mobile: la data scelta sta su una scrivania in alto, con due cubi di rovere per il giorno e un rullo per il mese, come un calendario perpetuo. Scegliendo un giorno i cubi si alzano, si girano in aria e, quando serve, si scambiano di posto (il 6 fa anche il 9); cambiando mese le settimane scorrono sotto una tessera di legno che resta sullo stesso giorno.
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 cube calendar</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/gantari@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- a delivery day picker. The chosen date stands on a little desk at the top, set with two oak day cubes and a
month drum on its stand, like a perpetual desk calendar; below, the weeks are one long strip that rolls under
a wooden tile. The cubes, the drum and the weeks are drawn by the script -->
<div class="picker" data-picker>
<div class="picker__top">
<div class="desk" aria-hidden="true" data-desk></div>
<div class="picker__arrows">
<button class="arrow" type="button" aria-label="Previous month" data-prev><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 14.5l6-6 6 6"/></svg></button>
<button class="arrow" type="button" aria-label="Next month" data-next><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 9.5l6 6 6-6"/></svg></button>
</div>
</div>
<p class="sr" id="cube-calendar-month" data-month-name></p>
<div class="cal" role="grid" aria-labelledby="cube-calendar-month" data-grid>
<div class="cal__week" role="row" data-week></div>
<div class="cal__window" data-window>
<div class="cal__strip" role="rowgroup" data-strip></div>
<div class="tile" aria-hidden="true" data-tile>
<span class="tile__shadow" data-tile-shadow></span>
<span class="tile__face"><span class="tile__copy" data-copy></span></span>
</div>
</div>
</div>
<div class="picker__foot">
<p class="picker__done" data-done><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7.5" data-check/></svg><span data-done-text></span></p>
<button class="book" type="button" data-book>
<span class="book__label" data-book-label>Book delivery</span>
<span class="book__date" data-book-date></span>
<svg class="book__spin" viewBox="0 0 24 24" aria-hidden="true" data-spin><path d="M12 4a8 8 0 0 1 8 8"/></svg>
</button>
</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.
27 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 calendario coi cubi» da Animorio e adattala al mio sitoOgni cubo è una scatola in CSS 3D con sei facce, disegnate due volte più grandi e rimpicciolite con scale(0.5), perché in Chrome le cifre restino nitide. Il primo cubo ha 0 1 2 3 4 5, il secondo 0 1 2 6 7 8, e il 6 girato a testa in giù fa il 9. Per ogni giorno il cubo di sinistra mostra le decine se le ha, altrimenti i due cubi si scambiano di posto: il 13 vuole il secondo cubo a sinistra, il 31 il primo. Il rullo dei mesi ha quattro facce lunghe intorno a un perno, fra due montanti di noce, e gira di 90 gradi per mese: la scritta di una faccia si cambia quando la faccia è dietro, e solo quella che viene davanti la mostra.
L'orientamento di un cubo è un quaternione. La rotazione che porta la faccia giusta davanti, con la normale verso di te e il suo «su» in alto (in basso per il 9), si scrive come matrice e diventa il quaternione d'arrivo. GSAP alza il cubo di LIFT pixel in 0,2 secondi, lo gira con uno slerp dal quaternione di adesso a quello nuovo in TURN secondi (power2.inOut), lo lascia cadere con bounce.out e lo fa dondolare su uno spigolo con elastic.out. Sollevato, un cubo si scosta un poco dal vicino, perché girato su uno spigolo è più largo del suo posto. Scambiandosi, il cubo che va a sinistra salta e passa davanti, l'altro scivola dietro, e finché i due si sovrappongono uno resta comunque davanti e l'altro dietro. Interrotto a metà, un cubo riparte dall'orientamento e dal punto in cui si trova.
A ogni fotogramma la normale di ogni faccia passa per la stessa matrice del cubo e per il suo dondolio; il prodotto con la direzione della luce, dall'alto a sinistra e un po' davanti, dice quanto la faccia si scurisce: LIGHT volte quello che le manca alla luce piena. Il rullo fa lo stesso con le sue quattro facce. Le ombre sulla scrivania sono ellissi sfumate stese sul piano, che si allargano e schiariscono quando il cubo si alza. Tutto è inclinato di TILT gradi, così si vedono le facce di sopra.
Le settimane sono una striscia sola, da prima del primo mese prenotabile a dopo l'ultimo. Tutto dipende da un numero, il mese con la sua frazione, tirato da una molla (ROLL): la striscia sta fra la prima settimana di un mese e quella del mese dopo in proporzione alla frazione, il rullo gira di 90 gradi per mese, e ogni giorno ha l'inchiostro pieno nel suo mese e sfuma verso gli altri. Trascinando le settimane, o il rullo, il numero segue il dito, con un elastico oltre il primo e l'ultimo mese; lasciato, la spinta lo porta avanti di un mese o due.
La tessera di rovere sul giorno scelto ha la sua molla (GLIDE). Cambiando mese, il giorno scelto diventa lo stesso giorno del mese nuovo, o il più vicino libero, e la tessera ci scivola mentre le settimane le passano sotto; mentre si trascina resta ferma. Dentro c'è una copia della striscia con i numeri scuri, spostata del contrario della tessera: i giorni che le passano sotto sembrano bruciati nel legno.
La griglia ha role grid, le righe fuori dalla finestra sono inert e un solo giorno prende il tasto Tab: le frecce si muovono fra i giorni, Home e End vanno all'inizio e alla fine della settimana, Pagina su e Pagina giù cambiano mese, e il giorno scelto segue il focus quando si può scegliere. I giorni che non si possono scegliere hanno aria-disabled e il motivo nel nome, e il mese nuovo si annuncia. Book delivery dice Booking, poi si stringe in Change mentre a sinistra si disegna la spunta.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
WEEK_START | script.js | 1 | Il primo giorno della settimana: 1 il lunedì, 0 la domenica. |
LEAD | script.js | 2 | I giorni che servono a preparare una consegna: il primo giorno che si può scegliere è oggi più questi. |
HORIZON | script.js | 120 | Quanti giorni avanti si può prenotare una consegna. |
CLOSED | script.js | [0] | I giorni della settimana senza consegne: 0 la domenica, 1 il lunedì, fino a 6 il sabato. |
FULL | script.js | 6 | Più o meno un giorno ogni tanti è già al completo (inventato a partire dalla data). |
TURN | script.js | 0.62 | I secondi in cui un cubo viene girato in aria. |
LIFT | script.js | 18 | Di quanti pixel si alza un cubo per essere girato. |
ROLL | script.js | [120, 18] | La molla delle settimane e del rullo dei mesi: rigidità e smorzamento. |
GLIDE | script.js | [300, 30] | La molla della tessera di legno sul giorno scelto: rigidità e smorzamento. |
TILT | script.js | 16 | Quanto dall'alto si vede la scrivania, in gradi. |
LIGHT | script.js | 0.42 | Quanto si scurisce il legno su una faccia girata lontano dalla luce. |
Per scegliere il giorno di una consegna, di un ritiro o di un appuntamento quando il marchio ha qualcosa di artigianale: un negozio di mobili, una falegnameria, una cartoleria, una torrefazione. I giorni al completo vanno presi dal tuo sistema al posto di quelli inventati. Per un soggiorno, con arrivo e partenza, c'è il calendario delle prenotazioni.
La scheda è larga 360 pixel, o lo schermo meno i margini: a 390 pixel è larga 358 e ci sta tutta, cubi, rullo e frecce compresi; su uno schermo più stretto la scrivania si rimpicciolisce da sola per lasciare posto alle frecce. Il tocco sceglie i giorni; trascinando in su e in giù le settimane o il rullo si cambia mese, con la spinta. touch-action none sta solo lì: fuori, la pagina scorre. Il colore al passaggio del puntatore sul telefono non c'è.
I cubi non si alzano e non girano: svaniscono e ricompaiono già sulla cifra giusta. Le settimane e il rullo cambiano mese con una dissolvenza, la tessera compare sul giorno nuovo in dissolvenza, i giorni che non si possono scegliere non tremano e all'apertura è già tutto al suo posto. Trascinando, le settimane seguono il dito, ma lasciate vanno subito al mese.
GSAP 3.15.0, Gantari (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 18 KB; le librerie: GSAP 28 KB.
Provata il 6 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.