Metro X - Metro X - Metro X

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));
})();

Key features

Designed to handle multiple devices and bandwidth-heavy applications.

BizMesh

Fast, reliable and accessible from anywhere.

The way we use Wi-Fi is evolving rapidly. With more users, more devices, and more bandwidth-intensive applications, your business Wi-Fi needs to be better than ever before.

Say goodbye to dead spots and weak signals—BizMesh has you covered.
Find out more

Smoother internet performance

BizMesh’s smart traffic steering technology constantly monitors your network and automatically connects your devices to the fastest and most stable signal. Whether it’s the main router or a Mesh satellite, BizMesh makes sure you're always using the best possible connection, without you having to do anything. This means smoother internet performance and fewer interruptions, keeping your business running efficiently.
Find out more

Beamforming Technology

With BizMesh’s beamforming technology, your Wi-Fi signal is directed straight to your device rather than spreading out in all directions. This targeted approach improves your connection strength and reduces interference, ensuring that no matter where you are in the office, you’ll have a strong, stable internet connection that keeps your business running smoothly.
Find out more

Are Wi-Fi extenders the same as BizMesh?

Not quite. While Wi-Fi extenders create separate networks that overlap with your existing one, BizMesh expands your current network seamlessly. With Wi-Fi extenders, you’ll need to manually set up devices to recognise the new network, and they may not automatically switch to the strongest connection as you move around. This can leave devices stuck on weaker signals, forcing you to switch manually. BizMesh, on the other hand, ensures your devices stay connected to the best possible signal without any manual intervention, giving you reliable coverage throughout your business.
Find out more
Contact us
Email

biz.sales@metrofibre.co.za

Telephone

087 151 4000

Leave your details

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