Repository: exadel-inc/esl
Pull request #2098 (2023-12-06 17:17:51)

chore(esl-event-listener): block events if scroll was detected
This feature should handle the cases when events need to be prevented from dispatching due to scroll detection.
Should be explained better in #2085
Closes: #2085


Patch:
diff --git a/.husky/commit-msg b/.husky/commit-msg
index 8472a1542..372c9ff38 100755
--- a/.husky/commit-msg
+++ b/.husky/commit-msg
@@ -1,4 +1,1 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
 npx commitlint -e $1
diff --git a/.husky/pre-commit b/.husky/pre-commit
index 871dac028..c769b0abf 100755
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,5 +1,2 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
 # ignore lint-staged if it is merge commit
 git rev-parse -q --no-revs --verify MERGE_HEAD || npx lint-staged --verbose --quiet
diff --git a/.husky/pre-push b/.husky/pre-push
index 2e017ab2e..f0a741848 100755
--- a/.husky/pre-push
+++ b/.husky/pre-push
@@ -1,4 +1,1 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
 npm run test -ws --include-workspace-root
diff --git a/package-lock.json b/package-lock.json
index 00f20d984..e1a522dc1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,8 +17,8 @@
         "@types/youtube": "0.0.50"
       },
       "devDependencies": {
-        "@commitlint/cli": "^18.4.4",
-        "@commitlint/config-conventional": "^18.4.4",
+        "@commitlint/cli": "^18.5.0",
+        "@commitlint/config-conventional": "^18.5.0",
         "@exadel/eslint-plugin-esl": "file:eslint",
         "@semantic-release/changelog": "^6.0.3",
         "@semantic-release/commit-analyzer": "^11.1.0",
@@ -27,8 +27,8 @@
         "@semantic-release/npm": "^11.0.2",
         "@semantic-release/release-notes-generator": "^12.1.0",
         "@types/jest": "^29.5.11",
-        "@typescript-eslint/eslint-plugin": "^6.19.0",
-        "@typescript-eslint/parser": "^6.19.0",
+        "@typescript-eslint/eslint-plugin": "^6.19.1",
+        "@typescript-eslint/parser": "^6.19.1",
         "chokidar-cli": "^3.0.0",
         "concurrently": "^8.2.2",
         "copyfiles": "^2.4.1",
@@ -39,7 +39,7 @@
         "eslint-plugin-sonarjs": "^0.23.0",
         "eslint-plugin-tsdoc": "^0.2.17",
         "foreach-cli": "^1.8.1",
-        "husky": "^8.0.3",
+        "husky": "^9.0.2",
         "jest": "^29.7.0",
         "jest-environment-jsdom": "^29.7.0",
         "kleur": "^4.1.5",
@@ -53,7 +53,7 @@
         "smoothscroll-polyfill": "^0.4.4",
         "stylelint": "^16.2.0",
         "stylelint-prettier": "^5.0.0",
-        "ts-jest": "^29.1.1",
+        "ts-jest": "^29.1.2",
         "typescript": "5.3.3"
       }
     },
