<div class="rtds-alert rtds-alert--success" role="status">
<div class="rtds-alert__icon" aria-hidden="true">
<svg class="rtds-icon rtds-fill-current rtds-w-7 rtds-h-7" aria-hidden="true" focusable="false" role="img">
<use href="../../icons.svg#outline--check-circle" />
</svg>
</div>
<div class="rtds-alert__content">
<h2 class="rtds-alert__heading">Operazione completata</h2>
<p class="rtds-alert__body">L'operazione è stata completata con successo. I dati sono stati salvati correttamente.</p>
</div>
</div>
{% if icon %}{% set iconId = icon %}
{% elif type == 'success' %}{% set iconId = 'outline--check-circle' %}
{% elif type == 'warning' %}{% set iconId = 'outline--exclamation-triangle' %}
{% elif type == 'error' %}{% set iconId = 'outline--x-circle' %}
{% else %}{% set iconId = 'outline--information-circle' %}
{% endif %}{% if type == 'warning' or type == 'error' %}{% set autoRole = 'alert' %}{% else %}{% set autoRole = 'status' %}{% endif %}<div class="rtds-alert rtds-alert--{{ type }}{% if classes %} {{ classes }}{% endif %}" role="{{ role or autoRole }}">
<div class="rtds-alert__icon" aria-hidden="true">
{% render '@icon', {id: iconId, size: 'rtds-w-7 rtds-h-7'}, true %}
</div>
<div class="rtds-alert__content">
{% if heading %}
<{{ headingTag | default('h2') }} class="rtds-alert__heading">{{ heading }}</{{ headingTag | default('h2') }}>
{% endif %}
{% if body %}
<p class="rtds-alert__body">{{ body | safe }}</p>
{% endif %}
</div>
{% if dismissible %}
<button type="button" class="rtds-btn rtds-btn--icon rtds-btn--outlined rtds-border-none rtds-content-01 hover:rtds-bg-black focus:rtds-content-03 rtds-w-8 rtds-h-8 rtds-alert__close">
{% render '@icon', {id: 'mini--x-mark', size: 'rtds-w-4 rtds-h-4'}, true %}
<span class="rtds-sr-only">{{ dismissLabel | default('Chiudi avviso') }}</span>
</button>
{% endif %}
</div>
{
"type": "success",
"heading": "Operazione completata",
"body": "L'operazione è stata completata con successo. I dati sono stati salvati correttamente."
}
.rtds-alert {
--_alert-bg: var(--alert-bg, var(--color-background-01, var(--color-neutral-50)));
display: flex;
align-items: flex-start;
gap: var(--spacing-3);
padding: var(--spacing-4);
border-width: 1px;
border-left-width: var(--spacing-1);
border-style: solid;
background-color: var(--_alert-bg);
color: var(--color-content-01, var(--color-neutral-900));
}
.rtds-alert__icon {
flex-shrink: 0;
}
.rtds-alert__content {
flex: 1;
}
.rtds-alert__heading {
display: block;
font-size: inherit;
font-weight: 600;
margin: 0 0 var(--spacing-1);
}
.rtds-alert__body {
margin: 0;
}
.rtds-alert__close {
flex-shrink: 0;
align-self: flex-start;
}
.rtds-alert__body a {
color: var(--color-link-primary, var(--color-primary-500));
text-decoration: underline;
}
.rtds-alert__body a:hover {
color: var(--color-link-primary-hover, var(--color-primary-600));
text-decoration: none;
}
/* Info */
.rtds-alert--info {
--_alert-info-border: var(--alert-info-border, var(--color-content-info, var(--color-info-dark)));
--_alert-info-icon: var(--alert-info-icon, var(--color-content-info, var(--color-info-dark)));
border-color: var(--_alert-info-border);
}
.rtds-alert--info .rtds-alert__icon {
color: var(--_alert-info-icon);
}
/* Success */
.rtds-alert--success {
--_alert-success-border: var(--alert-success-border, var(--color-content-success, var(--color-success-dark)));
--_alert-success-icon: var(--alert-success-icon, var(--color-content-success, var(--color-success-dark)));
border-color: var(--_alert-success-border);
}
.rtds-alert--success .rtds-alert__icon {
color: var(--_alert-success-icon);
}
/* Warning */
.rtds-alert--warning {
--_alert-warning-border: var(--alert-warning-border, var(--color-content-warn, var(--color-warn-dark)));
--_alert-warning-icon: var(--alert-warning-icon, var(--color-content-warn, var(--color-warn-dark)));
border-color: var(--_alert-warning-border);
}
.rtds-alert--warning .rtds-alert__icon {
color: var(--_alert-warning-icon);
}
/* Error */
.rtds-alert--error {
--_alert-error-border: var(--alert-error-border, var(--color-content-error, var(--color-error-dark)));
--_alert-error-icon: var(--alert-error-icon, var(--color-content-error, var(--color-error-dark)));
border-color: var(--_alert-error-border);
}
.rtds-alert--error .rtds-alert__icon {
color: var(--_alert-error-icon);
}
@layer components {
.rtds-alert {
--_alert-bg: var(--alert-bg, var(--color-background-01, var(--color-neutral-50)));
display: flex;
align-items: flex-start;
gap: var(--spacing-3);
padding: var(--spacing-4);
border-width: 1px;
border-left-width: var(--spacing-1);
border-style: solid;
background-color: var(--_alert-bg);
color: var(--color-content-01, var(--color-neutral-900));
}
.rtds-alert__icon {
flex-shrink: 0;
}
.rtds-alert__content {
flex: 1;
}
.rtds-alert__heading {
display: block;
font-size: inherit;
font-weight: 600;
margin: 0 0 var(--spacing-1);
}
.rtds-alert__body {
margin: 0;
}
.rtds-alert__close {
flex-shrink: 0;
align-self: flex-start;
}
.rtds-alert__body a {
color: var(--color-link-primary, var(--color-primary-500));
text-decoration: underline;
}
.rtds-alert__body a:hover {
color: var(--color-link-primary-hover, var(--color-primary-600));
text-decoration: none;
}
/* Info */
.rtds-alert--info {
--_alert-info-border: var(--alert-info-border, var(--color-content-info, var(--color-info-dark)));
--_alert-info-icon: var(--alert-info-icon, var(--color-content-info, var(--color-info-dark)));
border-color: var(--_alert-info-border);
}
.rtds-alert--info .rtds-alert__icon {
color: var(--_alert-info-icon);
}
/* Success */
.rtds-alert--success {
--_alert-success-border: var(--alert-success-border, var(--color-content-success, var(--color-success-dark)));
--_alert-success-icon: var(--alert-success-icon, var(--color-content-success, var(--color-success-dark)));
border-color: var(--_alert-success-border);
}
.rtds-alert--success .rtds-alert__icon {
color: var(--_alert-success-icon);
}
/* Warning */
.rtds-alert--warning {
--_alert-warning-border: var(--alert-warning-border, var(--color-content-warn, var(--color-warn-dark)));
--_alert-warning-icon: var(--alert-warning-icon, var(--color-content-warn, var(--color-warn-dark)));
border-color: var(--_alert-warning-border);
}
.rtds-alert--warning .rtds-alert__icon {
color: var(--_alert-warning-icon);
}
/* Error */
.rtds-alert--error {
--_alert-error-border: var(--alert-error-border, var(--color-content-error, var(--color-error-dark)));
--_alert-error-icon: var(--alert-error-icon, var(--color-content-error, var(--color-error-dark)));
border-color: var(--_alert-error-border);
}
.rtds-alert--error .rtds-alert__icon {
color: var(--_alert-error-icon);
}
}
Componente di notifica inline per comunicare stati informativi, di successo, attenzione ed errore. Display-only — nessun JavaScript integrato.
Il componente viene renderizzato come <div> con role ARIA derivato automaticamente dal tipo:
role="status" per type: info e type: success — annuncio polite allo screen readerrole="alert" per type: warning e type: error — annuncio assertive allo screen readerIl parametro role consente di sovrascrivere il valore auto-derivato quando necessario.
info: Messaggio informativo neutrosuccess: Conferma operazione completata con successowarning: Avviso che richiede attenzione dell’utenteerror: Errore che impedisce o ha impedito un’operazionewith-heading: Heading testuale sopra il corpo del messaggiodismissible: Pulsante di chiusura in alto a destrawith-link: Link all’interno del corpo del messaggiocustom-icon: Icona SVG personalizzata al posto di quella default del tipo| Parametro | Tipo | Obbligatorio | Default | Descrizione |
|---|---|---|---|---|
type |
stringa | sì | — | Tipo semantico: info | success | warning | error |
body |
stringa | no | — | Testo del messaggio; accetta HTML (safe) |
heading |
stringa | no | — | Titolo in grassetto sopra il corpo |
headingTag |
stringa | no | h2 |
Tag HTML del titolo (es. h3, p) |
dismissible |
booleano | no | false |
Mostra il pulsante di chiusura |
dismissLabel |
stringa | no | Chiudi avviso |
Label accessibile del pulsante di chiusura |
icon |
stringa | no | auto | ID dell’icona SVG; sovrascrive l’icona default del tipo |
role |
stringa | no | auto | Sovrascrive il role ARIA auto-derivato |
classes |
stringa | no | — | Classi CSS aggiuntive sul <div> radice |
Livello AA — criteri pertinenti:
role="status" e role="alert" comunicano i messaggi dinamici agli screen reader<div role="status"> — live region polite per info e success; lo screen reader annuncia il contenuto al termine della lettura corrente; da inserire nel DOM solo quando il messaggio è pronto<div role="alert"> — live region assertive per warning e error; lo screen reader interrompe la lettura corrente e annuncia immediatamente il contenuto| Attributo | Valori | Condizione |
|---|---|---|
role |
status | alert |
sempre — derivato da type; status per info/success, alert per warning/error |
aria-hidden |
true |
sull’icona SVG — decorativa, il testo garantisce il nome accessibile |
role garantisce l’annuncio del contenuto agli screen reader quando l’elemento viene inserito nel DOMaria-hidden="true" sull’icona — l’icona è decorativa; il nome accessibile è garantito da heading o bodylabel nascosta via rtds-sr-only.rtds-alert: Stile base — flex, padding var(--spacing-4), bordo 1px su tutti i lati + bordo sinistro spesso, sfondo neutro.rtds-alert--info: Variante informativa — bordo e icona blu (--color-content-info).rtds-alert--success: Variante successo — bordo e icona verde (--color-content-success).rtds-alert--warning: Variante attenzione — bordo e icona arancione (--color-content-warn).rtds-alert--error: Variante errore — bordo e icona rosso (--color-content-error).rtds-alert__icon: Contenitore dell’icona SVG — flex-shrink: 0.rtds-alert__content: Contenitore di heading e body — occupa lo spazio restante.rtds-alert__heading: Titolo opzionale in grassetto.rtds-alert__body: Testo del messaggio; i link al suo interno ricevono stile automatico (--color-link-primary, underline).rtds-alert__close: Pulsante di chiusura — flex-shrink: 0, allineato in alto — classi: rtds-btn rtds-btn--icon rtds-btn--outlined rtds-border-none rtds-content-01 hover:rtds-bg-black focus:rtds-content-03 rtds-w-8 rtds-h-8Il componente espone variabili CSS per la personalizzazione dal CMS ospitante tramite il pattern triple fallback.
| Proprietà CSS | Default DS | Descrizione |
|---|---|---|
--alert-bg |
var(--color-background-01) |
Sfondo — comune a tutti i tipi |
--alert-info-border |
var(--color-content-info) |
Bordo variante info |
--alert-info-icon |
var(--color-content-info) |
Colore icona variante info |
--alert-success-border |
var(--color-content-success) |
Bordo variante success |
--alert-success-icon |
var(--color-content-success) |
Colore icona variante success |
--alert-warning-border |
var(--color-content-warn) |
Bordo variante warning |
--alert-warning-icon |
var(--color-content-warn) |
Colore icona variante warning |
--alert-error-border |
var(--color-content-error) |
Bordo variante error |
--alert-error-icon |
var(--color-content-error) |
Colore icona variante error |
| Token DS | Fallback primitivo | Descrizione |
|---|---|---|
--color-background-01 |
var(--color-neutral-50) |
Sfondo neutro chiaro |
--color-content-info |
#075985 |
Bordo e icona info |
--color-content-success |
#166534 |
Bordo e icona success |
--color-content-warn |
#9a3412 |
Bordo e icona warning |
--color-content-error |
#991b1b |
Bordo e icona error |
<!-- Alert informativo con heading -->
<div class="rtds-alert rtds-alert--info" role="status">
<div class="rtds-alert__icon" aria-hidden="true"><!-- icona SVG --></div>
<div class="rtds-alert__content">
<h2 class="rtds-alert__heading">Informazione</h2>
<p class="rtds-alert__body">Testo del messaggio informativo.</p>
</div>
</div>
<!-- Alert errore -->
<div class="rtds-alert rtds-alert--error" role="alert">
<div class="rtds-alert__icon" aria-hidden="true"><!-- icona SVG --></div>
<div class="rtds-alert__content">
<p class="rtds-alert__body">Si è verificato un errore. Riprova più tardi.</p>
</div>
</div>
<!-- Alert con link nel body -->
<div class="rtds-alert rtds-alert--info" role="status">
<div class="rtds-alert__icon" aria-hidden="true"><!-- icona SVG --></div>
<div class="rtds-alert__content">
<p class="rtds-alert__body">Consulta la <a href="#">documentazione completa</a> per ulteriori informazioni.</p>
</div>
</div>/icons.svg) caricato in paginarole="alert" ha gestione speciale nelle AT: il contenuto viene annunciato sia quando l’elemento è iniettato nel DOM già con contenuto, sia quando il contenuto viene aggiunto in seguito. Per role="status" il pattern raccomandato è: live region vuota nel DOM → aggiungere il contenuto via JS. Evitare display: none su entrambi i ruoli: quando l’elemento non è visibile cessa di far parte dell’albero di accessibilità e la live region perde efficacia.rtds-btn rtds-btn--icon rtds-btn--outlined rtds-border-none rtds-content-01 hover:rtds-bg-black focus:rtds-content-03 rtds-w-8 rtds-h-8, coerente con il componente Toast.