diff --git a/docs/src/components/Topbar.astro b/docs/src/components/Topbar.astro index 22834522f..07bb4f708 100644 --- a/docs/src/components/Topbar.astro +++ b/docs/src/components/Topbar.astro @@ -133,6 +133,41 @@ const ENTERPRISE = `${SITE_MAIN}/enterprise`; .catch(() => { /* offline / rate-limited — leave the em-dash. */ }); })(); + // On touch / no-hover devices the `:hover` rule that reveals .nav-dd-menu + // never fires, so the first tap on the trigger anchor navigates away + // before the user can pick v1 vs v0. Intercept that first tap to open + // the menu; the second tap (or selecting an item) navigates as normal. + (() => { + if (!window.matchMedia('(hover: none)').matches) return; + const dds = Array.from(document.querySelectorAll('.nav-dd')); + if (!dds.length) return; + + const closeAll = (except?: HTMLElement) => { + for (const dd of dds) if (dd !== except) dd.classList.remove('open'); + }; + + for (const dd of dds) { + const trigger = dd.querySelector('.nav-dd-trigger'); + if (!trigger) continue; + trigger.addEventListener('click', (ev) => { + if (!dd.classList.contains('open')) { + ev.preventDefault(); + closeAll(dd); + dd.classList.add('open'); + } + }); + } + + document.addEventListener('click', (ev) => { + const target = ev.target as Node | null; + if (target && dds.some((dd) => dd.contains(target))) return; + closeAll(); + }); + document.addEventListener('keydown', (ev) => { + if (ev.key === 'Escape') closeAll(); + }); + })(); + // Copy-to-clipboard for every .code-figure .copy button — one delegated // listener per document. Emitted markup lives in scripts/remark-code-titles.mjs. (() => { diff --git a/docs/src/styles/globals.css b/docs/src/styles/globals.css index 6636a650b..9dd7d89b4 100644 --- a/docs/src/styles/globals.css +++ b/docs/src/styles/globals.css @@ -148,7 +148,8 @@ nav.top { transition: transform .15s ease; } .nav-dd:hover .nav-dd-trigger svg, -.nav-dd:focus-within .nav-dd-trigger svg { +.nav-dd:focus-within .nav-dd-trigger svg, +.nav-dd.open .nav-dd-trigger svg { color: var(--coral); transform: rotate(180deg); } @@ -169,7 +170,8 @@ nav.top { z-index: 60; } .nav-dd:hover .nav-dd-menu, -.nav-dd:focus-within .nav-dd-menu { +.nav-dd:focus-within .nav-dd-menu, +.nav-dd.open .nav-dd-menu { opacity: 1; visibility: visible; transform: translateY(0);