<div class="rtds-accordion rtds-accordion--widget">

    <div class="rtds-accordion__item">
        <h3 class="rtds-accordion__title rtds-flex rtds-font-bold rtds-text-base rtds-background-03">
            <button type="button" aria-expanded="false" class="rtds-accordion__trigger rtds-group rtds-flex rtds-items-center rtds-flex-1 rtds-transition-all" aria-controls="accordionSection-1" id="accordion1id">
                <span class="rtds-accordion__trigger-label">
                    Titolo panel
                </span>

                <span class="rtds-accordion__icon rtds-flex rtds-p-2 rtds-ml-auto rtds-h-auto rtds-transition-all">
                    <svg class="rtds-icon rtds-fill-current rtds-w-6 rtds-h-6 rtds-transition-all is-expand-arrow group-aria-expanded:rtds-rotate-180" aria-hidden="true" focusable="false" role="img">
                        <use href="../../icons.svg#mini--chevron-up" />
                    </svg>

                </span>

            </button>
        </h3>
        <div id="accordionSection-1" role="region" aria-labelledby="accordion1id" class="rtds-accordion__pane rtds-transition-all" hidden>

            Content

        </div>
    </div>

    <div class="rtds-accordion__item">
        <h3 class="rtds-accordion__title rtds-flex rtds-font-bold rtds-text-base rtds-background-03">
            <button type="button" aria-expanded="false" class="rtds-accordion__trigger rtds-group rtds-flex rtds-items-center rtds-flex-1 rtds-transition-all" aria-controls="accordionSection-2" id="accordion2id">
                <span class="rtds-accordion__trigger-label">
                    Titolo panel
                </span>

                <span class="rtds-accordion__icon rtds-flex rtds-p-2 rtds-ml-auto rtds-h-auto rtds-transition-all">
                    <svg class="rtds-icon rtds-fill-current rtds-w-6 rtds-h-6 rtds-transition-all is-expand-arrow group-aria-expanded:rtds-rotate-180" aria-hidden="true" focusable="false" role="img">
                        <use href="../../icons.svg#mini--chevron-up" />
                    </svg>

                </span>

            </button>
        </h3>
        <div id="accordionSection-2" role="region" aria-labelledby="accordion2id" class="rtds-accordion__pane rtds-transition-all" hidden>

            Content

        </div>
    </div>

    <div class="rtds-accordion__item">
        <h3 class="rtds-accordion__title rtds-flex rtds-font-bold rtds-text-base rtds-background-03">
            <button type="button" aria-expanded="false" class="rtds-accordion__trigger rtds-group rtds-flex rtds-items-center rtds-flex-1 rtds-transition-all" aria-controls="accordionSection-3" id="accordion3id">
                <span class="rtds-accordion__trigger-label">
                    Titolo panel
                </span>

                <span class="rtds-accordion__icon rtds-flex rtds-p-2 rtds-ml-auto rtds-h-auto rtds-transition-all">
                    <svg class="rtds-icon rtds-fill-current rtds-w-6 rtds-h-6 rtds-transition-all is-expand-arrow group-aria-expanded:rtds-rotate-180" aria-hidden="true" focusable="false" role="img">
                        <use href="../../icons.svg#mini--chevron-up" />
                    </svg>

                </span>

            </button>
        </h3>
        <div id="accordionSection-3" role="region" aria-labelledby="accordion3id" class="rtds-accordion__pane rtds-transition-all" hidden>

            Content

        </div>
    </div>

