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 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 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 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 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.

<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
MetroFibre Mobile App
- 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.
