<section class="rtds-cta-banner rtds-shadow-md rtds-background-03 rtds-cta-banner--bg-icon-right" style="background-image: url(../../images/banner-bg-icon.svg);">
    <div class="rtds-cta-banner__grid rtds-grid rtds-grid-cols-1 lg:rtds-grid-cols-12 lg:rtds-gap-6">
        <div class="rtds-cta-banner__content rtds-p-2 lg:rtds-p-5 lg:rtds-col-span-6 rtds-flex rtds-flex-col">
            <div class="rtds-space-y-2">
                <h2 class="rtds-heading-1">
                    Banner a due colonne
                </h2>

                <div class="rtds-text-sm lg:rtds-text-base">
                    <p>
                        Questa è la descrizione del banner che apparirà nella colonna di sinistra insieme al titolo, mentre i pulsanti CTA saranno posizionati nella colonna di destra.
                    </p>
                </div>

            </div>
        </div>

        <div class="rtds-cta-banner__cta-col rtds-p-2 lg:rtds-p-5 lg:rtds-col-span-6 rtds-flex rtds-flex-col rtds-justify-end rtds-gap-4  lg:rtds-items-end">

            <div class="rtds-cta-banner__cta rtds-grid sm:rtds-flex sm:rtds-flex-wrap rtds-gap-2">

                <a href="#" class="rtds-btn 
    rtds-btn--icon-right rtds-group/button rtds-btn--primary">

                    Azione principale

                    <svg class="rtds-icon rtds-fill-current rtds-w-4 rtds-h-4 md:rtds-w-5 md:rtds-h-5 lg:rtds-w-6 lg:rtds-h-6 group-hover/button:rtds-translate-x-1" aria-hidden="true" focusable="false" role="img">
                        <use href="../../icons.svg#mini--arrow-right" />
                    </svg>

                </a>

            </div>

        </div>

    </div>
</section>
<section class="rtds-cta-banner{% if hasShadow %} rtds-shadow-md{% endif %}{% if classes %} {{ classes }}{% endif %}{% if imgBg %} rtds-cta-banner--img-bg{% endif %}{% if hasMaxWidth %} rtds-cta-banner--max-width{% endif %}"{% if not iconPath and imgPath %} style="background-image: url({{ imgPath | path }});"{% endif %}>
    <div class="rtds-cta-banner__grid rtds-grid rtds-grid-cols-1 lg:rtds-grid-cols-12 lg:rtds-gap-6">
        <div class="rtds-cta-banner__content rtds-p-2 lg:rtds-p-5 lg:rtds-col-span-6 rtds-flex rtds-flex-col">
            <div class="rtds-space-y-2">
                <h2 class="rtds-heading-1">
                    {{ title }}
                </h2>
                {% if description and layout != '2-col-stacked' %}
                    <div class="rtds-text-sm lg:rtds-text-base">
                        <p>
                            {{ description }}
                        </p>
                    </div>
                {% endif %}
            </div>
        </div>

        <div class="rtds-cta-banner__cta-col rtds-p-2 lg:rtds-p-5 lg:rtds-col-span-6 rtds-flex rtds-flex-col rtds-justify-end rtds-gap-4 {% if layout != '2-col-stacked' %} lg:rtds-items-end{% endif %}">
            {% if description and layout == '2-col-stacked' %}
                <div class="rtds-text-sm lg:rtds-text-base">
                    <p>
                        {{ description }}
                    </p>
                </div>
            {% endif %}
            
            {% if cta %}
                <div class="rtds-cta-banner__cta rtds-grid sm:rtds-flex sm:rtds-flex-wrap rtds-gap-2">
                    {% for ctaItem in cta %}
                        {% render '@button' ~ ctaItem.variant, ctaItem.context , true %}
                    {% endfor %}
                </div>
            {% endif %}
        </div>

        {% if iconPath %}
            <div class="rtds-cta-banner__icon rtds-flex rtds-justify-center rtds-items-end rtds-p-4">
                <img src="{{ iconPath | path }}" alt="" aria-hidden="true">
            </div>
        {% endif %}

        {% block rightContent %}
        {% endblock %}

    </div>
