Skip to content

Latest commit

Β 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ”’ Counter

Un contatore web in JavaScript puro, con interfaccia costruita interamente via DOM.

Demo Β  Licenza

HTML5 CSS3 JavaScript Nessuna dipendenza


πŸ“‘ Indice


🎯 Il progetto

Counter Γ¨ una piccola applicazione web che simula il comportamento di un contatore: si apre su un valore iniziale di 0 e permette di aumentarlo o diminuirlo con due pulsanti, + e βˆ’.

È il progetto finale del modulo JavaScript del corso start2impact. La consegna chiede espressamente che l'interfaccia non sia scritta a mano nell'HTML, ma generata dinamicamente da JavaScript tramite manipolazione del DOM: il file index.html contiene soltanto un contenitore vuoto, tutto il resto nasce da document.createElement.

Oltre ai requisiti minimi, l'applicazione aggiunge alcune funzionalitΓ  pensate per renderla davvero utilizzabile: passo personalizzabile, salvataggio automatico, scorciatoie da tastiera, tema chiaro/scuro e uno storico delle ultime operazioni.


πŸ–Ό Anteprima

Tema scuro Tema chiaro
Counter, tema scuro Counter, tema chiaro

✨ Funzionalità

Richieste dalla consegna

FunzionalitΓ 
βœ… Il contatore parte da 0 all'apertura della pagina
βœ… Pulsante + per incrementare
βœ… Pulsante βˆ’ per decrementare
βœ… Il valore corrente Γ¨ sempre visibile a schermo
βœ… Interfaccia creata dinamicamente via DOM

Aggiunte

FunzionalitΓ  Dettaglio
πŸ”’ Passo personalizzabile si sceglie di quanto incrementare o decrementare a ogni click (da 1 a 1000)
πŸ’Ύ Salvataggio automatico valore, passo e tema vengono ricordati alla riapertura della pagina, tramite localStorage
⌨️ Scorciatoie da tastiera ↑ / + per aumentare, ↓ / βˆ’ per diminuire, R per azzerare
πŸ•˜ Storico le ultime 5 operazioni, con la variazione applicata e il valore risultante
πŸŒ— Tema chiaro / scuro al primo avvio segue la preferenza del sistema operativo, poi ricorda la scelta
🎨 Feedback visivo il numero è verde se positivo, rosso se negativo, con una breve animazione a ogni cambio
🚧 Limiti il valore resta tra βˆ’999999 e 999999; al limite il pulsante corrispondente si disabilita
♿️ Accessibile navigabile da tastiera, etichette ARIA e annuncio del nuovo valore agli screen reader
πŸ“± Responsive layout leggibile da smartphone a desktop
πŸ§ͺ Testata 20 test automatici sulla logica, eseguibili con Node senza installare nulla

πŸ“‹ Requisiti del progetto e come sono stati soddisfatti

Requisito Come Γ¨ stato rispettato
Sviluppo esclusivamente in JavaScript puro Nessun transpiler, nessun build step: si aprono i file e funzionano
Interfaccia creata dinamicamente via DOM index.html contiene solo <div id="app"></div>; display, pulsanti, campi e storico sono creati in js/ui.js con document.createElement
Niente jQuery, React, Angular, Vue o simili Zero dipendenze: nessun package.json, nessun node_modules, nessuno script da CDN
Librerie esterne solo se necessarie Non ne Γ¨ servita nessuna, nemmeno per le icone: sono SVG scritti a mano
FunzionalitΓ  aggiuntive a piacere Vedi la tabella qui sopra

πŸ“ Struttura del repository

JavaScript_RiccardoB/
β”‚
β”œβ”€β”€ index.html              # Contenitore vuoto + inclusione degli script
β”‚
β”œβ”€β”€ css/
β”‚   └── style.css           # Stili, temi chiaro/scuro, animazioni, responsive
β”‚
β”œβ”€β”€ js/
β”‚   β”œβ”€β”€ storage.js          # Salvataggio su localStorage (a prova di errore)
β”‚   β”œβ”€β”€ counter.js          # Logica del contatore, indipendente dal DOM
β”‚   β”œβ”€β”€ ui.js               # Creazione dell'interfaccia e rendering
β”‚   └── app.js              # Punto di ingresso: eventi, tastiera, tema, storico
β”‚
β”œβ”€β”€ tests/
β”‚   └── counter.test.js     # Test della logica, eseguibili con Node
β”‚
β”œβ”€β”€ assets/
β”‚   β”œβ”€β”€ screenshot-dark.png
β”‚   └── screenshot-light.png
β”‚
β”œβ”€β”€ LICENSE
└── README.md

βš™οΈ Come funziona

