This is just placeholder text.

Products and services

orem ipsum dolor sit amet, consectetur adipiscing elit. Integer laoreet mi vestibulum cursus condimentum.

Nam rutrum nibh sit amet diam ornare imperdiet. Curabitur eu enim vel magna dignissim vestibulum. Suspendisse a ultrices lacus, vel luctus enim.

I am a button

I am a heading one

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero uctus non, massa. Sed cursus ante dapibus diam. Sed nisi.

I am a button

I am a heading two

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero uctus non, massa. Sed cursus ante dapibus diam. Sed nisi.

I am a button

I am a heading three

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero uctus non, massa. Sed cursus ante dapibus diam. Sed nisi.

I am a button

I am a heading four

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero uctus non, massa. Sed cursus ante dapibus diam. Sed nisi.

I am a button
<script>
document.addEventListener('DOMContentLoaded', () => {
    // Seleccionar todos los conjuntos de tabs
    const tabsSets = document.querySelectorAll('[fb-tabs]');

    tabsSets.forEach(tabsSet => {
        const tabs = tabsSet.querySelectorAll('[fb-tabs-btn]');
        const panels = tabsSet.querySelectorAll('[fb-tabs-panel]');
        const tabsMenu = tabsSet.querySelector('[fb-tabs-menu]');
        const tabsTitle = tabsSet.querySelector('[fb-tabs-title]');
        const isVertical = tabsSet.hasAttribute('fb-vertical');

        // Asignar aria-label del menú de tabs con el texto del título
        if (tabsMenu && tabsTitle) {
            tabsMenu.setAttribute('aria-label', tabsTitle.textContent.trim());
        }

        // Asignar aria-controls a los tabs y aria-label a los paneles
        if (tabs.length === panels.length) {
            tabs.forEach((tab, index) => {
                const panelId = panels[index].id;
                const tabText = tab.textContent.trim();
                if (panelId && tabText) {
                    tab.setAttribute('aria-controls', panelId);
                    panels[index].setAttribute('aria-label', tabText);
                }
                tab.setAttribute('aria-selected', tab.classList.contains('brx-open'));
                tab.setAttribute('tabindex', tab.classList.contains('brx-open') ? '0' : '-1');
            });
        }

        // Configurar el MutationObserver
        const observer = new MutationObserver((mutations) => {
            mutations.forEach((mutation) => {
                if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
                    const targetTab = mutation.target;
                    targetTab.setAttribute('aria-selected', targetTab.classList.contains('brx-open'));
                    targetTab.setAttribute('tabindex', targetTab.classList.contains('brx-open') ? '0' : '-1');
                }
            });
        });

        // Observar cada tab para cambios en la clase
        tabs.forEach((tab) => {
            observer.observe(tab, { attributes: true });
        });

        tabs.forEach((tab, index) => {
            tab.addEventListener('keydown', (event) => {
                let newTabIndex = 0;
                const currentTabIndex = Array.from(tabs).indexOf(event.target);

                if (isVertical && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) {
                    event.preventDefault();

                    if (event.key === 'ArrowUp') {
                        newTabIndex = currentTabIndex === 0 ? tabs.length - 1 : currentTabIndex - 1;
                    } else {
                        newTabIndex = currentTabIndex === tabs.length - 1 ? 0 : currentTabIndex + 1;
                    }

                    tabs[currentTabIndex].setAttribute('tabindex', '-1');
                    tabs[newTabIndex].setAttribute('tabindex', '0');
                    tabs[newTabIndex].focus();
                } else if (!isVertical && (event.key === 'ArrowRight' || event.key === 'ArrowLeft')) {
                    event.preventDefault();

                    if (event.key === 'ArrowRight') {
                        newTabIndex = currentTabIndex === tabs.length - 1 ? 0 : currentTabIndex + 1;
                    } else {
                        newTabIndex = currentTabIndex === 0 ? tabs.length - 1 : currentTabIndex - 1;
                    }

                    tabs[currentTabIndex].setAttribute('tabindex', '-1');
                    tabs[newTabIndex].setAttribute('tabindex', '0');
                    tabs[newTabIndex].focus();
                } else if (event.key === 'Home') {
                    event.preventDefault();
                    newTabIndex = 0;
                    tabs[currentTabIndex].setAttribute('tabindex', '-1');
                    tabs[newTabIndex].setAttribute('tabindex', '0');
                    tabs[newTabIndex].focus();
                } else if (event.key === 'End') {
                    event.preventDefault();
                    newTabIndex = tabs.length - 1;
                    tabs[currentTabIndex].setAttribute('tabindex', '-1');
                    tabs[newTabIndex].setAttribute('tabindex', '0');
                    tabs[newTabIndex].focus();
                }
            });
        });
    });
});
</script>
(function() {
  const debounce = (fn, delay) => {
    let timeout;
    return function () {
      clearTimeout(timeout);
      timeout = setTimeout(fn, delay);
    };
  };

  const movePanels = () => {
    document.querySelectorAll('.fb-tabs-one').forEach(tab => {
      const isMobile = window.innerWidth <= 767;
      const buttons = tab.querySelectorAll('.tab-title');
      const panels = tab.querySelectorAll('.tab-pane');
      const content = tab.querySelector('.tab-content');

      if (isMobile && !tab.classList.contains('fb-tabs-mobile')) {
        tab.classList.add('fb-tabs-mobile');
        buttons.forEach((btn, i) => {
          if (panels[i]) {
            btn.insertAdjacentElement('afterend', panels[i]);
          }
        });
      } else if (!isMobile && tab.classList.contains('fb-tabs-mobile')) {
        tab.classList.remove('fb-tabs-mobile');
        panels.forEach(panel => {
          content.appendChild(panel);
        });
      }
    });
  };

  // Ejecutar al cargar
  movePanels();

  // Ejecutar en resize optimizado
  window.addEventListener('resize', debounce(movePanels, 500));
})();

More Ways to Stay Connected

Stay connected on the go with the MetroFibre mobile app.
MetroFibre Mobile App
With MetroFone, you can make and receive calls from your smartphone, at discounted rates. Whether you are at home, in the office, or on the move.
  • Compatible with iOS and Android
  • Free App to App messaging and video calling
  • Save up to 50% on outbound calls
  • Call any number in South Africa from your MetroFone Mobile Application.
Call any local mobile or landline number for as little as 0.49c per minute (Ex VAT)!
Explore MetroFone
Find it on your favourite app store.
Text section
I am a button