</section>
{
  "title": "Banner a due colonne",
  "imgPath": "/images/banner-bg-icon.svg",
  "ctaLabel": "Scopri di più<span class=\"rtds-sr-only\"> su ** TITOLO BANNER **</span>",
  "contentWidth": "rtds-col-span-12",
  "cta": [
    {
      "variant": "--icon-right",
      "context": {
        "classes": "rtds-btn--primary",
        "href": "#",
        "label": "Azione principale",
        "icon": "mini--arrow-right"
      }
    }
  ],
  "description": "Questa è la descrizione del banner che apparirà nella colonna di sinistra insieme al titolo, mentre i pulsanti CTA saranno posizionati nella colonna di destra.",
  "hasShadow": true,
  "classes": "rtds-background-03 rtds-cta-banner--bg-icon-right"
}
  • Content:
    .rtds-cta-banner {
        min-height: var(--spacing-36);
        border-radius: 0.75rem;
        display: grid;
    }
    body.rtds-cta-banner--img-bg .rtds-primary-navigation__backdrop,
        :root.rtds-cta-banner--img-bg .rtds-primary-navigation__backdrop {
        position: fixed;
        right: var(--spacing-0);
        bottom: var(--spacing-0);
        left: var(--spacing-0);
        z-index: 10;
    }
    @media (min-width: 1024px) {
        body.rtds-cta-banner--img-bg .rtds-primary-navigation__backdrop,
        :root.rtds-cta-banner--img-bg .rtds-primary-navigation__backdrop {
            display: none;
        }
    }
    body.rtds-cta-banner--img-bg .rtds-primary-navigation__backdrop,
        :root.rtds-cta-banner--img-bg .rtds-primary-navigation__backdrop {
        position: fixed;
        right: var(--spacing-0);
        bottom: var(--spacing-0);
        left: var(--spacing-0);
        z-index: 10;
    }
    @media (min-width: 1024px) {
        body.rtds-cta-banner--img-bg .rtds-primary-navigation__backdrop,
        :root.rtds-cta-banner--img-bg .rtds-primary-navigation__backdrop {
            display: none;
        }
    }
    .rtds-cta-banner--img-bg {
        position: relative;
        background-size: cover;
        background-position: center;
        overflow: hidden;
    }
    :where(.rtds-cta-banner--img-bg) .rtds-cta-banner__content {
        position: relative;
        --tw-text-opacity: 1;
        color: rgb(255 255 255 / var(--tw-text-opacity, 1));
    }
    /* manage overlay */
    .rtds-cta-banner--img-bg::before {
        position: absolute;
        top: var(--spacing-0);
        left: var(--spacing-0);
        height: 100%;
        width: 100%;
        --tw-bg-opacity: 1;
        background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));
        opacity: 0.5;
        --tw-content: '';
        content: var(--tw-content);
    }
    /* ICON BG RIGHT */
    .rtds-cta-banner--bg-icon-right {
        background-position: right center;
        background-repeat: no-repeat;
    }
    .rtds-cta-banner--bg-sviluppo-toscana {
            background-size: 5em; 
            background-position: right bottom 3em;
            background-repeat: no-repeat;
        }
    .rtds-cta-banner--max-width {
            max-width: 500px; /* o il valore che preferisci */
        }
    /* Opzionale: arrotonda gli angoli quando c'è il max-width */
    .rtds-cta-banner--max-width {
            border-radius: 8px; /* o il valore del tuo design system */
            overflow: hidden; /* per mantenere il background-image dentro i bordi arrotondati */
        }
    /* ========================================
       VARIANTE 2-COL-TEST
       ======================================== */
    body.rtds-cta-banner--2-col-test .rtds-primary-navigation__backdrop,
        :root.rtds-cta-banner--2-col-test .rtds-primary-navigation__backdrop {
        position: fixed;
        right: var(--spacing-0);
        bottom: var(--spacing-0);
        left: var(--spacing-0);
        z-index: 10;
    }
    @media (min-width: 1024px) {
        body.rtds-cta-banner--2-col-test .rtds-primary-navigation__backdrop,
        :root.rtds-cta-banner--2-col-test .rtds-primary-navigation__backdrop {
            display: none;
        }
    }
    body.rtds-cta-banner--2-col-test .rtds-primary-navigation__backdrop,
        :root.rtds-cta-banner--2-col-test .rtds-primary-navigation__backdrop {
        position: fixed;
        right: var(--spacing-0);
        bottom: var(--spacing-0);
        left: var(--spacing-0);
        z-index: 10;
    }
    @media (min-width: 1024px) {
        body.rtds-cta-banner--2-col-test .rtds-primary-navigation__backdrop,
        :root.rtds-cta-banner--2-col-test .rtds-primary-navigation__backdrop {
            display: none;
        }
    }
    .rtds-cta-banner--2-col-test {
        border-radius: 1rem;
        overflow: hidden;
        background-position: center bottom;
        background-size: auto 40%; /* o la dimensione che preferisci */
        padding-bottom: 12rem; /* spazio per l'icona */
    }
    /* Desktop: icona torna a destra */
    @media (min-width: 1024px) {
        .rtds-cta-banner--2-col-test {
            background-position: right center;
            background-size: auto 80%;
            padding-bottom: 0;
        }
    }
    
  • URL: /components/raw/cta-banner/cta-banner.built.css
  • Filesystem Path: components/04-organisms/cta-banner/cta-banner.built.css
  • Size: 3.8 KB
  • Content:
    @layer components {
        .rtds-cta-banner {
            @apply rtds-grid rtds-rounded-xl rtds-min-h-36;
        }
    
        .rtds-cta-banner--img-bg {
            @apply rtds-bg-cover rtds-bg-center rtds-relative rtds-overflow-hidden;
        }
    
        :where(.rtds-cta-banner--img-bg) .rtds-cta-banner__content {
            @apply rtds-relative rtds-text-white;
        }
    
        /* manage overlay */
    
        .rtds-cta-banner--img-bg {
            @apply before:rtds-content-[''] before:rtds-absolute before:rtds-top-0 before:rtds-left-0 before:rtds-w-full before:rtds-h-full before:rtds-bg-black before:rtds-opacity-50;
        }
    
        /* ICON BG RIGHT */
    
        .rtds-cta-banner--bg-icon-right {
            @apply rtds-bg-no-repeat rtds-bg-[position:right_center];
        }
    
        .rtds-cta-banner--bg-sviluppo-toscana {
            background-size: 5em; 
            background-position: right bottom 3em;
            background-repeat: no-repeat;
        }
    
        .rtds-cta-banner--max-width {
            max-width: 500px; /* o il valore che preferisci */
        }
        
        /* Opzionale: arrotonda gli angoli quando c'è il max-width */
        .rtds-cta-banner--max-width {
            border-radius: 8px; /* o il valore del tuo design system */
            overflow: hidden; /* per mantenere il background-image dentro i bordi arrotondati */
        }
    
        /* ========================================
       VARIANTE 2-COL-TEST
       ======================================== */
    
    .rtds-cta-banner--2-col-test {
        @apply rtds-rounded-2xl rtds-overflow-hidden;
        background-position: center bottom;
        background-size: auto 40%; /* o la dimensione che preferisci */
        padding-bottom: 12rem; /* spazio per l'icona */
    }
    
    /* Desktop: icona torna a destra */
    @screen lg {
        .rtds-cta-banner--2-col-test {
            background-position: right center;
            background-size: auto 80%;
            padding-bottom: 0;
        }
    }
    
    }
  • URL: /components/raw/cta-banner/cta-banner.css
  • Filesystem Path: components/04-organisms/cta-banner/cta-banner.css
  • Size: 1.8 KB