@@ -938,14 +938,14 @@
       }
     },
     "node_modules/@commitlint/cli": {
-      "version": "18.4.4",
-      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-18.4.4.tgz",
-      "integrity": "sha512-Ro3wIo//fV3XiV1EkdpHog6huaEyNcUAVrSmtgKqYM5g982wOWmP4FXvEDFwRMVgz878CNBvvCc33dMZ5AQJ/g==",
+      "version": "18.5.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-18.5.0.tgz",
+      "integrity": "sha512-g/N0mJBrHcTdiccUpJknS6/ru45eIEAZyhEy9sL2ILjzK2IVNrpzlAPtxEr8bZCZLGwPBUrQ5UCIIu4uebhImw==",
       "dev": true,
       "dependencies": {
         "@commitlint/format": "^18.4.4",
-        "@commitlint/lint": "^18.4.4",
-        "@commitlint/load": "^18.4.4",
+        "@commitlint/lint": "^18.5.0",
+        "@commitlint/load": "^18.5.0",
         "@commitlint/read": "^18.4.4",
         "@commitlint/types": "^18.4.4",
         "execa": "^5.0.0",
@@ -962,9 +962,9 @@
       }
     },
     "node_modules/@commitlint/config-conventional": {
-      "version": "18.4.4",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.4.4.tgz",
-      "integrity": "sha512-Bz3sPQSboBN+Et/KyZrR+OJ3z9PrHDw7Bls0/hv94PmuHBtMq1dCGxS9XzTGzxeMNlytCC4kxF083tbhPljl3Q==",
+      "version": "18.5.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.5.0.tgz",
+      "integrity": "sha512-XGmU4u3Z7bCn0H0nTEG9LUn6hMDUIPP4P6dun7PKFhtnt/wwiKAqmPj+QRmFiqWjkOWcmrh7w7xRiDL32cWS5g==",
       "dev": true,
       "dependencies": {
         "conventional-changelog-conventionalcommits": "^7.0.2"
@@ -974,9 +974,9 @@
       }
     },
     "node_modules/@commitlint/config-validator": {
-      "version": "18.4.4",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-18.4.4.tgz",
-      "integrity": "sha512-/QI8KIg/h7O0Eus36fPcEcO3QPBcdXuGfZeCF5m15k0EB2bcU8s6pHNTNEa6xz9PrAefHCL+yzRJj7w20T6Mow==",
+      "version": "18.5.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-18.5.0.tgz",
+      "integrity": "sha512-mDAA6WQPjh9Ida8ACdInDylBQcqeUD2gBHE+dQu+B3OIHiWiSSrq4F2+wg3nDU9EzfcQSwPwYL+QbMmiW5SmLA==",
       "dev": true,
       "dependencies": {
         "@commitlint/types": "^18.4.4",
@@ -1039,9 +1039,9 @@
       }
     },
     "node_modules/@commitlint/lint": {
-      "version": "18.4.4",
-      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-18.4.4.tgz",
-      "integrity": "sha512-SoyQstVxMY5Z4GnFRtRzy+NWYb+yVseXgir+7BxnpB59oH05C9XztRrhDw6OnkNeXhjINTpi1HLnuY7So+CaAQ==",
+      "version": "18.5.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-18.5.0.tgz",
+      "integrity": "sha512-4VbfTGTZf/aDaOn+vednMQFu5EIKfERvv7j8La3etQCra0O2QMrZL28xugTroYekawpTkiWWvLswtpVfabIbgw==",
       "dev": true,
       "dependencies": {
         "@commitlint/is-ignored": "^18.4.4",
@@ -1054,14 +1054,14 @@
       }
     },
     "node_modules/@commitlint/load": {
-      "version": "18.4.4",
-      "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-18.4.4.tgz",
-      "integrity": "sha512-RaDIa9qwOw2xRJ3Jr2DBXd14rmnHJIX2XdZF4kmoF1rgsg/+7cvrExLSUNAkQUNimyjCn1b/bKX2Omm+GdY0XQ==",
+      "version": "18.5.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-18.5.0.tgz",
+      "integrity": "sha512-vpyGgk7rzbFsU01NVwPNC/WetHFP0EwSYnQ1R833SJFHkEo+cWvqoVlw/VoZwBMoI6sF5/lwEdKzFDr1DHJ6+A==",
       "dev": true,
       "dependencies": {
-        "@commitlint/config-validator": "^18.4.4",
+        "@commitlint/config-validator": "^18.5.0",
         "@commitlint/execute-rule": "^18.4.4",
-        "@commitlint/resolve-extends": "^18.4.4",
+        "@commitlint/resolve-extends": "^18.5.0",
         "@commitlint/types": "^18.4.4",
         "chalk": "^4.1.0",
         "cosmiconfig": "^8.3.6",
@@ -1114,12 +1114,12 @@
       }
     },
     "node_modules/@commitlint/resolve-extends": {
-      "version": "18.4.4",
-      "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-18.4.4.tgz",
-      "integrity": "sha512-RRpIHSbRnFvmGifVk21Gqazf1QF/yeP+Kkg/e3PlkegcOKd/FGOXp/Kx9cvSO2K7ucSn4GD/oBvgasFoy+NCAw==",
+      "version": "18.5.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-18.5.0.tgz",
+      "integrity": "sha512-OxCYOMnlkOEEIkwTaRiFjHyuWBq962WBZQVHfMHej8tr3d+SfjznvqZhPmW8/SuqtfmGEiJPGWUNOxgwH+O0MA==",
       "dev": true,
       "dependencies": {
-        "@commitlint/config-validator": "^18.4.4",
+        "@commitlint/config-validator": "^18.5.0",
         "@commitlint/types": "^18.4.4",
         "import-fresh": "^3.0.0",
         "lodash.mergewith": "^4.6.2",
@@ -3148,16 +3148,16 @@
       "integrity": "sha512-d4GpH4uPYp9W07kc487tiq6V/EUHl18vZWFMbQoe4Sk9LXEWzFi/BMf9x7TI4m7/j7gU3KeX8H6M8aPBgykeLw=="
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "6.19.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.0.tgz",
-      "integrity": "sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==",
+      "version": "6.19.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz",
+      "integrity": "sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==",
       "dev": true,
       "dependencies": {
         "@eslint-community/regexpp": "^4.5.1",
-        "@typescript-eslint/scope-manager": "6.19.0",
-        "@typescript-eslint/type-utils": "6.19.0",
-        "@typescript-eslint/utils": "6.19.0",
-        "@typescript-eslint/visitor-keys": "6.19.0",
+        "@typescript-eslint/scope-manager": "6.19.1",
+        "@typescript-eslint/type-utils": "6.19.1",
+        "@typescript-eslint/utils": "6.19.1",
+        "@typescript-eslint/visitor-keys": "6.19.1",
         "debug": "^4.3.4",
         "graphemer": "^1.4.0",
         "ignore": "^5.2.4",
@@ -3183,15 +3183,15 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "6.19.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.0.tgz",
-      "integrity": "sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==",
+      "version": "6.19.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.1.tgz",
+      "integrity": "sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "6.19.0",
-        "@typescript-eslint/types": "6.19.0",
-        "@typescript-eslint/typescript-estree": "6.19.0",
-        "@typescript-eslint/visitor-keys": "6.19.0",
+        "@typescript-eslint/scope-manager": "6.19.1",
+        "@typescript-eslint/types": "6.19.1",
+        "@typescript-eslint/typescript-estree": "6.19.1",
+        "@typescript-eslint/visitor-keys": "6.19.1",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -3211,13 +3211,13 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "6.19.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz",
-      "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==",
+      "version": "6.19.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz",
+      "integrity": "sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "6.19.0",
-        "@typescript-eslint/visitor-keys": "6.19.0"
+        "@typescript-eslint/types": "6.19.1",
+        "@typescript-eslint/visitor-keys": "6.19.1"
       },
       "engines": {
         "node": "^16.0.0 || >=18.0.0"
@@ -3228,13 +3228,13 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "6.19.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz",
-      "integrity": "sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==",
+      "version": "6.19.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.1.tgz",
+      "integrity": "sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "6.19.0",
-        "@typescript-eslint/utils": "6.19.0",
+        "@typescript-eslint/typescript-estree": "6.19.1",
+        "@typescript-eslint/utils": "6.19.1",
         "debug": "^4.3.4",
         "ts-api-utils": "^1.0.1"
       },
@@ -3255,9 +3255,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "6.19.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz",
-      "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==",
+      "version": "6.19.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.1.tgz",
+      "integrity": "sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==",
       "dev": true,
       "engines": {
         "node": "^16.0.0 || >=18.0.0"
@@ -3268,13 +3268,13 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "6.19.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz",
-      "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==",
+      "version": "6.19.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz",
+      "integrity": "sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "6.19.0",
-        "@typescript-eslint/visitor-keys": "6.19.0",
+        "@typescript-eslint/types": "6.19.1",
+        "@typescript-eslint/visitor-keys": "6.19.1",
         "debug": "^4.3.4",
         "globby": "^11.1.0",
         "is-glob": "^4.0.3",
@@ -3325,17 +3325,17 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "6.19.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.0.tgz",
-      "integrity": "sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==",
+      "version": "6.19.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.1.tgz",
+      "integrity": "sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
         "@types/json-schema": "^7.0.12",
         "@types/semver": "^7.5.0",
-        "@typescript-eslint/scope-manager": "6.19.0",
-        "@typescript-eslint/types": "6.19.0",
-        "@typescript-eslint/typescript-estree": "6.19.0",
+        "@typescript-eslint/scope-manager": "6.19.1",
+        "@typescript-eslint/types": "6.19.1",
+        "@typescript-eslint/typescript-estree": "6.19.1",
         "semver": "^7.5.4"
       },
       "engines": {
@@ -3350,12 +3350,12 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "6.19.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz",
-      "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==",
+      "version": "6.19.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz",
+      "integrity": "sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "6.19.0",
+        "@typescript-eslint/types": "6.19.1",
         "eslint-visitor-keys": "^3.4.1"
       },
       "engines": {
@@ -8160,15 +8160,15 @@
       }
     },
     "node_modules/husky": {
-      "version": "8.0.3",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz",
-      "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
+      "version": "9.0.2",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.2.tgz",
+      "integrity": "sha512-0yR5R3OPjl8bYApi6T4QMOAwhtLhBjdYIVg5S6zSzIO8DIvQMh/b7Q8jW3WLbHLHtzpwiyMLBNB4R0Eb6x5+AA==",
       "dev": true,
       "bin": {
-        "husky": "lib/bin.js"
+        "husky": "bin.js"
       },
       "engines": {
-        "node": ">=14"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/typicode"
@@ -17883,9 +17883,9 @@
       }
     },
     "node_modules/ts-jest": {
-      "version": "29.1.1",
-      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz",
-      "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==",
+      "version": "29.1.2",
+      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz",
+      "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==",
       "dev": true,
       "dependencies": {
         "bs-logger": "0.x",
@@ -17901,7 +17901,7 @@
         "ts-jest": "cli.js"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": "^16.10.0 || ^18.0.0 || >=20.0.0"
       },
       "peerDependencies": {
         "@babel/core": ">=7.0.0-beta.0 <8",
@@ -18340,18 +18340,18 @@
       }
     },
     "node_modules/webpack": {
-      "version": "5.89.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
-      "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
+      "version": "5.90.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz",
+      "integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==",
       "dependencies": {
         "@types/eslint-scope": "^3.7.3",
-        "@types/estree": "^1.0.0",
+        "@types/estree": "^1.0.5",
         "@webassemblyjs/ast": "^1.11.5",
         "@webassemblyjs/wasm-edit": "^1.11.5",
         "@webassemblyjs/wasm-parser": "^1.11.5",
         "acorn": "^8.7.1",
         "acorn-import-assertions": "^1.9.0",
-        "browserslist": "^4.14.5",
+        "browserslist": "^4.21.10",
         "chrome-trace-event": "^1.0.2",
         "enhanced-resolve": "^5.15.0",
         "es-module-lexer": "^1.2.1",
@@ -18365,7 +18365,7 @@
         "neo-async": "^2.6.2",
         "schema-utils": "^3.2.0",
         "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.3.7",
+        "terser-webpack-plugin": "^5.3.10",
         "watchpack": "^2.4.0",
         "webpack-sources": "^3.2.3"
       },
@@ -18948,7 +18948,7 @@
         "prismjs": "^1.29.0",
         "smoothscroll-polyfill": "^0.4.4",
         "ts-loader": "^9.5.1",
-        "webpack": "^5.89.0",
+        "webpack": "^5.90.0",
         "webpack-bundle-analyzer": "^4.10.1",
         "webpack-cli": "^5.1.4"
       },
diff --git a/package.json b/package.json
index df09866e6..27a402c21 100644
--- a/package.json
+++ b/package.json
@@ -75,7 +75,7 @@
     "lint": "concurrently \"npm run lint:js\" \"npm run lint:css\" && node build/catlog.js \"Linting passed\"",
     "lint:js": "eslint \"src/**/*.ts\" \"site/src/**/*.ts\" --max-warnings 3",
     "lint:css": "stylelint \"src/**/*.less\" \"site/src/**/*.less\"",
-    "prepare": "husky install && npm run build",
+    "prepare": "husky && npm run build",
     "preversion": "npm test",
     "version": "cross-env-shell \"npm version $npm_package_version --no-git-tag-version --ws\" && git add **/package*.json",
     "postpack": "npm pack --workspace eslint",
@@ -87,8 +87,8 @@
     "@types/youtube": "0.0.50"
   },
   "devDependencies": {
-    "@commitlint/cli": "^18.4.4",
-    "@commitlint/config-conventional": "^18.4.4",
+    "@commitlint/cli": "^18.5.0",
+    "@commitlint/config-conventional": "^18.5.0",
     "@exadel/eslint-plugin-esl": "file:eslint",
     "@semantic-release/changelog": "^6.0.3",
     "@semantic-release/commit-analyzer": "^11.1.0",
@@ -97,8 +97,8 @@
     "@semantic-release/npm": "^11.0.2",
     "@semantic-release/release-notes-generator": "^12.1.0",
     "@types/jest": "^29.5.11",
-    "@typescript-eslint/eslint-plugin": "^6.19.0",
-    "@typescript-eslint/parser": "^6.19.0",
+    "@typescript-eslint/eslint-plugin": "^6.19.1",
+    "@typescript-eslint/parser": "^6.19.1",
     "chokidar-cli": "^3.0.0",
     "concurrently": "^8.2.2",
     "copyfiles": "^2.4.1",
@@ -109,7 +109,7 @@
     "eslint-plugin-sonarjs": "^0.23.0",
     "eslint-plugin-tsdoc": "^0.2.17",
     "foreach-cli": "^1.8.1",
-    "husky": "^8.0.3",
+    "husky": "^9.0.2",
     "jest": "^29.7.0",
     "jest-environment-jsdom": "^29.7.0",
     "kleur": "^4.1.5",
@@ -123,7 +123,7 @@
     "smoothscroll-polyfill": "^0.4.4",
     "stylelint": "^16.2.0",
     "stylelint-prettier": "^5.0.0",
-    "ts-jest": "^29.1.1",
+    "ts-jest": "^29.1.2",
     "typescript": "5.3.3"
   },
   "browserslist": [
diff --git a/site/package.json b/site/package.json
index d274bd6ed..8471e31b0 100644
--- a/site/package.json
+++ b/site/package.json
@@ -39,7 +39,7 @@
     "prismjs": "^1.29.0",
     "smoothscroll-polyfill": "^0.4.4",
     "ts-loader": "^9.5.1",
-    "webpack": "^5.89.0",
+    "webpack": "^5.90.0",
     "webpack-bundle-analyzer": "^4.10.1",
     "webpack-cli": "^5.1.4"
   },
