@foxford/ui 2.92.0-beta-c8e9f2e-20260116 → 2.92.0-beta-1231f93-20260120
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dts/index.d.ts
CHANGED
|
@@ -6061,7 +6061,7 @@ interface DialogBaseProps extends ResponsiveSizeProps<Size$a>, ResponsiveLayoutP
|
|
|
6061
6061
|
/**
|
|
6062
6062
|
* Контейнер, в котором разрешена прокрутка на iOS при заблокированном скролле страницы.
|
|
6063
6063
|
*/
|
|
6064
|
-
|
|
6064
|
+
iosAllowedScrollContainer?: HTMLElement;
|
|
6065
6065
|
};
|
|
6066
6066
|
/**
|
|
6067
6067
|
* Размер.
|
|
@@ -7463,7 +7463,7 @@ type ScrollLockParams = {
|
|
|
7463
7463
|
/**
|
|
7464
7464
|
* Контейнер, в котором разрешена прокрутка на iOS при заблокированном скролле страницы.
|
|
7465
7465
|
*/
|
|
7466
|
-
|
|
7466
|
+
iosAllowedScrollContainer?: HTMLElement;
|
|
7467
7467
|
};
|
|
7468
7468
|
declare function useScrollLock(params: ScrollLockParams): void;
|
|
7469
7469
|
|
package/hooks/useScrollLock.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var React=require('react');const TOUCH_EVENT_OPTIONS={capture:!0,passive:!1};const supportsScrollbarGutter=typeof CSS!='undefined'&&CSS.supports('scrollbar-gutter: stable');const isIosDevice=typeof window!='undefined'&&window.navigator?.userAgent&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||window.navigator.userAgent.includes('Macintosh')&&window.navigator.maxTouchPoints>1);const iosScrollableBlocks=[];let iosActiveScrollElement=null;let iosTouchStartY=null;let touchStartHandler=null;let touchMoveHandler=null;function getScrollLockCount(){return Number(document.documentElement.dataset.scrollLockCount||0)}function setScrollLockCount(t){document.documentElement.dataset.scrollLockCount=t.toString()}function applyScrollLockStyles(){const t=document.documentElement;if(t.dataset.prevOverflow=t.style.overflow||'',supportsScrollbarGutter&&!isIosDevice)t.style.scrollbarGutter='stable';else{const e=window.innerWidth-document.documentElement.clientWidth;if(t.dataset.prevPaddingRight=t.style.paddingRight||'',e>0){const o=parseInt(window.getComputedStyle(t).paddingRight||'0',10);t.style.paddingRight=`${o+e}px`}}t.style.overflow='hidden'}function resetScrollLockStyles(){const t=document.documentElement;t.style.overflow=t.dataset.prevOverflow||'',t.style.paddingRight=t.dataset.prevPaddingRight||'',delete t.dataset.prevOverflow,delete t.dataset.prevPaddingRight}function isScrollable(t){const e=getComputedStyle(t);return(e.overflowY==='auto'||e.overflowY==='scroll')&&t.scrollHeight>t.clientHeight}function findScrollableParent(t,e){let o=t;for(;o&&o!==e.parentElement;){if(isScrollable(o))return o;o=o.parentElement}return isScrollable(e)?e:null}exports.useScrollLock=t=>{const{locked:e,
|
|
1
|
+
'use strict';var React=require('react');const TOUCH_EVENT_OPTIONS={capture:!0,passive:!1};const supportsScrollbarGutter=typeof CSS!='undefined'&&CSS.supports('scrollbar-gutter: stable');const isIosDevice=typeof window!='undefined'&&window.navigator?.userAgent&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||window.navigator.userAgent.includes('Macintosh')&&window.navigator.maxTouchPoints>1);const iosScrollableBlocks=[];let iosActiveScrollElement=null;let iosTouchStartY=null;let touchStartHandler=null;let touchMoveHandler=null;function getScrollLockCount(){return Number(document.documentElement.dataset.scrollLockCount||0)}function setScrollLockCount(t){document.documentElement.dataset.scrollLockCount=t.toString()}function applyScrollLockStyles(){const t=document.documentElement;if(t.dataset.prevOverflow=t.style.overflow||'',supportsScrollbarGutter&&!isIosDevice)t.style.scrollbarGutter='stable';else{const e=window.innerWidth-document.documentElement.clientWidth;if(t.dataset.prevPaddingRight=t.style.paddingRight||'',e>0){const o=parseInt(window.getComputedStyle(t).paddingRight||'0',10);t.style.paddingRight=`${o+e}px`}}t.style.overflow='hidden'}function resetScrollLockStyles(){const t=document.documentElement;t.style.overflow=t.dataset.prevOverflow||'',t.style.paddingRight=t.dataset.prevPaddingRight||'',delete t.dataset.prevOverflow,delete t.dataset.prevPaddingRight}function isScrollable(t){const e=getComputedStyle(t);return(e.overflowY==='auto'||e.overflowY==='scroll')&&t.scrollHeight>t.clientHeight}function findScrollableParent(t,e){let o=t;for(;o&&o!==e.parentElement;){if(isScrollable(o))return o;o=o.parentElement}return isScrollable(e)?e:null}exports.useScrollLock=t=>{const{locked:e,iosAllowedScrollContainer:o=document.documentElement}=t;React.useEffect((()=>{if(e)return isIosDevice?((t=>{iosScrollableBlocks.push(t);const e=getScrollLockCount();e===0&&(applyScrollLockStyles(),touchMoveHandler||touchStartHandler||(touchStartHandler=t=>{const e=t.target;if(!(e instanceof HTMLElement))return iosActiveScrollElement=null,void(iosTouchStartY=null);iosTouchStartY=t.touches[0]?.clientY??null,iosActiveScrollElement=null;for(const t of iosScrollableBlocks)if(t.contains(e)){const o=findScrollableParent(e,t);if(o){iosActiveScrollElement=o;break}}},touchMoveHandler=t=>{const e=t.touches[0];if(!e||t.touches.length===2||(t=>{if(!(t&&t instanceof HTMLElement))return!1;const e=t.ownerDocument?.defaultView?.getSelection();return!(!e||e.isCollapsed||!e.containsNode(t,!0))||'selectionStart'in t&&'selectionEnd'in t&&Number(t.selectionStart)<Number(t.selectionEnd)&&t.ownerDocument?.activeElement===t})(t.target))return;if(!t.cancelable)return;if(!iosActiveScrollElement||iosTouchStartY===null)return void t.preventDefault();const o=e.clientY-Number(iosTouchStartY);(iosActiveScrollElement.scrollTop<=0&&o>0||iosActiveScrollElement.scrollTop+iosActiveScrollElement.clientHeight>=iosActiveScrollElement.scrollHeight&&o<0)&&t.preventDefault()},document.addEventListener('touchstart',touchStartHandler,TOUCH_EVENT_OPTIONS),document.addEventListener('touchmove',touchMoveHandler,TOUCH_EVENT_OPTIONS))),setScrollLockCount(e+1)})(o),()=>{(()=>{iosScrollableBlocks.pop();const t=getScrollLockCount();const e=Math.max(0,t-1);setScrollLockCount(e),e===0&&(resetScrollLockStyles(),touchStartHandler&&(document.removeEventListener('touchstart',touchStartHandler,TOUCH_EVENT_OPTIONS),touchStartHandler=null),touchMoveHandler&&(document.removeEventListener('touchmove',touchMoveHandler,TOUCH_EVENT_OPTIONS),touchMoveHandler=null),iosActiveScrollElement=null,iosTouchStartY=null)})()}):((()=>{const t=getScrollLockCount();t===0&&applyScrollLockStyles(),setScrollLockCount(t+1)})(),()=>{(()=>{const t=getScrollLockCount();if(t<=0)return;const e=t-1;setScrollLockCount(e),e===0&&resetScrollLockStyles()})()})}),[o,e])};
|
|
2
2
|
//# sourceMappingURL=useScrollLock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScrollLock.js","sources":["../../../src/hooks/useScrollLock.ts"],"sourcesContent":["import { useEffect } from 'react'\nimport type { Nullable } from 'shared/types'\n\ntype ScrollLockParams = {\n /**\n * Блокировать скролл.\n */\n locked: boolean\n /**\n * Контейнер, в котором разрешена прокрутка на iOS при заблокированном скролле страницы.\n */\n scrollableContainer?: HTMLElement\n}\n\nconst TOUCH_EVENT_OPTIONS = { capture: true, passive: false }\nconst DATA_SCROLL_LOCK_COUNT = 'scrollLockCount'\nconst DATA_PREV_OVERFLOW = 'prevOverflow'\nconst DATA_PREV_PADDING_RIGHT = 'prevPaddingRight'\n\nconst supportsScrollbarGutter = typeof CSS !== 'undefined' && CSS.supports('scrollbar-gutter: stable')\nconst isIosDevice =\n typeof window !== 'undefined' &&\n window.navigator?.userAgent &&\n (/iP(ad|hone|od)/.test(window.navigator.userAgent) ||\n (window.navigator.userAgent.includes('Macintosh') && window.navigator.maxTouchPoints > 1))\n\nconst iosScrollableBlocks: HTMLElement[] = []\nlet iosActiveScrollElement: Nullable<HTMLElement> = null\nlet iosTouchStartY: Nullable<number> = null\nlet touchStartHandler: Nullable<(event: TouchEvent) => void> = null\nlet touchMoveHandler: Nullable<(event: TouchEvent) => void> = null\n\nfunction getScrollLockCount(): number {\n return Number(document.documentElement.dataset[DATA_SCROLL_LOCK_COUNT] || 0)\n}\n\nfunction setScrollLockCount(count: number) {\n document.documentElement.dataset[DATA_SCROLL_LOCK_COUNT] = count.toString()\n}\n\nfunction applyScrollLockStyles() {\n const root = document.documentElement\n root.dataset[DATA_PREV_OVERFLOW] = root.style.overflow || ''\n\n if (supportsScrollbarGutter && !isIosDevice) {\n root.style.scrollbarGutter = 'stable'\n } else {\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n root.dataset[DATA_PREV_PADDING_RIGHT] = root.style.paddingRight || ''\n if (scrollbarWidth > 0) {\n const currentPaddingRight = parseInt(window.getComputedStyle(root).paddingRight || '0', 10)\n root.style.paddingRight = `${currentPaddingRight + scrollbarWidth}px`\n }\n }\n root.style.overflow = 'hidden'\n}\n\nfunction resetScrollLockStyles() {\n const root = document.documentElement\n root.style.overflow = root.dataset[DATA_PREV_OVERFLOW] || ''\n root.style.paddingRight = root.dataset[DATA_PREV_PADDING_RIGHT] || ''\n delete root.dataset[DATA_PREV_OVERFLOW]\n delete root.dataset[DATA_PREV_PADDING_RIGHT]\n}\n\nfunction lockScroll() {\n const count = getScrollLockCount()\n if (count === 0) {\n applyScrollLockStyles()\n }\n setScrollLockCount(count + 1)\n}\n\nfunction unlockScroll() {\n const currentCount = getScrollLockCount()\n if (currentCount <= 0) {\n return\n }\n\n const nextCount = currentCount - 1\n setScrollLockCount(nextCount)\n if (nextCount === 0) {\n resetScrollLockStyles()\n }\n}\n\nfunction isScrollable(element: HTMLElement): boolean {\n const style = getComputedStyle(element)\n const overflowY = style.overflowY === 'auto' || style.overflowY === 'scroll'\n\n return overflowY && element.scrollHeight > element.clientHeight\n}\n\nfunction findScrollableParent(startElement: HTMLElement, root: HTMLElement): Nullable<HTMLElement> {\n let element: Nullable<HTMLElement> = startElement\n\n while (element && element !== root.parentElement) {\n if (isScrollable(element)) {\n return element\n }\n\n element = element.parentElement\n }\n\n if (isScrollable(root)) {\n return root\n }\n\n return null\n}\n\nfunction isTouchMoveAllowed(target: Nullable<EventTarget>): boolean {\n if (!target || !(target instanceof HTMLElement)) {\n return false\n }\n\n const selection = target.ownerDocument?.defaultView?.getSelection()\n if (selection && !selection.isCollapsed && selection.containsNode(target, true)) {\n return true\n }\n\n if (\n 'selectionStart' in target &&\n 'selectionEnd' in target &&\n Number(target.selectionStart) < Number(target.selectionEnd) &&\n target.ownerDocument?.activeElement === target\n ) {\n return true\n }\n\n return false\n}\n\nfunction addIOSEvents() {\n if (touchMoveHandler || touchStartHandler) {\n return\n }\n\n touchStartHandler = (event: TouchEvent) => {\n const target = event.target\n if (!(target instanceof HTMLElement)) {\n iosActiveScrollElement = null\n iosTouchStartY = null\n\n return\n }\n\n iosTouchStartY = event.touches[0]?.clientY ?? null\n iosActiveScrollElement = null\n for (const block of iosScrollableBlocks) {\n if (block.contains(target)) {\n const scrollElement = findScrollableParent(target, block)\n if (scrollElement) {\n iosActiveScrollElement = scrollElement\n break\n }\n }\n }\n }\n\n touchMoveHandler = (event: TouchEvent) => {\n const touch = event.touches[0]\n if (!touch || event.touches.length === 2 || isTouchMoveAllowed(event.target)) {\n return\n }\n\n if (!event.cancelable) {\n return\n }\n\n if (!iosActiveScrollElement || iosTouchStartY === null) {\n event.preventDefault()\n\n return\n }\n\n const currentY = touch.clientY\n const deltaY = currentY - Number(iosTouchStartY)\n const atTop = iosActiveScrollElement.scrollTop <= 0\n const atBottom =\n iosActiveScrollElement.scrollTop + iosActiveScrollElement.clientHeight >= iosActiveScrollElement.scrollHeight\n if ((atTop && deltaY > 0) || (atBottom && deltaY < 0)) {\n event.preventDefault()\n }\n }\n\n document.addEventListener('touchstart', touchStartHandler, TOUCH_EVENT_OPTIONS)\n document.addEventListener('touchmove', touchMoveHandler, TOUCH_EVENT_OPTIONS)\n}\n\nfunction removeIOSEvents() {\n if (touchStartHandler) {\n document.removeEventListener('touchstart', touchStartHandler, TOUCH_EVENT_OPTIONS)\n touchStartHandler = null\n }\n if (touchMoveHandler) {\n document.removeEventListener('touchmove', touchMoveHandler, TOUCH_EVENT_OPTIONS)\n touchMoveHandler = null\n }\n iosActiveScrollElement = null\n iosTouchStartY = null\n}\n\nfunction lockScrollIOS(scrollableContainer: HTMLElement) {\n iosScrollableBlocks.push(scrollableContainer)\n const count = getScrollLockCount()\n if (count === 0) {\n applyScrollLockStyles()\n addIOSEvents()\n }\n setScrollLockCount(count + 1)\n}\n\nfunction unlockScrollIOS() {\n iosScrollableBlocks.pop()\n const count = getScrollLockCount()\n const nexCount = Math.max(0, count - 1)\n setScrollLockCount(nexCount)\n if (nexCount === 0) {\n resetScrollLockStyles()\n removeIOSEvents()\n }\n}\n\nfunction useScrollLock(params: ScrollLockParams) {\n const { locked, scrollableContainer = document.documentElement } = params\n\n useEffect(() => {\n if (!locked) {\n return\n }\n\n if (isIosDevice) {\n lockScrollIOS(scrollableContainer)\n\n return () => {\n unlockScrollIOS()\n }\n }\n\n lockScroll()\n\n return () => {\n unlockScroll()\n }\n }, [scrollableContainer, locked])\n}\n\nexport { useScrollLock }\n"],"names":["TOUCH_EVENT_OPTIONS","capture","passive","supportsScrollbarGutter","CSS","supports","isIosDevice","window","navigator","userAgent","test","includes","maxTouchPoints","iosScrollableBlocks","iosActiveScrollElement","iosTouchStartY","touchStartHandler","touchMoveHandler","getScrollLockCount","Number","document","documentElement","dataset","setScrollLockCount","count","toString","applyScrollLockStyles","root","style","overflow","scrollbarGutter","scrollbarWidth","innerWidth","clientWidth","paddingRight","currentPaddingRight","parseInt","getComputedStyle","resetScrollLockStyles","isScrollable","element","overflowY","scrollHeight","clientHeight","findScrollableParent","startElement","parentElement","params","locked","scrollableContainer","useEffect","push","event","target","HTMLElement","touches","clientY","block","contains","scrollElement","touch","length","selection","ownerDocument","defaultView","getSelection","isCollapsed","containsNode","selectionStart","selectionEnd","activeElement","isTouchMoveAllowed","cancelable","preventDefault","deltaY","scrollTop","addEventListener","lockScrollIOS","pop","nexCount","Math","max","removeEventListener","unlockScrollIOS","lockScroll","currentCount","nextCount","unlockScroll"],"mappings":"wCAcA,MAAMA,oBAAsB,CAAEC,SAAS,EAAMC,SAAS,GAKtD,MAAMC,+BAAiCC,KAAQ,aAAeA,IAAIC,SAAS,4BAC3E,MAAMC,mBACGC,QAAW,aAClBA,OAAOC,WAAWC,YACjB,iBAAiBC,KAAKH,OAAOC,UAAUC,YACrCF,OAAOC,UAAUC,UAAUE,SAAS,cAAgBJ,OAAOC,UAAUI,eAAiB,GAE3F,MAAMC,oBAAqC,GAC3C,IAAIC,uBAAgD,KACpD,IAAIC,eAAmC,KACvC,IAAIC,kBAA2D,KAC/D,IAAIC,iBAA0D,KAE9D,SAASC,qBACP,OAAOC,OAAOC,SAASC,gBAAgBC,QAA8B,iBAAK,EAC5E,CAEA,SAASC,mBAAmBC,GAC1BJ,SAASC,gBAAgBC,QAA8B,gBAAIE,EAAMC,UACnE,CAEA,SAASC,wBACP,MAAMC,EAAOP,SAASC,gBAGtB,GAFAM,EAAKL,QAA0B,aAAIK,EAAKC,MAAMC,UAAY,GAEtD1B,0BAA4BG,YAC9BqB,EAAKC,MAAME,gBAAkB,aACxB,CACL,MAAMC,EAAiBxB,OAAOyB,WAAaZ,SAASC,gBAAgBY,YAEpE,GADAN,EAAKL,QAA+B,iBAAIK,EAAKC,MAAMM,cAAgB,GAC/DH,EAAiB,EAAG,CACtB,MAAMI,EAAsBC,SAAS7B,OAAO8B,iBAAiBV,GAAMO,cAAgB,IAAK,IACxFP,EAAKC,MAAMM,aAAe,GAAGC,EAAsBJ,KACrD,CACF,CACAJ,EAAKC,MAAMC,SAAW,QACxB,CAEA,SAASS,wBACP,MAAMX,EAAOP,SAASC,gBACtBM,EAAKC,MAAMC,SAAWF,EAAKL,QAA0B,cAAK,GAC1DK,EAAKC,MAAMM,aAAeP,EAAKL,QAA+B,kBAAK,UAC5DK,EAAKL,QAA0B,oBAC/BK,EAAKL,QAA+B,gBAC7C,CAuBA,SAASiB,aAAaC,GACpB,MAAMZ,EAAQS,iBAAiBG,GAG/B,OAFkBZ,EAAMa,YAAc,QAAUb,EAAMa,YAAc,WAEhDD,EAAQE,aAAeF,EAAQG,YACrD,CAEA,SAASC,qBAAqBC,EAA2BlB,GACvD,IAAIa,EAAiCK,EAErC,KAAOL,GAAWA,IAAYb,EAAKmB,eAAe,CAChD,GAAIP,aAAaC,GACf,OAAOA,EAGTA,EAAUA,EAAQM,aACpB,CAEA,OAAIP,aAAaZ,GACRA,EAGF,IACT,uBAmHuBoB,IACrB,MAAMC,OAAEA,EAAMC,oBAAEA,EAAsB7B,SAASC,iBAAoB0B,EAEnEG,MAAAA,WAAU,KACR,GAAKF,EAIL,OAAI1C,aA7BR,CAAuB2C,IACrBpC,oBAAoBsC,KAAKF,GACzB,MAAMzB,EAAQN,qBACVM,IAAU,IACZE,wBAzEET,kBAAoBD,oBAIxBA,kBAAqBoC,IACnB,MAAMC,EAASD,EAAMC,OACrB,KAAMA,aAAkBC,aAItB,OAHAxC,uBAAyB,UACzBC,eAAiB,MAKnBA,eAAiBqC,EAAMG,QAAQ,IAAIC,SAAW,KAC9C1C,uBAAyB,KACzB,IAAK,MAAM2C,KAAS5C,oBAClB,GAAI4C,EAAMC,SAASL,GAAS,CAC1B,MAAMM,EAAgBf,qBAAqBS,EAAQI,GACnD,GAAIE,EAAe,CACjB7C,uBAAyB6C,EACzB,KACF,CACF,CACF,EAGF1C,iBAAoBmC,IAClB,MAAMQ,EAAQR,EAAMG,QAAQ,GAC5B,IAAKK,GAASR,EAAMG,QAAQM,SAAW,GAnD3C,CAA4BR,IAC1B,KAAKA,GAAYA,aAAkBC,aACjC,OAAO,EAGT,MAAMQ,EAAYT,EAAOU,eAAeC,aAAaC,eACrD,SAAIH,GAAcA,EAAUI,cAAeJ,EAAUK,aAAad,GAAQ,KAKxE,mBAAoBA,GACpB,iBAAkBA,GAClBlC,OAAOkC,EAAOe,gBAAkBjD,OAAOkC,EAAOgB,eAC9ChB,EAAOU,eAAeO,gBAAkBjB,CAM5C,EA+BgDkB,CAAmBnB,EAAMC,QACnE,OAGF,IAAKD,EAAMoB,WACT,OAGF,IAAK1D,wBAA0BC,iBAAmB,KAGhD,YAFAqC,EAAMqB,iBAMR,MAAMC,EADWd,EAAMJ,QACGrC,OAAOJ,iBACnBD,uBAAuB6D,WAAa,GAGpCD,EAAS,GADrB5D,uBAAuB6D,UAAY7D,uBAAuB6B,cAAgB7B,uBAAuB4B,cACzDgC,EAAS,IACjDtB,EAAMqB,gBACR,EAGFrD,SAASwD,iBAAiB,aAAc5D,kBAAmBhB,qBAC3DoB,SAASwD,iBAAiB,YAAa3D,iBAAkBjB,uBAuBzDuB,mBAAmBC,EAAQ,EAC7B,EAsBMqD,CAAc5B,GAEP,KAtBb,MACEpC,oBAAoBiE,MACpB,MAAMtD,EAAQN,qBACd,MAAM6D,EAAWC,KAAKC,IAAI,EAAGzD,EAAQ,GACrCD,mBAAmBwD,GACfA,IAAa,IACfzC,wBA5BEtB,oBACFI,SAAS8D,oBAAoB,aAAclE,kBAAmBhB,qBAC9DgB,kBAAoB,MAElBC,mBACFG,SAAS8D,oBAAoB,YAAajE,iBAAkBjB,qBAC5DiB,iBAAmB,MAErBH,uBAAyB,KACzBC,eAAiB,KAsBnB,EAcQoE,EAAiB,IA3KzB,MACE,MAAM3D,EAAQN,qBACVM,IAAU,GACZE,wBAEFH,mBAAmBC,EAAQ,EAC7B,EAyKI4D,GAEO,KAzKX,MACE,MAAMC,EAAenE,qBACrB,GAAImE,GAAgB,EAClB,OAGF,MAAMC,EAAYD,EAAe,EACjC9D,mBAAmB+D,GACfA,IAAc,GAChBhD,uBAEJ,EA+JMiD,EAAc,EACf,GACA,CAACtC,EAAqBD,GAC3B"}
|
|
1
|
+
{"version":3,"file":"useScrollLock.js","sources":["../../../src/hooks/useScrollLock.ts"],"sourcesContent":["import { useEffect } from 'react'\nimport type { Nullable } from 'shared/types'\n\ntype ScrollLockParams = {\n /**\n * Блокировать скролл.\n */\n locked: boolean\n /**\n * Контейнер, в котором разрешена прокрутка на iOS при заблокированном скролле страницы.\n */\n iosAllowedScrollContainer?: HTMLElement\n}\n\nconst TOUCH_EVENT_OPTIONS = { capture: true, passive: false }\nconst DATA_SCROLL_LOCK_COUNT = 'scrollLockCount'\nconst DATA_PREV_OVERFLOW = 'prevOverflow'\nconst DATA_PREV_PADDING_RIGHT = 'prevPaddingRight'\n\nconst supportsScrollbarGutter = typeof CSS !== 'undefined' && CSS.supports('scrollbar-gutter: stable')\nconst isIosDevice =\n typeof window !== 'undefined' &&\n window.navigator?.userAgent &&\n (/iP(ad|hone|od)/.test(window.navigator.userAgent) ||\n (window.navigator.userAgent.includes('Macintosh') && window.navigator.maxTouchPoints > 1))\n\nconst iosScrollableBlocks: HTMLElement[] = []\nlet iosActiveScrollElement: Nullable<HTMLElement> = null\nlet iosTouchStartY: Nullable<number> = null\nlet touchStartHandler: Nullable<(event: TouchEvent) => void> = null\nlet touchMoveHandler: Nullable<(event: TouchEvent) => void> = null\n\nfunction getScrollLockCount(): number {\n return Number(document.documentElement.dataset[DATA_SCROLL_LOCK_COUNT] || 0)\n}\n\nfunction setScrollLockCount(count: number) {\n document.documentElement.dataset[DATA_SCROLL_LOCK_COUNT] = count.toString()\n}\n\nfunction applyScrollLockStyles() {\n const root = document.documentElement\n root.dataset[DATA_PREV_OVERFLOW] = root.style.overflow || ''\n\n if (supportsScrollbarGutter && !isIosDevice) {\n root.style.scrollbarGutter = 'stable'\n } else {\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n root.dataset[DATA_PREV_PADDING_RIGHT] = root.style.paddingRight || ''\n if (scrollbarWidth > 0) {\n const currentPaddingRight = parseInt(window.getComputedStyle(root).paddingRight || '0', 10)\n root.style.paddingRight = `${currentPaddingRight + scrollbarWidth}px`\n }\n }\n root.style.overflow = 'hidden'\n}\n\nfunction resetScrollLockStyles() {\n const root = document.documentElement\n root.style.overflow = root.dataset[DATA_PREV_OVERFLOW] || ''\n root.style.paddingRight = root.dataset[DATA_PREV_PADDING_RIGHT] || ''\n delete root.dataset[DATA_PREV_OVERFLOW]\n delete root.dataset[DATA_PREV_PADDING_RIGHT]\n}\n\nfunction lockScroll() {\n const count = getScrollLockCount()\n if (count === 0) {\n applyScrollLockStyles()\n }\n setScrollLockCount(count + 1)\n}\n\nfunction unlockScroll() {\n const currentCount = getScrollLockCount()\n if (currentCount <= 0) {\n return\n }\n\n const nextCount = currentCount - 1\n setScrollLockCount(nextCount)\n if (nextCount === 0) {\n resetScrollLockStyles()\n }\n}\n\nfunction isScrollable(element: HTMLElement): boolean {\n const style = getComputedStyle(element)\n const overflowY = style.overflowY === 'auto' || style.overflowY === 'scroll'\n\n return overflowY && element.scrollHeight > element.clientHeight\n}\n\nfunction findScrollableParent(startElement: HTMLElement, root: HTMLElement): Nullable<HTMLElement> {\n let element: Nullable<HTMLElement> = startElement\n\n while (element && element !== root.parentElement) {\n if (isScrollable(element)) {\n return element\n }\n\n element = element.parentElement\n }\n\n if (isScrollable(root)) {\n return root\n }\n\n return null\n}\n\nfunction isTouchMoveAllowed(target: Nullable<EventTarget>): boolean {\n if (!target || !(target instanceof HTMLElement)) {\n return false\n }\n\n const selection = target.ownerDocument?.defaultView?.getSelection()\n if (selection && !selection.isCollapsed && selection.containsNode(target, true)) {\n return true\n }\n\n if (\n 'selectionStart' in target &&\n 'selectionEnd' in target &&\n Number(target.selectionStart) < Number(target.selectionEnd) &&\n target.ownerDocument?.activeElement === target\n ) {\n return true\n }\n\n return false\n}\n\nfunction addIOSEvents() {\n if (touchMoveHandler || touchStartHandler) {\n return\n }\n\n touchStartHandler = (event: TouchEvent) => {\n const target = event.target\n if (!(target instanceof HTMLElement)) {\n iosActiveScrollElement = null\n iosTouchStartY = null\n\n return\n }\n\n iosTouchStartY = event.touches[0]?.clientY ?? null\n iosActiveScrollElement = null\n for (const block of iosScrollableBlocks) {\n if (block.contains(target)) {\n const scrollElement = findScrollableParent(target, block)\n if (scrollElement) {\n iosActiveScrollElement = scrollElement\n break\n }\n }\n }\n }\n\n touchMoveHandler = (event: TouchEvent) => {\n const touch = event.touches[0]\n if (!touch || event.touches.length === 2 || isTouchMoveAllowed(event.target)) {\n return\n }\n\n if (!event.cancelable) {\n return\n }\n\n if (!iosActiveScrollElement || iosTouchStartY === null) {\n event.preventDefault()\n\n return\n }\n\n const currentY = touch.clientY\n const deltaY = currentY - Number(iosTouchStartY)\n const atTop = iosActiveScrollElement.scrollTop <= 0\n const atBottom =\n iosActiveScrollElement.scrollTop + iosActiveScrollElement.clientHeight >= iosActiveScrollElement.scrollHeight\n if ((atTop && deltaY > 0) || (atBottom && deltaY < 0)) {\n event.preventDefault()\n }\n }\n\n document.addEventListener('touchstart', touchStartHandler, TOUCH_EVENT_OPTIONS)\n document.addEventListener('touchmove', touchMoveHandler, TOUCH_EVENT_OPTIONS)\n}\n\nfunction removeIOSEvents() {\n if (touchStartHandler) {\n document.removeEventListener('touchstart', touchStartHandler, TOUCH_EVENT_OPTIONS)\n touchStartHandler = null\n }\n if (touchMoveHandler) {\n document.removeEventListener('touchmove', touchMoveHandler, TOUCH_EVENT_OPTIONS)\n touchMoveHandler = null\n }\n iosActiveScrollElement = null\n iosTouchStartY = null\n}\n\nfunction lockScrollIOS(scrollableContainer: HTMLElement) {\n iosScrollableBlocks.push(scrollableContainer)\n const count = getScrollLockCount()\n if (count === 0) {\n applyScrollLockStyles()\n addIOSEvents()\n }\n setScrollLockCount(count + 1)\n}\n\nfunction unlockScrollIOS() {\n iosScrollableBlocks.pop()\n const count = getScrollLockCount()\n const nexCount = Math.max(0, count - 1)\n setScrollLockCount(nexCount)\n if (nexCount === 0) {\n resetScrollLockStyles()\n removeIOSEvents()\n }\n}\n\nfunction useScrollLock(params: ScrollLockParams) {\n const { locked, iosAllowedScrollContainer = document.documentElement } = params\n\n useEffect(() => {\n if (!locked) {\n return\n }\n\n if (isIosDevice) {\n lockScrollIOS(iosAllowedScrollContainer)\n\n return () => {\n unlockScrollIOS()\n }\n }\n\n lockScroll()\n\n return () => {\n unlockScroll()\n }\n }, [iosAllowedScrollContainer, locked])\n}\n\nexport { useScrollLock }\n"],"names":["TOUCH_EVENT_OPTIONS","capture","passive","supportsScrollbarGutter","CSS","supports","isIosDevice","window","navigator","userAgent","test","includes","maxTouchPoints","iosScrollableBlocks","iosActiveScrollElement","iosTouchStartY","touchStartHandler","touchMoveHandler","getScrollLockCount","Number","document","documentElement","dataset","setScrollLockCount","count","toString","applyScrollLockStyles","root","style","overflow","scrollbarGutter","scrollbarWidth","innerWidth","clientWidth","paddingRight","currentPaddingRight","parseInt","getComputedStyle","resetScrollLockStyles","isScrollable","element","overflowY","scrollHeight","clientHeight","findScrollableParent","startElement","parentElement","params","locked","iosAllowedScrollContainer","useEffect","scrollableContainer","push","event","target","HTMLElement","touches","clientY","block","contains","scrollElement","touch","length","selection","ownerDocument","defaultView","getSelection","isCollapsed","containsNode","selectionStart","selectionEnd","activeElement","isTouchMoveAllowed","cancelable","preventDefault","deltaY","scrollTop","addEventListener","lockScrollIOS","pop","nexCount","Math","max","removeEventListener","unlockScrollIOS","lockScroll","currentCount","nextCount","unlockScroll"],"mappings":"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"}
|
package/hooks/useScrollLock.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useEffect}from'react';const TOUCH_EVENT_OPTIONS={capture:!0,passive:!1};const supportsScrollbarGutter=typeof CSS!='undefined'&&CSS.supports('scrollbar-gutter: stable');const isIosDevice=typeof window!='undefined'&&window.navigator?.userAgent&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||window.navigator.userAgent.includes('Macintosh')&&window.navigator.maxTouchPoints>1);const iosScrollableBlocks=[];let iosActiveScrollElement=null;let iosTouchStartY=null;let touchStartHandler=null;let touchMoveHandler=null;function getScrollLockCount(){return Number(document.documentElement.dataset.scrollLockCount||0)}function setScrollLockCount(t){document.documentElement.dataset.scrollLockCount=t.toString()}function applyScrollLockStyles(){const t=document.documentElement;if(t.dataset.prevOverflow=t.style.overflow||'',supportsScrollbarGutter&&!isIosDevice)t.style.scrollbarGutter='stable';else{const e=window.innerWidth-document.documentElement.clientWidth;if(t.dataset.prevPaddingRight=t.style.paddingRight||'',e>0){const o=parseInt(window.getComputedStyle(t).paddingRight||'0',10);t.style.paddingRight=`${o+e}px`}}t.style.overflow='hidden'}function resetScrollLockStyles(){const t=document.documentElement;t.style.overflow=t.dataset.prevOverflow||'',t.style.paddingRight=t.dataset.prevPaddingRight||'',delete t.dataset.prevOverflow,delete t.dataset.prevPaddingRight}function isScrollable(t){const e=getComputedStyle(t);return(e.overflowY==='auto'||e.overflowY==='scroll')&&t.scrollHeight>t.clientHeight}function findScrollableParent(t,e){let o=t;for(;o&&o!==e.parentElement;){if(isScrollable(o))return o;o=o.parentElement}return isScrollable(e)?e:null}function useScrollLock(t){const{locked:e,
|
|
1
|
+
import{useEffect}from'react';const TOUCH_EVENT_OPTIONS={capture:!0,passive:!1};const supportsScrollbarGutter=typeof CSS!='undefined'&&CSS.supports('scrollbar-gutter: stable');const isIosDevice=typeof window!='undefined'&&window.navigator?.userAgent&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||window.navigator.userAgent.includes('Macintosh')&&window.navigator.maxTouchPoints>1);const iosScrollableBlocks=[];let iosActiveScrollElement=null;let iosTouchStartY=null;let touchStartHandler=null;let touchMoveHandler=null;function getScrollLockCount(){return Number(document.documentElement.dataset.scrollLockCount||0)}function setScrollLockCount(t){document.documentElement.dataset.scrollLockCount=t.toString()}function applyScrollLockStyles(){const t=document.documentElement;if(t.dataset.prevOverflow=t.style.overflow||'',supportsScrollbarGutter&&!isIosDevice)t.style.scrollbarGutter='stable';else{const e=window.innerWidth-document.documentElement.clientWidth;if(t.dataset.prevPaddingRight=t.style.paddingRight||'',e>0){const o=parseInt(window.getComputedStyle(t).paddingRight||'0',10);t.style.paddingRight=`${o+e}px`}}t.style.overflow='hidden'}function resetScrollLockStyles(){const t=document.documentElement;t.style.overflow=t.dataset.prevOverflow||'',t.style.paddingRight=t.dataset.prevPaddingRight||'',delete t.dataset.prevOverflow,delete t.dataset.prevPaddingRight}function isScrollable(t){const e=getComputedStyle(t);return(e.overflowY==='auto'||e.overflowY==='scroll')&&t.scrollHeight>t.clientHeight}function findScrollableParent(t,e){let o=t;for(;o&&o!==e.parentElement;){if(isScrollable(o))return o;o=o.parentElement}return isScrollable(e)?e:null}function useScrollLock(t){const{locked:e,iosAllowedScrollContainer:o=document.documentElement}=t;useEffect((()=>{if(e)return isIosDevice?((t=>{iosScrollableBlocks.push(t);const e=getScrollLockCount();e===0&&(applyScrollLockStyles(),touchMoveHandler||touchStartHandler||(touchStartHandler=t=>{const e=t.target;if(!(e instanceof HTMLElement))return iosActiveScrollElement=null,void(iosTouchStartY=null);iosTouchStartY=t.touches[0]?.clientY??null,iosActiveScrollElement=null;for(const t of iosScrollableBlocks)if(t.contains(e)){const o=findScrollableParent(e,t);if(o){iosActiveScrollElement=o;break}}},touchMoveHandler=t=>{const e=t.touches[0];if(!e||t.touches.length===2||(t=>{if(!(t&&t instanceof HTMLElement))return!1;const e=t.ownerDocument?.defaultView?.getSelection();return!(!e||e.isCollapsed||!e.containsNode(t,!0))||'selectionStart'in t&&'selectionEnd'in t&&Number(t.selectionStart)<Number(t.selectionEnd)&&t.ownerDocument?.activeElement===t})(t.target))return;if(!t.cancelable)return;if(!iosActiveScrollElement||iosTouchStartY===null)return void t.preventDefault();const o=e.clientY-Number(iosTouchStartY);(iosActiveScrollElement.scrollTop<=0&&o>0||iosActiveScrollElement.scrollTop+iosActiveScrollElement.clientHeight>=iosActiveScrollElement.scrollHeight&&o<0)&&t.preventDefault()},document.addEventListener('touchstart',touchStartHandler,TOUCH_EVENT_OPTIONS),document.addEventListener('touchmove',touchMoveHandler,TOUCH_EVENT_OPTIONS))),setScrollLockCount(e+1)})(o),()=>{(()=>{iosScrollableBlocks.pop();const t=getScrollLockCount();const e=Math.max(0,t-1);setScrollLockCount(e),e===0&&(resetScrollLockStyles(),touchStartHandler&&(document.removeEventListener('touchstart',touchStartHandler,TOUCH_EVENT_OPTIONS),touchStartHandler=null),touchMoveHandler&&(document.removeEventListener('touchmove',touchMoveHandler,TOUCH_EVENT_OPTIONS),touchMoveHandler=null),iosActiveScrollElement=null,iosTouchStartY=null)})()}):((()=>{const t=getScrollLockCount();t===0&&applyScrollLockStyles(),setScrollLockCount(t+1)})(),()=>{(()=>{const t=getScrollLockCount();if(t<=0)return;const e=t-1;setScrollLockCount(e),e===0&&resetScrollLockStyles()})()})}),[o,e])}export{useScrollLock};
|
|
2
2
|
//# sourceMappingURL=useScrollLock.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScrollLock.mjs","sources":["../../../src/hooks/useScrollLock.ts"],"sourcesContent":["import { useEffect } from 'react'\nimport type { Nullable } from 'shared/types'\n\ntype ScrollLockParams = {\n /**\n * Блокировать скролл.\n */\n locked: boolean\n /**\n * Контейнер, в котором разрешена прокрутка на iOS при заблокированном скролле страницы.\n */\n scrollableContainer?: HTMLElement\n}\n\nconst TOUCH_EVENT_OPTIONS = { capture: true, passive: false }\nconst DATA_SCROLL_LOCK_COUNT = 'scrollLockCount'\nconst DATA_PREV_OVERFLOW = 'prevOverflow'\nconst DATA_PREV_PADDING_RIGHT = 'prevPaddingRight'\n\nconst supportsScrollbarGutter = typeof CSS !== 'undefined' && CSS.supports('scrollbar-gutter: stable')\nconst isIosDevice =\n typeof window !== 'undefined' &&\n window.navigator?.userAgent &&\n (/iP(ad|hone|od)/.test(window.navigator.userAgent) ||\n (window.navigator.userAgent.includes('Macintosh') && window.navigator.maxTouchPoints > 1))\n\nconst iosScrollableBlocks: HTMLElement[] = []\nlet iosActiveScrollElement: Nullable<HTMLElement> = null\nlet iosTouchStartY: Nullable<number> = null\nlet touchStartHandler: Nullable<(event: TouchEvent) => void> = null\nlet touchMoveHandler: Nullable<(event: TouchEvent) => void> = null\n\nfunction getScrollLockCount(): number {\n return Number(document.documentElement.dataset[DATA_SCROLL_LOCK_COUNT] || 0)\n}\n\nfunction setScrollLockCount(count: number) {\n document.documentElement.dataset[DATA_SCROLL_LOCK_COUNT] = count.toString()\n}\n\nfunction applyScrollLockStyles() {\n const root = document.documentElement\n root.dataset[DATA_PREV_OVERFLOW] = root.style.overflow || ''\n\n if (supportsScrollbarGutter && !isIosDevice) {\n root.style.scrollbarGutter = 'stable'\n } else {\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n root.dataset[DATA_PREV_PADDING_RIGHT] = root.style.paddingRight || ''\n if (scrollbarWidth > 0) {\n const currentPaddingRight = parseInt(window.getComputedStyle(root).paddingRight || '0', 10)\n root.style.paddingRight = `${currentPaddingRight + scrollbarWidth}px`\n }\n }\n root.style.overflow = 'hidden'\n}\n\nfunction resetScrollLockStyles() {\n const root = document.documentElement\n root.style.overflow = root.dataset[DATA_PREV_OVERFLOW] || ''\n root.style.paddingRight = root.dataset[DATA_PREV_PADDING_RIGHT] || ''\n delete root.dataset[DATA_PREV_OVERFLOW]\n delete root.dataset[DATA_PREV_PADDING_RIGHT]\n}\n\nfunction lockScroll() {\n const count = getScrollLockCount()\n if (count === 0) {\n applyScrollLockStyles()\n }\n setScrollLockCount(count + 1)\n}\n\nfunction unlockScroll() {\n const currentCount = getScrollLockCount()\n if (currentCount <= 0) {\n return\n }\n\n const nextCount = currentCount - 1\n setScrollLockCount(nextCount)\n if (nextCount === 0) {\n resetScrollLockStyles()\n }\n}\n\nfunction isScrollable(element: HTMLElement): boolean {\n const style = getComputedStyle(element)\n const overflowY = style.overflowY === 'auto' || style.overflowY === 'scroll'\n\n return overflowY && element.scrollHeight > element.clientHeight\n}\n\nfunction findScrollableParent(startElement: HTMLElement, root: HTMLElement): Nullable<HTMLElement> {\n let element: Nullable<HTMLElement> = startElement\n\n while (element && element !== root.parentElement) {\n if (isScrollable(element)) {\n return element\n }\n\n element = element.parentElement\n }\n\n if (isScrollable(root)) {\n return root\n }\n\n return null\n}\n\nfunction isTouchMoveAllowed(target: Nullable<EventTarget>): boolean {\n if (!target || !(target instanceof HTMLElement)) {\n return false\n }\n\n const selection = target.ownerDocument?.defaultView?.getSelection()\n if (selection && !selection.isCollapsed && selection.containsNode(target, true)) {\n return true\n }\n\n if (\n 'selectionStart' in target &&\n 'selectionEnd' in target &&\n Number(target.selectionStart) < Number(target.selectionEnd) &&\n target.ownerDocument?.activeElement === target\n ) {\n return true\n }\n\n return false\n}\n\nfunction addIOSEvents() {\n if (touchMoveHandler || touchStartHandler) {\n return\n }\n\n touchStartHandler = (event: TouchEvent) => {\n const target = event.target\n if (!(target instanceof HTMLElement)) {\n iosActiveScrollElement = null\n iosTouchStartY = null\n\n return\n }\n\n iosTouchStartY = event.touches[0]?.clientY ?? null\n iosActiveScrollElement = null\n for (const block of iosScrollableBlocks) {\n if (block.contains(target)) {\n const scrollElement = findScrollableParent(target, block)\n if (scrollElement) {\n iosActiveScrollElement = scrollElement\n break\n }\n }\n }\n }\n\n touchMoveHandler = (event: TouchEvent) => {\n const touch = event.touches[0]\n if (!touch || event.touches.length === 2 || isTouchMoveAllowed(event.target)) {\n return\n }\n\n if (!event.cancelable) {\n return\n }\n\n if (!iosActiveScrollElement || iosTouchStartY === null) {\n event.preventDefault()\n\n return\n }\n\n const currentY = touch.clientY\n const deltaY = currentY - Number(iosTouchStartY)\n const atTop = iosActiveScrollElement.scrollTop <= 0\n const atBottom =\n iosActiveScrollElement.scrollTop + iosActiveScrollElement.clientHeight >= iosActiveScrollElement.scrollHeight\n if ((atTop && deltaY > 0) || (atBottom && deltaY < 0)) {\n event.preventDefault()\n }\n }\n\n document.addEventListener('touchstart', touchStartHandler, TOUCH_EVENT_OPTIONS)\n document.addEventListener('touchmove', touchMoveHandler, TOUCH_EVENT_OPTIONS)\n}\n\nfunction removeIOSEvents() {\n if (touchStartHandler) {\n document.removeEventListener('touchstart', touchStartHandler, TOUCH_EVENT_OPTIONS)\n touchStartHandler = null\n }\n if (touchMoveHandler) {\n document.removeEventListener('touchmove', touchMoveHandler, TOUCH_EVENT_OPTIONS)\n touchMoveHandler = null\n }\n iosActiveScrollElement = null\n iosTouchStartY = null\n}\n\nfunction lockScrollIOS(scrollableContainer: HTMLElement) {\n iosScrollableBlocks.push(scrollableContainer)\n const count = getScrollLockCount()\n if (count === 0) {\n applyScrollLockStyles()\n addIOSEvents()\n }\n setScrollLockCount(count + 1)\n}\n\nfunction unlockScrollIOS() {\n iosScrollableBlocks.pop()\n const count = getScrollLockCount()\n const nexCount = Math.max(0, count - 1)\n setScrollLockCount(nexCount)\n if (nexCount === 0) {\n resetScrollLockStyles()\n removeIOSEvents()\n }\n}\n\nfunction useScrollLock(params: ScrollLockParams) {\n const { locked, scrollableContainer = document.documentElement } = params\n\n useEffect(() => {\n if (!locked) {\n return\n }\n\n if (isIosDevice) {\n lockScrollIOS(scrollableContainer)\n\n return () => {\n unlockScrollIOS()\n }\n }\n\n lockScroll()\n\n return () => {\n unlockScroll()\n }\n }, [scrollableContainer, locked])\n}\n\nexport { useScrollLock }\n"],"names":["TOUCH_EVENT_OPTIONS","capture","passive","supportsScrollbarGutter","CSS","supports","isIosDevice","window","navigator","userAgent","test","includes","maxTouchPoints","iosScrollableBlocks","iosActiveScrollElement","iosTouchStartY","touchStartHandler","touchMoveHandler","getScrollLockCount","Number","document","documentElement","dataset","setScrollLockCount","count","toString","applyScrollLockStyles","root","style","overflow","scrollbarGutter","scrollbarWidth","innerWidth","clientWidth","paddingRight","currentPaddingRight","parseInt","getComputedStyle","resetScrollLockStyles","isScrollable","element","overflowY","scrollHeight","clientHeight","findScrollableParent","startElement","parentElement","useScrollLock","params","locked","scrollableContainer","useEffect","push","event","target","HTMLElement","touches","clientY","block","contains","scrollElement","touch","length","selection","ownerDocument","defaultView","getSelection","isCollapsed","containsNode","selectionStart","selectionEnd","activeElement","isTouchMoveAllowed","cancelable","preventDefault","deltaY","scrollTop","addEventListener","lockScrollIOS","pop","nexCount","Math","max","removeEventListener","unlockScrollIOS","lockScroll","currentCount","nextCount","unlockScroll"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useScrollLock.mjs","sources":["../../../src/hooks/useScrollLock.ts"],"sourcesContent":["import { useEffect } from 'react'\nimport type { Nullable } from 'shared/types'\n\ntype ScrollLockParams = {\n /**\n * Блокировать скролл.\n */\n locked: boolean\n /**\n * Контейнер, в котором разрешена прокрутка на iOS при заблокированном скролле страницы.\n */\n iosAllowedScrollContainer?: HTMLElement\n}\n\nconst TOUCH_EVENT_OPTIONS = { capture: true, passive: false }\nconst DATA_SCROLL_LOCK_COUNT = 'scrollLockCount'\nconst DATA_PREV_OVERFLOW = 'prevOverflow'\nconst DATA_PREV_PADDING_RIGHT = 'prevPaddingRight'\n\nconst supportsScrollbarGutter = typeof CSS !== 'undefined' && CSS.supports('scrollbar-gutter: stable')\nconst isIosDevice =\n typeof window !== 'undefined' &&\n window.navigator?.userAgent &&\n (/iP(ad|hone|od)/.test(window.navigator.userAgent) ||\n (window.navigator.userAgent.includes('Macintosh') && window.navigator.maxTouchPoints > 1))\n\nconst iosScrollableBlocks: HTMLElement[] = []\nlet iosActiveScrollElement: Nullable<HTMLElement> = null\nlet iosTouchStartY: Nullable<number> = null\nlet touchStartHandler: Nullable<(event: TouchEvent) => void> = null\nlet touchMoveHandler: Nullable<(event: TouchEvent) => void> = null\n\nfunction getScrollLockCount(): number {\n return Number(document.documentElement.dataset[DATA_SCROLL_LOCK_COUNT] || 0)\n}\n\nfunction setScrollLockCount(count: number) {\n document.documentElement.dataset[DATA_SCROLL_LOCK_COUNT] = count.toString()\n}\n\nfunction applyScrollLockStyles() {\n const root = document.documentElement\n root.dataset[DATA_PREV_OVERFLOW] = root.style.overflow || ''\n\n if (supportsScrollbarGutter && !isIosDevice) {\n root.style.scrollbarGutter = 'stable'\n } else {\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n root.dataset[DATA_PREV_PADDING_RIGHT] = root.style.paddingRight || ''\n if (scrollbarWidth > 0) {\n const currentPaddingRight = parseInt(window.getComputedStyle(root).paddingRight || '0', 10)\n root.style.paddingRight = `${currentPaddingRight + scrollbarWidth}px`\n }\n }\n root.style.overflow = 'hidden'\n}\n\nfunction resetScrollLockStyles() {\n const root = document.documentElement\n root.style.overflow = root.dataset[DATA_PREV_OVERFLOW] || ''\n root.style.paddingRight = root.dataset[DATA_PREV_PADDING_RIGHT] || ''\n delete root.dataset[DATA_PREV_OVERFLOW]\n delete root.dataset[DATA_PREV_PADDING_RIGHT]\n}\n\nfunction lockScroll() {\n const count = getScrollLockCount()\n if (count === 0) {\n applyScrollLockStyles()\n }\n setScrollLockCount(count + 1)\n}\n\nfunction unlockScroll() {\n const currentCount = getScrollLockCount()\n if (currentCount <= 0) {\n return\n }\n\n const nextCount = currentCount - 1\n setScrollLockCount(nextCount)\n if (nextCount === 0) {\n resetScrollLockStyles()\n }\n}\n\nfunction isScrollable(element: HTMLElement): boolean {\n const style = getComputedStyle(element)\n const overflowY = style.overflowY === 'auto' || style.overflowY === 'scroll'\n\n return overflowY && element.scrollHeight > element.clientHeight\n}\n\nfunction findScrollableParent(startElement: HTMLElement, root: HTMLElement): Nullable<HTMLElement> {\n let element: Nullable<HTMLElement> = startElement\n\n while (element && element !== root.parentElement) {\n if (isScrollable(element)) {\n return element\n }\n\n element = element.parentElement\n }\n\n if (isScrollable(root)) {\n return root\n }\n\n return null\n}\n\nfunction isTouchMoveAllowed(target: Nullable<EventTarget>): boolean {\n if (!target || !(target instanceof HTMLElement)) {\n return false\n }\n\n const selection = target.ownerDocument?.defaultView?.getSelection()\n if (selection && !selection.isCollapsed && selection.containsNode(target, true)) {\n return true\n }\n\n if (\n 'selectionStart' in target &&\n 'selectionEnd' in target &&\n Number(target.selectionStart) < Number(target.selectionEnd) &&\n target.ownerDocument?.activeElement === target\n ) {\n return true\n }\n\n return false\n}\n\nfunction addIOSEvents() {\n if (touchMoveHandler || touchStartHandler) {\n return\n }\n\n touchStartHandler = (event: TouchEvent) => {\n const target = event.target\n if (!(target instanceof HTMLElement)) {\n iosActiveScrollElement = null\n iosTouchStartY = null\n\n return\n }\n\n iosTouchStartY = event.touches[0]?.clientY ?? null\n iosActiveScrollElement = null\n for (const block of iosScrollableBlocks) {\n if (block.contains(target)) {\n const scrollElement = findScrollableParent(target, block)\n if (scrollElement) {\n iosActiveScrollElement = scrollElement\n break\n }\n }\n }\n }\n\n touchMoveHandler = (event: TouchEvent) => {\n const touch = event.touches[0]\n if (!touch || event.touches.length === 2 || isTouchMoveAllowed(event.target)) {\n return\n }\n\n if (!event.cancelable) {\n return\n }\n\n if (!iosActiveScrollElement || iosTouchStartY === null) {\n event.preventDefault()\n\n return\n }\n\n const currentY = touch.clientY\n const deltaY = currentY - Number(iosTouchStartY)\n const atTop = iosActiveScrollElement.scrollTop <= 0\n const atBottom =\n iosActiveScrollElement.scrollTop + iosActiveScrollElement.clientHeight >= iosActiveScrollElement.scrollHeight\n if ((atTop && deltaY > 0) || (atBottom && deltaY < 0)) {\n event.preventDefault()\n }\n }\n\n document.addEventListener('touchstart', touchStartHandler, TOUCH_EVENT_OPTIONS)\n document.addEventListener('touchmove', touchMoveHandler, TOUCH_EVENT_OPTIONS)\n}\n\nfunction removeIOSEvents() {\n if (touchStartHandler) {\n document.removeEventListener('touchstart', touchStartHandler, TOUCH_EVENT_OPTIONS)\n touchStartHandler = null\n }\n if (touchMoveHandler) {\n document.removeEventListener('touchmove', touchMoveHandler, TOUCH_EVENT_OPTIONS)\n touchMoveHandler = null\n }\n iosActiveScrollElement = null\n iosTouchStartY = null\n}\n\nfunction lockScrollIOS(scrollableContainer: HTMLElement) {\n iosScrollableBlocks.push(scrollableContainer)\n const count = getScrollLockCount()\n if (count === 0) {\n applyScrollLockStyles()\n addIOSEvents()\n }\n setScrollLockCount(count + 1)\n}\n\nfunction unlockScrollIOS() {\n iosScrollableBlocks.pop()\n const count = getScrollLockCount()\n const nexCount = Math.max(0, count - 1)\n setScrollLockCount(nexCount)\n if (nexCount === 0) {\n resetScrollLockStyles()\n removeIOSEvents()\n }\n}\n\nfunction useScrollLock(params: ScrollLockParams) {\n const { locked, iosAllowedScrollContainer = document.documentElement } = params\n\n useEffect(() => {\n if (!locked) {\n return\n }\n\n if (isIosDevice) {\n lockScrollIOS(iosAllowedScrollContainer)\n\n return () => {\n unlockScrollIOS()\n }\n }\n\n lockScroll()\n\n return () => {\n unlockScroll()\n }\n }, [iosAllowedScrollContainer, locked])\n}\n\nexport { useScrollLock }\n"],"names":["TOUCH_EVENT_OPTIONS","capture","passive","supportsScrollbarGutter","CSS","supports","isIosDevice","window","navigator","userAgent","test","includes","maxTouchPoints","iosScrollableBlocks","iosActiveScrollElement","iosTouchStartY","touchStartHandler","touchMoveHandler","getScrollLockCount","Number","document","documentElement","dataset","setScrollLockCount","count","toString","applyScrollLockStyles","root","style","overflow","scrollbarGutter","scrollbarWidth","innerWidth","clientWidth","paddingRight","currentPaddingRight","parseInt","getComputedStyle","resetScrollLockStyles","isScrollable","element","overflowY","scrollHeight","clientHeight","findScrollableParent","startElement","parentElement","useScrollLock","params","locked","iosAllowedScrollContainer","useEffect","scrollableContainer","push","event","target","HTMLElement","touches","clientY","block","contains","scrollElement","touch","length","selection","ownerDocument","defaultView","getSelection","isCollapsed","containsNode","selectionStart","selectionEnd","activeElement","isTouchMoveAllowed","cancelable","preventDefault","deltaY","scrollTop","addEventListener","lockScrollIOS","pop","nexCount","Math","max","removeEventListener","unlockScrollIOS","lockScroll","currentCount","nextCount","unlockScroll"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foxford/ui",
|
|
3
|
-
"version": "2.92.0-beta-
|
|
3
|
+
"version": "2.92.0-beta-1231f93-20260120",
|
|
4
4
|
"description": "UI components and utilities",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/foxford/ui/issues"
|
|
@@ -63,6 +63,6 @@
|
|
|
63
63
|
"shared",
|
|
64
64
|
"theme"
|
|
65
65
|
],
|
|
66
|
-
"sha": "
|
|
66
|
+
"sha": "1231f93",
|
|
67
67
|
"scripts": {}
|
|
68
68
|
}
|