From b98b725ec31a3a5ce7fba173e863ee0eecc843ba Mon Sep 17 00:00:00 2001 From: rameel Date: Fri, 9 Jan 2026 20:32:53 +0500 Subject: [PATCH 1/6] Bump package.json version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 397bfc0..0c2e914 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ramstack/pagelock", - "version": "1.0.1", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ramstack/pagelock", - "version": "1.0.1", + "version": "1.1.0", "license": "MIT", "devDependencies": { "@rollup/plugin-node-resolve": "^16.0.3", diff --git a/package.json b/package.json index bf0578f..c836848 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ramstack/pagelock", - "version": "1.0.1", + "version": "1.1.0", "description": "A simple utility for managing page scroll locking. No external dependencies.", "type": "module", "author": "rameel ", From 2f9c54f26daecde8cc2ed17ea3d581126dd0162d Mon Sep 17 00:00:00 2001 From: rameel Date: Fri, 9 Jan 2026 20:35:25 +0500 Subject: [PATCH 2/6] Rename rollup.config.mjs to rollup.config.js --- rollup.config.mjs => rollup.config.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename rollup.config.mjs => rollup.config.js (100%) diff --git a/rollup.config.mjs b/rollup.config.js similarity index 100% rename from rollup.config.mjs rename to rollup.config.js From 7bea8bfed1034b261043ddced3314e53ca42a496 Mon Sep 17 00:00:00 2001 From: rameel Date: Fri, 9 Jan 2026 20:36:53 +0500 Subject: [PATCH 3/6] Add trim_ws plugin to rollup --- rollup.config.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/rollup.config.js b/rollup.config.js index abaf802..bffc1e0 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,3 +1,4 @@ +import path from "node:path"; import resolve from "@rollup/plugin-node-resolve"; import size from "rollup-plugin-bundle-size"; import strip_comments from "strip-comments"; @@ -25,7 +26,8 @@ const plugins = [ resolve(), typescript(), size(), - remove_comments() + remove_comments(), + trim_ws() ]; export default [{ @@ -62,3 +64,15 @@ function remove_comments() { } }; } + +function trim_ws() { + return { + name: "trim_ws", + generateBundle(options, bundle) { + if (options.file.match(/\.js$/)) { + const key = path.basename(options.file); + bundle[key].code = bundle[key].code.trim(); + } + } + }; +} From 2b650d57a2207b0dc22aafb646d24a37549acda5 Mon Sep 17 00:00:00 2001 From: rameel Date: Fri, 9 Jan 2026 20:38:45 +0500 Subject: [PATCH 4/6] Rename rollup plugin 'strip' to 'remove_comments' --- rollup.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rollup.config.js b/rollup.config.js index bffc1e0..79424d0 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -56,7 +56,7 @@ export default [{ function remove_comments() { return { - name: "strip", + name: "remove_comments", transform(source) { return { code: strip_comments(source) From 8f25d0528768bde976842b5685b2729fb4927a8f Mon Sep 17 00:00:00 2001 From: rameel Date: Fri, 9 Jan 2026 20:52:19 +0500 Subject: [PATCH 5/6] Move pagelock state from module scope to document-level signleton --- src/pagelock.ts | 49 +++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/pagelock.ts b/src/pagelock.ts index e3cdbe1..6d3c697 100644 --- a/src/pagelock.ts +++ b/src/pagelock.ts @@ -1,12 +1,16 @@ -let locks: Array = []; -let sequence: number = 0; - -let width: string; +interface ExtendedDocument extends Document { + _r_pagelock?: { + locks: number[]; + sequence: number; + width?: string | null; + props?: { + overflow: string; + paddingRight: string + } | null; + }; +} -let props: { - overflow: string, - paddingRight: string -} | null | undefined; +const storage = (document as ExtendedDocument)._r_pagelock ??= { locks: [], sequence: 0 }; /** * Locks the page scroll. Subsequent calls to the function add to the queue of lock holders. @@ -18,30 +22,31 @@ let props: { * without affecting the others in the queue. */ export function pagelock(): () => void { - if (!props) { + if (!storage.props) { const { offsetHeight, clientHeight } = document.documentElement; const style = document.body.style; - props = { + + storage.props = { overflow: style.overflow, paddingRight: style.paddingRight }; if (offsetHeight > clientHeight) { - style.paddingRight = scrollbarWidth(); + style.paddingRight = scrollbar_width(); } style.overflow = "hidden"; } - const seq = ++sequence; - locks.push(seq); + const seq = ++storage.sequence; + storage.locks.push(seq); return () => { - locks = locks.filter(v => v !== seq); + storage.locks = storage.locks.filter(v => v !== seq); restore(); }; } @@ -54,26 +59,26 @@ export function pagelock(): () => void { * Otherwise, only the most recent lock is released. Defaults to `false`. */ export function pageunlock(force?: boolean): void { - force ? locks = [] : locks.pop(); + force ? storage.locks = [] : storage.locks.pop(); restore(); } function restore(): void { - if (props && !locks.length) { - Object.assign(document.body.style, props); - props = null; + if (storage.props && !storage.locks.length) { + Object.assign(document.body.style, storage.props); + storage.props = null; } } -function scrollbarWidth(): string { - if (!width) { +function scrollbar_width(): string { + if (!storage.width) { const outer = document.createElement("div"); outer.innerHTML = "
"; const inner = outer.firstChild as HTMLDivElement; document.body.appendChild(outer); - width = (inner.offsetWidth - inner.clientWidth) + "px"; + storage.width = (inner.offsetWidth - inner.clientWidth) + "px"; document.body.removeChild(outer); } - return width; + return storage.width; } From 622b473be94de3877554c515b856f94700f335d9 Mon Sep 17 00:00:00 2001 From: rameel Date: Fri, 9 Jan 2026 20:56:57 +0500 Subject: [PATCH 6/6] Update tsconfig target and module to es2022 --- tsconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 81429f2..5846a7e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "ES2020", - "module": "ES2020", + "target": "es2022", + "module": "es2022", "strict": true, "declaration": true, "outDir": "./dist",