diff --git a/src/modules/esl-event-listener/core/targets/swipe.target.ts b/src/modules/esl-event-listener/core/targets/swipe.target.ts
index f8396c3a6..1e2aa493a 100644
--- a/src/modules/esl-event-listener/core/targets/swipe.target.ts
+++ b/src/modules/esl-event-listener/core/targets/swipe.target.ts
@@ -1,4 +1,5 @@
 import {SyntheticEventTarget} from '../../../esl-utils/dom/events/target';
+import {getParentScrollOffsets, isOffsetChanged} from '../../../esl-utils/dom/scroll';
 import {getTouchPoint, isMouseEvent, isTouchEvent} from '../../../esl-utils/dom/events/misc';
 import {resolveDomTarget} from '../../../esl-utils/abstract/dom-target';
 import {isElement} from '../../../esl-utils/dom/api';
@@ -7,6 +8,7 @@ import {resolveCSSSize} from '../../../esl-utils/dom/units';
 import {ESLEventListener} from '../listener';
 import {ESLSwipeGestureEvent} from './swipe.target.event';
 
+import type {ElementScrollOffset} from '../../../esl-utils/dom//scroll';
 import type {CSSSize} from '../../../esl-utils/dom/units';
 import type {SwipeDirection, ESLSwipeGestureEventInfo} from './swipe.target.event';
 import type {ESLDomElementTarget} from '../../../esl-utils/abstract/dom-target';
