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 ", diff --git a/rollup.config.mjs b/rollup.config.js similarity index 77% rename from rollup.config.mjs rename to rollup.config.js index abaf802..79424d0 100644 --- a/rollup.config.mjs +++ 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 [{ @@ -54,7 +56,7 @@ export default [{ function remove_comments() { return { - name: "strip", + name: "remove_comments", transform(source) { return { code: strip_comments(source) @@ -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(); + } + } + }; +} 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; } 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",