From 0650a7b4d8c5d5bfc71c699ab0d2a0fcf084465a Mon Sep 17 00:00:00 2001 From: trean Date: Mon, 9 Mar 2026 13:12:10 +0100 Subject: [PATCH] add optional tab sync restriction, to sync only down the page --- .../themes/qdrant-2024/assets/js/tab-sync.js | 40 ++++++++++++++++++- .../pricing/qdrant-pricing-doors.html | 2 +- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/qdrant-landing/themes/qdrant-2024/assets/js/tab-sync.js b/qdrant-landing/themes/qdrant-2024/assets/js/tab-sync.js index f05539946..d10b86fce 100644 --- a/qdrant-landing/themes/qdrant-2024/assets/js/tab-sync.js +++ b/qdrant-landing/themes/qdrant-2024/assets/js/tab-sync.js @@ -3,6 +3,30 @@ * Add data-tab-sync="group-id" to the tab container (parent of tab buttons). * Tab buttons must have data-tab with matching values across synchronized groups. * Programmatic clicks (isTrusted: false) are ignored to avoid sync loops. + * + * Optional data-tab-sync-direction: + * - "down-only": only sync to tab groups that appear later in the DOM (below the clicked one). + * E.g. with A, B, C: A syncs B and C; B syncs C; C syncs none. + * + * @example Basic usage (bidirectional sync) + *
+ * + * + *
+ *
+ * + * + *
+ * + * @example Down-only (sync flows downward only) + *
+ * + * + *
+ *
+ * + * + *
*/ export function initTabSync() { document.addEventListener( @@ -18,8 +42,20 @@ export function initTabSync() { const tabId = tab.getAttribute('data-tab'); if (!syncGroup || !tabId) return; - document.querySelectorAll(`[data-tab-sync="${syncGroup}"]`).forEach((group) => { - if (group === container) return; + const groups = [...document.querySelectorAll(`[data-tab-sync="${syncGroup}"]`)]; + const hasDownOnly = groups.some((g) => g.getAttribute('data-tab-sync-direction') === 'down-only'); + + const shouldSyncTo = (group) => { + if (group === container) return false; + if (hasDownOnly) { + const groupIsBelow = !!(container.compareDocumentPosition(group) & Node.DOCUMENT_POSITION_FOLLOWING); + if (!groupIsBelow) return false; + } + return true; + }; + + groups.forEach((group) => { + if (!shouldSyncTo(group)) return; const matchingTab = group.querySelector(`[data-tab="${tabId}"]`); if (matchingTab) matchingTab.click(); }); diff --git a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-doors.html b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-doors.html index 5cc73fd9a..2dad5c38a 100644 --- a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-doors.html +++ b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-doors.html @@ -2,7 +2,7 @@
{{/* Navigation Tabs – data-tab-sync groups tab switching across sections */}} -
+
{{ range .context.Params.tabs }}