Introduzione ai Form HTML: Il Cuore dell'Interazione Utente
Benvenuti alla sedicesima lezione del nostro corso 'Impara HTML in 45 lezioni'! Oggi ci immergiamo in uno degli argomenti più cruciali e interattivi della programmazione web: i form HTML. Sebbene le pagine web siano fantastiche per visualizzare informazioni, la vera magia accade quando gli utenti possono interagire con esse, inviando dati, registrandosi, effettuando acquisti o lasciando commenti. È qui che entrano in gioco i form HTML.
Un form HTML è una raccolta di elementi di input che permettono agli utenti di inserire informazioni. Queste informazioni vengono poi inviate a un server per essere elaborate. Pensa a ogni volta che hai effettuato il login su un sito, compilato un modulo d'ordine, cercato qualcosa su Google o inviato un messaggio tramite un modulo di contatto: in tutti questi casi, hai interagito con un form HTML. Comprendere la loro struttura e il loro funzionamento è fondamentale per qualsiasi sviluppatore web, anche a livello principiante, perché sono la base per creare applicazioni web dinamiche e utili.
In questa lezione, esploreremo in profondità la struttura di un form HTML, analizzando ogni componente, i suoi attributi e il perché di ogni scelta di design. Impareremo non solo cosa usare, ma anche perché usarlo in un certo modo, ponendo particolare attenzione all'accessibilità e all'usabilità, aspetti che spesso vengono trascurati ma che sono vitali per un'esperienza utente di qualità. Preparatevi a trasformare le vostre pagine statiche in piattaforme interattive!
L'Elemento <form>: Il Contenitore Principale
Ogni form HTML inizia e finisce con l'elemento <form>. Questo tag agisce come un contenitore per tutti gli elementi di input, i campi di testo, i pulsanti e altri controlli che compongono il tuo modulo. Senza l'elemento <form>, i tuoi input non sarebbero in grado di inviare dati a un server in modo coeso.
<form action="/submit-data" method="post">
<!-- Qui andranno tutti gli elementi del form -->
</form>
Analizziamo i due attributi più importanti dell'elemento <form>:
L'attributo action
L'attributo action specifica l'URL dove i dati del form devono essere inviati quando viene sottomesso. Questo URL punta tipicamente a uno script lato server (ad esempio, un file PHP, un endpoint Node.js, una vista Django/Flask, ecc.) che è responsabile dell'elaborazione delle informazioni inviate. Se l'attributo action viene omesso, i dati verranno inviati alla stessa pagina che contiene il form. È fondamentale che questo URL sia corretto, altrimenti i dati non raggiungeranno la destinazione desiderata e il form sembrerà non funzionare.
Esempio:
action="/registrazione-utente.php" indica che i dati verranno inviati allo script registrazione-utente.php sul server.
L'attributo method
L'attributo method specifica il metodo HTTP da utilizzare per inviare i dati del form. I due valori più comuni sono GET e POST.
-
GET: I dati del form vengono aggiunti all'URL come parametri di query (visibili nella barra degli indirizzi del browser). È utile per form che non modificano i dati sul server, come i form di ricerca. I dati inviati conGETsono limitati in quantità e non sono sicuri per informazioni sensibili.- Perché usarlo: Ideale per ricerche, filtri, o quando si desidera che l'URL sia condivisibile (es. un link ai risultati di una ricerca specifica).
- Quando NON usarlo: Mai per password, dati personali o qualsiasi informazione che non dovrebbe essere visibile nell'URL o che potrebbe essere memorizzata nella cronologia del browser.
-
POST: I dati del form vengono inviati nel corpo della richiesta HTTP e non sono visibili nell'URL. È il metodo preferito per inviare dati sensibili o grandi quantità di dati, come moduli di registrazione, upload di file o ordini di acquisto.- Perché usarlo: Sicurezza (i dati non sono nell'URL), nessuna limitazione sulla quantità di dati, ideale per operazioni che modificano lo stato del server (creazione, aggiornamento, cancellazione di risorse).
- Quando NON usarlo: Se vuoi che l'URL sia condivisibile con i parametri specifici del form.
La scelta tra GET e POST è cruciale e dipende dalla natura dei dati che stai inviando e dall'operazione che il server deve eseguire.
Elementi di Input Fondamentali: Interagire con l'Utente
Una volta definito il contenitore <form>, è il momento di inserire gli elementi che permettono all'utente di fornire input. HTML offre una varietà di elementi per diversi tipi di dati.
L'elemento <input>
L'elemento <input> è l'elemento più versatile e utilizzato nei form. Il suo comportamento cambia drasticamente in base all'attributo type. Ecco alcuni dei tipi più comuni:
type="text": Il tipo predefinito. Un campo di testo a riga singola per input generico.<label for="nomeUtente">Nome Utente:</label> <input type="text" id="nomeUtente" name="username">type="password": Un campo di testo a riga singola dove i caratteri inseriti vengono mascherati (es. con asterischi o pallini) per la privacy.<label for="password">Password:</label> <input type="password" id="password" name="password">type="email": Un campo di testo per indirizzi email. I browser moderni possono offrire una validazione automatica di base sul formato dell'email.<label for="email">Email:</label> <input type="email" id="email" name="emailUtente">type="number": Un campo di input per numeri. Il browser può visualizzare frecce per incrementare/decrementare il valore.<label for="quantita">Quantità:</label> <input type="number" id="quantita" name="quantity" min="1" max="100">type="checkbox": Una casella di spunta. Utile quando l'utente può selezionare zero, uno o più opzioni da un elenco.<input type="checkbox" id="accettoTermini" name="termini" value="si"> <label for="accettoTermini">Accetto i termini e condizioni</label>type="radio": Pulsanti di opzione. Utili quando l'utente deve selezionare una sola opzione da un elenco. I pulsanti radio con lo stesso attributonameformano un gruppo, e solo uno di essi può essere selezionato alla volta.<input type="radio" id="opzioneA" name="scelta" value="A"> <label for="opzioneA">Opzione A</label> <input type="radio" id="opzioneB" name="scelta" value="B"> <label for="opzioneB">Opzione B</label>type="submit": Un pulsante che invia i dati del form al server. Il testo sul pulsante è di solito il valore dell'attributovalueo 'Invia'/'Submit' per default.<input type="submit" value="Invia Dati">type="date": Un selettore di data che apre un calendario per scegliere una data.<label for="dataNascita">Data di Nascita:</label> <input type="date" id="dataNascita" name="data_nascita">type="file": Permette all'utente di selezionare uno o più file da caricare. Richiede che il form abbiaenctype="multipart/form-data"se si usa il metodoPOST.<label for="caricaFile">Carica il tuo CV:</label> <input type="file" id="caricaFile" name="cv_file">
L'elemento <label>: L'Importanza dell'Accessibilità
L'elemento <label> è fondamentale per l'accessibilità e l'usabilità. Fornisce un'etichetta testuale per un elemento di input. Non solo migliora l'esperienza visiva, ma permette anche agli screen reader (usati da persone con disabilità visive) di leggere l'etichetta associata all'input. Per collegare una <label> a un <input>, si usa l'attributo for nella <label>, il cui valore deve corrispondere all'attributo id dell'<input> correlato.
<label for="nomeUtente">Nome Utente:</label>
<input type="text" id="nomeUtente" name="username">
Quando si clicca sull'etichetta, il browser focalizza automaticamente il campo di input associato, migliorando l'usabilità per tutti gli utenti, specialmente su dispositivi touch.
L'elemento <textarea>: Input Multilinea
Quando hai bisogno che gli utenti inseriscano testi lunghi, come commenti o descrizioni, l'elemento <textarea> è la scelta giusta. Supporta più righe di testo e può essere ridimensionato dall'utente (a meno che non venga impedito con CSS).
<label for="messaggio">Il tuo messaggio:</label>
<textarea id="messaggio" name="user_message" rows="5" cols="30"></textarea>
Gli attributi rows e cols definiscono le dimensioni iniziali della textarea (righe e colonne di testo visualizzate).
L'elemento <select> e <option>: Menu a Discesa
Per permettere agli utenti di scegliere una o più opzioni da un elenco predefinito, si usa l'elemento <select> combinato con <option>. Ogni <option> rappresenta un'opzione selezionabile.
<label for="paese">Seleziona il tuo paese:</label>
<select id="paese" name="country">
<option value="">-- Seleziona un'opzione --</option>
<option value="it">Italia</option>
<option value="fr">Francia</option>
<option value="es">Spagna</option>
</select>
L'attributo value dell'<option> è il dato che verrà inviato al server. Il testo tra i tag <option> è ciò che l'utente vede.
L'elemento <button>
Mentre input type="submit" crea un pulsante di invio, l'elemento <button> offre maggiore flessibilità. Può contenere non solo testo, ma anche HTML (come immagini o icone). L'attributo type di un <button> può essere submit (invia il form), reset (resetta i campi del form) o button (un pulsante generico che non invia il form e richiede JavaScript per la sua funzionalità).
<button type="submit">Invia Richiesta</button>
<button type="button">Clicca qui</button> <!-- Non invia il form, richiede JS -->
Organizzare i Form: Semplicità e Chiarezza
Form complessi possono diventare difficili da usare e comprendere. HTML offre elementi per raggruppare e organizzare i campi, migliorando l'usabilità e la leggibilità.
L'elemento <fieldset> e <legend>
<fieldset> viene utilizzato per raggruppare semanticamente elementi correlati all'interno di un form, disegnando un bordo attorno a essi per un raggruppamento visivo. L'elemento <legend> fornisce una didascalia (titolo) per il <fieldset>, posizionata tipicamente sul bordo del raggruppamento.
<form action="/profilo-utente" method="post">
<fieldset>
<legend>Informazioni Personali</legend>
<label for="nome">Nome:</label>
<input type="text" id="nome" name="first_name">
<label for="cognome">Cognome:</label>
<input type="text" id="cognome" name="last_name">
</fieldset>
<fieldset>
<legend>Dati di Contatto</legend>
<label for="emailContatto">Email:</label>
<input type="email" id="emailContatto" name="contact_email">
<label for="telefono">Telefono:</label>
<input type="tel" id="telefono" name="phone">
</fieldset>
<button type="submit">Salva Profilo</button>
</form>
Questo approccio rende i form lunghi più gestibili, dividendo le informazioni in sezioni logiche.
Uso di <div> per il Layout
Mentre <fieldset> e <legend> sono per il raggruppamento semantico, i tag <div> sono spesso usati per scopi di layout, specialmente quando si applicano stili CSS. Possono aiutare a organizzare gli input e le loro etichette in righe o colonne, facilitando l'applicazione di stili per una migliore presentazione.
<form action="/login" method="post">
<div>
<label for="usernameLogin">Username:</label>
<input type="text" id="usernameLogin" name="username" required>
</div>
<div>
<label for="passwordLogin">Password:</label>
<input type="password" id="passwordLogin" name="password" required>
</div>
<div>
<button type="submit">Accedi</button>
</div>
</form>
Attributi Utili per la Validazione e l'Usabilità
Oltre all'attributo type, molti altri attributi possono essere aggiunti agli elementi di input per migliorare l'usabilità, fornire indicazioni e abilitare la validazione lato client (cioè, la validazione eseguita dal browser prima che i dati vengano inviati al server).
-
name: CRUCIALE. Questo attributo è usato per identificare il campo di input quando i dati vengono inviati al server. Senza un attributoname, i dati di quel campo non verranno inviati. Il valore dell'attributonamesarà il nome della variabile che conterrà il valore dell'input sul server.name="username" -
id: Usato per identificare un elemento in modo univoco all'interno della pagina. È fondamentale per collegare le<label>agli<input>e per manipolare gli elementi con JavaScript o applicare stili CSS specifici.id="emailField" -
value: Specifica il valore iniziale o predefinito di un campo di input. Percheckboxeradio,valueè il dato che verrà inviato se l'opzione è selezionata. Persubmitebutton, è il testo visualizzato sul pulsante.value="Valore predefinito" -
placeholder: Fornisce un suggerimento o un esempio del formato di input previsto. Il testo scompare quando l'utente inizia a digitare. Non deve sostituire la<label>.placeholder="mario.rossi@example.com" -
required: Un attributo booleano che indica che il campo deve essere compilato prima che il form possa essere inviato. Il browser impedirà l'invio e mostrerà un messaggio di errore se il campo è vuoto.required -
readonly: Un attributo booleano che rende un campo di input non modificabile dall'utente. Il valore del campo verrà comunque inviato con il form.readonly -
disabled: Un attributo booleano che disabilita un campo di input, impedendo all'utente di interagirci. Il valore del campo non verrà inviato con il form.disabled -
minemax: Usati contype="number",type="range",type="date",type="time"per specificare i valori minimi e massimi consentiti.min="18" max="99" -
step: Usato contype="number",type="range",type="date",type="time"per specificare l'intervallo valido tra i valori (es.step="5"per numeri che aumentano di 5 in 5).step="0.01" -
pattern: Accetta un'espressione regolare (regex) che il valore dell'input deve corrispondere per essere considerato valido. Utile per validazioni complesse chetypeda solo non può gestire (es. codici postali, formati specifici).pattern="[0-9]{3}-[0-9]{3}-[0-9]{4}"(per un numero di telefono nel formato 123-456-7890) -
maxlength: Specifica il numero massimo di caratteri che l'utente può inserire in un campo di testo o textarea.maxlength="50"
Questi attributi, se usati correttamente, possono migliorare significativamente l'esperienza utente e la robustezza del form, fornendo una prima linea di difesa contro input non validi.
Esempi Pratici di Form HTML
Vediamo ora alcuni esempi pratici per mettere insieme quanto appreso. Costruiremo un form di registrazione utente e un form di contatto semplice.
Esempio 1: Form di Registrazione Utente Completo
Questo esempio include vari tipi di input, raggruppamento con fieldset, etichette e validazione lato client.
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Form di Registrazione</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; background-color: #f4f4f4; }
form { background: white; padding: 20px; border-radius: 8px; max-width: 600px; margin: auto; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
fieldset { border: 1px solid #ddd; padding: 15px; margin-bottom: 20px; border-radius: 5px; }
legend { font-weight: bold; color: #333; padding: 0 10px; }
div { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-weight: bold; color: #555; }
input[type="text"], input[type="email"], input[type="password"], input[type="number"], input[type="date"], select, textarea {
width: calc(100% - 22px); /* Adjust for padding and border */
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
font-size: 16px;
}
input[type="checkbox"], input[type="radio"] { margin-right: 8px; }
button[type="submit"] {
background-color: #007bff;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 18px;
width: 100%;
}
button[type="submit"]:hover { background-color: #0056b3; }
.radio-group label, .checkbox-group label { display: inline-block; margin-right: 15px; font-weight: normal; }
</style>
</head>
<body>
<form action="/api/register" method="post">
<h2>Registrazione Nuovo Utente</h2>
<fieldset>
<legend>Dati Personali</legend>
<div>
<label for="nome">Nome:</label>
<input type="text" id="nome" name="first_name" required placeholder="Mario">
</div>
<div>
<label for="cognome">Cognome:</label>
<input type="text" id="cognome" name="last_name" required placeholder="Rossi">
</div>
<div>
<label for="dataNascita">Data di Nascita:</label>
<input type="date" id="dataNascita" name="dob" required min="1900-01-01" max="2006-01-01">
</div>
</fieldset>
<fieldset>
<legend>Informazioni Account</legend>
<div>
<label for="emailRegistrazione">Email:</label>
<input type="email" id="emailRegistrazione" name="email" required placeholder="tua.email@example.com">
</div>
<div>
<label for="passwordRegistrazione">Password:</label>
<input type="password" id="passwordRegistrazione" name="password" required minlength="8" placeholder="Minimo 8 caratteri">
</div>
<div>
<label for="confermaPassword">Conferma Password:</label>
<input type="password" id="confermaPassword" name="confirm_password" required minlength="8" placeholder="Ripeti la password">
</div>
</fieldset>
<fieldset>
<legend>Preferenze</legend>
<div class="radio-group">
<label>Genere:</label>
<input type="radio" id="uomo" name="gender" value="male">
<label for="uomo">Uomo</label>
<input type="radio" id="donna" name="gender" value="female">
<label for="donna">Donna</label>
<input type="radio" id="altro" name="gender" value="other">
<label for="altro">Altro</label>
</div>
<div>
<label for="newsletter">Desideri ricevere la nostra newsletter?</label>
<input type="checkbox" id="newsletter" name="newsletter" value="yes" checked>
</div>
</fieldset>
<fieldset>
<legend>Termini e Condizioni</legend>
<div>
<input type="checkbox" id="accetto" name="terms" value="accepted" required>
<label for="accetto">Accetto i <a href="#" target="_blank">termini e condizioni</a> e la <a href="#" target="_blank">privacy policy</a>.</label>
</div>
</fieldset>
<button type="submit">Registrati Ora</button>
</form>
</body>
</html>
Esempio 2: Form di Contatto Semplice
Questo form mostra l'uso di textarea e un menu a discesa per la selezione del soggetto.
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Form di Contatto</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; background-color: #f0f8ff; }
form { background: white; padding: 25px; border-radius: 10px; max-width: 500px; margin: auto; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
h2 { text-align: center; color: #2a6496; margin-bottom: 25px; }
div { margin-bottom: 18px; }
label { display: block; margin-bottom: 7px; font-weight: bold; color: #333; }
input[type="text"], input[type="email"], select, textarea {
width: calc(100% - 24px); /* Adjust for padding and border */
padding: 12px;
border: 1px solid #a0c4e2;
border-radius: 5px;
box-sizing: border-box;
font-size: 16px;
transition: border-color 0.3s ease;
}
input[type="text"]:focus, input[type="email"]:focus, select:focus, textarea:focus {
border-color: #007bff;
outline: none;
}
textarea { resize: vertical; min-height: 100px; }
button[type="submit"] {
background-color: #2a6496;
color: white;
padding: 15px 25px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 18px;
width: 100%;
transition: background-color 0.3s ease;
}
button[type="submit"]:hover { background-color: #1a4b6e; }
</style>
</head>
<body>
<form action="/api/contact" method="post">
<h2>Contattaci</h2>
<div>
<label for="nomeContatto">Il tuo Nome:</label>
<input type="text" id="nomeContatto" name="name" required placeholder="Il tuo nome completo">
</div>
<div>
<label for="emailContatto">La tua Email:</label>
<input type="email" id="emailContatto" name="email" required placeholder="tua.email@example.com">
</div>
<div>
<label for="soggetto">Soggetto:</label>
<select id="soggetto" name="subject" required>
<option value="">-- Seleziona un soggetto --</option>
<option value="informazioni_generali">Informazioni Generali</option>
<option value="supporto_tecnico">Supporto Tecnico</option>
<option value="collaborazioni">Collaborazioni</option>
<option value="altro">Altro</option>
</select>
</div>
<div>
<label for="messaggioContatto">Il tuo Messaggio:</label>
<textarea id="messaggioContatto" name="message" rows="6" required placeholder="Scrivi qui il tuo messaggio..."></textarea>
</div>
<button type="submit">Invia Messaggio</button>
</form>
</body>
</html>
Errori Comuni e Best Practice
Anche se i form HTML sembrano semplici, ci sono errori comuni che i principianti (e a volte anche gli esperti) commettono. Evitarli migliorerà notevolmente l'usabilità e la robustezza dei tuoi form.
Errori Comuni:
- Dimenticare l'attributo
name: Senzaname, l'input non verrà inviato al server. Questo è l'errore più frequente e frustrante per i principianti. - Non usare
<label>o usarlo in modo errato: Le etichette sono cruciali per l'accessibilità e l'usabilità. Assicurati che ilfordella<label>corrisponda all'iddell'<input>. - Confondere
GETePOST: UsareGETper dati sensibili o per operazioni che modificano lo stato del server è un grave errore di sicurezza e design. - Non fornire un
valuepercheckboxeradio: Se non specifichi unvalue, il browser invieràoncome valore predefinito, il che potrebbe non essere utile per il backend. - Affidarsi solo alla validazione HTML5: La validazione lato client (con
required,pattern,type="email", ecc.) è un'ottima prima linea di difesa, ma può essere bypassata. È sempre necessario implementare una validazione lato server per garantire la sicurezza e l'integrità dei dati. - Non considerare l'esperienza mobile: Form troppo larghi, pulsanti troppo piccoli o input con tastiere inadatte possono rendere i form inutilizzabili su smartphone.
- Mancanza di feedback all'utente: Non indicare chiaramente quali campi sono obbligatori o quali errori sono stati commessi frustra l'utente.
Best Practice:
- Usa sempre
<label>: Associa ogni input a una<label>usandoforeid. - Scegli il
typedi input corretto: Utilizzatype="email",type="tel",type="date",type="number"e così via per sfruttare le funzionalità e la validazione integrate del browser. - Applica attributi di validazione HTML5: Usa
required,minlength,maxlength,pattern,min,maxper fornire una validazione immediata all'utente. - Raggruppa logicamente gli input: Utilizza
<fieldset>e<legend>per organizzare i form complessi in sezioni coerenti. - Fornisci testo
placeholderutile: Guida l'utente con esempi di input, ma ricorda che non sostituisce la<label>. - Considera l'ordine di tabulazione: Assicurati che l'ordine degli elementi nel DOM (e quindi l'ordine di tabulazione) sia logico per gli utenti che navigano con la tastiera.
- Design responsivo: Assicurati che i tuoi form siano utilizzabili su tutte le dimensioni dello schermo, da desktop a mobile.
- Messaggi di errore chiari: Se la validazione fallisce, fornisci messaggi di errore specifici e facili da capire.
Prossimi Passi: Oltre la Struttura HTML
Questa lezione ti ha fornito una solida base per costruire la struttura dei form HTML. Tuttavia, i form moderni richiedono molto di più della semplice marcatura. Ecco cosa potrai approfondire nelle prossime tappe del tuo percorso di sviluppo web:
- Stilizzazione con CSS: I form HTML di base sono funzionali ma esteticamente poco attraenti. Imparare a stilizzare i form con CSS è essenziale per renderli accattivanti e coerenti con il design del tuo sito. Potrai personalizzare colori, font, dimensioni, layout e aggiungere effetti visivi per migliorare l'esperienza utente.
- Interattività e Validazione Avanzata con JavaScript: HTML5 offre una validazione di base, ma JavaScript ti permetterà di creare esperienze di validazione dinamiche e personalizzate. Potrai mostrare messaggi di errore in tempo reale, abilitare/disabilitare campi in base ad altre selezioni, o implementare logiche di form più complesse (es. un campo che appare solo se viene selezionata una certa opzione).
- Elaborazione Dati Lato Server: Una volta che un form viene inviato, i dati devono essere elaborati da un'applicazione lato server. Questo richiede la conoscenza di un linguaggio di programmazione backend (come PHP, Node.js con Express, Python con Django/Flask, Ruby on Rails) e spesso l'interazione con un database per memorizzare le informazioni. Questo è il passo che rende i tuoi form veramente utili e le tue applicazioni web dinamiche.
- Sicurezza dei Form: La sicurezza è paramount. Imparerai a proteggere i tuoi form da attacchi comuni come XSS (Cross-Site Scripting), CSRF (Cross-Site Request Forgery) e iniezioni SQL, sia lato client che lato server.
- Form API e Framework: Con l'avanzare delle tue competenze, potresti esplorare framework e librerie JavaScript (come React, Vue.js, Angular) o framework backend che semplificano enormemente la gestione e la creazione di form complessi, offrendo componenti riutilizzabili e astrazioni per la validazione e l'invio dei dati.
Continuare a esplorare queste aree ti permetterà di costruire form non solo strutturalmente corretti, ma anche belli, interattivi, sicuri e pienamente funzionali. I form sono un pilastro fondamentale dell'interazione web, e padroneggiarli ti aprirà le porte a infinite possibilità nello sviluppo di applicazioni web.
Congratulazioni per aver completato questa lezione approfondita sulla struttura dei form HTML! Continua a sperimentare e a costruire, la pratica è la chiave per padroneggiare queste competenze.