@hh.ru/magritte-ui-scrollable-container 4.4.7 → 4.5.0
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/ScrollableContainer.js +1 -1
- package/ScrollableItem.js +1 -1
- package/index.css +547 -547
- package/index.js +1 -1
- package/index.mock.js +1 -1
- package/package.json +10 -10
- package/types.d.ts +1 -0
- package/types.js.map +1 -1
- package/{useScrollContainer-LmCy1Ope.js → useScrollContainer-DzOh_Ayb.js} +38 -10
- package/useScrollContainer-DzOh_Ayb.js.map +1 -0
- package/useScrollContainer.js +1 -1
- package/utils.d.ts +0 -4
- package/utils.js +1 -17
- package/utils.js.map +1 -1
- package/useScrollContainer-LmCy1Ope.js.map +0 -1
package/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import '@hh.ru/magritte-ui-action';
|
|
|
8
8
|
import '@hh.ru/magritte-ui-breakpoint';
|
|
9
9
|
import '@hh.ru/magritte-ui-dot-pages';
|
|
10
10
|
import '@hh.ru/magritte-ui-icon/icon';
|
|
11
|
-
import './useScrollContainer-
|
|
11
|
+
import './useScrollContainer-DzOh_Ayb.js';
|
|
12
12
|
import '@hh.ru/magritte-internal-custom-scroll';
|
|
13
13
|
import './types.js';
|
|
14
14
|
import './utils.js';
|
package/index.mock.js
CHANGED
|
@@ -8,7 +8,7 @@ import '@hh.ru/magritte-ui-action';
|
|
|
8
8
|
import '@hh.ru/magritte-ui-breakpoint';
|
|
9
9
|
import '@hh.ru/magritte-ui-dot-pages';
|
|
10
10
|
import '@hh.ru/magritte-ui-icon/icon';
|
|
11
|
-
import './useScrollContainer-
|
|
11
|
+
import './useScrollContainer-DzOh_Ayb.js';
|
|
12
12
|
import '@hh.ru/magritte-internal-custom-scroll';
|
|
13
13
|
import './types.js';
|
|
14
14
|
import './utils.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-ui-scrollable-container",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -20,14 +20,14 @@
|
|
|
20
20
|
"watch": "yarn root:watch $(pwd)"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@hh.ru/magritte-design-tokens": "20.0.
|
|
24
|
-
"@hh.ru/magritte-internal-custom-scroll": "1.3.
|
|
25
|
-
"@hh.ru/magritte-ui-action": "4.4.
|
|
26
|
-
"@hh.ru/magritte-ui-breakpoint": "4.1.
|
|
27
|
-
"@hh.ru/magritte-ui-dot-pages": "3.0.
|
|
28
|
-
"@hh.ru/magritte-ui-icon": "7.9.
|
|
29
|
-
"@hh.ru/magritte-ui-mock-component": "1.0.
|
|
30
|
-
"@hh.ru/magritte-ui-spacing": "2.0.
|
|
23
|
+
"@hh.ru/magritte-design-tokens": "20.0.2",
|
|
24
|
+
"@hh.ru/magritte-internal-custom-scroll": "1.3.2",
|
|
25
|
+
"@hh.ru/magritte-ui-action": "4.4.19",
|
|
26
|
+
"@hh.ru/magritte-ui-breakpoint": "4.1.1",
|
|
27
|
+
"@hh.ru/magritte-ui-dot-pages": "3.0.14",
|
|
28
|
+
"@hh.ru/magritte-ui-icon": "7.9.8",
|
|
29
|
+
"@hh.ru/magritte-ui-mock-component": "1.0.12",
|
|
30
|
+
"@hh.ru/magritte-ui-spacing": "2.0.35"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"classnames": ">=2.3.2",
|
|
@@ -36,5 +36,5 @@
|
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public"
|
|
38
38
|
},
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "cefaeeef963e6627c0fc859d333843d03a043de1"
|
|
40
40
|
}
|
package/types.d.ts
CHANGED
package/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import { HTMLAttributes, RefObject, Dispatch, SetStateAction } from 'react';\n\nimport { DotPagesProps } from '@hh.ru/magritte-ui-dot-pages';\n\nexport const OFFSET_ATTR = Symbol('scroll-item-offset');\n\nexport interface ItemWithOffset {\n [OFFSET_ATTR]: { left: number; right: number };\n}\n\n/**\n * Переменные полностью описывающие состояние скролла, хранятся в одном объекте, чтобы не плодить\n * кучу ref'ов и передавать всё состояние в функции одним аргументом, а не длинным списком переменных\n */\nexport interface ScrollInternalState {\n /** реф на внешнюю обертку, на нее добавляются классы для фейдв по краям и показа/скрытия кнопок скролла */\n wrapperRef: RefObject<HTMLDivElement>;\n /** контейнер с помощью изменения положения которого обеспечивается скролл */\n positionContainerRef: RefObject<HTMLDivElement>;\n /** контейнер в котором лежит еонтейнер позиционирования, определяет видимую область */\n containerRef: RefObject<HTMLDivElement>;\n /** ширина контейнера позиционирования */\n positionContainerWidth: number;\n /** сдвиг контейнера позиционирования относительно родителя */\n positionContainerTranslation: number;\n /** ширина контейнера определяющего видимую область */\n containerWidth: number;\n /** список элементов которые скроллятся */\n items: RefObject<HTMLElement & ItemWithOffset>[];\n /** размер коррекции отступов */\n correction: { leftCorrection: number; rightCorrection: number };\n /** флаг режима без кнопок */\n disableButtons: boolean;\n /**\n * флаг сигнализирующий о том, что происходит анимация подскролла к элементу\n * когда флаг установлен отключаются обработчики wheel и touch cобытий\n * */\n scrollAnimationInProgress: boolean;\n scrollToItemInProgress: RefObject<unknown> | null;\n /**\n * если при маунте дочерних компонентов был вызван scrollToItem, то элемент к которому нужно\n * подскроллить сохраняется здесь мы не можем сразу после маунта скроллить, т.к. неизвестна ширина\n * контейнера позиционирования, кроме того в этом случае подскролл должен происходить без анимации\n */\n scrollToOnMount: RefObject<HTMLElement> | null;\n /**\n * флаг, сигнализирующий о том, что в контейнере зарегистрированы элементы, для которых не произведен расчет позиции\n * это может произойти из-за того, что расчет позиции дебаунсится\n * при наличии этого флага во всех функциях оcуществляющих скролл нужно предварительно синхронно рассчитать позиции\n * всех зарегистрированных элементов\n */\n recalcRequired: boolean;\n /** нужно ли центрировать элемент при событии touchend/inertial end animate */\n needCorrectionOnScrollEnd: boolean;\n /** флаг режима для dot pages */\n showDotPages: boolean;\n /** текущий dot */\n activeDot: number;\n /** экшн для обновления dot */\n setActiveDot: Dispatch<SetStateAction<number>>;\n setCountItems: Dispatch<SetStateAction<number>>;\n /** элемент, на котором был пользователь до скролла */\n previousActiveIndexItem: number;\n /** направление скролла */\n directionRight: boolean;\n /** Колбэк при прокрутке контейнера */\n onScroll?: () => void;\n}\n\nexport interface ScrollableControls {\n /** двигаем ScrollableContainer налево*/\n scrollLeft: () => void;\n /** двигаем ScrollableContainer направо*/\n scrollRight: () => void;\n /** двигаем ScrollableContainer к первому элементу*/\n scrollToFirstItem: () => void;\n /** двигаем ScrollableContainer к последнему элементу*/\n scrollToLastItem: () => void;\n /** функция, возвращающая флаг возможности прокрутки ScrollableContainer вправо */\n isScrollRightEnabled: () => boolean;\n /** функция, возвращающая флаг возможности прокрутки ScrollableContainer влево */\n isScrollLeftEnabled: () => boolean;\n}\n\n/**\n * Пропы для настройки коррекции отступов в режиме без кнопок, когда надо чтобы край скролла соответствовал\n * краю родительского контейнера, у которого могут быть отступы. Задаются в виде положительного числа.\n * более специфичные пропсы переопределяют менее специфичные. При выборе значения коррекции для разрешения выбирается\n * ближайшее заданное значение для разрешений меньшего или равного размера. Т.е. если задано correction и correctionM,\n * то для разрешений S и XS будет использовано correction, а для остальных correctionM. Если задано\n * еще и correctionLeftM, то для разрешений начиная с M и больше для левого края будет использовано\n * correctionLeftM, а для правого correctionM.\n */\nexport interface SpacingCorrectionProps {\n /** Величина коррекции отступа, положительное число или 0 */\n correction?: number;\n /** Величина коррекции отступа для разрешения XS и больше, положительное число или 0 */\n correctionXS?: number;\n /** Величина коррекции отступа для разрешения S и больше, положительное число или 0 */\n correctionS?: number;\n /** Величина коррекции отступа для разрешения M и больше, положительное число или 0 */\n correctionM?: number;\n /** Величина коррекции отступа для разрешения L и больше, положительное число или 0 */\n correctionL?: number;\n /** Величина коррекции отступа для разрешения XL и больше, положительное число или 0 */\n correctionXL?: number;\n /** Величина коррекции отступа для разрешения XXL и больше, положительное число или 0 */\n correctionXXL?: number;\n /** Величина коррекции отступа слева для разрешения XS и больше, положительное число или 0 */\n correctionLeftXS?: number;\n /** Величина коррекции левого отступа для разрешения S и больше, положительное число или 0 */\n correctionLeftS?: number;\n /** Величина коррекции левого отступа для разрешения M и больше, положительное число или 0 */\n correctionLeftM?: number;\n /** Величина коррекции левого отступа для разрешения L и больше, положительное число или 0 */\n correctionLeftL?: number;\n /** Величина коррекции левого отступа для разрешения XL и больше, положительное число или 0 */\n correctionLeftXL?: number;\n /** Величина коррекции левого отступа для разрешения XXL и больше, положительное число или 0 */\n correctionLeftXXL?: number;\n /** Величина коррекции отступа справа для разрешения XS и больше, положительное число или 0 */\n correctionRightXS?: number;\n /** Величина коррекции отступа справа для разрешения S и больше, положительное число или 0 */\n correctionRightS?: number;\n /** Величина коррекции отступа справа для разрешения M и больше, положительное число или 0 */\n correctionRightM?: number;\n /** Величина коррекции отступа справа для разрешения L и больше, положительное число или 0 */\n correctionRightL?: number;\n /** Величина коррекции отступа справа для разрешения XL и больше, положительное число или 0 */\n correctionRightXL?: number;\n /** Величина коррекции отступа справа для разрешения XXL и больше, положительное число или 0 */\n correctionRightXXL?: number;\n}\n\nexport interface ScrollableContainerBaseProps {\n /** Нужно ли показывать кнопки навигации (предпологает использование `correction`)*/\n disableButtons?: boolean;\n /** Нужно ли показывать dot-pages*/\n showDotPages?: boolean;\n /** Колбэк при изменении active dot в компоненте dot-pages*/\n onChangeDot?: (dot: number) => void;\n /** Свойства dot-pages*/\n dotPagesProps?: Omit<DotPagesProps, 'active' | 'count' | 'data-qa'>;\n /** Колбэк при прокрутке контейнера */\n onScroll?: () => void;\n}\n\nexport type ScrollableContainerProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n keyof SpacingCorrectionProps | 'disableButtons' | 'onScroll'\n> &\n ScrollableContainerBaseProps &\n SpacingCorrectionProps;\n"],"names":[],"mappings":"MAIa,WAAW,GAAG,MAAM,CAAC,oBAAoB;;;;"}
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import { HTMLAttributes, RefObject, Dispatch, SetStateAction } from 'react';\n\nimport { DotPagesProps } from '@hh.ru/magritte-ui-dot-pages';\n\nexport const OFFSET_ATTR = Symbol('scroll-item-offset');\n\nexport interface ItemWithOffset {\n [OFFSET_ATTR]: { left: number; right: number };\n}\n\n/**\n * Переменные полностью описывающие состояние скролла, хранятся в одном объекте, чтобы не плодить\n * кучу ref'ов и передавать всё состояние в функции одним аргументом, а не длинным списком переменных\n */\nexport interface ScrollInternalState {\n /** реф на внешнюю обертку, на нее добавляются классы для фейдв по краям и показа/скрытия кнопок скролла */\n wrapperRef: RefObject<HTMLDivElement>;\n /** контейнер с помощью изменения положения которого обеспечивается скролл */\n positionContainerRef: RefObject<HTMLDivElement>;\n /** контейнер в котором лежит еонтейнер позиционирования, определяет видимую область */\n containerRef: RefObject<HTMLDivElement>;\n /** ширина контейнера позиционирования */\n positionContainerWidth: number;\n /** сдвиг контейнера позиционирования относительно родителя */\n positionContainerTranslation: number;\n /** ширина контейнера определяющего видимую область */\n containerWidth: number;\n /** список элементов которые скроллятся */\n items: RefObject<HTMLElement & ItemWithOffset>[];\n /** размер коррекции отступов */\n correction: { leftCorrection: number; rightCorrection: number };\n /** флаг режима без кнопок */\n disableButtons: boolean;\n /**\n * флаг сигнализирующий о том, что происходит анимация подскролла к элементу\n * когда флаг установлен отключаются обработчики wheel и touch cобытий\n * */\n scrollAnimationInProgress: boolean;\n scrollToItemInProgress: RefObject<unknown> | null;\n /**\n * если при маунте дочерних компонентов был вызван scrollToItem, то элемент к которому нужно\n * подскроллить сохраняется здесь мы не можем сразу после маунта скроллить, т.к. неизвестна ширина\n * контейнера позиционирования, кроме того в этом случае подскролл должен происходить без анимации\n */\n scrollToOnMount: RefObject<HTMLElement> | null;\n /**\n * флаг, сигнализирующий о том, что в контейнере зарегистрированы элементы, для которых не произведен расчет позиции\n * это может произойти из-за того, что расчет позиции дебаунсится\n * при наличии этого флага во всех функциях оcуществляющих скролл нужно предварительно синхронно рассчитать позиции\n * всех зарегистрированных элементов\n */\n recalcRequired: boolean;\n /** нужно ли центрировать элемент при событии touchend/inertial end animate */\n needCorrectionOnScrollEnd: boolean;\n /** флаг режима для dot pages */\n showDotPages: boolean;\n /** текущий dot */\n activeDot: number;\n /** экшн для обновления dot */\n setActiveDot: Dispatch<SetStateAction<number>>;\n setCountItems: Dispatch<SetStateAction<number>>;\n /** элемент, на котором был пользователь до скролла */\n previousActiveIndexItem: number;\n /** направление скролла */\n directionRight: boolean;\n /** Колбэк при прокрутке контейнера */\n onScroll?: () => void;\n /* Было ли взаимодействие с компонентом - скролл или прокрутка к элементу */\n wasInteracted: boolean;\n}\n\nexport interface ScrollableControls {\n /** двигаем ScrollableContainer налево*/\n scrollLeft: () => void;\n /** двигаем ScrollableContainer направо*/\n scrollRight: () => void;\n /** двигаем ScrollableContainer к первому элементу*/\n scrollToFirstItem: () => void;\n /** двигаем ScrollableContainer к последнему элементу*/\n scrollToLastItem: () => void;\n /** функция, возвращающая флаг возможности прокрутки ScrollableContainer вправо */\n isScrollRightEnabled: () => boolean;\n /** функция, возвращающая флаг возможности прокрутки ScrollableContainer влево */\n isScrollLeftEnabled: () => boolean;\n}\n\n/**\n * Пропы для настройки коррекции отступов в режиме без кнопок, когда надо чтобы край скролла соответствовал\n * краю родительского контейнера, у которого могут быть отступы. Задаются в виде положительного числа.\n * более специфичные пропсы переопределяют менее специфичные. При выборе значения коррекции для разрешения выбирается\n * ближайшее заданное значение для разрешений меньшего или равного размера. Т.е. если задано correction и correctionM,\n * то для разрешений S и XS будет использовано correction, а для остальных correctionM. Если задано\n * еще и correctionLeftM, то для разрешений начиная с M и больше для левого края будет использовано\n * correctionLeftM, а для правого correctionM.\n */\nexport interface SpacingCorrectionProps {\n /** Величина коррекции отступа, положительное число или 0 */\n correction?: number;\n /** Величина коррекции отступа для разрешения XS и больше, положительное число или 0 */\n correctionXS?: number;\n /** Величина коррекции отступа для разрешения S и больше, положительное число или 0 */\n correctionS?: number;\n /** Величина коррекции отступа для разрешения M и больше, положительное число или 0 */\n correctionM?: number;\n /** Величина коррекции отступа для разрешения L и больше, положительное число или 0 */\n correctionL?: number;\n /** Величина коррекции отступа для разрешения XL и больше, положительное число или 0 */\n correctionXL?: number;\n /** Величина коррекции отступа для разрешения XXL и больше, положительное число или 0 */\n correctionXXL?: number;\n /** Величина коррекции отступа слева для разрешения XS и больше, положительное число или 0 */\n correctionLeftXS?: number;\n /** Величина коррекции левого отступа для разрешения S и больше, положительное число или 0 */\n correctionLeftS?: number;\n /** Величина коррекции левого отступа для разрешения M и больше, положительное число или 0 */\n correctionLeftM?: number;\n /** Величина коррекции левого отступа для разрешения L и больше, положительное число или 0 */\n correctionLeftL?: number;\n /** Величина коррекции левого отступа для разрешения XL и больше, положительное число или 0 */\n correctionLeftXL?: number;\n /** Величина коррекции левого отступа для разрешения XXL и больше, положительное число или 0 */\n correctionLeftXXL?: number;\n /** Величина коррекции отступа справа для разрешения XS и больше, положительное число или 0 */\n correctionRightXS?: number;\n /** Величина коррекции отступа справа для разрешения S и больше, положительное число или 0 */\n correctionRightS?: number;\n /** Величина коррекции отступа справа для разрешения M и больше, положительное число или 0 */\n correctionRightM?: number;\n /** Величина коррекции отступа справа для разрешения L и больше, положительное число или 0 */\n correctionRightL?: number;\n /** Величина коррекции отступа справа для разрешения XL и больше, положительное число или 0 */\n correctionRightXL?: number;\n /** Величина коррекции отступа справа для разрешения XXL и больше, положительное число или 0 */\n correctionRightXXL?: number;\n}\n\nexport interface ScrollableContainerBaseProps {\n /** Нужно ли показывать кнопки навигации (предпологает использование `correction`)*/\n disableButtons?: boolean;\n /** Нужно ли показывать dot-pages*/\n showDotPages?: boolean;\n /** Колбэк при изменении active dot в компоненте dot-pages*/\n onChangeDot?: (dot: number) => void;\n /** Свойства dot-pages*/\n dotPagesProps?: Omit<DotPagesProps, 'active' | 'count' | 'data-qa'>;\n /** Колбэк при прокрутке контейнера */\n onScroll?: () => void;\n}\n\nexport type ScrollableContainerProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n keyof SpacingCorrectionProps | 'disableButtons' | 'onScroll'\n> &\n ScrollableContainerBaseProps &\n SpacingCorrectionProps;\n"],"names":[],"mappings":"MAIa,WAAW,GAAG,MAAM,CAAC,oBAAoB;;;;"}
|
|
@@ -3,9 +3,9 @@ import { useState, useRef, useCallback, useEffect, useLayoutEffect } from 'react
|
|
|
3
3
|
import classnames from 'classnames';
|
|
4
4
|
import { initScrollHandlers, clamp } from '@hh.ru/magritte-internal-custom-scroll';
|
|
5
5
|
import { OFFSET_ATTR } from './types.js';
|
|
6
|
-
import { debounce
|
|
6
|
+
import { debounce } from './utils.js';
|
|
7
7
|
|
|
8
|
-
var styles = {"scroll-wrapper":"magritte-scroll-wrapper___vTdZl_4-
|
|
8
|
+
var styles = {"scroll-wrapper":"magritte-scroll-wrapper___vTdZl_4-5-0","scrollWrapper":"magritte-scroll-wrapper___vTdZl_4-5-0","scrollable-container":"magritte-scrollable-container___AKIUp_4-5-0","scrollableContainer":"magritte-scrollable-container___AKIUp_4-5-0","fade-both-sides":"magritte-fade-both-sides___pBan7_4-5-0","fadeBothSides":"magritte-fade-both-sides___pBan7_4-5-0","no-buttons":"magritte-no-buttons___eCwO-_4-5-0","noButtons":"magritte-no-buttons___eCwO-_4-5-0","fade-left-side":"magritte-fade-left-side___Hlpre_4-5-0","fadeLeftSide":"magritte-fade-left-side___Hlpre_4-5-0","fade-right-side":"magritte-fade-right-side___Lskyt_4-5-0","fadeRightSide":"magritte-fade-right-side___Lskyt_4-5-0","scroll-button":"magritte-scroll-button___4GQu3_4-5-0","scrollButton":"magritte-scroll-button___4GQu3_4-5-0","scroll-button-left":"magritte-scroll-button-left___UueEY_4-5-0","scrollButtonLeft":"magritte-scroll-button-left___UueEY_4-5-0","scroll-button-right":"magritte-scroll-button-right___wZOn-_4-5-0","scrollButtonRight":"magritte-scroll-button-right___wZOn-_4-5-0","position-container":"magritte-position-container___1A4Bv_4-5-0","positionContainer":"magritte-position-container___1A4Bv_4-5-0","position-container-animated":"magritte-position-container-animated___XuPNW_4-5-0","positionContainerAnimated":"magritte-position-container-animated___XuPNW_4-5-0","dot-container":"magritte-dot-container___ahtlG_4-5-0","dotContainer":"magritte-dot-container___ahtlG_4-5-0"};
|
|
9
9
|
|
|
10
10
|
const BUTTON_WIDTH = 44;
|
|
11
11
|
const FOCUS_OUTLINE_WIDTH = 4;
|
|
@@ -187,6 +187,14 @@ const recalculateItemPositions = (state) => {
|
|
|
187
187
|
state.scrollToOnMount = null;
|
|
188
188
|
return;
|
|
189
189
|
}
|
|
190
|
+
if (state.showDotPages && state.activeDot && items[state.activeDot - 1] && items[state.activeDot - 1].current) {
|
|
191
|
+
const item = items[state.activeDot - 1].current;
|
|
192
|
+
const offset = item[OFFSET_ATTR];
|
|
193
|
+
const itemWidth = offset.right - offset.left;
|
|
194
|
+
const translation = (state.containerWidth - itemWidth) / 2 - offset.left;
|
|
195
|
+
setAnimated(state, false);
|
|
196
|
+
setTranslation(translation, state);
|
|
197
|
+
}
|
|
190
198
|
applyScrollButtonsUpdate(state);
|
|
191
199
|
};
|
|
192
200
|
/**
|
|
@@ -198,14 +206,9 @@ const initResizeObserver = (state) => {
|
|
|
198
206
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
199
207
|
return () => { };
|
|
200
208
|
}
|
|
201
|
-
|
|
202
|
-
const observer = new ResizeObserver(scheduleForAnimationFrame(() => {
|
|
203
|
-
if (firstCall) {
|
|
204
|
-
firstCall = false;
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
209
|
+
const observer = new ResizeObserver(() => {
|
|
207
210
|
recalculateItemPositions(state);
|
|
208
|
-
})
|
|
211
|
+
});
|
|
209
212
|
observer.observe(containerRef.current);
|
|
210
213
|
observer.observe(positionContainerRef.current);
|
|
211
214
|
return () => observer.disconnect();
|
|
@@ -254,6 +257,7 @@ const useScrollContainer = (leftCorrection, rightCorrection, disableButtons, sho
|
|
|
254
257
|
directionRight: false,
|
|
255
258
|
previousActiveIndexItem: 0,
|
|
256
259
|
onScroll,
|
|
260
|
+
wasInteracted: false,
|
|
257
261
|
});
|
|
258
262
|
scrollStateRef.current.correction = { leftCorrection, rightCorrection };
|
|
259
263
|
scrollStateRef.current.disableButtons = disableButtons;
|
|
@@ -266,6 +270,7 @@ const useScrollContainer = (leftCorrection, rightCorrection, disableButtons, sho
|
|
|
266
270
|
if (scrollStateRef.current.recalcRequired) {
|
|
267
271
|
recalculateItemPositions(scrollStateRef.current);
|
|
268
272
|
}
|
|
273
|
+
scrollStateRef.current.wasInteracted = true;
|
|
269
274
|
// set active dot here because user can click on item
|
|
270
275
|
if (scrollStateRef.current.showDotPages) {
|
|
271
276
|
scrollStateRef.current.setActiveDot(scrollStateRef.current.items.indexOf(ref) + 1);
|
|
@@ -282,6 +287,7 @@ const useScrollContainer = (leftCorrection, rightCorrection, disableButtons, sho
|
|
|
282
287
|
}, [scrollToItem]);
|
|
283
288
|
const scrollSide = useCallback((directionRight) => {
|
|
284
289
|
const { containerWidth, positionContainerRef, positionContainerTranslation, showDotPages } = scrollStateRef.current;
|
|
290
|
+
scrollStateRef.current.wasInteracted = true;
|
|
285
291
|
if (!positionContainerRef.current) {
|
|
286
292
|
return;
|
|
287
293
|
}
|
|
@@ -359,10 +365,31 @@ const useScrollContainer = (leftCorrection, rightCorrection, disableButtons, sho
|
|
|
359
365
|
wrapperRef.removeEventListener('touchstart', handleTouchStartHandler);
|
|
360
366
|
};
|
|
361
367
|
}, []);
|
|
368
|
+
useLayoutEffect(() => {
|
|
369
|
+
/* Эффект нужен для пересчета размеров в случае, когда родительский контейнер открывается с анимацией,
|
|
370
|
+
* на которую не срабатывает ResizeObserver - например, Modal с transition: scale */
|
|
371
|
+
const handleParentTransitionEnd = (event) => {
|
|
372
|
+
const { wrapperRef, wasInteracted } = scrollStateRef.current;
|
|
373
|
+
/* wasInteracted - флаг, было ли взаимодействие с компонентом (скролл или подскролл к какому-либо элементу).
|
|
374
|
+
* Если взаимодействие было, то пересчитывать не нужно, тк считаем, что анимации появления родительского контейнера
|
|
375
|
+
* завершились */
|
|
376
|
+
if (!wasInteracted &&
|
|
377
|
+
event.target instanceof Element &&
|
|
378
|
+
wrapperRef.current &&
|
|
379
|
+
event.target.contains(wrapperRef.current)) {
|
|
380
|
+
recalculateItemPositions(scrollStateRef.current);
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
document.addEventListener('transitionend', handleParentTransitionEnd);
|
|
384
|
+
return () => {
|
|
385
|
+
document.removeEventListener('transitionend', handleParentTransitionEnd);
|
|
386
|
+
};
|
|
387
|
+
}, []);
|
|
362
388
|
const onTouchMove = useCallback((event) => {
|
|
363
389
|
if (scrollStateRef.current.scrollAnimationInProgress) {
|
|
364
390
|
return;
|
|
365
391
|
}
|
|
392
|
+
scrollStateRef.current.wasInteracted = true;
|
|
366
393
|
const { positionContainerTranslation } = scrollStateRef.current;
|
|
367
394
|
setTranslation(scrollStateRef.current.positionContainerTranslation + event.delta, scrollStateRef.current);
|
|
368
395
|
if (positionContainerTranslation === scrollStateRef.current.positionContainerTranslation) {
|
|
@@ -387,6 +414,7 @@ const useScrollContainer = (leftCorrection, rightCorrection, disableButtons, sho
|
|
|
387
414
|
}, []);
|
|
388
415
|
const onWheelMove = useCallback((event) => {
|
|
389
416
|
const { recalcRequired, scrollAnimationInProgress, positionContainerTranslation, showDotPages } = scrollStateRef.current;
|
|
417
|
+
scrollStateRef.current.wasInteracted = true;
|
|
390
418
|
if (recalcRequired) {
|
|
391
419
|
recalculateItemPositions(scrollStateRef.current);
|
|
392
420
|
}
|
|
@@ -446,4 +474,4 @@ const useScrollContainer = (leftCorrection, rightCorrection, disableButtons, sho
|
|
|
446
474
|
};
|
|
447
475
|
|
|
448
476
|
export { styles as s, useScrollContainer as u };
|
|
449
|
-
//# sourceMappingURL=useScrollContainer-
|
|
477
|
+
//# sourceMappingURL=useScrollContainer-DzOh_Ayb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScrollContainer-DzOh_Ayb.js","sources":["../src/useScrollContainer.ts"],"sourcesContent":["import { useRef, useEffect, RefObject, useCallback, useLayoutEffect, useState } from 'react';\nimport classnames from 'classnames';\n\nimport { ScrollGestureEvent, initScrollHandlers, clamp } from '@hh.ru/magritte-internal-custom-scroll';\nimport { ScrollInternalState, ItemWithOffset, OFFSET_ATTR } from '@hh.ru/magritte-ui-scrollable-container/types';\nimport { debounce } from '@hh.ru/magritte-ui-scrollable-container/utils';\n\nimport styles from './scrollableContainer.less';\n\nconst BUTTON_WIDTH = 44;\nconst FOCUS_OUTLINE_WIDTH = 4;\nconst DEFAULT_DOT = 1;\n\n/**\n * На базе стейта проверяем возможность использования вычисленного index-а\n * @param index значение для проверки\n * @param state Состояние скролла\n */\nconst isIncorrectIndex = (index: number, state: ScrollInternalState) => index < 0 || state.items.length - 1 < index;\n\n/**\n * Валидирует значение анимации и устанавливает ее в контейнер\n * @param translation значение анимации\n * @param state Состояние скролла\n */\nconst setTranslation = (translation: number, state: ScrollInternalState) => {\n const { positionContainerRef, positionContainerWidth, containerWidth } = state;\n if (!positionContainerRef.current) {\n return;\n }\n const prevTranslation = state.positionContainerTranslation;\n state.positionContainerTranslation = clamp(translation, containerWidth - positionContainerWidth, 0);\n positionContainerRef.current.style.transform = `translate3d(${state.positionContainerTranslation}px, 0, 0)`;\n if (prevTranslation !== state.positionContainerTranslation) {\n state.onScroll?.();\n }\n};\n\n/**\n * Вычисляет нужно ли показывать фейды по краям и скрывать кнопки скролла\n * Применяет соответствующие классы к обертке\n * Проверяет что сдвиг контейнера позиционирования находится в допустимых пределах и если нет, то корректирует его\n * @param state Состояние скролла\n */\nconst applyScrollButtonsUpdate = (state: ScrollInternalState) => {\n const { positionContainerRef, wrapperRef, positionContainerWidth, containerWidth } = state;\n let { positionContainerTranslation } = state;\n\n if (!positionContainerRef.current || !wrapperRef.current) {\n return;\n }\n\n if (positionContainerWidth + positionContainerTranslation < containerWidth) {\n positionContainerTranslation = containerWidth - positionContainerWidth;\n setTranslation(positionContainerTranslation, state);\n }\n const isFadeLeft = positionContainerTranslation < 0;\n const isFadeRight = positionContainerTranslation + positionContainerWidth > containerWidth;\n const className = classnames({\n [styles.fadeLeftSide]: isFadeLeft && !isFadeRight,\n [styles.fadeRightSide]: isFadeRight && !isFadeLeft,\n [styles.fadeBothSides]: isFadeRight && isFadeLeft,\n });\n wrapperRef.current.classList.remove(styles.fadeBothSides, styles.fadeLeftSide, styles.fadeRightSide);\n className && wrapperRef.current.classList.add(className);\n};\n\nconst setAnimated = (state: ScrollInternalState, animated: boolean) => {\n state.positionContainerRef.current?.classList.toggle(styles.positionContainerAnimated, animated);\n if (!animated) {\n state.scrollAnimationInProgress = false;\n }\n};\n\n/**\n * Скролл к конкретному элементу группы. Если на момент вызова нет ref контейнера позиционирования, то считаем что\n * функция была при маунте компонента и запоминаем элемент на который нужно скроллить. При маунте вызываем эту функцию\n * еще раз и скроллим к запомненному элементу без анимации.\n * @param state Состояние скролла\n * @param item Элемент к которому нужно подскроллить\n */\nconst scrollTo = (state: ScrollInternalState, item: RefObject<HTMLElement>) => {\n const {\n positionContainerTranslation,\n containerWidth,\n positionContainerRef,\n scrollToItemInProgress,\n disableButtons,\n positionContainerWidth,\n showDotPages,\n items,\n } = state;\n if (!positionContainerRef.current) {\n state.scrollToOnMount = item;\n return;\n }\n\n if (item.current === scrollToItemInProgress?.current) {\n return;\n }\n state.previousActiveIndexItem = items.indexOf(item as unknown as RefObject<HTMLElement & ItemWithOffset>);\n const offset = (item.current as unknown as ItemWithOffset)[OFFSET_ATTR];\n const width = offset.right - offset.left;\n const buttonsCorrection = disableButtons ? 0 : BUTTON_WIDTH;\n\n // нужно ли отцентрировать контейнер по текущему item\n // актуально для режима showDotPages\n // так как контейнер работает как карусель\n const needItemCorrection = showDotPages;\n let translation = positionContainerTranslation;\n if (width > containerWidth) {\n // элемент шире контейнера\n translation = -((width - containerWidth) / 2 + offset.left);\n } else if (offset.left + positionContainerTranslation < buttonsCorrection && positionContainerTranslation < 0) {\n // контейнер движется вправо\n const correction = needItemCorrection ? (containerWidth - width) / 2 : buttonsCorrection;\n translation = -offset.left + correction;\n } else if (\n offset.right + positionContainerTranslation > containerWidth - buttonsCorrection &&\n positionContainerTranslation > containerWidth - positionContainerWidth\n ) {\n // контейнер движется влево\n const correction = needItemCorrection ? (containerWidth - width) / 2 : buttonsCorrection;\n translation = containerWidth - offset.right - correction;\n } else if (showDotPages) {\n // анимация к центру элемента (при необходимости)\n const correction = (containerWidth - width) / 2;\n // если находимся на границе контейнера, то анимации уже не будет (так как граница блока достигнута)\n // то есть translation надо скорректировать на базе контейнера чрз clamp\n translation = clamp(-offset.left + correction, containerWidth - positionContainerWidth, 0);\n }\n\n const isPositionChanged = translation !== positionContainerTranslation;\n const needAnimation = !state.scrollToOnMount && isPositionChanged;\n\n // Если это скролл при маунте, или позиция скролла не изменилась, то его не нужно анимировать\n setAnimated(state, needAnimation);\n setTranslation(translation, state);\n if (needAnimation) {\n state.scrollAnimationInProgress = true;\n state.scrollToItemInProgress = item;\n }\n applyScrollButtonsUpdate(state);\n};\n\n/**\n * Если текущий элемент совпадает с новым\n * Находим следующий активный элемент по направлению и скролим к нему\n */\nconst scrollToNewItemDebounced = debounce((state: ScrollInternalState, indexNearestToCenter: number) => {\n const { previousActiveIndexItem, items, directionRight } = state;\n let index = indexNearestToCenter;\n // определяем ситуацию, когда скрола не хватило до следующего элемента\n if (previousActiveIndexItem === indexNearestToCenter) {\n const indexBasedOnDirection = directionRight ? indexNearestToCenter + 1 : indexNearestToCenter - 1;\n // нужно проверить новый индекс, чтобы не выходить за границы\n if (!isIncorrectIndex(indexBasedOnDirection, state)) {\n index = indexBasedOnDirection;\n state.setActiveDot(index + 1);\n }\n }\n const item: RefObject<HTMLElement> = items[index];\n scrollTo(state, item);\n}, 30);\n\n/**\n * Скролл к конкретному элементу группы (обернуто в debounce)\n */\nconst scrollToDebounced = debounce(\n (state: ScrollInternalState, index: number) => scrollTo(state, state.items[index]),\n 30\n);\n\n/**\n * Пересчитывает позиции элементов и обновляет состояние скролла. Вызывается при изменении размеров контейнера или\n * добавлении/удалении элементов. Проходится по всем элементам и вычисляет сдвиг их правой и левой границы относительно\n * контейнера позиционирования. Сортирует элементы по возрастанию сдвига левой границы. Вычисляет ширину внешнего\n * контейнера и контейнера позиционирования. При вычислении ширины контейнера позиционирования правой его границей\n * считается правая граница самого крайнего справа элемента. Это нужно чтобы при переносе элементов на несколько строк\n * справа не появлялось лишнее пустое пространство.\n * @param state Состояние скролла\n */\nconst recalculateItemPositions = (state: ScrollInternalState) => {\n const { positionContainerRef, containerRef, items, showDotPages, setCountItems } = state;\n\n if (!positionContainerRef.current || !containerRef.current) {\n return;\n }\n const offset = positionContainerRef.current.getBoundingClientRect().left || 0;\n items.forEach((itemRef) => {\n if (!itemRef.current) {\n return;\n }\n const rect = itemRef.current.getBoundingClientRect();\n itemRef.current[OFFSET_ATTR] = { left: rect.left - offset, right: rect.right - offset };\n });\n\n if (showDotPages) {\n setCountItems(items.length);\n }\n\n state.recalcRequired = false;\n // т.к. нам нужна ширина content-box, то вычитаем левую и правую коррекцию, т.к. ей будут равны паддинги\n state.containerWidth =\n containerRef.current.offsetWidth - state.correction.leftCorrection - state.correction.rightCorrection;\n // считаем ширину контейнера позиционирования равной правой границе самого крайнего элемента\n state.positionContainerWidth = items.reduce(\n (position, itemRef) => Math.max(position, itemRef.current?.[OFFSET_ATTR]?.right || 0),\n 0\n );\n if (!state.disableButtons && state.positionContainerWidth > state.containerWidth) {\n state.containerWidth -= FOCUS_OUTLINE_WIDTH;\n }\n\n // если при маунте, когда у нас еще не было информации об элементах и размерах контейнеров был вызван scrollTo,\n // то нужно проскроллить без анимации\n if (state.scrollToOnMount) {\n scrollTo(state, state.scrollToOnMount);\n state.scrollToOnMount = null;\n return;\n }\n\n if (state.showDotPages && state.activeDot && items[state.activeDot - 1] && items[state.activeDot - 1].current) {\n const item = items[state.activeDot - 1].current as HTMLElement & ItemWithOffset;\n const offset = item[OFFSET_ATTR];\n const itemWidth = offset.right - offset.left;\n const translation = (state.containerWidth - itemWidth) / 2 - offset.left;\n\n setAnimated(state, false);\n setTranslation(translation, state);\n }\n\n applyScrollButtonsUpdate(state);\n};\n\n/**\n * Инициализирует ResizeObserver для контейнера и контейнера позиционирования\n */\nconst initResizeObserver = (state: ScrollInternalState) => {\n const { positionContainerRef, containerRef } = state;\n if (!positionContainerRef.current || !containerRef.current) {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n return () => {};\n }\n const observer = new ResizeObserver(() => {\n recalculateItemPositions(state);\n });\n observer.observe(containerRef.current);\n observer.observe(positionContainerRef.current);\n\n return () => observer.disconnect();\n};\n\n/**\n * На базе стейта считает ближайший элемент, который ближе к центру вью контейнера\n * Между блоками могут быть отступы, тогда centerPoint в offset-ы ни одного из элементов не попадет\n * В этом случае, используем предыдущее значение\n * @param state Состояние скролла\n * @returns Индекс элемента в массиве state.items\n */\nconst findIndexNearestToCenter = (state: ScrollInternalState): number => {\n const centerPoint = state.containerWidth / 2 + Math.abs(state.positionContainerTranslation);\n const indexNearestToCenter = state.items.findIndex((itemRef) => {\n if (!itemRef.current) {\n return false;\n }\n const offset = itemRef.current[OFFSET_ATTR];\n return offset.left < centerPoint && offset.right > centerPoint;\n });\n return indexNearestToCenter !== -1 ? indexNearestToCenter + 1 : state.activeDot;\n};\n\ninterface UseScrollContainer {\n registerItem: (ref: RefObject<HTMLElement>) => void;\n removeItem: (ref: RefObject<HTMLElement>) => void;\n scrollToItem: (ref: RefObject<HTMLElement>) => void;\n scrollToFirstItem: VoidFunction;\n scrollToLastItem: VoidFunction;\n scrollSide: (right?: boolean) => void;\n initScrollHandlers: () => VoidFunction;\n wrapperRef: RefObject<HTMLDivElement>;\n positionContainerRef: RefObject<HTMLDivElement>;\n containerRef: RefObject<HTMLDivElement>;\n countItems: number;\n activeDot: number;\n isScrollRightEnabled: () => boolean;\n isScrollLeftEnabled: () => boolean;\n}\n\nexport const useScrollContainer = (\n leftCorrection: number,\n rightCorrection: number,\n disableButtons: boolean,\n showDotPages?: boolean,\n onScroll?: () => void\n): UseScrollContainer => {\n // need state for dot component\n const [activeDot, setActiveDot] = useState(DEFAULT_DOT);\n const [countItems, setCountItems] = useState(0);\n const scrollStateRef = useRef<ScrollInternalState>({\n wrapperRef: useRef<HTMLDivElement>(null),\n positionContainerRef: useRef<HTMLDivElement>(null),\n containerRef: useRef<HTMLDivElement>(null),\n positionContainerWidth: 0,\n positionContainerTranslation: 0,\n containerWidth: 0,\n items: [],\n correction: { leftCorrection: 0, rightCorrection: 0 },\n disableButtons: false,\n scrollAnimationInProgress: false,\n scrollToOnMount: null,\n recalcRequired: false,\n scrollToItemInProgress: null,\n showDotPages: false,\n activeDot: DEFAULT_DOT,\n needCorrectionOnScrollEnd: false,\n setActiveDot,\n setCountItems,\n directionRight: false,\n previousActiveIndexItem: 0,\n onScroll,\n wasInteracted: false,\n });\n\n scrollStateRef.current.correction = { leftCorrection, rightCorrection };\n scrollStateRef.current.disableButtons = disableButtons;\n scrollStateRef.current.showDotPages = Boolean(showDotPages);\n scrollStateRef.current.activeDot = activeDot;\n scrollStateRef.current.onScroll = onScroll;\n\n // eslint-disable-next-line disable-autofix/react-hooks/exhaustive-deps\n const recalculateItemPositionsDebounced = useCallback(\n debounce(() => recalculateItemPositions(scrollStateRef.current), 10),\n []\n );\n\n const scrollToItem = useCallback((ref: RefObject<HTMLElement>) => {\n if (scrollStateRef.current.recalcRequired) {\n recalculateItemPositions(scrollStateRef.current);\n }\n scrollStateRef.current.wasInteracted = true;\n // set active dot here because user can click on item\n if (scrollStateRef.current.showDotPages) {\n scrollStateRef.current.setActiveDot(\n scrollStateRef.current.items.indexOf(ref as unknown as RefObject<HTMLElement & ItemWithOffset>) + 1\n );\n }\n scrollTo(scrollStateRef.current, ref);\n }, []);\n\n const scrollToFirstItem = useCallback(() => {\n const { items } = scrollStateRef.current;\n items.length > 0 && scrollToItem(items[0]);\n }, [scrollToItem]);\n\n const scrollToLastItem = useCallback(() => {\n const { items } = scrollStateRef.current;\n items.length > 0 && scrollToItem(items[items.length - 1]);\n }, [scrollToItem]);\n\n const scrollSide = useCallback(\n (directionRight?: boolean) => {\n const { containerWidth, positionContainerRef, positionContainerTranslation, showDotPages } =\n scrollStateRef.current;\n scrollStateRef.current.wasInteracted = true;\n if (!positionContainerRef.current) {\n return;\n }\n if (!showDotPages) {\n // move container based on container width\n const translation = positionContainerTranslation + (directionRight ? -containerWidth : containerWidth);\n setAnimated(scrollStateRef.current, true);\n setTranslation(translation, scrollStateRef.current);\n applyScrollButtonsUpdate(scrollStateRef.current);\n } else {\n // calc new dot and check it\n const activeDot = scrollStateRef.current.activeDot;\n const newActiveDot = directionRight ? activeDot + 1 : activeDot - 1;\n if (!isIncorrectIndex(newActiveDot - 1, scrollStateRef.current)) {\n // move container to new select ref\n scrollToItem(scrollStateRef.current.items[newActiveDot - 1]);\n }\n }\n },\n [scrollToItem]\n );\n\n const registerItem = useCallback((ref: RefObject<HTMLElement>) => {\n if (!ref.current) {\n return;\n }\n\n scrollStateRef.current.items.push(ref as unknown as RefObject<HTMLElement & ItemWithOffset>);\n scrollStateRef.current.recalcRequired = true;\n recalculateItemPositions(scrollStateRef.current);\n }, []);\n\n const removeItem = useCallback(\n (ref: RefObject<HTMLElement>) => {\n if (!ref.current) {\n return;\n }\n\n scrollStateRef.current.items = scrollStateRef.current.items.filter(\n (storedRef) => storedRef.current !== ref.current\n );\n recalculateItemPositionsDebounced();\n },\n [recalculateItemPositionsDebounced]\n );\n\n useEffect(() => {\n const { wrapperRef, positionContainerRef, containerRef } = scrollStateRef.current;\n if (!containerRef.current || !positionContainerRef.current || !wrapperRef.current) {\n return void 0;\n }\n\n const transitionEndHandler = (event: TransitionEvent) => {\n if (event.target !== scrollStateRef.current?.positionContainerRef.current) {\n return;\n }\n setAnimated(scrollStateRef.current, false);\n if (scrollStateRef.current) {\n scrollStateRef.current.scrollAnimationInProgress = false;\n scrollStateRef.current.scrollToItemInProgress = null;\n }\n };\n const positionContainer = scrollStateRef.current?.positionContainerRef.current;\n positionContainer?.addEventListener('transitionend', transitionEndHandler);\n\n const resizeObserverCleanup = initResizeObserver(scrollStateRef.current);\n\n return () => {\n resizeObserverCleanup();\n positionContainer?.removeEventListener('transitionend', transitionEndHandler);\n };\n }, []);\n\n useLayoutEffect(() => {\n recalculateItemPositions(scrollStateRef.current);\n if (disableButtons) {\n setAnimated(scrollStateRef.current, false);\n }\n }, [disableButtons, leftCorrection, rightCorrection]);\n\n useEffect(() => {\n const wrapperRef = scrollStateRef.current.wrapperRef.current;\n if (!wrapperRef) {\n return void 0;\n }\n const handleTouchStartHandler = (event: TouchEvent) => {\n event.stopPropagation();\n };\n wrapperRef.addEventListener('touchstart', handleTouchStartHandler);\n return () => {\n wrapperRef.removeEventListener('touchstart', handleTouchStartHandler);\n };\n }, []);\n\n useLayoutEffect(() => {\n /* Эффект нужен для пересчета размеров в случае, когда родительский контейнер открывается с анимацией,\n * на которую не срабатывает ResizeObserver - например, Modal с transition: scale */\n const handleParentTransitionEnd = (event: TransitionEvent) => {\n const { wrapperRef, wasInteracted } = scrollStateRef.current;\n /* wasInteracted - флаг, было ли взаимодействие с компонентом (скролл или подскролл к какому-либо элементу).\n * Если взаимодействие было, то пересчитывать не нужно, тк считаем, что анимации появления родительского контейнера\n * завершились */\n if (\n !wasInteracted &&\n event.target instanceof Element &&\n wrapperRef.current &&\n event.target.contains(wrapperRef.current)\n ) {\n recalculateItemPositions(scrollStateRef.current);\n }\n };\n\n document.addEventListener('transitionend', handleParentTransitionEnd);\n\n return () => {\n document.removeEventListener('transitionend', handleParentTransitionEnd);\n };\n }, []);\n\n const onTouchMove = useCallback((event: ScrollGestureEvent) => {\n if (scrollStateRef.current.scrollAnimationInProgress) {\n return;\n }\n scrollStateRef.current.wasInteracted = true;\n const { positionContainerTranslation } = scrollStateRef.current;\n setTranslation(scrollStateRef.current.positionContainerTranslation + event.delta, scrollStateRef.current);\n if (positionContainerTranslation === scrollStateRef.current.positionContainerTranslation) {\n event.preventDefault();\n }\n if (scrollStateRef.current.showDotPages) {\n // by touch change active dot\n const newActiveDot = findIndexNearestToCenter(scrollStateRef.current);\n // update state\n scrollStateRef.current.setActiveDot(newActiveDot);\n // scheduling correction\n scrollStateRef.current.needCorrectionOnScrollEnd = true;\n }\n }, []);\n\n const onTouchEnd = useCallback(() => {\n const { needCorrectionOnScrollEnd, showDotPages, activeDot } = scrollStateRef.current;\n if (showDotPages && needCorrectionOnScrollEnd) {\n scrollStateRef.current.needCorrectionOnScrollEnd = false;\n // center active element\n scrollToDebounced(scrollStateRef.current, activeDot - 1);\n }\n }, []);\n\n const onWheelMove = useCallback((event: ScrollGestureEvent) => {\n const { recalcRequired, scrollAnimationInProgress, positionContainerTranslation, showDotPages } =\n scrollStateRef.current;\n scrollStateRef.current.wasInteracted = true;\n if (recalcRequired) {\n recalculateItemPositions(scrollStateRef.current);\n }\n if (scrollAnimationInProgress) {\n event.preventDefault();\n return;\n }\n scrollStateRef.current.directionRight = event.delta < 0;\n const translation = positionContainerTranslation + event.delta;\n setTranslation(translation, scrollStateRef.current);\n applyScrollButtonsUpdate(scrollStateRef.current);\n\n // эти значения могут быть не равны только в случае если попытались сдвинуть контейнер дальше\n // допустимого значения, это значит что мы уперлись в левую или правую границу, значит дальнейшие события\n // скролла можно не обрабатывать\n if (translation === scrollStateRef.current.positionContainerTranslation) {\n event.preventDefault();\n }\n if (showDotPages) {\n // by wheel change active dot\n const newActiveDot = findIndexNearestToCenter(scrollStateRef.current);\n scrollStateRef.current.setActiveDot(newActiveDot);\n // center active element\n scrollToNewItemDebounced(scrollStateRef.current, newActiveDot - 1);\n }\n }, []);\n\n const _initScrollHandlers = useCallback(\n () =>\n initScrollHandlers({\n axis: 'horizontal',\n wrapperRef: scrollStateRef.current.wrapperRef,\n onTouchMove,\n onTouchEnd,\n onWheelMove,\n }),\n [onTouchMove, onTouchEnd, onWheelMove]\n );\n\n const isScrollRightEnabled = useCallback(() => {\n const { positionContainerTranslation, positionContainerWidth, containerWidth } = scrollStateRef.current;\n return positionContainerTranslation + positionContainerWidth <= containerWidth;\n }, []);\n\n const isScrollLeftEnabled = useCallback(() => {\n const { positionContainerTranslation } = scrollStateRef.current;\n return positionContainerTranslation >= 0;\n }, []);\n\n return {\n registerItem,\n removeItem,\n scrollToItem,\n scrollToFirstItem,\n scrollToLastItem,\n scrollSide,\n initScrollHandlers: _initScrollHandlers,\n wrapperRef: scrollStateRef.current.wrapperRef,\n positionContainerRef: scrollStateRef.current.positionContainerRef,\n containerRef: scrollStateRef.current.containerRef,\n countItems,\n activeDot,\n isScrollRightEnabled,\n isScrollLeftEnabled,\n };\n};\n"],"names":[],"mappings":";;;;;;;;AASA,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB;;;;AAIG;AACH,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,KAA0B,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC;AAEpH;;;;AAIG;AACH,MAAM,cAAc,GAAG,CAAC,WAAmB,EAAE,KAA0B,KAAI;IACvE,MAAM,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;AAC/E,IAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE;QAC/B,OAAO;KACV;AACD,IAAA,MAAM,eAAe,GAAG,KAAK,CAAC,4BAA4B,CAAC;AAC3D,IAAA,KAAK,CAAC,4BAA4B,GAAG,KAAK,CAAC,WAAW,EAAE,cAAc,GAAG,sBAAsB,EAAE,CAAC,CAAC,CAAC;AACpG,IAAA,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,YAAA,EAAe,KAAK,CAAC,4BAA4B,CAAA,SAAA,CAAW,CAAC;AAC5G,IAAA,IAAI,eAAe,KAAK,KAAK,CAAC,4BAA4B,EAAE;AACxD,QAAA,KAAK,CAAC,QAAQ,IAAI,CAAC;KACtB;AACL,CAAC,CAAC;AAEF;;;;;AAKG;AACH,MAAM,wBAAwB,GAAG,CAAC,KAA0B,KAAI;IAC5D,MAAM,EAAE,oBAAoB,EAAE,UAAU,EAAE,sBAAsB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;AAC3F,IAAA,IAAI,EAAE,4BAA4B,EAAE,GAAG,KAAK,CAAC;IAE7C,IAAI,CAAC,oBAAoB,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;QACtD,OAAO;KACV;AAED,IAAA,IAAI,sBAAsB,GAAG,4BAA4B,GAAG,cAAc,EAAE;AACxE,QAAA,4BAA4B,GAAG,cAAc,GAAG,sBAAsB,CAAC;AACvE,QAAA,cAAc,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;KACvD;AACD,IAAA,MAAM,UAAU,GAAG,4BAA4B,GAAG,CAAC,CAAC;AACpD,IAAA,MAAM,WAAW,GAAG,4BAA4B,GAAG,sBAAsB,GAAG,cAAc,CAAC;IAC3F,MAAM,SAAS,GAAG,UAAU,CAAC;QACzB,CAAC,MAAM,CAAC,YAAY,GAAG,UAAU,IAAI,CAAC,WAAW;QACjD,CAAC,MAAM,CAAC,aAAa,GAAG,WAAW,IAAI,CAAC,UAAU;AAClD,QAAA,CAAC,MAAM,CAAC,aAAa,GAAG,WAAW,IAAI,UAAU;AACpD,KAAA,CAAC,CAAC;AACH,IAAA,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACrG,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAA0B,EAAE,QAAiB,KAAI;AAClE,IAAA,KAAK,CAAC,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;IACjG,IAAI,CAAC,QAAQ,EAAE;AACX,QAAA,KAAK,CAAC,yBAAyB,GAAG,KAAK,CAAC;KAC3C;AACL,CAAC,CAAC;AAEF;;;;;;AAMG;AACH,MAAM,QAAQ,GAAG,CAAC,KAA0B,EAAE,IAA4B,KAAI;AAC1E,IAAA,MAAM,EACF,4BAA4B,EAC5B,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,KAAK,GACR,GAAG,KAAK,CAAC;AACV,IAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE;AAC/B,QAAA,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7B,OAAO;KACV;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,sBAAsB,EAAE,OAAO,EAAE;QAClD,OAAO;KACV;IACD,KAAK,CAAC,uBAAuB,GAAG,KAAK,CAAC,OAAO,CAAC,IAA0D,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAI,IAAI,CAAC,OAAqC,CAAC,WAAW,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;IACzC,MAAM,iBAAiB,GAAG,cAAc,GAAG,CAAC,GAAG,YAAY,CAAC;;;;IAK5D,MAAM,kBAAkB,GAAG,YAAY,CAAC;IACxC,IAAI,WAAW,GAAG,4BAA4B,CAAC;AAC/C,IAAA,IAAI,KAAK,GAAG,cAAc,EAAE;;AAExB,QAAA,WAAW,GAAG,EAAE,CAAC,KAAK,GAAG,cAAc,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;KAC/D;AAAM,SAAA,IAAI,MAAM,CAAC,IAAI,GAAG,4BAA4B,GAAG,iBAAiB,IAAI,4BAA4B,GAAG,CAAC,EAAE;;AAE3G,QAAA,MAAM,UAAU,GAAG,kBAAkB,GAAG,CAAC,cAAc,GAAG,KAAK,IAAI,CAAC,GAAG,iBAAiB,CAAC;AACzF,QAAA,WAAW,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC;KAC3C;SAAM,IACH,MAAM,CAAC,KAAK,GAAG,4BAA4B,GAAG,cAAc,GAAG,iBAAiB;AAChF,QAAA,4BAA4B,GAAG,cAAc,GAAG,sBAAsB,EACxE;;AAEE,QAAA,MAAM,UAAU,GAAG,kBAAkB,GAAG,CAAC,cAAc,GAAG,KAAK,IAAI,CAAC,GAAG,iBAAiB,CAAC;QACzF,WAAW,GAAG,cAAc,GAAG,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC;KAC5D;SAAM,IAAI,YAAY,EAAE;;QAErB,MAAM,UAAU,GAAG,CAAC,cAAc,GAAG,KAAK,IAAI,CAAC,CAAC;;;AAGhD,QAAA,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,UAAU,EAAE,cAAc,GAAG,sBAAsB,EAAE,CAAC,CAAC,CAAC;KAC9F;AAED,IAAA,MAAM,iBAAiB,GAAG,WAAW,KAAK,4BAA4B,CAAC;IACvE,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,iBAAiB,CAAC;;AAGlE,IAAA,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AAClC,IAAA,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACnC,IAAI,aAAa,EAAE;AACf,QAAA,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC;AACvC,QAAA,KAAK,CAAC,sBAAsB,GAAG,IAAI,CAAC;KACvC;IACD,wBAAwB,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF;;;AAGG;AACH,MAAM,wBAAwB,GAAG,QAAQ,CAAC,CAAC,KAA0B,EAAE,oBAA4B,KAAI;IACnG,MAAM,EAAE,uBAAuB,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IACjE,IAAI,KAAK,GAAG,oBAAoB,CAAC;;AAEjC,IAAA,IAAI,uBAAuB,KAAK,oBAAoB,EAAE;AAClD,QAAA,MAAM,qBAAqB,GAAG,cAAc,GAAG,oBAAoB,GAAG,CAAC,GAAG,oBAAoB,GAAG,CAAC,CAAC;;QAEnG,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,KAAK,CAAC,EAAE;YACjD,KAAK,GAAG,qBAAqB,CAAC;AAC9B,YAAA,KAAK,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;SACjC;KACJ;AACD,IAAA,MAAM,IAAI,GAA2B,KAAK,CAAC,KAAK,CAAC,CAAC;AAClD,IAAA,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC,EAAE,EAAE,CAAC,CAAC;AAEP;;AAEG;AACH,MAAM,iBAAiB,GAAG,QAAQ,CAC9B,CAAC,KAA0B,EAAE,KAAa,KAAK,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAClF,EAAE,CACL,CAAC;AAEF;;;;;;;;AAQG;AACH,MAAM,wBAAwB,GAAG,CAAC,KAA0B,KAAI;AAC5D,IAAA,MAAM,EAAE,oBAAoB,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;IAEzF,IAAI,CAAC,oBAAoB,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;QACxD,OAAO;KACV;AACD,IAAA,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;AAC9E,IAAA,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAClB,OAAO;SACV;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;QACrD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC;AAC5F,KAAC,CAAC,CAAC;IAEH,IAAI,YAAY,EAAE;AACd,QAAA,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KAC/B;AAED,IAAA,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;;AAE7B,IAAA,KAAK,CAAC,cAAc;AAChB,QAAA,YAAY,CAAC,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC;;AAE1G,IAAA,KAAK,CAAC,sBAAsB,GAAG,KAAK,CAAC,MAAM,CACvC,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,EACrF,CAAC,CACJ,CAAC;AACF,IAAA,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,sBAAsB,GAAG,KAAK,CAAC,cAAc,EAAE;AAC9E,QAAA,KAAK,CAAC,cAAc,IAAI,mBAAmB,CAAC;KAC/C;;;AAID,IAAA,IAAI,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;AACvC,QAAA,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7B,OAAO;KACV;AAED,IAAA,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE;AAC3G,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,OAAuC,CAAC;AAChF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;AAC7C,QAAA,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;AAEzE,QAAA,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC1B,QAAA,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;KACtC;IAED,wBAAwB,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF;;AAEG;AACH,MAAM,kBAAkB,GAAG,CAAC,KAA0B,KAAI;AACtD,IAAA,MAAM,EAAE,oBAAoB,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IACrD,IAAI,CAAC,oBAAoB,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;;AAExD,QAAA,OAAO,MAAO,GAAC,CAAC;KACnB;AACD,IAAA,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAK;QACrC,wBAAwB,CAAC,KAAK,CAAC,CAAC;AACpC,KAAC,CAAC,CAAC;AACH,IAAA,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AACvC,IAAA,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE/C,IAAA,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;AACvC,CAAC,CAAC;AAEF;;;;;;AAMG;AACH,MAAM,wBAAwB,GAAG,CAAC,KAA0B,KAAY;AACpE,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC5F,MAAM,oBAAoB,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,KAAI;AAC3D,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AAClB,YAAA,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,GAAG,WAAW,IAAI,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;AACnE,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,oBAAoB,KAAK,CAAC,CAAC,GAAG,oBAAoB,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;AACpF,CAAC,CAAC;AAmBK,MAAM,kBAAkB,GAAG,CAC9B,cAAsB,EACtB,eAAuB,EACvB,cAAuB,EACvB,YAAsB,EACtB,QAAqB,KACD;;IAEpB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,MAAM,CAAsB;AAC/C,QAAA,UAAU,EAAE,MAAM,CAAiB,IAAI,CAAC;AACxC,QAAA,oBAAoB,EAAE,MAAM,CAAiB,IAAI,CAAC;AAClD,QAAA,YAAY,EAAE,MAAM,CAAiB,IAAI,CAAC;AAC1C,QAAA,sBAAsB,EAAE,CAAC;AACzB,QAAA,4BAA4B,EAAE,CAAC;AAC/B,QAAA,cAAc,EAAE,CAAC;AACjB,QAAA,KAAK,EAAE,EAAE;QACT,UAAU,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;AACrD,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,yBAAyB,EAAE,KAAK;AAChC,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,sBAAsB,EAAE,IAAI;AAC5B,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,SAAS,EAAE,WAAW;AACtB,QAAA,yBAAyB,EAAE,KAAK;QAChC,YAAY;QACZ,aAAa;AACb,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,uBAAuB,EAAE,CAAC;QAC1B,QAAQ;AACR,QAAA,aAAa,EAAE,KAAK;AACvB,KAAA,CAAC,CAAC;IAEH,cAAc,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AACxE,IAAA,cAAc,CAAC,OAAO,CAAC,cAAc,GAAG,cAAc,CAAC;IACvD,cAAc,CAAC,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAC5D,IAAA,cAAc,CAAC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;AAC7C,IAAA,cAAc,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;;IAG3C,MAAM,iCAAiC,GAAG,WAAW,CACjD,QAAQ,CAAC,MAAM,wBAAwB,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EACpE,EAAE,CACL,CAAC;AAEF,IAAA,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,GAA2B,KAAI;AAC7D,QAAA,IAAI,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE;AACvC,YAAA,wBAAwB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;SACpD;AACD,QAAA,cAAc,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;;AAE5C,QAAA,IAAI,cAAc,CAAC,OAAO,CAAC,YAAY,EAAE;AACrC,YAAA,cAAc,CAAC,OAAO,CAAC,YAAY,CAC/B,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAyD,CAAC,GAAG,CAAC,CACtG,CAAC;SACL;AACD,QAAA,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;KACzC,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAK;AACvC,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;AACzC,QAAA,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,KAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;AAEnB,IAAA,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAK;AACtC,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;AACzC,QAAA,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9D,KAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;AAEnB,IAAA,MAAM,UAAU,GAAG,WAAW,CAC1B,CAAC,cAAwB,KAAI;AACzB,QAAA,MAAM,EAAE,cAAc,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,YAAY,EAAE,GACtF,cAAc,CAAC,OAAO,CAAC;AAC3B,QAAA,cAAc,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5C,QAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE;YAC/B,OAAO;SACV;QACD,IAAI,CAAC,YAAY,EAAE;;AAEf,YAAA,MAAM,WAAW,GAAG,4BAA4B,IAAI,cAAc,GAAG,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC;AACvG,YAAA,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC1C,YAAA,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;AACpD,YAAA,wBAAwB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;SACpD;aAAM;;AAEH,YAAA,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC;AACnD,YAAA,MAAM,YAAY,GAAG,cAAc,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;AACpE,YAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,GAAG,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE;;AAE7D,gBAAA,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;aAChE;SACJ;AACL,KAAC,EACD,CAAC,YAAY,CAAC,CACjB,CAAC;AAEF,IAAA,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,GAA2B,KAAI;AAC7D,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YACd,OAAO;SACV;QAED,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAyD,CAAC,CAAC;AAC7F,QAAA,cAAc,CAAC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;AAC7C,QAAA,wBAAwB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;KACpD,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,UAAU,GAAG,WAAW,CAC1B,CAAC,GAA2B,KAAI;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YACd,OAAO;SACV;QAED,cAAc,CAAC,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAC9D,CAAC,SAAS,KAAK,SAAS,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,CACnD,CAAC;AACF,QAAA,iCAAiC,EAAE,CAAC;AACxC,KAAC,EACD,CAAC,iCAAiC,CAAC,CACtC,CAAC;IAEF,SAAS,CAAC,MAAK;QACX,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE,YAAY,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;AAClF,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YAC/E,OAAO,KAAK,CAAC,CAAC;SACjB;AAED,QAAA,MAAM,oBAAoB,GAAG,CAAC,KAAsB,KAAI;AACpD,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,CAAC,OAAO,EAAE,oBAAoB,CAAC,OAAO,EAAE;gBACvE,OAAO;aACV;AACD,YAAA,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC3C,YAAA,IAAI,cAAc,CAAC,OAAO,EAAE;AACxB,gBAAA,cAAc,CAAC,OAAO,CAAC,yBAAyB,GAAG,KAAK,CAAC;AACzD,gBAAA,cAAc,CAAC,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;aACxD;AACL,SAAC,CAAC;QACF,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC;AAC/E,QAAA,iBAAiB,EAAE,gBAAgB,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;QAE3E,MAAM,qBAAqB,GAAG,kBAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAEzE,QAAA,OAAO,MAAK;AACR,YAAA,qBAAqB,EAAE,CAAC;AACxB,YAAA,iBAAiB,EAAE,mBAAmB,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;AAClF,SAAC,CAAC;KACL,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,MAAK;AACjB,QAAA,wBAAwB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,cAAc,EAAE;AAChB,YAAA,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SAC9C;KACJ,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IAEtD,SAAS,CAAC,MAAK;QACX,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;QAC7D,IAAI,CAAC,UAAU,EAAE;YACb,OAAO,KAAK,CAAC,CAAC;SACjB;AACD,QAAA,MAAM,uBAAuB,GAAG,CAAC,KAAiB,KAAI;YAClD,KAAK,CAAC,eAAe,EAAE,CAAC;AAC5B,SAAC,CAAC;AACF,QAAA,UAAU,CAAC,gBAAgB,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;AACnE,QAAA,OAAO,MAAK;AACR,YAAA,UAAU,CAAC,mBAAmB,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;AAC1E,SAAC,CAAC;KACL,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,MAAK;AACjB;AACoF;AACpF,QAAA,MAAM,yBAAyB,GAAG,CAAC,KAAsB,KAAI;YACzD,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;AAC7D;;AAEiB;AACjB,YAAA,IACI,CAAC,aAAa;gBACd,KAAK,CAAC,MAAM,YAAY,OAAO;AAC/B,gBAAA,UAAU,CAAC,OAAO;gBAClB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAC3C;AACE,gBAAA,wBAAwB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;aACpD;AACL,SAAC,CAAC;AAEF,QAAA,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE,yBAAyB,CAAC,CAAC;AAEtE,QAAA,OAAO,MAAK;AACR,YAAA,QAAQ,CAAC,mBAAmB,CAAC,eAAe,EAAE,yBAAyB,CAAC,CAAC;AAC7E,SAAC,CAAC;KACL,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAyB,KAAI;AAC1D,QAAA,IAAI,cAAc,CAAC,OAAO,CAAC,yBAAyB,EAAE;YAClD,OAAO;SACV;AACD,QAAA,cAAc,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5C,QAAA,MAAM,EAAE,4BAA4B,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;AAChE,QAAA,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC,4BAA4B,GAAG,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;QAC1G,IAAI,4BAA4B,KAAK,cAAc,CAAC,OAAO,CAAC,4BAA4B,EAAE;YACtF,KAAK,CAAC,cAAc,EAAE,CAAC;SAC1B;AACD,QAAA,IAAI,cAAc,CAAC,OAAO,CAAC,YAAY,EAAE;;YAErC,MAAM,YAAY,GAAG,wBAAwB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;;AAEtE,YAAA,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;;AAElD,YAAA,cAAc,CAAC,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;SAC3D;KACJ,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,MAAK;QAChC,MAAM,EAAE,yBAAyB,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;AACtF,QAAA,IAAI,YAAY,IAAI,yBAAyB,EAAE;AAC3C,YAAA,cAAc,CAAC,OAAO,CAAC,yBAAyB,GAAG,KAAK,CAAC;;YAEzD,iBAAiB,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;SAC5D;KACJ,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAyB,KAAI;AAC1D,QAAA,MAAM,EAAE,cAAc,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,YAAY,EAAE,GAC3F,cAAc,CAAC,OAAO,CAAC;AAC3B,QAAA,cAAc,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5C,IAAI,cAAc,EAAE;AAChB,YAAA,wBAAwB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;SACpD;QACD,IAAI,yBAAyB,EAAE;YAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;SACV;QACD,cAAc,CAAC,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AACxD,QAAA,MAAM,WAAW,GAAG,4BAA4B,GAAG,KAAK,CAAC,KAAK,CAAC;AAC/D,QAAA,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;AACpD,QAAA,wBAAwB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;;;;QAKjD,IAAI,WAAW,KAAK,cAAc,CAAC,OAAO,CAAC,4BAA4B,EAAE;YACrE,KAAK,CAAC,cAAc,EAAE,CAAC;SAC1B;QACD,IAAI,YAAY,EAAE;;YAEd,MAAM,YAAY,GAAG,wBAAwB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACtE,YAAA,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;;YAElD,wBAAwB,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;SACtE;KACJ,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,mBAAmB,GAAG,WAAW,CACnC,MACI,kBAAkB,CAAC;AACf,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,UAAU,EAAE,cAAc,CAAC,OAAO,CAAC,UAAU;QAC7C,WAAW;QACX,UAAU;QACV,WAAW;KACd,CAAC,EACN,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CACzC,CAAC;AAEF,IAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,MAAK;QAC1C,MAAM,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;AACxG,QAAA,OAAO,4BAA4B,GAAG,sBAAsB,IAAI,cAAc,CAAC;KAClF,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAK;AACzC,QAAA,MAAM,EAAE,4BAA4B,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;QAChE,OAAO,4BAA4B,IAAI,CAAC,CAAC;KAC5C,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACH,YAAY;QACZ,UAAU;QACV,YAAY;QACZ,iBAAiB;QACjB,gBAAgB;QAChB,UAAU;AACV,QAAA,kBAAkB,EAAE,mBAAmB;AACvC,QAAA,UAAU,EAAE,cAAc,CAAC,OAAO,CAAC,UAAU;AAC7C,QAAA,oBAAoB,EAAE,cAAc,CAAC,OAAO,CAAC,oBAAoB;AACjE,QAAA,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC,YAAY;QACjD,UAAU;QACV,SAAS;QACT,oBAAoB;QACpB,mBAAmB;KACtB,CAAC;AACN;;;;"}
|
package/useScrollContainer.js
CHANGED
|
@@ -4,5 +4,5 @@ import 'classnames';
|
|
|
4
4
|
import '@hh.ru/magritte-internal-custom-scroll';
|
|
5
5
|
import './types.js';
|
|
6
6
|
import './utils.js';
|
|
7
|
-
export { u as useScrollContainer } from './useScrollContainer-
|
|
7
|
+
export { u as useScrollContainer } from './useScrollContainer-DzOh_Ayb.js';
|
|
8
8
|
//# sourceMappingURL=useScrollContainer.js.map
|
package/utils.d.ts
CHANGED
|
@@ -1,5 +1 @@
|
|
|
1
1
|
export declare function debounce<T extends unknown[]>(callback: (...args: T) => void, waitMs: number): typeof callback;
|
|
2
|
-
/**
|
|
3
|
-
* Обертка модифицирующая функцию так, что она будет вызвана не чаще чем раз в кадр анимации
|
|
4
|
-
*/
|
|
5
|
-
export declare function scheduleForAnimationFrame<T extends unknown[]>(callback: (...args: T) => void): typeof callback;
|
package/utils.js
CHANGED
|
@@ -8,22 +8,6 @@ function debounce(callback, waitMs) {
|
|
|
8
8
|
}, waitMs);
|
|
9
9
|
};
|
|
10
10
|
}
|
|
11
|
-
/**
|
|
12
|
-
* Обертка модифицирующая функцию так, что она будет вызвана не чаще чем раз в кадр анимации
|
|
13
|
-
*/
|
|
14
|
-
function scheduleForAnimationFrame(callback) {
|
|
15
|
-
let scheduled = false;
|
|
16
|
-
return (...args) => {
|
|
17
|
-
if (scheduled) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
scheduled = true;
|
|
21
|
-
requestAnimationFrame(() => {
|
|
22
|
-
scheduled = false;
|
|
23
|
-
callback(...args);
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
11
|
|
|
28
|
-
export { debounce
|
|
12
|
+
export { debounce };
|
|
29
13
|
//# sourceMappingURL=utils.js.map
|
package/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["export function debounce<T extends unknown[]>(callback: (...args: T) => void, waitMs: number): typeof callback {\n let timeout = 0;\n return (...args: T) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n callback(...args);\n }, waitMs) as unknown as number;\n };\n}\n
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["export function debounce<T extends unknown[]>(callback: (...args: T) => void, waitMs: number): typeof callback {\n let timeout = 0;\n return (...args: T) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n callback(...args);\n }, waitMs) as unknown as number;\n };\n}\n"],"names":[],"mappings":"AAAgB,SAAA,QAAQ,CAAsB,QAA8B,EAAE,MAAc,EAAA;IACxF,IAAI,OAAO,GAAG,CAAC,CAAC;AAChB,IAAA,OAAO,CAAC,GAAG,IAAO,KAAI;QAClB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,QAAA,OAAO,GAAG,UAAU,CAAC,MAAK;AACtB,YAAA,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;SACrB,EAAE,MAAM,CAAsB,CAAC;AACpC,KAAC,CAAC;AACN;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useScrollContainer-LmCy1Ope.js","sources":["../src/useScrollContainer.ts"],"sourcesContent":["import { useRef, useEffect, RefObject, useCallback, useLayoutEffect, useState } from 'react';\nimport classnames from 'classnames';\n\nimport { ScrollGestureEvent, initScrollHandlers, clamp } from '@hh.ru/magritte-internal-custom-scroll';\nimport { ScrollInternalState, ItemWithOffset, OFFSET_ATTR } from '@hh.ru/magritte-ui-scrollable-container/types';\nimport { debounce, scheduleForAnimationFrame } from '@hh.ru/magritte-ui-scrollable-container/utils';\n\nimport styles from './scrollableContainer.less';\n\nconst BUTTON_WIDTH = 44;\nconst FOCUS_OUTLINE_WIDTH = 4;\nconst DEFAULT_DOT = 1;\n\n/**\n * На базе стейта проверяем возможность использования вычисленного index-а\n * @param index значение для проверки\n * @param state Состояние скролла\n */\nconst isIncorrectIndex = (index: number, state: ScrollInternalState) => index < 0 || state.items.length - 1 < index;\n\n/**\n * Валидирует значение анимации и устанавливает ее в контейнер\n * @param translation значение анимации\n * @param state Состояние скролла\n */\nconst setTranslation = (translation: number, state: ScrollInternalState) => {\n const { positionContainerRef, positionContainerWidth, containerWidth } = state;\n if (!positionContainerRef.current) {\n return;\n }\n const prevTranslation = state.positionContainerTranslation;\n state.positionContainerTranslation = clamp(translation, containerWidth - positionContainerWidth, 0);\n positionContainerRef.current.style.transform = `translate3d(${state.positionContainerTranslation}px, 0, 0)`;\n if (prevTranslation !== state.positionContainerTranslation) {\n state.onScroll?.();\n }\n};\n\n/**\n * Вычисляет нужно ли показывать фейды по краям и скрывать кнопки скролла\n * Применяет соответствующие классы к обертке\n * Проверяет что сдвиг контейнера позиционирования находится в допустимых пределах и если нет, то корректирует его\n * @param state Состояние скролла\n */\nconst applyScrollButtonsUpdate = (state: ScrollInternalState) => {\n const { positionContainerRef, wrapperRef, positionContainerWidth, containerWidth } = state;\n let { positionContainerTranslation } = state;\n\n if (!positionContainerRef.current || !wrapperRef.current) {\n return;\n }\n\n if (positionContainerWidth + positionContainerTranslation < containerWidth) {\n positionContainerTranslation = containerWidth - positionContainerWidth;\n setTranslation(positionContainerTranslation, state);\n }\n const isFadeLeft = positionContainerTranslation < 0;\n const isFadeRight = positionContainerTranslation + positionContainerWidth > containerWidth;\n const className = classnames({\n [styles.fadeLeftSide]: isFadeLeft && !isFadeRight,\n [styles.fadeRightSide]: isFadeRight && !isFadeLeft,\n [styles.fadeBothSides]: isFadeRight && isFadeLeft,\n });\n wrapperRef.current.classList.remove(styles.fadeBothSides, styles.fadeLeftSide, styles.fadeRightSide);\n className && wrapperRef.current.classList.add(className);\n};\n\nconst setAnimated = (state: ScrollInternalState, animated: boolean) => {\n state.positionContainerRef.current?.classList.toggle(styles.positionContainerAnimated, animated);\n if (!animated) {\n state.scrollAnimationInProgress = false;\n }\n};\n\n/**\n * Скролл к конкретному элементу группы. Если на момент вызова нет ref контейнера позиционирования, то считаем что\n * функция была при маунте компонента и запоминаем элемент на который нужно скроллить. При маунте вызываем эту функцию\n * еще раз и скроллим к запомненному элементу без анимации.\n * @param state Состояние скролла\n * @param item Элемент к которому нужно подскроллить\n */\nconst scrollTo = (state: ScrollInternalState, item: RefObject<HTMLElement>) => {\n const {\n positionContainerTranslation,\n containerWidth,\n positionContainerRef,\n scrollToItemInProgress,\n disableButtons,\n positionContainerWidth,\n showDotPages,\n items,\n } = state;\n if (!positionContainerRef.current) {\n state.scrollToOnMount = item;\n return;\n }\n\n if (item.current === scrollToItemInProgress?.current) {\n return;\n }\n state.previousActiveIndexItem = items.indexOf(item as unknown as RefObject<HTMLElement & ItemWithOffset>);\n const offset = (item.current as unknown as ItemWithOffset)[OFFSET_ATTR];\n const width = offset.right - offset.left;\n const buttonsCorrection = disableButtons ? 0 : BUTTON_WIDTH;\n\n // нужно ли отцентрировать контейнер по текущему item\n // актуально для режима showDotPages\n // так как контейнер работает как карусель\n const needItemCorrection = showDotPages;\n let translation = positionContainerTranslation;\n if (width > containerWidth) {\n // элемент шире контейнера\n translation = -((width - containerWidth) / 2 + offset.left);\n } else if (offset.left + positionContainerTranslation < buttonsCorrection && positionContainerTranslation < 0) {\n // контейнер движется вправо\n const correction = needItemCorrection ? (containerWidth - width) / 2 : buttonsCorrection;\n translation = -offset.left + correction;\n } else if (\n offset.right + positionContainerTranslation > containerWidth - buttonsCorrection &&\n positionContainerTranslation > containerWidth - positionContainerWidth\n ) {\n // контейнер движется влево\n const correction = needItemCorrection ? (containerWidth - width) / 2 : buttonsCorrection;\n translation = containerWidth - offset.right - correction;\n } else if (showDotPages) {\n // анимация к центру элемента (при необходимости)\n const correction = (containerWidth - width) / 2;\n // если находимся на границе контейнера, то анимации уже не будет (так как граница блока достигнута)\n // то есть translation надо скорректировать на базе контейнера чрз clamp\n translation = clamp(-offset.left + correction, containerWidth - positionContainerWidth, 0);\n }\n\n const isPositionChanged = translation !== positionContainerTranslation;\n const needAnimation = !state.scrollToOnMount && isPositionChanged;\n\n // Если это скролл при маунте, или позиция скролла не изменилась, то его не нужно анимировать\n setAnimated(state, needAnimation);\n setTranslation(translation, state);\n if (needAnimation) {\n state.scrollAnimationInProgress = true;\n state.scrollToItemInProgress = item;\n }\n applyScrollButtonsUpdate(state);\n};\n\n/**\n * Если текущий элемент совпадает с новым\n * Находим следующий активный элемент по направлению и скролим к нему\n */\nconst scrollToNewItemDebounced = debounce((state: ScrollInternalState, indexNearestToCenter: number) => {\n const { previousActiveIndexItem, items, directionRight } = state;\n let index = indexNearestToCenter;\n // определяем ситуацию, когда скрола не хватило до следующего элемента\n if (previousActiveIndexItem === indexNearestToCenter) {\n const indexBasedOnDirection = directionRight ? indexNearestToCenter + 1 : indexNearestToCenter - 1;\n // нужно проверить новый индекс, чтобы не выходить за границы\n if (!isIncorrectIndex(indexBasedOnDirection, state)) {\n index = indexBasedOnDirection;\n state.setActiveDot(index + 1);\n }\n }\n const item: RefObject<HTMLElement> = items[index];\n scrollTo(state, item);\n}, 30);\n\n/**\n * Скролл к конкретному элементу группы (обернуто в debounce)\n */\nconst scrollToDebounced = debounce(\n (state: ScrollInternalState, index: number) => scrollTo(state, state.items[index]),\n 30\n);\n\n/**\n * Пересчитывает позиции элементов и обновляет состояние скролла. Вызывается при изменении размеров контейнера или\n * добавлении/удалении элементов. Проходится по всем элементам и вычисляет сдвиг их правой и левой границы относительно\n * контейнера позиционирования. Сортирует элементы по возрастанию сдвига левой границы. Вычисляет ширину внешнего\n * контейнера и контейнера позиционирования. При вычислении ширины контейнера позиционирования правой его границей\n * считается правая граница самого крайнего справа элемента. Это нужно чтобы при переносе элементов на несколько строк\n * справа не появлялось лишнее пустое пространство.\n * @param state Состояние скролла\n */\nconst recalculateItemPositions = (state: ScrollInternalState) => {\n const { positionContainerRef, containerRef, items, showDotPages, setCountItems } = state;\n\n if (!positionContainerRef.current || !containerRef.current) {\n return;\n }\n const offset = positionContainerRef.current.getBoundingClientRect().left || 0;\n items.forEach((itemRef) => {\n if (!itemRef.current) {\n return;\n }\n const rect = itemRef.current.getBoundingClientRect();\n itemRef.current[OFFSET_ATTR] = { left: rect.left - offset, right: rect.right - offset };\n });\n\n if (showDotPages) {\n setCountItems(items.length);\n }\n\n state.recalcRequired = false;\n // т.к. нам нужна ширина content-box, то вычитаем левую и правую коррекцию, т.к. ей будут равны паддинги\n state.containerWidth =\n containerRef.current.offsetWidth - state.correction.leftCorrection - state.correction.rightCorrection;\n // считаем ширину контейнера позиционирования равной правой границе самого крайнего элемента\n state.positionContainerWidth = items.reduce(\n (position, itemRef) => Math.max(position, itemRef.current?.[OFFSET_ATTR]?.right || 0),\n 0\n );\n if (!state.disableButtons && state.positionContainerWidth > state.containerWidth) {\n state.containerWidth -= FOCUS_OUTLINE_WIDTH;\n }\n\n // если при маунте, когда у нас еще не было информации об элементах и размерах контейнеров был вызван scrollTo,\n // то нужно проскроллить без анимации\n if (state.scrollToOnMount) {\n scrollTo(state, state.scrollToOnMount);\n state.scrollToOnMount = null;\n return;\n }\n\n applyScrollButtonsUpdate(state);\n};\n\n/**\n * Инициализирует ResizeObserver для контейнера и контейнера позиционирования\n */\nconst initResizeObserver = (state: ScrollInternalState) => {\n const { positionContainerRef, containerRef } = state;\n if (!positionContainerRef.current || !containerRef.current) {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n return () => {};\n }\n let firstCall = true;\n const observer = new ResizeObserver(\n scheduleForAnimationFrame(() => {\n if (firstCall) {\n firstCall = false;\n return;\n }\n recalculateItemPositions(state);\n })\n );\n observer.observe(containerRef.current);\n observer.observe(positionContainerRef.current);\n\n return () => observer.disconnect();\n};\n\n/**\n * На базе стейта считает ближайший элемент, который ближе к центру вью контейнера\n * Между блоками могут быть отступы, тогда centerPoint в offset-ы ни одного из элементов не попадет\n * В этом случае, используем предыдущее значение\n * @param state Состояние скролла\n * @returns Индекс элемента в массиве state.items\n */\nconst findIndexNearestToCenter = (state: ScrollInternalState): number => {\n const centerPoint = state.containerWidth / 2 + Math.abs(state.positionContainerTranslation);\n const indexNearestToCenter = state.items.findIndex((itemRef) => {\n if (!itemRef.current) {\n return false;\n }\n const offset = itemRef.current[OFFSET_ATTR];\n return offset.left < centerPoint && offset.right > centerPoint;\n });\n return indexNearestToCenter !== -1 ? indexNearestToCenter + 1 : state.activeDot;\n};\n\ninterface UseScrollContainer {\n registerItem: (ref: RefObject<HTMLElement>) => void;\n removeItem: (ref: RefObject<HTMLElement>) => void;\n scrollToItem: (ref: RefObject<HTMLElement>) => void;\n scrollToFirstItem: VoidFunction;\n scrollToLastItem: VoidFunction;\n scrollSide: (right?: boolean) => void;\n initScrollHandlers: () => VoidFunction;\n wrapperRef: RefObject<HTMLDivElement>;\n positionContainerRef: RefObject<HTMLDivElement>;\n containerRef: RefObject<HTMLDivElement>;\n countItems: number;\n activeDot: number;\n isScrollRightEnabled: () => boolean;\n isScrollLeftEnabled: () => boolean;\n}\n\nexport const useScrollContainer = (\n leftCorrection: number,\n rightCorrection: number,\n disableButtons: boolean,\n showDotPages?: boolean,\n onScroll?: () => void\n): UseScrollContainer => {\n // need state for dot component\n const [activeDot, setActiveDot] = useState(DEFAULT_DOT);\n const [countItems, setCountItems] = useState(0);\n const scrollStateRef = useRef<ScrollInternalState>({\n wrapperRef: useRef<HTMLDivElement>(null),\n positionContainerRef: useRef<HTMLDivElement>(null),\n containerRef: useRef<HTMLDivElement>(null),\n positionContainerWidth: 0,\n positionContainerTranslation: 0,\n containerWidth: 0,\n items: [],\n correction: { leftCorrection: 0, rightCorrection: 0 },\n disableButtons: false,\n scrollAnimationInProgress: false,\n scrollToOnMount: null,\n recalcRequired: false,\n scrollToItemInProgress: null,\n showDotPages: false,\n activeDot: DEFAULT_DOT,\n needCorrectionOnScrollEnd: false,\n setActiveDot,\n setCountItems,\n directionRight: false,\n previousActiveIndexItem: 0,\n onScroll,\n });\n\n scrollStateRef.current.correction = { leftCorrection, rightCorrection };\n scrollStateRef.current.disableButtons = disableButtons;\n scrollStateRef.current.showDotPages = Boolean(showDotPages);\n scrollStateRef.current.activeDot = activeDot;\n scrollStateRef.current.onScroll = onScroll;\n\n // eslint-disable-next-line disable-autofix/react-hooks/exhaustive-deps\n const recalculateItemPositionsDebounced = useCallback(\n debounce(() => recalculateItemPositions(scrollStateRef.current), 10),\n []\n );\n\n const scrollToItem = useCallback((ref: RefObject<HTMLElement>) => {\n if (scrollStateRef.current.recalcRequired) {\n recalculateItemPositions(scrollStateRef.current);\n }\n // set active dot here because user can click on item\n if (scrollStateRef.current.showDotPages) {\n scrollStateRef.current.setActiveDot(\n scrollStateRef.current.items.indexOf(ref as unknown as RefObject<HTMLElement & ItemWithOffset>) + 1\n );\n }\n scrollTo(scrollStateRef.current, ref);\n }, []);\n\n const scrollToFirstItem = useCallback(() => {\n const { items } = scrollStateRef.current;\n items.length > 0 && scrollToItem(items[0]);\n }, [scrollToItem]);\n\n const scrollToLastItem = useCallback(() => {\n const { items } = scrollStateRef.current;\n items.length > 0 && scrollToItem(items[items.length - 1]);\n }, [scrollToItem]);\n\n const scrollSide = useCallback(\n (directionRight?: boolean) => {\n const { containerWidth, positionContainerRef, positionContainerTranslation, showDotPages } =\n scrollStateRef.current;\n if (!positionContainerRef.current) {\n return;\n }\n if (!showDotPages) {\n // move container based on container width\n const translation = positionContainerTranslation + (directionRight ? -containerWidth : containerWidth);\n setAnimated(scrollStateRef.current, true);\n setTranslation(translation, scrollStateRef.current);\n applyScrollButtonsUpdate(scrollStateRef.current);\n } else {\n // calc new dot and check it\n const activeDot = scrollStateRef.current.activeDot;\n const newActiveDot = directionRight ? activeDot + 1 : activeDot - 1;\n if (!isIncorrectIndex(newActiveDot - 1, scrollStateRef.current)) {\n // move container to new select ref\n scrollToItem(scrollStateRef.current.items[newActiveDot - 1]);\n }\n }\n },\n [scrollToItem]\n );\n\n const registerItem = useCallback((ref: RefObject<HTMLElement>) => {\n if (!ref.current) {\n return;\n }\n\n scrollStateRef.current.items.push(ref as unknown as RefObject<HTMLElement & ItemWithOffset>);\n scrollStateRef.current.recalcRequired = true;\n recalculateItemPositions(scrollStateRef.current);\n }, []);\n\n const removeItem = useCallback(\n (ref: RefObject<HTMLElement>) => {\n if (!ref.current) {\n return;\n }\n\n scrollStateRef.current.items = scrollStateRef.current.items.filter(\n (storedRef) => storedRef.current !== ref.current\n );\n recalculateItemPositionsDebounced();\n },\n [recalculateItemPositionsDebounced]\n );\n\n useEffect(() => {\n const { wrapperRef, positionContainerRef, containerRef } = scrollStateRef.current;\n if (!containerRef.current || !positionContainerRef.current || !wrapperRef.current) {\n return void 0;\n }\n\n const transitionEndHandler = (event: TransitionEvent) => {\n if (event.target !== scrollStateRef.current?.positionContainerRef.current) {\n return;\n }\n setAnimated(scrollStateRef.current, false);\n if (scrollStateRef.current) {\n scrollStateRef.current.scrollAnimationInProgress = false;\n scrollStateRef.current.scrollToItemInProgress = null;\n }\n };\n const positionContainer = scrollStateRef.current?.positionContainerRef.current;\n positionContainer?.addEventListener('transitionend', transitionEndHandler);\n\n const resizeObserverCleanup = initResizeObserver(scrollStateRef.current);\n\n return () => {\n resizeObserverCleanup();\n positionContainer?.removeEventListener('transitionend', transitionEndHandler);\n };\n }, []);\n\n useLayoutEffect(() => {\n recalculateItemPositions(scrollStateRef.current);\n if (disableButtons) {\n setAnimated(scrollStateRef.current, false);\n }\n }, [disableButtons, leftCorrection, rightCorrection]);\n\n useEffect(() => {\n const wrapperRef = scrollStateRef.current.wrapperRef.current;\n if (!wrapperRef) {\n return void 0;\n }\n const handleTouchStartHandler = (event: TouchEvent) => {\n event.stopPropagation();\n };\n wrapperRef.addEventListener('touchstart', handleTouchStartHandler);\n return () => {\n wrapperRef.removeEventListener('touchstart', handleTouchStartHandler);\n };\n }, []);\n\n const onTouchMove = useCallback((event: ScrollGestureEvent) => {\n if (scrollStateRef.current.scrollAnimationInProgress) {\n return;\n }\n const { positionContainerTranslation } = scrollStateRef.current;\n setTranslation(scrollStateRef.current.positionContainerTranslation + event.delta, scrollStateRef.current);\n if (positionContainerTranslation === scrollStateRef.current.positionContainerTranslation) {\n event.preventDefault();\n }\n if (scrollStateRef.current.showDotPages) {\n // by touch change active dot\n const newActiveDot = findIndexNearestToCenter(scrollStateRef.current);\n // update state\n scrollStateRef.current.setActiveDot(newActiveDot);\n // scheduling correction\n scrollStateRef.current.needCorrectionOnScrollEnd = true;\n }\n }, []);\n\n const onTouchEnd = useCallback(() => {\n const { needCorrectionOnScrollEnd, showDotPages, activeDot } = scrollStateRef.current;\n if (showDotPages && needCorrectionOnScrollEnd) {\n scrollStateRef.current.needCorrectionOnScrollEnd = false;\n // center active element\n scrollToDebounced(scrollStateRef.current, activeDot - 1);\n }\n }, []);\n\n const onWheelMove = useCallback((event: ScrollGestureEvent) => {\n const { recalcRequired, scrollAnimationInProgress, positionContainerTranslation, showDotPages } =\n scrollStateRef.current;\n if (recalcRequired) {\n recalculateItemPositions(scrollStateRef.current);\n }\n if (scrollAnimationInProgress) {\n event.preventDefault();\n return;\n }\n scrollStateRef.current.directionRight = event.delta < 0;\n const translation = positionContainerTranslation + event.delta;\n setTranslation(translation, scrollStateRef.current);\n applyScrollButtonsUpdate(scrollStateRef.current);\n\n // эти значения могут быть не равны только в случае если попытались сдвинуть контейнер дальше\n // допустимого значения, это значит что мы уперлись в левую или правую границу, значит дальнейшие события\n // скролла можно не обрабатывать\n if (translation === scrollStateRef.current.positionContainerTranslation) {\n event.preventDefault();\n }\n if (showDotPages) {\n // by wheel change active dot\n const newActiveDot = findIndexNearestToCenter(scrollStateRef.current);\n scrollStateRef.current.setActiveDot(newActiveDot);\n // center active element\n scrollToNewItemDebounced(scrollStateRef.current, newActiveDot - 1);\n }\n }, []);\n\n const _initScrollHandlers = useCallback(\n () =>\n initScrollHandlers({\n axis: 'horizontal',\n wrapperRef: scrollStateRef.current.wrapperRef,\n onTouchMove,\n onTouchEnd,\n onWheelMove,\n }),\n [onTouchMove, onTouchEnd, onWheelMove]\n );\n\n const isScrollRightEnabled = useCallback(() => {\n const { positionContainerTranslation, positionContainerWidth, containerWidth } = scrollStateRef.current;\n return positionContainerTranslation + positionContainerWidth <= containerWidth;\n }, []);\n\n const isScrollLeftEnabled = useCallback(() => {\n const { positionContainerTranslation } = scrollStateRef.current;\n return positionContainerTranslation >= 0;\n }, []);\n\n return {\n registerItem,\n removeItem,\n scrollToItem,\n scrollToFirstItem,\n scrollToLastItem,\n scrollSide,\n initScrollHandlers: _initScrollHandlers,\n wrapperRef: scrollStateRef.current.wrapperRef,\n positionContainerRef: scrollStateRef.current.positionContainerRef,\n containerRef: scrollStateRef.current.containerRef,\n countItems,\n activeDot,\n isScrollRightEnabled,\n isScrollLeftEnabled,\n };\n};\n"],"names":[],"mappings":"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"}
|