@@ -17,6 +19,8 @@ export {ESLSwipeGestureEvent};
  * Describes settings object that could be passed to {@link ESLSwipeGestureTarget.for} as optional parameter
  */
 export interface ESLSwipeGestureSetting {
+  /** Flag to indicate if the swipe event should not be dispatched if a scroll of content was detected (true by default) */
+  skipOnScroll?: boolean;
   /** The minimum distance to accept swipe (supports `px`, `vw` and `vh` units) */
   threshold?: CSSSize;
   /** The maximum duration between `ponterdown` and `pointerup` events */
@@ -28,6 +32,7 @@ export interface ESLSwipeGestureSetting {
  */
 export class ESLSwipeGestureTarget extends SyntheticEventTarget {
   protected static defaultConfig: Required<ESLSwipeGestureSetting> = {
+    skipOnScroll: true,
     threshold: '20px',
     timeout: 500
   };
@@ -49,6 +54,7 @@ export class ESLSwipeGestureTarget extends SyntheticEventTarget {
   protected readonly config: Required<ESLSwipeGestureSetting>;
 
   protected startEvent: PointerEvent;
+  protected startEventOffset: ElementScrollOffset[];
 
   protected constructor(
     protected readonly target: Element,
@@ -70,6 +76,7 @@ export class ESLSwipeGestureTarget extends SyntheticEventTarget {
    * @param startEvent - initial pointer event
    */
   protected handleStart(startEvent: PointerEvent): void {
+    this.startEventOffset = this.config.skipOnScroll ? getParentScrollOffsets(startEvent.target as Element, this.target) : [];
     this.startEvent = startEvent;
     ESLEventListener.subscribe(this, this.handleEnd, {
       event: this.endEventName,
@@ -119,6 +126,10 @@ export class ESLSwipeGestureTarget extends SyntheticEventTarget {
 
     // return if swipe took too long or distance is too short
     if (!this.isGestureAcceptable(eventDetails)) return;
+    if (this.config.skipOnScroll) {
+      const offsets = getParentScrollOffsets(endEvent.target as Element, this.target);
+      if (isOffsetChanged(this.startEventOffset.concat(offsets))) return;
+    }
 
     const event = ESLSwipeGestureEvent.fromConfig(this.target, eventDetails);
     // fire `swipe` event on the element that started the swipe
diff --git a/src/modules/esl-event-listener/core/targets/wheel.target.ts b/src/modules/esl-event-listener/core/targets/wheel.target.ts
index 468555f3f..5820d82f6 100644
--- a/src/modules/esl-event-listener/core/targets/wheel.target.ts
+++ b/src/modules/esl-event-listener/core/targets/wheel.target.ts
@@ -1,5 +1,6 @@
 import {SyntheticEventTarget} from '../../../esl-utils/dom/events/target';
 import {resolveDomTarget} from '../../../esl-utils/abstract/dom-target';
+import {getParentScrollOffsets, isOffsetChanged} from '../../../esl-utils/dom/scroll';
 import {isElement} from '../../../esl-utils/dom/api';
 import {bind} from '../../../esl-utils/decorators/bind';
 import {aggregate} from '../../../esl-utils/async/aggregate';
@@ -9,6 +10,7 @@ import {ESLWheelEvent} from './wheel.target.event';
 
 import type {ESLWheelEventInfo} from './wheel.target.event';
 import type {ESLDomElementTarget} from '../../../esl-utils/abstract/dom-target';
+import type {ElementScrollOffset} from '../../../esl-utils/dom/scroll';
 
 export {ESLWheelEvent};
 
@@ -16,6 +18,8 @@ export {ESLWheelEvent};
  * Describes settings object that could be passed to {@link ESLWheelTarget.for} as optional parameter
  */
 export interface ESLWheelTargetSetting {
+  /** Flag to indicate if the `longwheel` event shouldn't be dispatched if scroll of content was detected (true by default) */
+  skipOnScroll?: boolean;
   /** The minimum distance to accept as a long scroll */
   distance?: number;
   /** The maximum duration of the wheel events to consider it inertial */
@@ -27,12 +31,15 @@ export interface ESLWheelTargetSetting {
  */
 export class ESLWheelTarget extends SyntheticEventTarget {
   protected static defaultConfig: Required<ESLWheelTargetSetting> = {
+    skipOnScroll: true,
     distance: 400,
     timeout: 100
   };
 
   protected readonly config: Required<ESLWheelTargetSetting>;
 
+  protected scrollData: ElementScrollOffset[] = [];
+
   /** Function for aggregating wheel events into array of events */
   protected aggregateWheel: (event: WheelEvent) => void;
 
@@ -63,12 +70,20 @@ export class ESLWheelTarget extends SyntheticEventTarget {
   /** Handles wheel events */
   @bind
   protected _onWheel(event: WheelEvent): void {
+    if (this.config.skipOnScroll) {
+      const offsets = getParentScrollOffsets(event.target as Element, this.target);
+      this.scrollData = this.scrollData.concat(offsets);
+    }
     this.aggregateWheel(event);
   }
 
   /** Handles aggregated wheel events */
   protected handleAggregatedWheel(events: WheelEvent[]): void {
     const wheelInfo =  this.resolveEventDetails(events);
+
+    const isBlocked = isOffsetChanged(this.scrollData);
+    this.scrollData = [];
+    if (isBlocked) return;
     if (Math.abs(wheelInfo.deltaX) >= this.config.distance) this.dispatchWheelEvent('x', wheelInfo);
     if (Math.abs(wheelInfo.deltaY) >= this.config.distance) this.dispatchWheelEvent('y', wheelInfo);
   }
diff --git a/src/modules/esl-utils/dom/scroll/parent.ts b/src/modules/esl-utils/dom/scroll/parent.ts
index 7010fcf2f..0d97a9829 100644
--- a/src/modules/esl-utils/dom/scroll/parent.ts
+++ b/src/modules/esl-utils/dom/scroll/parent.ts
@@ -3,32 +3,36 @@ import {isElement, getNodeName, getParentNode} from '../api';
 /**
  * Get the list of all scroll parents, up the list of ancestors until we get to the top window object.
  * @param element - element for which you want to get the list of all scroll parents
- * @param list - array of elements to concatenate with the list of all scroll parents of element (optional)
+ * @param root - element which element considered a final scrollable parent target (optional, defaults to element.ownerDocument?.body)
  */
-export function getListScrollParents(element: Element, list: Element[] = []): Element[] {
-  const scrollParent = getScrollParent(element);
-  const isBody = scrollParent === element.ownerDocument?.body;
-  const target = isBody
-    ? isScrollable(scrollParent) ? scrollParent : []
-    : scrollParent;
-
-  const updatedList = list.concat(target);
-  return isBody
-    ? updatedList
-    : updatedList.concat(getListScrollParents(getParentNode(scrollParent) as Element));
+export function getListScrollParents(element: Element, root?: Element): Element[] {
+  const limitNode = root || element.ownerDocument?.body;
+  const scrollParent = getScrollParent(element, limitNode);
+  if (!scrollParent) return [];
+  const isScrollableTarget = scrollParent === limitNode;
+  if (isScrollableTarget) return isScrollable(scrollParent) ? [scrollParent] : [];
+  return [scrollParent].concat(getListScrollParents(getParentNode(scrollParent) as Element, limitNode));
 }
 
+/**
+ * Get the scroll parent of the specified element in the DOM tree.
+ * @param node - element for which to get the scroll parent
+ * @param root - element which element considered a final scrollable parent
+ */
+export function getScrollParent(node: Element, root: Element): Element | undefined;
 /**
  * Get the scroll parent of the specified element in the DOM tree.
  * @param node - element for which to get the scroll parent
  */
-export function getScrollParent(node: Element): Element {
+export function getScrollParent(node: Element): Element;
+export function getScrollParent(node: Element, root?: Element): Element | undefined {
   if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {
     return node.ownerDocument?.body as Element;
   }
 
   if (isElement(node) && isScrollable(node)) return node;
-  return getScrollParent(getParentNode(node) as Element);
+  if (node === root) return;
+  return getScrollParent(getParentNode(node) as Element, root!);
 }
 
 /**
diff --git a/src/modules/esl-utils/dom/scroll/utils.ts b/src/modules/esl-utils/dom/scroll/utils.ts
index 35401b5d5..be31ae2c8 100644
--- a/src/modules/esl-utils/dom/scroll/utils.ts
+++ b/src/modules/esl-utils/dom/scroll/utils.ts
@@ -1,4 +1,4 @@
-import {getScrollParent} from './parent';
+import {getListScrollParents, getScrollParent} from './parent';
 
 const $html = document.documentElement;
 
@@ -82,3 +82,17 @@ export function unlockScroll(target: Element = $html, options: ScrollLockOptions
   scrollable.removeAttribute('esl-scroll-lock');
   if (options.recursive && scrollable.parentElement) unlockScroll(scrollable.parentElement, options);
 }
+
+export interface ElementScrollOffset {
+  element: Element;
+  top: number;
+  left: number;
+}
+
+export function isOffsetChanged(offsets: ElementScrollOffset[]): boolean {
+  return offsets.some((element) => element.element.scrollTop !== element.top || element.element.scrollLeft !== element.left);
+}
+
+export function getParentScrollOffsets($el: Element, $topContainer: Element): ElementScrollOffset[] {
+  return getListScrollParents($el, $topContainer).map((el) => ({element: el, top: el.scrollTop, left: el.scrollLeft}));
+}


Test patch:
diff --git a/src/modules/esl-utils/dom/scroll/test/parent.test.ts b/src/modules/esl-utils/dom/scroll/test/parent.test.ts
index 78c81edb2..c87ca6bc5 100644
--- a/src/modules/esl-utils/dom/scroll/test/parent.test.ts
+++ b/src/modules/esl-utils/dom/scroll/test/parent.test.ts
@@ -86,6 +86,27 @@ describe('Function getScrollParent', () => {
       expect(getScrollParent(thirdLevelChild)).toEqual(target);
     });
   });
+
+  describe('Limit search to top target element', () => {
+    const firstLevelChild = document.createElement('div');
+    target.appendChild(firstLevelChild);
+
+    firstLevelChild.style.overflow = 'auto';
+
+    beforeAll(() => target.style.overflow = '');
+
+    test('should detect first scrollable parent element', () => {
+      expect(getScrollParent(firstLevelChild, target)).toEqual(firstLevelChild);
+    });
+
+    test('should accept body element as top target element', () => {
+      expect(getScrollParent(target, $body)).toEqual($body);
+    });
+
+    test('should return undefined if any scrollable parents found', () => {
+      expect(getScrollParent(target, target)).toEqual(undefined);
+    });
+  });
 });
 
 describe('Function getListScrollParents', () => {
@@ -120,4 +141,19 @@ describe('Function getListScrollParents', () => {
 
     expect(getListScrollParents(thirdLevelChild)).toEqual([thirdLevelChild, firstLevelChild, $body]);
   });
+
+  test('target should only detect scrollable elements up to top target element', () => {
+    const firstLevelChild = document.createElement('div');
+    const secondLevelChild = document.createElement('div');
+    const thirdLevelChild = document.createElement('div');
+
+    firstLevelChild.style.overflow = 'auto';
+    thirdLevelChild.style.overflow = 'auto';
+
+    secondLevelChild.appendChild(thirdLevelChild);
+    target.appendChild(firstLevelChild);
+    firstLevelChild.appendChild(secondLevelChild);
+
+    expect(getListScrollParents(thirdLevelChild, secondLevelChild)).toEqual([thirdLevelChild]);
+  });
 });