npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@rfkhusnutdinov/scroll-lock-manager

v1.0.1

Published

A lightweight JavaScript utility to manage body scroll without layout shifts.

Downloads

4

Readme

ScrollLockManager

A lightweight JavaScript utility to manage body scroll without layout shifts. Automatically detects when scroll is locked, even by other scripts or libraries, and applies compensation to prevent content jumps.

Features

  • Automatically detects when body scroll is locked, even by other code or libraries
  • Automatically compensates scrollbar width with margin-right to prevent content jumps
  • Overrides any existing margin-right set by other libraries for consistent behavior
  • Supports native scrollbar-gutter when available
  • Observes body overflow changes using OverflowObserver
  • Tracks scrollbar width with ScrollbarWidthObserver
  • Lock and unlock scroll programmatically
  • Singleton pattern ensures only one instance

Installation

Install from npm

npm install @rfkhusnutdinov/scroll-lock-manager
import ScrollLockManager from "@rfkhusnutdinov/scroll-lock-manager";

Use ScrollLockManager from CDN

<script src="https://cdn.jsdelivr.net/npm/@rfkhusnutdinov/scroll-lock-manager@latest"></script>

Usage

const scrollManager = new ScrollLockManager({
  useScrollbarGutter: true, // optional, default is true
});

// Lock scroll
scrollManager.lockScroll();

// Unlock scroll
scrollManager.unlockScroll();

// Disconnect and clean up
scrollManager.disconnect();

Notes

  • ScrollLockManager prevents document jumps that usually occur when overflow: hidden is applied by compensating the scrollbar width with margin-right.
  • The plugin automatically detects when scroll is locked, even if done by other scripts or libraries, and applies the necessary styles to maintain consistent layout.
  • Any existing margin-right set by other libraries is overridden to ensure correct alignment and prevent layout shifts.
  • The useScrollbarGutter option enables the native CSS scrollbar-gutter property if supported by the browser, providing smoother layouts.
  • CSS classes are applied automatically: scroll-lock-manager-overflow-hidden is added when body overflow is hidden.
  • Singleton pattern ensures only one instance of ScrollLockManager is active at a time.

API

| Method | Description | | --------------------------------------------- | -------------------------------------------------------- | | new ScrollLockManager({ useScrollbarGutter }) | Initializes the manager or returns the existing instance | | lockScroll() | Locks body scroll | | unlockScroll() | Unlocks body scroll | | disconnect() | Stops observing and cleans up styles/observers |