Hands-on, engineer-focused training from the creators of the service mesh
Buoyant's Service Mesh Academy offers hands-on workshops and self-paced courses to help DevOps engineers, SREs, and architects master Linkerd, the CNCF-graduated service mesh for Kubernetes.
On-demand Workshops
Sorry, the form failed to load. Please refresh the page and try again.
'; } if (closeBtn) closeBtn.focus(); }); } // Poll briefly for the HubSpot iframe and focus it once it appears. // Focusing the iframe element itself causes most browsers to place focus // on the first focusable inside it, which is the first form field. function focusIntoForm() { var attempts = 0; var maxAttempts = 30; // ~3 seconds total var poll = setInterval(function () { attempts++; var container = document.getElementById('wsa-modal-form-container'); var iframe = container ? container.querySelector('iframe') : null; if (iframe) { clearInterval(poll); // Small delay to let the iframe finish loading its content setTimeout(function () { try { iframe.focus(); } catch (err) { // Fallback: focus the close button so keyboard users have a path in if (closeBtn) closeBtn.focus(); } }, 150); } else if (attempts >= maxAttempts) { clearInterval(poll); // Form never rendered — focus close button as fallback if (closeBtn) closeBtn.focus(); } }, 100); } function closeModal() { if (!overlay) return; overlay.classList.remove('is-open'); overlay.setAttribute('aria-hidden', 'true'); document.body.classList.remove('wsa-modal-locked'); document.removeEventListener('keydown', handleKeydown); pendingRedirectUrl = null; // Restore focus to the trigger that opened the modal if (lastFocusedTrigger && typeof lastFocusedTrigger.focus === 'function') { lastFocusedTrigger.focus(); } lastFocusedTrigger = null; } // ===== Click delegation ===== function handleSectionClick(e) { var trigger = e.target.closest('[data-gated-trigger]'); if (!trigger) return; // Re-check unlock state at click time (in case it changed in another tab) if (isUnlocked()) { applyGatingState(); return; // Let the native navigation proceed } e.preventDefault(); var href = trigger.getAttribute('data-original-href') || trigger.getAttribute('href'); // Resolve to absolute URL for safety var absoluteUrl; try { absoluteUrl = new URL(href, window.location.origin).href; } catch (err) { absoluteUrl = href; } openModal(trigger, absoluteUrl); } // ===== Wire up ===== function init() { var section = document.querySelector('.section_academy_list'); if (!section) return; // Portal: move the modal overlay to be a direct child of so it // escapes any parent stacking context (transforms, filters, fixed // positioning issues, etc.) that Webflow may have on ancestor elements. if (overlay && overlay.parentNode !== document.body) { document.body.appendChild(overlay); } applyGatingState(); section.addEventListener('click', handleSectionClick); if (closeBtn) { closeBtn.addEventListener('click', closeModal); } if (overlay) { // Click on backdrop (not the modal itself) closes overlay.addEventListener('click', function (e) { if (e.target === overlay) closeModal(); }); } // Sync state across tabs window.addEventListener('storage', function (e) { if (e.key === STORAGE_KEY) { applyGatingState(); } }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();






















