<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" style="background-image: url(../../images/lampadina.png);">
<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-12">
<div class="rtds-space-y-2 rtds-pr-16 ">
<h2 class="rtds-heading-4">
Accedi al servizio
</h2>
<div class="rtds-text-sm lg:rtds-text-base">
<p>
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse.
</p>
</div>
</div>
<div class="rtds-cta-banner__cta rtds-justify-end rtds-mt-auto rtds-grid sm:rtds-flex sm:rtds-flex-wrap rtds-gap-2">
<a href="#" class="rtds-btn
rtds-btn--icon rtds-btn--primary"><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" aria-hidden="true" focusable="false" role="img">
<use href="../../icons.svg#mini--chevron-right" />
</svg>
<span class="rtds-sr-only">
<span>
</span>
<span class="rtds-sr-only"> su {nome servizio}</span>
</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": "Accedi al servizio",
"imgPath": "/images/lampadina.png",
"ctaLabel": "Scopri di più<span class=\"rtds-sr-only\"> su ** TITOLO BANNER **</span>",
"contentWidth": "rtds-col-span-12",
"cta": [
{
"variant": "--icon",
"context": {
"classes": "rtds-btn--primary",
"href": "#",
"label": "",
"icon": "mini--chevron-right",
"iconTransformType": "translate",
"srOnlyLabel": " su {nome servizio}"
}
}
],
"description": "dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse.",
"classes": "rtds-background-03 rtds-cta-banner--bg-icon-right rtds-cta-banner--bg-sviluppo-toscana",
"hasMaxWidth": true,
"ctaClasses": "rtds-justify-end"
}
.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