<div class="rtds-alert rtds-alert--info" 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--information-circle" />
        </svg>

    </div>
    <div class="rtds-alert__content">

        <h2 class="rtds-alert__heading">Titolo avviso informativo</h2>

        <p class="rtds-alert__body">Descrizione del messaggio con contenuto esteso.</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": "info",
  "heading": "Titolo avviso informativo",
  "body": "Descrizione del messaggio con contenuto esteso."
}
  • Content:
    .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);
        }
    
  • URL: /components/raw/alert/alert.built.css
  • Filesystem Path: components/08-servizi/alert/alert.built.css
  • Size: 2.7 KB
  • Content:
    @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);
        }
    }
    
  • URL: /components/raw/alert/alert.css
  • Filesystem Path: components/08-servizi/alert/alert.css
  • Size: 2.8 KB

Alert

Componente di notifica inline per comunicare stati informativi, di successo, attenzione ed errore. Display-only — nessun JavaScript integrato.


Comportamento

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 reader
  • role="alert" per type: warning e type: error — annuncio assertive allo screen reader

Il parametro role consente di sovrascrivere il valore auto-derivato quando necessario.


Varianti

Varianti di Tipo

  • info: Messaggio informativo neutro
  • success: Conferma operazione completata con successo
  • warning: Avviso che richiede attenzione dell’utente
  • error: Errore che impedisce o ha impedito un’operazione

Varianti di Struttura

  • with-heading: Heading testuale sopra il corpo del messaggio
  • dismissible: Pulsante di chiusura in alto a destra
  • with-link: Link all’interno del corpo del messaggio
  • custom-icon: Icona SVG personalizzata al posto di quella default del tipo

Parametri di configurazione

Parametro Tipo Obbligatorio Default Descrizione
type stringa 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

Accessibilità

WCAG 2.2

Livello AA — criteri pertinenti:

  • 1.4.1 Uso del colore — l’icona garantisce la distinzione tipologica oltre al colore
  • 1.4.3 Contrasto minimo — testo su sfondo con contrasto ≥ 4.5:1
  • 4.1.3 Messaggi di stato — role="status" e role="alert" comunicano i messaggi dinamici agli screen reader

Struttura e semantica

  • <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

Attributi ARIA

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

Screen reader

  • Il role garantisce l’annuncio del contenuto agli screen reader quando l’elemento viene inserito nel DOM
  • aria-hidden="true" sull’icona — l’icona è decorativa; il nome accessibile è garantito da heading o body
  • Il pulsante di chiusura ha label nascosta via rtds-sr-only

Stili CSS

Classi Base

  • .rtds-alert: Stile base — flex, padding var(--spacing-4), bordo 1px su tutti i lati + bordo sinistro spesso, sfondo neutro

Classi Modificatori

  • .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)

Classi Elementi (BEM)

  • .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-8

Tematizzazione

Il componente espone variabili CSS per la personalizzazione dal CMS ospitante tramite il pattern triple fallback.

Override pubblici (Tier 1)

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 semantici DS (Tier 2)

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

Esempi di utilizzo

<!-- 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>

Note

  • Richiede lo sprite SVG (/icons.svg) caricato in pagina
  • role="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.
  • Il dismiss/close è responsabilità del consumer (nessun JavaScript integrato). Il pulsante usa markup inline con 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-8, coerente con il componente Toast.