</div>
{% extends '@accordion' %}
{% block icon %}
    <span class="rtds-accordion__icon rtds-flex rtds-p-2 rtds-ml-auto rtds-h-auto rtds-transition-all{% if iconClasses %} {{ iconClasses }} {% endif %}">
        {% render '@icon', {id: showMoreIcon, size: iconSize, classes: 'rtds-transition-all is-expand-arrow group-aria-expanded:rtds-rotate-180'}, true %}
    </span>
{% endblock icon %}
{
  "showMoreIcon": "mini--chevron-up",
  "showLessIcon": "mini--minus",
  "iconSize": "rtds-w-6 rtds-h-6",
  "panelTitleFont": "rtds-text-base",
  "panels": [
    {
      "label": "Titolo panel",
      "text": "Content"
    },
    {
      "label": "Titolo panel",
      "text": "Content"
    },
    {
      "label": "Titolo panel",
      "text": "Content"
    }
  ],
  "classes": "rtds-accordion--widget",
  "panelTitleClasses": "rtds-background-03"
}
  • Content:
    /**
     * ACCORDION
     *
    */
    @layer components {
        .rtds-accordion {
            @apply rtds-grid rtds-gap-4;
        }
    
        .rtds-accordion--minimal {
            @apply rtds-gap-0;
        }
    
        .rtds-accordion__item {
            @apply rtds-space-y-4;
        }
    
        /*.rtds-accordion--default, .rtds-accordion--minimal {
        }*/
    
        :where(.rtds-accordion--default) .rtds-accordion__item,
        :where(.rtds-accordion--minimal) .rtds-accordion__item {
            @apply rtds-p-4 rtds-bg-white;
        }
    
        :where(.rtds-accordion--default) .rtds-accordion__item {
            @apply rtds-rounded rtds-shadow-md;
        }
    
        :where(.rtds-accordion--widget) .rtds-accordion__title {
            @apply rtds-p-2;
        }
    
        :where(.rtds-accordion--widget) .rtds-accordion__pane {
            @apply rtds-px-2;
        }
    
        :where(.rtds-accordion--minimal) .rtds-accordion__item {
            @apply rtds-border-b rtds-border-gray-01;
        }
    }
  • URL: /components/raw/accordion/accordion.css
  • Filesystem Path: components/03-molecules/accordion/accordion.css
  • Size: 891 Bytes
  • Content:
    /*
     *   This content is licensed according to the W3C Software License at
     *   https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
     *
     *   Simple accordion pattern example
     */
    
    'use strict';
    
    class Accordion {
      constructor(domNode) {
        this.rootEl = domNode;
        this.buttonEl = this.rootEl.querySelector('button[aria-expanded]');
    
        const controlsId = this.buttonEl.getAttribute('aria-controls');
        this.contentEl = document.getElementById(controlsId);
    
        this.open = this.buttonEl.getAttribute('aria-expanded') === 'true';
    
        // Aggiungiamo una reference al container principale dell'accordion
        this.accordionContainer = this.rootEl.closest('.rtds-accordion');
    
        // add event listeners
        this.buttonEl.addEventListener('click', this.onButtonClick.bind(this));
      }
    
      onButtonClick() {
        // Se l'accordion ha la classe toggle, chiudiamo gli altri pannelli
        if (this.accordionContainer.classList.contains('rtds-accordion--toggle')) {
          // Troviamo tutti i pannelli aperti nello stesso accordion
          const openButtons = this.accordionContainer.querySelectorAll('button[aria-expanded="true"]');
          openButtons.forEach(button => {
            if (button !== this.buttonEl) {
              // Troviamo l'istanza dell'accordion per questo button e la chiudiamo
              const accordionTitle = button.closest('.rtds-accordion__title');
              const accordionInstance = accordions.get(accordionTitle);
              if (accordionInstance) {
                accordionInstance.close();
              }
            }
          });
        }
        
        this.toggle(!this.open);
      }
    
      toggle(open) {
        // don't do anything if the open state doesn't change
        if (open === this.open) {
          return;
        }
    
        // update the internal state
        this.open = open;
    
        // handle DOM updates
        this.buttonEl.setAttribute('aria-expanded', `${open}`);
        if (open) {
          this.contentEl.removeAttribute('hidden');
        } else {
          this.contentEl.setAttribute('hidden', '');
        }
      }
    
      // Add public open and close methods for convenience
      open() {
        this.toggle(true);
      }
    
      close() {
        this.toggle(false);
      }
    }
    
    // Modifichiamo l'inizializzazione per mantenere un riferimento alle istanze
    const accordions = new Map();
    document.querySelectorAll('.rtds-accordion__title').forEach((accordionEl) => {
      accordions.set(accordionEl, new Accordion(accordionEl));
    });
    
  • URL: /components/raw/accordion/accordion.js
  • Filesystem Path: components/03-molecules/accordion/accordion.js
  • Size: 2.4 KB

Accordion

Componente per pannelli espandibili basato sulle linee guida WAI Authoring Practices Guide.

Comportamento

Il componente implementa un accordion accessibile che:

  • Supporta pannelli indipendenti o collegati
  • Gestisce correttamente gli stati ARIA
  • Supporta la navigazione da tastiera
  • Include animazioni di transizione
  • È completamente personalizzabile

Varianti

Varianti di Stile

  • default: Accordion con sfondo bianco, bordi arrotondati e ombra
  • minimal: Accordion con bordo inferiore
  • rounded: Accordion con icone circolari e ombreggiatura
  • widget: Accordion compatto per widget

Varianti di Comportamento

  • default: Pannelli indipendenti (ogni pannello si apre/chiude indipendentemente)
  • toggle: Un solo pannello aperto alla volta (l’apertura di un pannello chiude gli altri)

Parametri di Configurazione

Parametri Base

  • idSection (numero, opzionale): ID numerico per sezioni multiple
  • classes (stringa, opzionale): Classi CSS aggiuntive
  • spacingClasses (stringa, opzionale): Classi per lo spaziamento generale
  • titleSpacingClasses (stringa, opzionale): Classi per lo spaziamento dei titoli

Parametri per Pannelli

  • panels (array, obbligatorio): Lista dei pannelli
    • label (stringa, obbligatorio): Testo del titolo
    • text (stringa, obbligatorio): Contenuto del pannello
    • isOpen (booleano, opzionale): Stato iniziale del pannello

Parametri per Icone

  • showMoreIcon (stringa, opzionale): ID dell’icona per “mostra più”
  • showLessIcon (stringa, opzionale): ID dell’icona per “mostra meno”
  • iconSize (stringa, opzionale): Classi per la dimensione delle icone
  • iconClasses (stringa, opzionale): Classi aggiuntive per le icone

Parametri per Stili

  • panelTitleClasses (stringa, opzionale): Classi per i titoli dei pannelli
  • panelTitleFont (stringa, opzionale): Classi per il font dei titoli
  • triggerClasses (stringa, opzionale): Classi per i pulsanti trigger
  • panelContentClasses (stringa, opzionale): Classi per il contenuto dei pannelli
  • panelContentSpacing (stringa, opzionale): Classi per lo spaziamento del contenuto

Stili CSS

Classi Base

  • .rtds-accordion:
    • Layout: grid
    • Gap: gap-6

Classi per Varianti

  • .rtds-accordion--default:
    • Sfondo: bg-white
    • Bordi: rounded
    • Ombra: shadow-md
  • .rtds-accordion--minimal:
    • Bordo: border-b, border-gray-01

Classi per Elementi

  • .rtds-accordion__title:
    • Layout: flex
    • Font: font-bold
  • .rtds-accordion__trigger:
    • Layout: group, flex, items-center, flex-1
    • Transizione: transition-all
  • .rtds-accordion__icon:
    • Layout: flex, p-2, ml-auto
    • Transizione: transition-all
  • .rtds-accordion__pane:
    • Transizione: transition-all

Esempio di Utilizzo

```html