@hh.ru/magritte-ui-scrollable-container 4.5.10 → 5.0.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.
@@ -6,7 +6,7 @@ import { Action } from '@hh.ru/magritte-ui-action';
6
6
  import { Breakpoint, useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
7
7
  import { DotPages } from '@hh.ru/magritte-ui-dot-pages';
8
8
  import { ChevronLeftOutlinedSize24, ChevronRightOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
9
- import { u as useScrollContainer, s as styles } from './useScrollContainer-Ch0KW7_j.js';
9
+ import { u as useScrollContainer, s as styles } from './useScrollContainer-dz27uMy6.js';
10
10
  import { VSpacing } from '@hh.ru/magritte-ui-spacing';
11
11
  import '@hh.ru/magritte-internal-custom-scroll';
12
12
  import './types.js';
@@ -126,16 +126,16 @@ const ScrollableContainerComponent = ({ children, disableButtons: _disableButton
126
126
  correctionRightXXL,
127
127
  breakpoint.breakpoint,
128
128
  ]);
129
- const { containerRef, positionContainerRef, wrapperRef, registerItem, removeItem, scrollToItem, scrollToFirstItem, scrollToLastItem, scrollSide, initScrollHandlers, countItems, isScrollRightEnabled, isScrollLeftEnabled, activeDot, } = useScrollContainer(spacingCorrectionStyles.paddingLeft, spacingCorrectionStyles.paddingRight, disableButtons, showDotPages, onScroll);
129
+ const { containerRef, positionContainerRef, wrapperRef, registerItem, removeItem, scrollToItem, scrollToFirstItem, scrollToLastItem, scrollSide, initScrollHandlers, countItems, isScrollRightDisabled, isScrollLeftDisabled, activeDot, } = useScrollContainer(spacingCorrectionStyles.paddingLeft, spacingCorrectionStyles.paddingRight, disableButtons, showDotPages, onScroll);
130
130
  useEffect(initScrollHandlers, [initScrollHandlers]);
131
131
  useImperativeHandle(controlsRef, () => ({
132
132
  scrollLeft: () => scrollSide(),
133
133
  scrollRight: () => scrollSide(true),
134
134
  scrollToFirstItem: () => scrollToFirstItem(),
135
135
  scrollToLastItem: () => scrollToLastItem(),
136
- isScrollRightEnabled: () => isScrollRightEnabled(),
137
- isScrollLeftEnabled: () => isScrollLeftEnabled(),
138
- }), [scrollSide, scrollToFirstItem, scrollToLastItem, isScrollRightEnabled, isScrollLeftEnabled]);
136
+ isScrollRightDisabled: () => isScrollRightDisabled(),
137
+ isScrollLeftDisabled: () => isScrollLeftDisabled(),
138
+ }), [scrollSide, scrollToFirstItem, scrollToLastItem, isScrollRightDisabled, isScrollLeftDisabled]);
139
139
  useEffect(() => {
140
140
  onChangeDot?.(activeDot);
141
141
  }, [onChangeDot, activeDot]);
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollableContainer.js","sources":["../src/ScrollableContainer.tsx"],"sourcesContent":["import {\n createContext,\n RefObject,\n useEffect,\n useMemo,\n useContext,\n forwardRef,\n useImperativeHandle,\n ForwardedRef,\n ReactElement,\n PropsWithChildren,\n} from 'react';\nimport classnames from 'classnames';\n\nimport { Action } from '@hh.ru/magritte-ui-action';\nimport { useBreakpoint, Breakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { DotPages } from '@hh.ru/magritte-ui-dot-pages';\nimport { ChevronRightOutlinedSize24, ChevronLeftOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport {\n SpacingCorrectionProps,\n ScrollableControls,\n ScrollableContainerProps,\n} from '@hh.ru/magritte-ui-scrollable-container/types';\nimport { useScrollContainer } from '@hh.ru/magritte-ui-scrollable-container/useScrollContainer';\nimport { VSpacing } from '@hh.ru/magritte-ui-spacing';\n\nimport styles from './scrollableContainer.less';\n\ninterface ScrollContextType {\n registerItem: (ref: RefObject<HTMLElement>) => void;\n removeItem: (ref: RefObject<HTMLElement>) => void;\n scrollToItem: (ref: RefObject<HTMLElement>) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noopFunc = () => {};\nconst ScrollContext = createContext<ScrollContextType>({\n registerItem: noopFunc,\n removeItem: noopFunc,\n scrollToItem: noopFunc,\n});\n\nexport const useScrollContext = (): ScrollContextType => useContext(ScrollContext);\n\nconst BREAKPOINTS_LIST = [Breakpoint.XS, Breakpoint.S, Breakpoint.M, Breakpoint.L, Breakpoint.XL, Breakpoint.XXL];\nconst NO_BUTTONS_START_FROM_BREAKPOINT = Breakpoint.S;\nconst NO_TRANSLATE = { transform: 'translate3d(0px, 0, 0)' };\n\n/**\n * По переданным параметрам коррекции возвращает значения отступов для текущего брейкпоинта\n * @param props Параметры коррекции\n * @param breakpoint Текуший брейкпоинт\n * @returns Объект содержащий значения отступов\n */\nconst getActualCorrection = (props: SpacingCorrectionProps, breakpoint: Breakpoint) => {\n const breakpointIndex = BREAKPOINTS_LIST.indexOf(breakpoint);\n let leftCorrection: number | undefined;\n let rightCorrection: number | undefined;\n // Проходимся по всем брейкпоинтам, начиная с текущего в сторону меньших разрешений\n for (let i = breakpointIndex; i >= 0; i--) {\n const breakpointName = BREAKPOINTS_LIST[i].toUpperCase();\n // Ключи, которые могут быть в параметрах коррекции (SpacingCorrectionProps)\n const leftCorrectionKey = `correctionLeft${breakpointName}` as keyof SpacingCorrectionProps;\n const rightCorrectionKey = `correctionRight${breakpointName}` as keyof SpacingCorrectionProps;\n const commonCorrectionKey = `correction${breakpointName}` as keyof SpacingCorrectionProps;\n // Если для текущего брейкпоинта есть параметры коррекции для левой/правой стороны, то берем их\n props[leftCorrectionKey] !== undefined &&\n leftCorrection === undefined &&\n (leftCorrection = props[leftCorrectionKey]);\n props[rightCorrectionKey] !== undefined &&\n rightCorrection === undefined &&\n (rightCorrection = props[rightCorrectionKey]);\n\n // Если для левой или правой стороны не найден параметр коррекции, то пробуем взять параметр correction для\n // брейкпоинта который сейчас обрабатываем в цикле, например correctionM\n if (props[commonCorrectionKey] !== undefined) {\n leftCorrection === undefined && (leftCorrection = props[commonCorrectionKey]);\n rightCorrection === undefined && (rightCorrection = props[commonCorrectionKey]);\n }\n\n // Если нашли значения для обеих сторон - возращаем\n if (leftCorrection !== undefined && rightCorrection !== undefined) {\n return { leftCorrection, rightCorrection };\n }\n }\n\n // Если не нашли значение для какой то из сторон, то берем значение из correction, без уточнения брейкпоинта\n return {\n leftCorrection: leftCorrection === undefined ? props.correction || 0 : leftCorrection,\n rightCorrection: rightCorrection === undefined ? props.correction || 0 : rightCorrection,\n };\n};\n\nexport const ScrollableContainerComponent = (\n {\n children,\n disableButtons: _disableButtons,\n correction = 0,\n correctionXS,\n correctionS,\n correctionM,\n correctionL,\n correctionXL,\n correctionXXL,\n correctionLeftXS,\n correctionLeftS,\n correctionLeftM,\n correctionLeftL,\n correctionLeftXL,\n correctionLeftXXL,\n correctionRightXS,\n correctionRightS,\n correctionRightM,\n correctionRightL,\n correctionRightXL,\n correctionRightXXL,\n showDotPages,\n dotPagesProps,\n onChangeDot,\n onScroll,\n ...rest\n }: PropsWithChildren<ScrollableContainerProps>,\n controlsRef?: ForwardedRef<ScrollableControls>\n): ReactElement => {\n const breakpoint = useBreakpoint();\n const breakpointIndex = BREAKPOINTS_LIST.indexOf(breakpoint.breakpoint);\n const noButtonBreakpointIndex = BREAKPOINTS_LIST.indexOf(NO_BUTTONS_START_FROM_BREAKPOINT);\n\n // use corrections and cast container to mobile view\n const disableButtons = _disableButtons || breakpointIndex <= noButtonBreakpointIndex;\n\n const spacingCorrectionStyles = useMemo(() => {\n // component use default button\n if (!disableButtons) {\n return { paddingLeft: 0, paddingRight: 0 };\n }\n const correctionProps = {\n correction,\n correctionXS,\n correctionS,\n correctionM,\n correctionL,\n correctionXL,\n correctionXXL,\n correctionLeftXS,\n correctionLeftS,\n correctionLeftM,\n correctionLeftL,\n correctionLeftXL,\n correctionLeftXXL,\n correctionRightXS,\n correctionRightS,\n correctionRightM,\n correctionRightL,\n correctionRightXL,\n correctionRightXXL,\n };\n const correctionValue = getActualCorrection(correctionProps, breakpoint.breakpoint);\n return {\n marginLeft: -correctionValue.leftCorrection,\n marginRight: -correctionValue.rightCorrection,\n paddingLeft: correctionValue.leftCorrection,\n paddingRight: correctionValue.rightCorrection,\n };\n }, [\n disableButtons,\n correction,\n correctionXS,\n correctionS,\n correctionM,\n correctionL,\n correctionXL,\n correctionXXL,\n correctionLeftXS,\n correctionLeftS,\n correctionLeftM,\n correctionLeftL,\n correctionLeftXL,\n correctionLeftXXL,\n correctionRightXS,\n correctionRightS,\n correctionRightM,\n correctionRightL,\n correctionRightXL,\n correctionRightXXL,\n breakpoint.breakpoint,\n ]);\n\n const {\n containerRef,\n positionContainerRef,\n wrapperRef,\n registerItem,\n removeItem,\n scrollToItem,\n scrollToFirstItem,\n scrollToLastItem,\n scrollSide,\n initScrollHandlers,\n countItems,\n isScrollRightEnabled,\n isScrollLeftEnabled,\n activeDot,\n } = useScrollContainer(\n spacingCorrectionStyles.paddingLeft,\n spacingCorrectionStyles.paddingRight,\n disableButtons,\n showDotPages,\n onScroll\n );\n\n useEffect(initScrollHandlers, [initScrollHandlers]);\n\n useImperativeHandle(\n controlsRef,\n () => ({\n scrollLeft: () => scrollSide(),\n scrollRight: () => scrollSide(true),\n scrollToFirstItem: () => scrollToFirstItem(),\n scrollToLastItem: () => scrollToLastItem(),\n isScrollRightEnabled: () => isScrollRightEnabled(),\n isScrollLeftEnabled: () => isScrollLeftEnabled(),\n }),\n [scrollSide, scrollToFirstItem, scrollToLastItem, isScrollRightEnabled, isScrollLeftEnabled]\n );\n\n useEffect(() => {\n onChangeDot?.(activeDot);\n }, [onChangeDot, activeDot]);\n\n return (\n <div>\n <div\n ref={wrapperRef}\n data-qa=\"scrollable-container__wrapper\"\n className={classnames(styles.scrollWrapper, {\n [styles.noButtons]: disableButtons,\n })}\n {...rest}\n >\n <div\n className={styles.scrollableContainer}\n style={disableButtons ? spacingCorrectionStyles : {}}\n ref={containerRef}\n data-qa=\"scrollable-container__overflow-container\"\n >\n <div\n data-qa=\"scrollable-container__position-container\"\n className={styles.positionContainer}\n style={NO_TRANSLATE}\n ref={positionContainerRef}\n >\n <ScrollContext.Provider value={{ registerItem, removeItem, scrollToItem }}>\n {children}\n </ScrollContext.Provider>\n </div>\n </div>\n {!disableButtons && (\n <>\n <div className={classnames(styles.scrollButton, styles.scrollButtonLeft)}>\n <Action\n tabIndex={-1}\n mode=\"secondary\"\n style=\"neutral\"\n icon={ChevronLeftOutlinedSize24}\n showBackground\n onClick={() => scrollSide()}\n data-qa=\"scrollable-container__scroll-button-left\"\n />\n </div>\n <div className={classnames(styles.scrollButton, styles.scrollButtonRight)}>\n <Action\n tabIndex={-1}\n mode=\"secondary\"\n style=\"neutral\"\n icon={ChevronRightOutlinedSize24}\n showBackground\n onClick={() => scrollSide(true)}\n data-qa=\"scrollable-container__scroll-button-right\"\n />\n </div>\n </>\n )}\n </div>\n {showDotPages && countItems > 1 && (\n <div>\n <VSpacing default={8} />\n <div className={styles.dotContainer}>\n <DotPages\n active={activeDot}\n count={countItems}\n data-qa=\"scrollable-container__dot-pages\"\n {...dotPagesProps}\n />\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport const ScrollableContainer = forwardRef(ScrollableContainerComponent);\n\nScrollableContainer.displayName = 'ScrollableContainer';\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":";;;;;;;;;;;;;AAkCA;AACA,MAAM,QAAQ,GAAG,MAAK,GAAG,CAAC;AAC1B,MAAM,aAAa,GAAG,aAAa,CAAoB;AACnD,IAAA,YAAY,EAAE,QAAQ;AACtB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,YAAY,EAAE,QAAQ;AACzB,CAAA,CAAC,CAAC;AAEU,MAAA,gBAAgB,GAAG,MAAyB,UAAU,CAAC,aAAa,EAAE;AAEnF,MAAM,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;AAClH,MAAM,gCAAgC,GAAG,UAAU,CAAC,CAAC,CAAC;AACtD,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC;AAE7D;;;;;AAKG;AACH,MAAM,mBAAmB,GAAG,CAAC,KAA6B,EAAE,UAAsB,KAAI;IAClF,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC7D,IAAA,IAAI,cAAkC,CAAC;AACvC,IAAA,IAAI,eAAmC,CAAC;;AAExC,IAAA,KAAK,IAAI,CAAC,GAAG,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;;AAEzD,QAAA,MAAM,iBAAiB,GAAG,CAAiB,cAAA,EAAA,cAAc,EAAkC,CAAC;AAC5F,QAAA,MAAM,kBAAkB,GAAG,CAAkB,eAAA,EAAA,cAAc,EAAkC,CAAC;AAC9F,QAAA,MAAM,mBAAmB,GAAG,CAAa,UAAA,EAAA,cAAc,EAAkC,CAAC;;AAE1F,QAAA,KAAK,CAAC,iBAAiB,CAAC,KAAK,SAAS;AAClC,YAAA,cAAc,KAAK,SAAS;AAC5B,aAAC,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAChD,QAAA,KAAK,CAAC,kBAAkB,CAAC,KAAK,SAAS;AACnC,YAAA,eAAe,KAAK,SAAS;AAC7B,aAAC,eAAe,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;;;AAIlD,QAAA,IAAI,KAAK,CAAC,mBAAmB,CAAC,KAAK,SAAS,EAAE;YAC1C,cAAc,KAAK,SAAS,KAAK,cAAc,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC9E,eAAe,KAAK,SAAS,KAAK,eAAe,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;SACnF;;QAGD,IAAI,cAAc,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS,EAAE;AAC/D,YAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;SAC9C;KACJ;;IAGD,OAAO;AACH,QAAA,cAAc,EAAE,cAAc,KAAK,SAAS,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,GAAG,cAAc;AACrF,QAAA,eAAe,EAAE,eAAe,KAAK,SAAS,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,GAAG,eAAe;KAC3F,CAAC;AACN,CAAC,CAAC;AAEK,MAAM,4BAA4B,GAAG,CACxC,EACI,QAAQ,EACR,cAAc,EAAE,eAAe,EAC/B,UAAU,GAAG,CAAC,EACd,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,QAAQ,EACR,GAAG,IAAI,EACmC,EAC9C,WAA8C,KAChC;AACd,IAAA,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACxE,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;;AAG3F,IAAA,MAAM,cAAc,GAAG,eAAe,IAAI,eAAe,IAAI,uBAAuB,CAAC;AAErF,IAAA,MAAM,uBAAuB,GAAG,OAAO,CAAC,MAAK;;QAEzC,IAAI,CAAC,cAAc,EAAE;YACjB,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;SAC9C;AACD,QAAA,MAAM,eAAe,GAAG;YACpB,UAAU;YACV,YAAY;YACZ,WAAW;YACX,WAAW;YACX,WAAW;YACX,YAAY;YACZ,aAAa;YACb,gBAAgB;YAChB,eAAe;YACf,eAAe;YACf,eAAe;YACf,gBAAgB;YAChB,iBAAiB;YACjB,iBAAiB;YACjB,gBAAgB;YAChB,gBAAgB;YAChB,gBAAgB;YAChB,iBAAiB;YACjB,kBAAkB;SACrB,CAAC;QACF,MAAM,eAAe,GAAG,mBAAmB,CAAC,eAAe,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;QACpF,OAAO;AACH,YAAA,UAAU,EAAE,CAAC,eAAe,CAAC,cAAc;AAC3C,YAAA,WAAW,EAAE,CAAC,eAAe,CAAC,eAAe;YAC7C,WAAW,EAAE,eAAe,CAAC,cAAc;YAC3C,YAAY,EAAE,eAAe,CAAC,eAAe;SAChD,CAAC;AACN,KAAC,EAAE;QACC,cAAc;QACd,UAAU;QACV,YAAY;QACZ,WAAW;QACX,WAAW;QACX,WAAW;QACX,YAAY;QACZ,aAAa;QACb,gBAAgB;QAChB,eAAe;QACf,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,iBAAiB;QACjB,iBAAiB;QACjB,gBAAgB;QAChB,gBAAgB;QAChB,gBAAgB;QAChB,iBAAiB;QACjB,kBAAkB;AAClB,QAAA,UAAU,CAAC,UAAU;AACxB,KAAA,CAAC,CAAC;IAEH,MAAM,EACF,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,GACZ,GAAG,kBAAkB,CAClB,uBAAuB,CAAC,WAAW,EACnC,uBAAuB,CAAC,YAAY,EACpC,cAAc,EACd,YAAY,EACZ,QAAQ,CACX,CAAC;AAEF,IAAA,SAAS,CAAC,kBAAkB,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAEpD,IAAA,mBAAmB,CACf,WAAW,EACX,OAAO;AACH,QAAA,UAAU,EAAE,MAAM,UAAU,EAAE;AAC9B,QAAA,WAAW,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC;AACnC,QAAA,iBAAiB,EAAE,MAAM,iBAAiB,EAAE;AAC5C,QAAA,gBAAgB,EAAE,MAAM,gBAAgB,EAAE;AAC1C,QAAA,oBAAoB,EAAE,MAAM,oBAAoB,EAAE;AAClD,QAAA,mBAAmB,EAAE,MAAM,mBAAmB,EAAE;AACnD,KAAA,CAAC,EACF,CAAC,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAC/F,CAAC;IAEF,SAAS,CAAC,MAAK;AACX,QAAA,WAAW,GAAG,SAAS,CAAC,CAAC;AAC7B,KAAC,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AAE7B,IAAA,QACIA,IACI,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CAAAA,IAAA,CAAA,KAAA,EAAA,EACI,GAAG,EAAE,UAAU,EACP,SAAA,EAAA,+BAA+B,EACvC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE;AACxC,oBAAA,CAAC,MAAM,CAAC,SAAS,GAAG,cAAc;iBACrC,CAAC,EAAA,GACE,IAAI,EAER,QAAA,EAAA,CAAAC,GAAA,CAAA,KAAA,EAAA,EACI,SAAS,EAAE,MAAM,CAAC,mBAAmB,EACrC,KAAK,EAAE,cAAc,GAAG,uBAAuB,GAAG,EAAE,EACpD,GAAG,EAAE,YAAY,aACT,0CAA0C,EAAA,QAAA,EAElDA,wBACY,0CAA0C,EAClD,SAAS,EAAE,MAAM,CAAC,iBAAiB,EACnC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,oBAAoB,EAAA,QAAA,EAEzBA,IAAC,aAAa,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,EACpE,QAAA,EAAA,QAAQ,EACY,CAAA,EAAA,CACvB,EACJ,CAAA,EACL,CAAC,cAAc,KACZD,IAAA,CAAAE,QAAA,EAAA,EAAA,QAAA,EAAA,CACID,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAA,QAAA,EACpEA,GAAC,CAAA,MAAM,IACH,QAAQ,EAAE,CAAC,CAAC,EACZ,IAAI,EAAC,WAAW,EAChB,KAAK,EAAC,SAAS,EACf,IAAI,EAAE,yBAAyB,EAC/B,cAAc,EACd,IAAA,EAAA,OAAO,EAAE,MAAM,UAAU,EAAE,aACnB,0CAA0C,EAAA,CACpD,EACA,CAAA,EACNA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,iBAAiB,CAAC,EAAA,QAAA,EACrEA,GAAC,CAAA,MAAM,IACH,QAAQ,EAAE,CAAC,CAAC,EACZ,IAAI,EAAC,WAAW,EAChB,KAAK,EAAC,SAAS,EACf,IAAI,EAAE,0BAA0B,EAChC,cAAc,EAAA,IAAA,EACd,OAAO,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,EAAA,SAAA,EACvB,2CAA2C,EACrD,CAAA,EAAA,CACA,IACP,CACN,CAAA,EAAA,CACC,EACL,YAAY,IAAI,UAAU,GAAG,CAAC,KAC3BD,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACIC,GAAC,CAAA,QAAQ,IAAC,OAAO,EAAE,CAAC,EAAA,CAAI,EACxBA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,YAAY,EAC/B,QAAA,EAAAA,GAAA,CAAC,QAAQ,EACL,EAAA,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,UAAU,EAAA,SAAA,EACT,iCAAiC,EAAA,GACrC,aAAa,EAAA,CACnB,GACA,CACJ,EAAA,CAAA,CACT,CACC,EAAA,CAAA,EACR;AACN,EAAE;MAEW,mBAAmB,GAAG,UAAU,CAAC,4BAA4B,EAAE;AAE5E,mBAAmB,CAAC,WAAW,GAAG,qBAAqB;;;;"}
1
+ {"version":3,"file":"ScrollableContainer.js","sources":["../src/ScrollableContainer.tsx"],"sourcesContent":["import {\n createContext,\n RefObject,\n useEffect,\n useMemo,\n useContext,\n forwardRef,\n useImperativeHandle,\n ForwardedRef,\n ReactElement,\n PropsWithChildren,\n} from 'react';\nimport classnames from 'classnames';\n\nimport { Action } from '@hh.ru/magritte-ui-action';\nimport { useBreakpoint, Breakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { DotPages } from '@hh.ru/magritte-ui-dot-pages';\nimport { ChevronRightOutlinedSize24, ChevronLeftOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport {\n SpacingCorrectionProps,\n ScrollableControls,\n ScrollableContainerProps,\n} from '@hh.ru/magritte-ui-scrollable-container/types';\nimport { useScrollContainer } from '@hh.ru/magritte-ui-scrollable-container/useScrollContainer';\nimport { VSpacing } from '@hh.ru/magritte-ui-spacing';\n\nimport styles from './scrollableContainer.less';\n\ninterface ScrollContextType {\n registerItem: (ref: RefObject<HTMLElement>) => void;\n removeItem: (ref: RefObject<HTMLElement>) => void;\n scrollToItem: (ref: RefObject<HTMLElement>) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noopFunc = () => {};\nconst ScrollContext = createContext<ScrollContextType>({\n registerItem: noopFunc,\n removeItem: noopFunc,\n scrollToItem: noopFunc,\n});\n\nexport const useScrollContext = (): ScrollContextType => useContext(ScrollContext);\n\nconst BREAKPOINTS_LIST = [Breakpoint.XS, Breakpoint.S, Breakpoint.M, Breakpoint.L, Breakpoint.XL, Breakpoint.XXL];\nconst NO_BUTTONS_START_FROM_BREAKPOINT = Breakpoint.S;\nconst NO_TRANSLATE = { transform: 'translate3d(0px, 0, 0)' };\n\n/**\n * По переданным параметрам коррекции возвращает значения отступов для текущего брейкпоинта\n * @param props Параметры коррекции\n * @param breakpoint Текуший брейкпоинт\n * @returns Объект содержащий значения отступов\n */\nconst getActualCorrection = (props: SpacingCorrectionProps, breakpoint: Breakpoint) => {\n const breakpointIndex = BREAKPOINTS_LIST.indexOf(breakpoint);\n let leftCorrection: number | undefined;\n let rightCorrection: number | undefined;\n // Проходимся по всем брейкпоинтам, начиная с текущего в сторону меньших разрешений\n for (let i = breakpointIndex; i >= 0; i--) {\n const breakpointName = BREAKPOINTS_LIST[i].toUpperCase();\n // Ключи, которые могут быть в параметрах коррекции (SpacingCorrectionProps)\n const leftCorrectionKey = `correctionLeft${breakpointName}` as keyof SpacingCorrectionProps;\n const rightCorrectionKey = `correctionRight${breakpointName}` as keyof SpacingCorrectionProps;\n const commonCorrectionKey = `correction${breakpointName}` as keyof SpacingCorrectionProps;\n // Если для текущего брейкпоинта есть параметры коррекции для левой/правой стороны, то берем их\n props[leftCorrectionKey] !== undefined &&\n leftCorrection === undefined &&\n (leftCorrection = props[leftCorrectionKey]);\n props[rightCorrectionKey] !== undefined &&\n rightCorrection === undefined &&\n (rightCorrection = props[rightCorrectionKey]);\n\n // Если для левой или правой стороны не найден параметр коррекции, то пробуем взять параметр correction для\n // брейкпоинта который сейчас обрабатываем в цикле, например correctionM\n if (props[commonCorrectionKey] !== undefined) {\n leftCorrection === undefined && (leftCorrection = props[commonCorrectionKey]);\n rightCorrection === undefined && (rightCorrection = props[commonCorrectionKey]);\n }\n\n // Если нашли значения для обеих сторон - возращаем\n if (leftCorrection !== undefined && rightCorrection !== undefined) {\n return { leftCorrection, rightCorrection };\n }\n }\n\n // Если не нашли значение для какой то из сторон, то берем значение из correction, без уточнения брейкпоинта\n return {\n leftCorrection: leftCorrection === undefined ? props.correction || 0 : leftCorrection,\n rightCorrection: rightCorrection === undefined ? props.correction || 0 : rightCorrection,\n };\n};\n\nexport const ScrollableContainerComponent = (\n {\n children,\n disableButtons: _disableButtons,\n correction = 0,\n correctionXS,\n correctionS,\n correctionM,\n correctionL,\n correctionXL,\n correctionXXL,\n correctionLeftXS,\n correctionLeftS,\n correctionLeftM,\n correctionLeftL,\n correctionLeftXL,\n correctionLeftXXL,\n correctionRightXS,\n correctionRightS,\n correctionRightM,\n correctionRightL,\n correctionRightXL,\n correctionRightXXL,\n showDotPages,\n dotPagesProps,\n onChangeDot,\n onScroll,\n ...rest\n }: PropsWithChildren<ScrollableContainerProps>,\n controlsRef?: ForwardedRef<ScrollableControls>\n): ReactElement => {\n const breakpoint = useBreakpoint();\n const breakpointIndex = BREAKPOINTS_LIST.indexOf(breakpoint.breakpoint);\n const noButtonBreakpointIndex = BREAKPOINTS_LIST.indexOf(NO_BUTTONS_START_FROM_BREAKPOINT);\n\n // use corrections and cast container to mobile view\n const disableButtons = _disableButtons || breakpointIndex <= noButtonBreakpointIndex;\n\n const spacingCorrectionStyles = useMemo(() => {\n // component use default button\n if (!disableButtons) {\n return { paddingLeft: 0, paddingRight: 0 };\n }\n const correctionProps = {\n correction,\n correctionXS,\n correctionS,\n correctionM,\n correctionL,\n correctionXL,\n correctionXXL,\n correctionLeftXS,\n correctionLeftS,\n correctionLeftM,\n correctionLeftL,\n correctionLeftXL,\n correctionLeftXXL,\n correctionRightXS,\n correctionRightS,\n correctionRightM,\n correctionRightL,\n correctionRightXL,\n correctionRightXXL,\n };\n const correctionValue = getActualCorrection(correctionProps, breakpoint.breakpoint);\n return {\n marginLeft: -correctionValue.leftCorrection,\n marginRight: -correctionValue.rightCorrection,\n paddingLeft: correctionValue.leftCorrection,\n paddingRight: correctionValue.rightCorrection,\n };\n }, [\n disableButtons,\n correction,\n correctionXS,\n correctionS,\n correctionM,\n correctionL,\n correctionXL,\n correctionXXL,\n correctionLeftXS,\n correctionLeftS,\n correctionLeftM,\n correctionLeftL,\n correctionLeftXL,\n correctionLeftXXL,\n correctionRightXS,\n correctionRightS,\n correctionRightM,\n correctionRightL,\n correctionRightXL,\n correctionRightXXL,\n breakpoint.breakpoint,\n ]);\n\n const {\n containerRef,\n positionContainerRef,\n wrapperRef,\n registerItem,\n removeItem,\n scrollToItem,\n scrollToFirstItem,\n scrollToLastItem,\n scrollSide,\n initScrollHandlers,\n countItems,\n isScrollRightDisabled,\n isScrollLeftDisabled,\n activeDot,\n } = useScrollContainer(\n spacingCorrectionStyles.paddingLeft,\n spacingCorrectionStyles.paddingRight,\n disableButtons,\n showDotPages,\n onScroll\n );\n\n useEffect(initScrollHandlers, [initScrollHandlers]);\n\n useImperativeHandle(\n controlsRef,\n () => ({\n scrollLeft: () => scrollSide(),\n scrollRight: () => scrollSide(true),\n scrollToFirstItem: () => scrollToFirstItem(),\n scrollToLastItem: () => scrollToLastItem(),\n isScrollRightDisabled: () => isScrollRightDisabled(),\n isScrollLeftDisabled: () => isScrollLeftDisabled(),\n }),\n [scrollSide, scrollToFirstItem, scrollToLastItem, isScrollRightDisabled, isScrollLeftDisabled]\n );\n\n useEffect(() => {\n onChangeDot?.(activeDot);\n }, [onChangeDot, activeDot]);\n\n return (\n <div>\n <div\n ref={wrapperRef}\n data-qa=\"scrollable-container__wrapper\"\n className={classnames(styles.scrollWrapper, {\n [styles.noButtons]: disableButtons,\n })}\n {...rest}\n >\n <div\n className={styles.scrollableContainer}\n style={disableButtons ? spacingCorrectionStyles : {}}\n ref={containerRef}\n data-qa=\"scrollable-container__overflow-container\"\n >\n <div\n data-qa=\"scrollable-container__position-container\"\n className={styles.positionContainer}\n style={NO_TRANSLATE}\n ref={positionContainerRef}\n >\n <ScrollContext.Provider value={{ registerItem, removeItem, scrollToItem }}>\n {children}\n </ScrollContext.Provider>\n </div>\n </div>\n {!disableButtons && (\n <>\n <div className={classnames(styles.scrollButton, styles.scrollButtonLeft)}>\n <Action\n tabIndex={-1}\n mode=\"secondary\"\n style=\"neutral\"\n icon={ChevronLeftOutlinedSize24}\n showBackground\n onClick={() => scrollSide()}\n data-qa=\"scrollable-container__scroll-button-left\"\n />\n </div>\n <div className={classnames(styles.scrollButton, styles.scrollButtonRight)}>\n <Action\n tabIndex={-1}\n mode=\"secondary\"\n style=\"neutral\"\n icon={ChevronRightOutlinedSize24}\n showBackground\n onClick={() => scrollSide(true)}\n data-qa=\"scrollable-container__scroll-button-right\"\n />\n </div>\n </>\n )}\n </div>\n {showDotPages && countItems > 1 && (\n <div>\n <VSpacing default={8} />\n <div className={styles.dotContainer}>\n <DotPages\n active={activeDot}\n count={countItems}\n data-qa=\"scrollable-container__dot-pages\"\n {...dotPagesProps}\n />\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport const ScrollableContainer = forwardRef(ScrollableContainerComponent);\n\nScrollableContainer.displayName = 'ScrollableContainer';\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
package/ScrollableItem.js CHANGED
@@ -7,7 +7,7 @@ import '@hh.ru/magritte-ui-action';
7
7
  import '@hh.ru/magritte-ui-breakpoint';
8
8
  import '@hh.ru/magritte-ui-dot-pages';
9
9
  import '@hh.ru/magritte-ui-icon/icon';
10
- import './useScrollContainer-Ch0KW7_j.js';
10
+ import './useScrollContainer-dz27uMy6.js';
11
11
  import '@hh.ru/magritte-internal-custom-scroll';
12
12
  import './types.js';
13
13
  import './utils.js';
package/index.css CHANGED
@@ -2,11 +2,11 @@
2
2
  --magritte-semantic-animation-ease-in-out-tiger-200-timing-function-v21-1-0:cubic-bezier(0.25, 0.1, 0.25, 1);
3
3
  --magritte-semantic-animation-ease-in-out-tiger-200-duration-v21-1-0:200ms;
4
4
  }
5
- .magritte-scroll-wrapper___vTdZl_4-5-10{
5
+ .magritte-scroll-wrapper___vTdZl_5-0-0{
6
6
  position:relative;
7
7
  touch-action:pan-y pinch-zoom;
8
8
  }
9
- .magritte-scrollable-container___AKIUp_4-5-10{
9
+ .magritte-scrollable-container___AKIUp_5-0-0{
10
10
  display:block;
11
11
  overflow-x:hidden;
12
12
  overflow-x:clip;
@@ -16,57 +16,57 @@
16
16
  padding:4px;
17
17
  margin:-4px;
18
18
  }
19
- .magritte-fade-both-sides___pBan7_4-5-10:not(.magritte-no-buttons___eCwO-_4-5-10) .magritte-scrollable-container___AKIUp_4-5-10{
19
+ .magritte-fade-both-sides___pBan7_5-0-0:not(.magritte-no-buttons___eCwO-_5-0-0) .magritte-scrollable-container___AKIUp_5-0-0{
20
20
  padding:4px 0;
21
21
  margin:-4px 0;
22
22
  --both-sides-mask:linear-gradient(90deg, transparent 0, transparent 36px, #000 100.504px, #000 calc(100% - 100.50399999999999px), transparent calc(100% - 36px));
23
23
  -webkit-mask:var(--both-sides-mask);
24
24
  mask:var(--both-sides-mask);
25
25
  }
26
- .magritte-fade-left-side___Hlpre_4-5-10:not(.magritte-no-buttons___eCwO-_4-5-10) .magritte-scrollable-container___AKIUp_4-5-10{
26
+ .magritte-fade-left-side___Hlpre_5-0-0:not(.magritte-no-buttons___eCwO-_5-0-0) .magritte-scrollable-container___AKIUp_5-0-0{
27
27
  margin-left:0;
28
28
  padding-left:0;
29
29
  --left-fade-mask:linear-gradient(90deg, transparent 0, transparent 36px, #000 100.504px);
30
30
  -webkit-mask:var(--left-fade-mask);
31
31
  mask:var(--left-fade-mask);
32
32
  }
33
- .magritte-fade-right-side___Lskyt_4-5-10:not(.magritte-no-buttons___eCwO-_4-5-10) .magritte-scrollable-container___AKIUp_4-5-10{
33
+ .magritte-fade-right-side___Lskyt_5-0-0:not(.magritte-no-buttons___eCwO-_5-0-0) .magritte-scrollable-container___AKIUp_5-0-0{
34
34
  padding-right:0;
35
35
  margin-right:0;
36
36
  --right-fade-mask:linear-gradient(90deg, #000 0, #000 calc(100% - 100.50399999999999px), transparent calc(100% - 36px));
37
37
  -webkit-mask:var(--right-fade-mask);
38
38
  mask:var(--right-fade-mask);
39
39
  }
40
- .magritte-scroll-button___4GQu3_4-5-10{
40
+ .magritte-scroll-button___4GQu3_5-0-0{
41
41
  display:none;
42
42
  position:absolute;
43
43
  top:50%;
44
44
  transform:translateY(-50%);
45
45
  }
46
- .magritte-scroll-button-left___UueEY_4-5-10{
46
+ .magritte-scroll-button-left___UueEY_5-0-0{
47
47
  left:0;
48
48
  }
49
- .magritte-fade-left-side___Hlpre_4-5-10:not(.magritte-no-buttons___eCwO-_4-5-10) .magritte-scroll-button-left___UueEY_4-5-10,
50
- .magritte-fade-both-sides___pBan7_4-5-10:not(.magritte-no-buttons___eCwO-_4-5-10) .magritte-scroll-button-left___UueEY_4-5-10{
49
+ .magritte-fade-left-side___Hlpre_5-0-0:not(.magritte-no-buttons___eCwO-_5-0-0) .magritte-scroll-button-left___UueEY_5-0-0,
50
+ .magritte-fade-both-sides___pBan7_5-0-0:not(.magritte-no-buttons___eCwO-_5-0-0) .magritte-scroll-button-left___UueEY_5-0-0{
51
51
  display:block;
52
52
  }
53
- .magritte-scroll-button-right___wZOn-_4-5-10{
53
+ .magritte-scroll-button-right___wZOn-_5-0-0{
54
54
  right:0;
55
55
  }
56
- .magritte-fade-right-side___Lskyt_4-5-10:not(.magritte-no-buttons___eCwO-_4-5-10) .magritte-scroll-button-right___wZOn-_4-5-10,
57
- .magritte-fade-both-sides___pBan7_4-5-10:not(.magritte-no-buttons___eCwO-_4-5-10) .magritte-scroll-button-right___wZOn-_4-5-10{
56
+ .magritte-fade-right-side___Lskyt_5-0-0:not(.magritte-no-buttons___eCwO-_5-0-0) .magritte-scroll-button-right___wZOn-_5-0-0,
57
+ .magritte-fade-both-sides___pBan7_5-0-0:not(.magritte-no-buttons___eCwO-_5-0-0) .magritte-scroll-button-right___wZOn-_5-0-0{
58
58
  display:block;
59
59
  }
60
- .magritte-position-container___1A4Bv_4-5-10{
60
+ .magritte-position-container___1A4Bv_5-0-0{
61
61
  box-sizing:border-box;
62
62
  width:100%;
63
63
  }
64
- .magritte-position-container-animated___XuPNW_4-5-10{
64
+ .magritte-position-container-animated___XuPNW_5-0-0{
65
65
  transition-property:transform;
66
66
  transition-duration:var(--magritte-semantic-animation-ease-in-out-tiger-200-duration-v21-1-0);
67
67
  transition-timing-function:var(--magritte-semantic-animation-ease-in-out-tiger-200-timing-function-v21-1-0);
68
68
  }
69
- .magritte-dot-container___ahtlG_4-5-10{
69
+ .magritte-dot-container___ahtlG_5-0-0{
70
70
  display:flex;
71
71
  justify-content:center;
72
72
  }
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-Ch0KW7_j.js';
11
+ import './useScrollContainer-dz27uMy6.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-Ch0KW7_j.js';
11
+ import './useScrollContainer-dz27uMy6.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.5.10",
3
+ "version": "5.0.0",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -36,5 +36,5 @@
36
36
  "publishConfig": {
37
37
  "access": "public"
38
38
  },
39
- "gitHead": "ed858f67b727e03f1262ca1930b36710cb1952ea"
39
+ "gitHead": "7d1c3409a69fc7bfa413ac36128f66bf34f2b4b7"
40
40
  }
package/types.d.ts CHANGED
@@ -78,10 +78,10 @@ export interface ScrollableControls {
78
78
  scrollToFirstItem: () => void;
79
79
  /** двигаем ScrollableContainer к последнему элементу*/
80
80
  scrollToLastItem: () => void;
81
- /** функция, возвращающая флаг возможности прокрутки ScrollableContainer вправо */
82
- isScrollRightEnabled: () => boolean;
83
- /** функция, возвращающая флаг возможности прокрутки ScrollableContainer влево */
84
- isScrollLeftEnabled: () => boolean;
81
+ /** функция, возвращающая true если ScrollableContainer до конца прокручен вправо */
82
+ isScrollRightDisabled: () => boolean;
83
+ /** функция, возвращающая true если ScrollableContainer до конца прокручен влево */
84
+ isScrollLeftDisabled: () => boolean;
85
85
  }
86
86
  /**
87
87
  * Пропы для настройки коррекции отступов в режиме без кнопок, когда надо чтобы край скролла соответствовал
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 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;;;;"}
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 /** функция, возвращающая true если ScrollableContainer до конца прокручен вправо */\n isScrollRightDisabled: () => boolean;\n /** функция, возвращающая true если ScrollableContainer до конца прокручен влево */\n isScrollLeftDisabled: () => 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;;;;"}
@@ -5,7 +5,7 @@ import { initScrollHandlers, clamp } from '@hh.ru/magritte-internal-custom-scrol
5
5
  import { OFFSET_ATTR } from './types.js';
6
6
  import { debounce } from './utils.js';
7
7
 
8
- var styles = {"scroll-wrapper":"magritte-scroll-wrapper___vTdZl_4-5-10","scrollWrapper":"magritte-scroll-wrapper___vTdZl_4-5-10","scrollable-container":"magritte-scrollable-container___AKIUp_4-5-10","scrollableContainer":"magritte-scrollable-container___AKIUp_4-5-10","fade-both-sides":"magritte-fade-both-sides___pBan7_4-5-10","fadeBothSides":"magritte-fade-both-sides___pBan7_4-5-10","no-buttons":"magritte-no-buttons___eCwO-_4-5-10","noButtons":"magritte-no-buttons___eCwO-_4-5-10","fade-left-side":"magritte-fade-left-side___Hlpre_4-5-10","fadeLeftSide":"magritte-fade-left-side___Hlpre_4-5-10","fade-right-side":"magritte-fade-right-side___Lskyt_4-5-10","fadeRightSide":"magritte-fade-right-side___Lskyt_4-5-10","scroll-button":"magritte-scroll-button___4GQu3_4-5-10","scrollButton":"magritte-scroll-button___4GQu3_4-5-10","scroll-button-left":"magritte-scroll-button-left___UueEY_4-5-10","scrollButtonLeft":"magritte-scroll-button-left___UueEY_4-5-10","scroll-button-right":"magritte-scroll-button-right___wZOn-_4-5-10","scrollButtonRight":"magritte-scroll-button-right___wZOn-_4-5-10","position-container":"magritte-position-container___1A4Bv_4-5-10","positionContainer":"magritte-position-container___1A4Bv_4-5-10","position-container-animated":"magritte-position-container-animated___XuPNW_4-5-10","positionContainerAnimated":"magritte-position-container-animated___XuPNW_4-5-10","dot-container":"magritte-dot-container___ahtlG_4-5-10","dotContainer":"magritte-dot-container___ahtlG_4-5-10"};
8
+ var styles = {"scroll-wrapper":"magritte-scroll-wrapper___vTdZl_5-0-0","scrollWrapper":"magritte-scroll-wrapper___vTdZl_5-0-0","scrollable-container":"magritte-scrollable-container___AKIUp_5-0-0","scrollableContainer":"magritte-scrollable-container___AKIUp_5-0-0","fade-both-sides":"magritte-fade-both-sides___pBan7_5-0-0","fadeBothSides":"magritte-fade-both-sides___pBan7_5-0-0","no-buttons":"magritte-no-buttons___eCwO-_5-0-0","noButtons":"magritte-no-buttons___eCwO-_5-0-0","fade-left-side":"magritte-fade-left-side___Hlpre_5-0-0","fadeLeftSide":"magritte-fade-left-side___Hlpre_5-0-0","fade-right-side":"magritte-fade-right-side___Lskyt_5-0-0","fadeRightSide":"magritte-fade-right-side___Lskyt_5-0-0","scroll-button":"magritte-scroll-button___4GQu3_5-0-0","scrollButton":"magritte-scroll-button___4GQu3_5-0-0","scroll-button-left":"magritte-scroll-button-left___UueEY_5-0-0","scrollButtonLeft":"magritte-scroll-button-left___UueEY_5-0-0","scroll-button-right":"magritte-scroll-button-right___wZOn-_5-0-0","scrollButtonRight":"magritte-scroll-button-right___wZOn-_5-0-0","position-container":"magritte-position-container___1A4Bv_5-0-0","positionContainer":"magritte-position-container___1A4Bv_5-0-0","position-container-animated":"magritte-position-container-animated___XuPNW_5-0-0","positionContainerAnimated":"magritte-position-container-animated___XuPNW_5-0-0","dot-container":"magritte-dot-container___ahtlG_5-0-0","dotContainer":"magritte-dot-container___ahtlG_5-0-0"};
9
9
 
10
10
  const BUTTON_WIDTH = 44;
11
11
  const FOCUS_OUTLINE_WIDTH = 4;
@@ -447,11 +447,11 @@ const useScrollContainer = (leftCorrection, rightCorrection, disableButtons, sho
447
447
  onTouchEnd,
448
448
  onWheelMove,
449
449
  }), [onTouchMove, onTouchEnd, onWheelMove]);
450
- const isScrollRightEnabled = useCallback(() => {
450
+ const isScrollRightDisabled = useCallback(() => {
451
451
  const { positionContainerTranslation, positionContainerWidth, containerWidth } = scrollStateRef.current;
452
452
  return positionContainerTranslation + positionContainerWidth <= containerWidth;
453
453
  }, []);
454
- const isScrollLeftEnabled = useCallback(() => {
454
+ const isScrollLeftDisabled = useCallback(() => {
455
455
  const { positionContainerTranslation } = scrollStateRef.current;
456
456
  return positionContainerTranslation >= 0;
457
457
  }, []);
@@ -468,10 +468,10 @@ const useScrollContainer = (leftCorrection, rightCorrection, disableButtons, sho
468
468
  containerRef: scrollStateRef.current.containerRef,
469
469
  countItems,
470
470
  activeDot,
471
- isScrollRightEnabled,
472
- isScrollLeftEnabled,
471
+ isScrollRightDisabled,
472
+ isScrollLeftDisabled,
473
473
  };
474
474
  };
475
475
 
476
476
  export { styles as s, useScrollContainer as u };
477
- //# sourceMappingURL=useScrollContainer-Ch0KW7_j.js.map
477
+ //# sourceMappingURL=useScrollContainer-dz27uMy6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollContainer-dz27uMy6.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 isScrollRightDisabled: () => boolean;\n isScrollLeftDisabled: () => 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 isScrollRightDisabled = useCallback(() => {\n const { positionContainerTranslation, positionContainerWidth, containerWidth } = scrollStateRef.current;\n return positionContainerTranslation + positionContainerWidth <= containerWidth;\n }, []);\n\n const isScrollLeftDisabled = 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 isScrollRightDisabled,\n isScrollLeftDisabled,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -12,8 +12,8 @@ interface UseScrollContainer {
12
12
  containerRef: RefObject<HTMLDivElement>;
13
13
  countItems: number;
14
14
  activeDot: number;
15
- isScrollRightEnabled: () => boolean;
16
- isScrollLeftEnabled: () => boolean;
15
+ isScrollRightDisabled: () => boolean;
16
+ isScrollLeftDisabled: () => boolean;
17
17
  }
18
18
  export declare const useScrollContainer: (leftCorrection: number, rightCorrection: number, disableButtons: boolean, showDotPages?: boolean, onScroll?: () => void) => UseScrollContainer;
19
19
  export {};
@@ -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-Ch0KW7_j.js';
7
+ export { u as useScrollContainer } from './useScrollContainer-dz27uMy6.js';
8
8
  //# sourceMappingURL=useScrollContainer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useScrollContainer-Ch0KW7_j.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":"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"}