CTA Banner

Componente per la creazione di banner con call-to-action. Supporta layout a colonna singola con immagine di sfondo e layout a due colonne con contenuto e CTA separati.


Comportamento

Il componente viene renderizzato come <section class="rtds-cta-banner">.

Esistono due template principali:

  • cta-banner.njk — layout a colonna singola: contenuto e CTA nella stessa colonna, immagine opzionale come sfondo CSS
  • cta-banner--2-col.njk — layout a due colonne: titolo nella colonna sinistra, CTA (e descrizione opzionale) nella colonna destra; usato anche dalla variante 2-col-stacked

Il parametro hasMaxWidth aggiunge la classe .rtds-cta-banner--max-width per limitare la larghezza massima del banner.


Varianti

Varianti di layout

  • default: Layout a colonna singola con immagine di sfondo CSS e ombra (imgBg: true, hasShadow: true)
  • 2-col: Layout a due colonne — titolo a sinistra, CTA a destra; sfondo colorato con icona decorativa (rtds-cta-banner--bg-icon-right)
  • 2-col-test: Layout a due colonne con immagine in basso su mobile e a destra su desktop (rtds-cta-banner--2-col-test); adatta per immagini non ritagliabili
  • 2-col-stacked: Variante del layout a due colonne — titolo a sinistra, descrizione + CTA impilati nella colonna destra; attivato tramite layout: '2-col-stacked' nel context di cta-banner--2-col.njk
  • has-icon-right: Layout a colonna singola con sfondo colorato e icona decorativa a destra; due pulsanti CTA
  • has-icon-right-v2: Variante di has-icon-right con immagine custom in basso a destra; CTA allineata a destra tramite ctaClasses: 'rtds-justify-end'
  • has-icon-right-v2-max-width: Identica a has-icon-right-v2 con aggiunta di hasMaxWidth: true — limita la larghezza del banner a 500px

Parametri di configurazione

Contesto di sviluppo Fractal/Nunjucks — Questa sezione riguarda esclusivamente i parametri del context .config.yml usati durante lo sviluppo nella libreria.

Parametri Base

  • title (stringa, obbligatorio): Titolo del banner, renderizzato come <h2>
  • description (stringa, opzionale): Testo descrittivo sotto il titolo; nel layout 2-col-stacked appare nella colonna destra
  • imgPath (stringa, opzionale): Percorso dell’immagine; usata come sfondo CSS inline (style="background-image: url(...)") nel layout base; nel layout 2-col usata come sfondo CSS se non è presente iconPath
  • imgBg (booleano, opzionale): Se true, aggiunge .rtds-cta-banner--img-bg — attiva overlay scuro e testo bianco per garantire il contrasto sull’immagine di sfondo
  • hasShadow (booleano, opzionale): Se true, aggiunge rtds-shadow-md al banner
  • hasMaxWidth (booleano, opzionale): Se true, aggiunge .rtds-cta-banner--max-width — limita la larghezza massima a 500px; utile per banner in contesti a larghezza ridotta
  • classes (stringa, opzionale): Classi CSS aggiuntive sull’elemento <section> radice (es. rtds-background-03 rtds-cta-banner--bg-icon-right)
  • contentWidth (stringa, opzionale): Classi Tailwind per la larghezza della colonna di contenuto nella griglia a 12 colonne (es. rtds-col-span-6 lg:rtds-col-span-7, rtds-col-span-12)
  • ctaClasses (stringa, opzionale): Classi CSS aggiuntive sul contenitore .rtds-cta-banner__cta (es. rtds-justify-end)
  • layout (stringa, opzionale): Valore '2-col-stacked' nel template cta-banner--2-col.njk — sposta la descrizione nella colonna destra sopra le CTA

Parametri CTA

  • cta (array, opzionale): Elenco dei pulsanti CTA; ogni elemento accetta:
    • variant (stringa): Variante del componente @button (es. '--icon-right', '--icon-right-s', '--icon')
    • context (oggetto): Contesto passato al componente @button:
      • classes (stringa): Classi CSS del pulsante (es. rtds-btn--primary, rtds-btn--inverted)
      • href (stringa): URL di destinazione
      • label (stringa): Testo del pulsante; può contenere HTML (es. <span class="rtds-sr-only">)
      • icon (stringa, opzionale): ID icona dallo sprite SVG (es. mini--arrow-right)
      • iconTransformType (stringa, opzionale): Tipo di animazione icona (scale, translate)
      • srOnlyLabel (stringa, opzionale): Testo aggiuntivo per screen reader da aggiungere al label (es. ' su {nome servizio}')

Parametro solo per cta-banner--2-col.njk

  • iconPath (stringa, opzionale): Percorso di un’immagine decorativa renderizzata come <img aria-hidden="true"> in una colonna separata; se presente, imgPath non viene usato come sfondo CSS

Accessibilità

WCAG 2.1

Livello AA — criteri pertinenti:

  • 1.3.1 Informazioni e correlazioni — struttura semantica con <section> e <h2> come intestazione
  • 2.4.4 Scopo del collegamento (nel contesto) — i CTA devono avere testo descrittivo; usare srOnlyLabel o <span class="rtds-sr-only"> se il label è generico (es. “Scopri di più”)
  • 1.1.1 Contenuti non testuali — l’immagine decorativa nel layout 2-col usa aria-hidden="true"; le immagini di sfondo CSS non richiedono testo alternativo

Struttura e semantica

  • <section class="rtds-cta-banner"> — regione semantica; identifica il banner come area distinta della pagina; senza aria-label o aria-labelledby non è un landmark navigabile dagli screen reader
  • <h2> — intestazione del banner; rispetta la gerarchia degli heading nella pagina; nel layout base usa classe tipografica rtds-heading-4, nel layout 2-col usa rtds-heading-1
  • <img aria-hidden="true"> (solo layout 2-col con iconPath) — immagine puramente decorativa; nascosta agli screen reader

Screen reader

  • I pulsanti CTA devono avere label descrittive della destinazione; se il testo visivo è generico (es. “Scopri di più”), aggiungere testo nascosto tramite <span class="rtds-sr-only"> nel label del context
  • L’immagine di sfondo è impostata via CSS inline e non ha testo alternativo — le informazioni trasmesse dall’immagine devono essere disponibili nel testo visibile

Stili CSS

Classi Base

  • .rtds-cta-banner: Stile base del banner; grid, rounded-xl, altezza minima rtds-min-h-36

Classi Modificatori

  • .rtds-cta-banner--img-bg: Attiva l’immagine di sfondo (bg-cover, bg-center); aggiunge overlay scuro semitrasparente (before:) per garantire il contrasto del testo
  • .rtds-cta-banner--bg-icon-right: Posiziona l’immagine di sfondo a destra al centro (bg-no-repeat, bg-[position:right_center])
  • .rtds-cta-banner--bg-sviluppo-toscana: Immagine di sfondo piccola (5em) in basso a destra, background-repeat: no-repeat
  • .rtds-cta-banner--max-width: Limita la larghezza massima a 500px; aggiunge border-radius: 8px e overflow: hidden
  • .rtds-cta-banner--2-col-test: Immagine di sfondo centrata in basso su mobile con padding-bottom: 12rem; su lg torna a destra con dimensione automatica (80% altezza)

Classi Elementi (BEM)

  • .rtds-cta-banner__content: Colonna con titolo, descrizione e CTA (layout base); grid, p-5, gap-4 md:gap-6
  • .rtds-cta-banner__cta: Contenitore dei pulsanti CTA; grid sm:flex sm:flex-wrap gap-2
  • .rtds-cta-banner__grid: Griglia interna del layout 2-col; grid grid-cols-1 lg:grid-cols-12 lg:gap-6
  • .rtds-cta-banner__cta-col: Colonna destra nel layout 2-col; flex flex-col justify-end
  • .rtds-cta-banner__icon: Contenitore immagine decorativa nel layout 2-col (con iconPath); flex justify-center items-end p-4

Esempi di utilizzo

<!-- Banner base con immagine di sfondo -->
<section class="rtds-cta-banner rtds-cta-banner--img-bg rtds-shadow-md"
         style="background-image: url('/images/feathers.jpg');">
    <div class="rtds-grid rtds-grid-cols-1 lg:rtds-grid-cols-12">
        <div class="rtds-cta-banner__content rtds-grid rtds-p-5 rtds-gap-4 rtds-col-span-6 lg:rtds-col-span-7">
            <div class="rtds-space-y-2 rtds-pr-16">
                <h2 class="rtds-heading-4">Titolo del banner</h2>
            </div>
            <div class="rtds-cta-banner__cta rtds-mt-auto rtds-grid sm:rtds-flex rtds-gap-2">
                <a href="#" class="rtds-btn rtds-btn--s rtds-btn--inverted">
                    Scopri di più<span class="rtds-sr-only"> su Titolo Banner</span>
                </a>
            </div>
        </div>
    </div>
</section>

<!-- Banner a due colonne con sfondo colorato -->
<section class="rtds-cta-banner rtds-shadow-md rtds-background-03 rtds-cta-banner--bg-icon-right"
         style="background-image: url('/images/banner-bg-icon.svg');">
    <div class="rtds-cta-banner__grid rtds-grid rtds-grid-cols-1 lg:rtds-grid-cols-12 lg:rtds-gap-6">
        <div class="rtds-cta-banner__content rtds-p-2 lg:rtds-p-5 lg:rtds-col-span-6 rtds-flex rtds-flex-col">
            <h2 class="rtds-heading-1">Banner a due colonne</h2>
        </div>
        <div class="rtds-cta-banner__cta-col rtds-p-2 lg:rtds-p-5 lg:rtds-col-span-6 rtds-flex rtds-flex-col rtds-justify-end rtds-gap-4 lg:rtds-items-end">
            <div class="rtds-cta-banner__cta rtds-grid sm:rtds-flex rtds-gap-2">
                <a href="#" class="rtds-btn rtds-btn--primary">Azione principale</a>
            </div>
        </div>
    </div>
</section>

<!-- Banner con larghezza massima (has-icon-right-v2-max-width) -->
<section class="rtds-cta-banner rtds-background-03 rtds-cta-banner--bg-icon-right rtds-cta-banner--bg-sviluppo-toscana rtds-cta-banner--max-width">
    <!-- contenuto -->
</section>

Note

  • Le varianti 2-col, 2-col-test e 2-col-stacked usano il template cta-banner--2-col.njk, non cta-banner.njk
  • La variante 2-col-stacked estende cta-banner--2-col.njk tramite {% extends "@cta-banner--2-col" %} e usa il parametro layout: '2-col-stacked' per spostare la descrizione nella colonna destra
  • Il parametro ctaLabel presente nel context globale è un segnaposto legacy — il testo dei pulsanti va configurato tramite cta[].context.label
  • Il blocco rightContent nel template base è vuoto e disponibile per override tramite Nunjucks in implementazioni custom