<section class="rtds-cta-banner rtds-shadow-md rtds-cta-banner--img-bg" 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 md:rtds-gap-6 rtds-col-span-6 lg:rtds-col-span-7">
<div class="rtds-space-y-2 rtds-pr-16 ">
<h2 class="rtds-heading-4">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, aenean id pretium lacus
</h2>
</div>
<div class="rtds-cta-banner__cta rtds-mt-auto 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--s rtds-btn--inverted">
Scopri di più<span class="rtds-sr-only"> su ** TITOLO BANNER **</span>
<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--chevron-right" />
</svg>
</a>
<a href="#" class="rtds-btn
rtds-btn--icon-right rtds-group/button rtds-btn--s rtds-btn--primary">
Altro CTA
<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--chevron-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 imgPath %} style="background-image: url({{ imgPath | path }});"{% endif %}>
<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 md:rtds-gap-6{% if contentWidth %} {{ contentWidth }}{% endif %}">
<div class="rtds-space-y-2 rtds-pr-16 ">
<h2 class="rtds-heading-4">
{{ title }}
</h2>
{% if description %}
<div class="rtds-text-sm lg:rtds-text-base">
<p>
{{ description }}
</p>
</div>
{% endif %}
</div>
{% if cta %}
<div class="rtds-cta-banner__cta {% if ctaClasses %} {{ ctaClasses }} {% endif %} rtds-mt-auto 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>
{% block rightContent %}
{% endblock %}
</div>
</section>
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, aenean id pretium lacus",
"imgPath": "/images/feathers.jpg",
"ctaLabel": "Scopri di più<span class=\"rtds-sr-only\"> su ** TITOLO BANNER **</span>",
"contentWidth": "rtds-col-span-6 lg:rtds-col-span-7",
"cta": [
{
"variant": "--icon-right",
"context": {
"classes": "rtds-btn--s rtds-btn--inverted",
"href": "#",
"label": "Scopri di più<span class=\"rtds-sr-only\"> su ** TITOLO BANNER **</span>"
}
},
{
"variant": "--icon-right",
"context": {
"classes": "rtds-btn--s rtds-btn--primary",
"href": "#",
"label": "Altro CTA"
}
}
],
"imgBg": true,
"hasShadow": true
}
.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;
}
}
@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;
}
}
}
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.
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 CSScta-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-stackedIl parametro hasMaxWidth aggiunge la classe .rtds-cta-banner--max-width per limitare la larghezza massima del banner.
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 ritagliabili2-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.njkhas-icon-right: Layout a colonna singola con sfondo colorato e icona decorativa a destra; due pulsanti CTAhas-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 500pxContesto di sviluppo Fractal/Nunjucks — Questa sezione riguarda esclusivamente i parametri del context
.config.ymlusati durante lo sviluppo nella libreria.
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 destraimgPath (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 iconPathimgBg (booleano, opzionale): Se true, aggiunge .rtds-cta-banner--img-bg — attiva overlay scuro e testo bianco per garantire il contrasto sull’immagine di sfondohasShadow (booleano, opzionale): Se true, aggiunge rtds-shadow-md al bannerhasMaxWidth (booleano, opzionale): Se true, aggiunge .rtds-cta-banner--max-width — limita la larghezza massima a 500px; utile per banner in contesti a larghezza ridottaclasses (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 CTActa (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 destinazionelabel (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}')cta-banner--2-col.njkiconPath (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 CSSLivello AA — criteri pertinenti:
<section> e <h2> come intestazionesrOnlyLabel o <span class="rtds-sr-only"> se il label è generico (es. “Scopri di più”)2-col usa aria-hidden="true"; le immagini di sfondo CSS non richiedono testo alternativo<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<span class="rtds-sr-only"> nel label del context.rtds-cta-banner: Stile base del banner; grid, rounded-xl, altezza minima rtds-min-h-36.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).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<!-- 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>2-col, 2-col-test e 2-col-stacked usano il template cta-banner--2-col.njk, non cta-banner.njk2-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 destractaLabel presente nel context globale è un segnaposto legacy — il testo dei pulsanti va configurato tramite cta[].context.labelrightContent nel template base è vuoto e disponibile per override tramite Nunjucks in implementazioni custom