Files
upstream-shadcn-ui/apps/v4/lib/docs-sidebar-scroll.ts
upstream-mirror 1416db152c
All checks were successful
Release / Create Version PR or Publish Stable Release (push) Has been skipped
Release / Publish Prerelease to NPM (push) Has been skipped
Monitor Registries / Monitor registry health (push) Has been skipped
snapshot of https://github.com/shadcn-ui/ui.git (main, 2026-09-15; blobs > 131072B omitted)
2026-09-15 22:44:43 +05:00

67 lines
2.3 KiB
TypeScript

export const DOCS_SIDEBAR_SCROLL_STORAGE_KEY = "docs-sidebar-scroll"
export const DOCS_SIDEBAR_SCROLL_RESTORE_SCRIPT = `(function () {
if (location.pathname !== "/docs" && !location.pathname.startsWith("/docs/")) return
var stored = null
try {
stored = JSON.parse(sessionStorage.getItem("${DOCS_SIDEBAR_SCROLL_STORAGE_KEY}"))
} catch (e) {}
function getActiveItem(container) {
var items = container.querySelectorAll('[data-active="true"]')
var active = null
var activePathLength = -1
var activeDistance = Infinity
var containerCenter = container.getBoundingClientRect().top + container.clientHeight / 2
for (var i = 0; i < items.length; i++) {
var link = items[i].querySelector('a[href]')
var href = items[i].getAttribute('href') || (link && link.getAttribute('href'))
var pathLength = href ? href.length : 0
var itemRect = items[i].getBoundingClientRect()
var distance = Math.abs(itemRect.top + itemRect.height / 2 - containerCenter)
if (pathLength > activePathLength || (pathLength === activePathLength && distance < activeDistance)) {
active = items[i]
activePathLength = pathLength
activeDistance = distance
}
}
return active
}
function restoreScroll() {
var container = document.querySelector('[data-docs-sidebar-content]')
if (!container || !container.clientHeight) return
if (stored && stored.pathname === location.pathname) {
container.scrollTop = stored.scrollTop
return
}
var active = getActiveItem(container)
if (!active) return
var containerRect = container.getBoundingClientRect()
var activeRect = active.getBoundingClientRect()
if (activeRect.top >= containerRect.top && activeRect.bottom <= containerRect.bottom) return
container.scrollTop += activeRect.top - containerRect.top - (container.clientHeight - activeRect.height) / 2
}
var observer = new MutationObserver(restoreScroll)
observer.observe(document.documentElement, { childList: true, subtree: true })
restoreScroll()
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", function () {
restoreScroll()
observer.disconnect()
}, { once: true })
} else {
observer.disconnect()
}
})()`