Il codice è diviso in quattro file con responsabilità separate, così che ognuno faccia una cosa sola e sia comprensibile da solo.

   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   crea e aggiorna   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚   ui.js      │◀────────────────────│   app.js     β”‚
   β”‚  (il DOM)    β”‚                     β”‚(orchestrazione)β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                                               β”‚ chiama i metodi
                                               β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   notifica i cambi  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚  storage.js  │◀────────────────────│  counter.js  β”‚
   β”‚(localStorage)β”‚                     β”‚ (la logica)  β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

counter.js β€” la logica. Espone una factory createCounter() che restituisce un contatore con lo stato chiuso in una closure: dall'esterno non Γ¨ modificabile se non attraverso i metodi increment(), decrement(), reset(), setStep() e setValue(). Ogni cambiamento viene comunicato ai sottoscrittori registrati con subscribe(), in stile observer.

Questo modulo non conosce il DOM: Γ¨ la ragione per cui puΓ² essere testato in Node senza un browser, e per cui l'interfaccia potrebbe essere riscritta da zero senza toccarlo.

ui.js β€” l'interfaccia. Costruisce tutti gli elementi con document.createElement (tramite un piccolo helper dichiarativo el()) e li inserisce nella pagina. Espone le funzioni render(), renderHistory() e pulse(), che disegnano lo stato ricevuto senza sapere nulla di come quello stato sia stato calcolato.

storage.js β€” la persistenza. Un involucro attorno a localStorage che intercetta le eccezioni: in navigazione privata o con la quota esaurita l'accesso puΓ² fallire, e in quel caso l'applicazione continua a funzionare mostrando un avviso, semplicemente senza ricordare il valore.

app.js β€” l'orchestrazione. Mette insieme i pezzi, collega gli eventi dei pulsanti e della tastiera e gestisce tema e storico. Il flusso Γ¨ sempre nella stessa direzione β€” interazione β†’ logica β†’ notifica β†’ interfaccia + salvataggio β€” quindi ciΓ² che si vede a schermo e ciΓ² che Γ¨ realmente memorizzato non possono andare fuori sincrono.


πŸ’» Eseguire il progetto in locale

Non serve installare nulla: non ci sono dipendenze nΓ© passaggi di build.

git clone https://github.com/TurboR93/JavaScript_RiccardoB.git
cd JavaScript_RiccardoB
open index.html          # su macOS β€” altrimenti basta un doppio click sul file

L'applicazione funziona anche aperta direttamente dal filesystem (file://). Volendo servirla via HTTP, con Python o Node:

python3 -m http.server 8000
# oppure
npx serve .

Poi si apre http://localhost:8000.


πŸ§ͺ Test

La logica del contatore Γ¨ coperta da 20 test automatici che verificano il comportamento di base, il passo personalizzato, i limiti, la robustezza sugli input non validi e le notifiche ai sottoscrittori.

node tests/counter.test.js
20 test superati, 0 falliti

Non serve installare nΓ© npm nΓ© alcun framework di testing: lo script usa solo Node.


♿️ AccessibilitΓ 

  • Ogni controllo Γ¨ raggiungibile e azionabile da tastiera, con contorno di focus sempre visibile.
  • Il display usa role="status" e aria-live="polite": gli screen reader annunciano il nuovo valore senza interrompere l'utente.
  • I pulsanti hanno aria-label esplicite ("Aumenta il contatore", "Diminuisci il contatore", …), perchΓ© graficamente mostrano solo un simbolo.
  • Il colore non Γ¨ mai l'unica informazione: il valore e lo storico restano leggibili anche senza distinguere verde e rosso.
  • La regola prefers-reduced-motion disattiva le animazioni per chi ha impostato quella preferenza di sistema.
  • Un messaggio in <noscript> spiega la situazione se JavaScript Γ¨ disattivato.

🌐 Compatibilità

Testata su browser desktop e mobile aggiornati (Chrome, Safari, Firefox, Edge). Richiede JavaScript attivo, dato che l'intera interfaccia viene generata a runtime.


πŸ›  Tecnologie

  • HTML5 β€” un unico contenitore, tutto il resto Γ¨ generato
  • CSS3 β€” variabili custom, Flexbox, Grid, color-mix(), animazioni, media query
  • JavaScript (ES5+) β€” DOM API, closure, pattern observer, localStorage
  • Nessuna libreria esterna, nessun framework, nessun build step

πŸ‘€ Autore

Riccardo Brunello

GitHub


πŸ“„ Licenza

Distribuito con licenza MIT β€” vedi il file LICENSE.


⭐️ Se il progetto ti è stato utile, lascia una stella!

About

Counter in JavaScript puro: interfaccia generata dinamicamente via DOM. Progetto JavaScript start2impact.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages