<div class="c-foldable-banner">

    <div class="c-foldable-banner__wrapper" id="foldable-banner">
        <div class="c-foldable-banner__image">
            <img src="../../images/svgs/stk_write_us.svg" alt="" width="60">
        </div>
        <div class="c-foldable-banner__text">
            <p>Per aggiornamenti in tempo reale sul proprio volo e informazioni sui nostri servizi, è disponibile la chat su <a href="#">Whatsapp</a>, al numero <a href="+390516479615"><strong>+39 0516479615</strong></a>, oppure la chat su <a href="">Messenger</a>.</p>
        </div>
        <button class="c-foldable-banner__close-btn js-foldable-banner-close-btn" aria-controls="foldable-banner" aria-expanded="true">
            <svg class="c-icon c-icon--24 u-color-night-100" role="presentation">
                <use xlink:href="#ic_close_black_24px"></use>
            </svg> </button>
    </div>

    <button class="c-foldable-banner__open-btn js-foldable-banner-open-btn" aria-controls="foldable-banner" aria-expanded="true">
        <svg class="c-icon c-icon--18 u-color-basic-white-100" role="presentation">
            <use xlink:href="#ic_expand_more_black_24px"></use>
        </svg> </button>

</div>
<div class="c-foldable-banner"{{#if modifier}} {{ modifier }}{{/if}}>
  
  <div class="c-foldable-banner__wrapper" id="foldable-banner">
    <div class="c-foldable-banner__image">
      <img src="{{ path img.src }}" alt="" width="60">
    </div>
    <div class="c-foldable-banner__text">{{{ text }}}</div>
    <button class="c-foldable-banner__close-btn js-foldable-banner-close-btn" aria-controls="foldable-banner" aria-expanded="true">
      {{> @icon icn-close }}
    </button>
  </div>

  <button class="c-foldable-banner__open-btn js-foldable-banner-open-btn" aria-controls="foldable-banner" aria-expanded="true">
    {{> @icon icn-open }}
  </button>

</div>
{
  "img": {
    "src": "/images/svgs/stk_write_us.svg"
  },
  "text": "<p>Per aggiornamenti in tempo reale sul proprio volo e informazioni sui nostri servizi, è disponibile la chat su <a href=\"#\">Whatsapp</a>, al numero <a href=\"+390516479615\"><strong>+39 0516479615</strong></a>, oppure la chat su <a href=\"\">Messenger</a>.</p>",
  "icn-close": {
    "symbol": "ic_close_black_24px",
    "class": "c-icon c-icon--24 u-color-night-100"
  },
  "icn-open": {
    "symbol": "ic_expand_more_black_24px",
    "class": "c-icon c-icon--18 u-color-basic-white-100"
  }
}
  • Content:
    .c-foldable-banner {
      border-top: remify(8px) solid primary(night, 100);
      background-color: primary(sky, 10);
      position: relative;
    
      &.is-collapsed {
        border-top: none;
      }
    
    }
    
    /*------------------------------------*\
      COLLAPSED STATE
    \*------------------------------------*/
    .c-foldable-banner.is-collapsed {
    
      .c-foldable-banner__wrapper {
        display: none;
      }
    
      .c-foldable-banner__open-btn {
        display: flex;
      }
    
    }
    /*------------------------------------*\
      END COLLAPSED STATE
    \*------------------------------------*/
    
    
    .c-foldable-banner__wrapper {
      max-width: remify(900px);
      margin-inline: auto;
      gap: remify(16px);
      align-items: center;
      padding: remify(16px);
      display: flex;
    
      @include min-screen(bp(tablet)) {
        padding: remify(24px) remify(16px);
      }
    }
    
    .c-foldable-banner__image {
      display: none;
    
      @include min-screen(bp(phablet)) {
        display: block;
      }
    
    }
    
    .c-foldable-banner__text {
      @include font-scale(level-1-5);
      color: secondary(text, 100);
    
      @include min-screen(bp(tablet)) {
        @include font-scale(level-2);
      }
    
      a {
        color: currentColor;
      }
    }
    
    .c-foldable-banner__close-btn {
      width: remify(44px);
      aspect-ratio: 1;
      background-color: transparent;
      border: none;
      cursor: pointer;
    }
    
    .c-foldable-banner__open-btn {
      display: none;
      position: absolute;
      left: 50%;
      bottom: -20px;
      transform: translateX(-50%);
      background-color: primary(night, 100);
      border: none;
      align-items: center;
      justify-content: center;
      width: remify(48px);
      border-radius: 0 0 remify(8px) remify(8px);
      cursor: pointer;
      z-index: $z-Index-foldable-open-btn;
    }
  • URL: /components/raw/foldable-banner/_foldable-banner.scss
  • Filesystem Path: src/views/02-molecules/foldable-banner/_foldable-banner.scss
  • Size: 1.6 KB
  • Content:
    // foldable-banner.js
    (() => {
      document.addEventListener('DOMContentLoaded', () => {
        const BANNER_SELECTOR = '.c-foldable-banner';
        const banners = document.querySelectorAll(BANNER_SELECTOR);
    
        if (!banners.length) return; // nessun banner → esce subito
    
        const getFocusable = (root) =>
          root.querySelectorAll(
            'a[href], button, input, select, textarea, details summary, [tabindex]:not([tabindex="-1"])'
          );
    
        banners.forEach((banner) => {
          const wrapper  = banner.querySelector('.c-foldable-banner__wrapper');
          const btnClose = banner.querySelector('.js-foldable-banner-close-btn');
          const btnOpen  = banner.querySelector('.js-foldable-banner-open-btn');
    
          if (!wrapper || !btnClose || !btnOpen) return;
    
          let isOpen = true; // stato iniziale: aperto
    
          const setFocusability = (enabled) => {
            const focusables = Array.from(getFocusable(wrapper));
            focusables.forEach((el) => {
              if (el === btnClose) return;
              if (!enabled) {
                if (el.hasAttribute('tabindex')) el.dataset.prevTabindex = el.getAttribute('tabindex');
                el.setAttribute('tabindex', '-1');
              } else {
                if (el.dataset.prevTabindex != null) {
                  el.setAttribute('tabindex', el.dataset.prevTabindex);
                  delete el.dataset.prevTabindex;
                } else {
                  el.removeAttribute('tabindex');
                }
              }
            });
          };
    
          const applyState = () => {
            banner.classList.toggle('is-collapsed', !isOpen);
            wrapper.setAttribute('aria-hidden', String(!isOpen));
            // entrambi i pulsanti devono avere aria-expanded uguale
            btnClose.setAttribute('aria-expanded', String(isOpen));
            btnOpen.setAttribute('aria-expanded', String(isOpen));
            setFocusability(isOpen);
          };
    
          const open = () => {
            if (isOpen) return;
            isOpen = true;
            applyState();
            btnClose.focus();
          };
    
          const close = () => {
            if (!isOpen) return;
            isOpen = false;
            applyState();
            btnOpen.focus();
          };
    
          btnClose.addEventListener('click', (e) => {
            e.preventDefault();
            close();
          });
    
          btnOpen.addEventListener('click', (e) => {
            e.preventDefault();
            open();
          });
    
          banner.addEventListener('keydown', (e) => {
            if (e.key === 'Escape' && isOpen) {
              e.stopPropagation();
              close();
            }
          });
    
          // inizializza stato coerente con HTML (aperto)
          applyState();
        });
      });
    })();
    
  • URL: /components/raw/foldable-banner/foldable-banner.js
  • Filesystem Path: src/views/02-molecules/foldable-banner/foldable-banner.js
  • Size: 2.6 KB

No notes defined.