@vkontakte/vkui 7.1.0 → 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Alert/Alert.d.ts +2 -1
- package/dist/components/Alert/Alert.d.ts.map +1 -1
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/AppRoot/ScrollContext.d.ts.map +1 -1
- package/dist/components/AppRoot/ScrollContext.js +5 -0
- package/dist/components/AppRoot/ScrollContext.js.map +1 -1
- package/dist/components/CarouselBase/CarouselBase.d.ts.map +1 -1
- package/dist/components/CarouselBase/CarouselBase.js +14 -4
- package/dist/components/CarouselBase/CarouselBase.js.map +1 -1
- package/dist/components/CarouselBase/helpers.d.ts +9 -2
- package/dist/components/CarouselBase/helpers.d.ts.map +1 -1
- package/dist/components/CarouselBase/helpers.js +10 -4
- package/dist/components/CarouselBase/helpers.js.map +1 -1
- package/dist/components/ImageBase/ImageBase.d.ts +4 -0
- package/dist/components/ImageBase/ImageBase.d.ts.map +1 -1
- package/dist/components/ImageBase/ImageBase.js +6 -3
- package/dist/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/components/TabsItem/TabsItem.d.ts +1 -1
- package/dist/components/TabsItem/TabsItem.d.ts.map +1 -1
- package/dist/components/TabsItem/TabsItem.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/Alert/Alert.js.map +1 -1
- package/dist/cssm/components/AppRoot/ScrollContext.js +5 -0
- package/dist/cssm/components/AppRoot/ScrollContext.js.map +1 -1
- package/dist/cssm/components/CarouselBase/CarouselBase.js +14 -4
- package/dist/cssm/components/CarouselBase/CarouselBase.js.map +1 -1
- package/dist/cssm/components/CarouselBase/CarouselBase.module.css +0 -5
- package/dist/cssm/components/CarouselBase/helpers.js +10 -4
- package/dist/cssm/components/CarouselBase/helpers.js.map +1 -1
- package/dist/cssm/components/ChipsInputBase/ChipsInputBase.module.css +0 -4
- package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css +0 -4
- package/dist/cssm/components/Header/Header.module.css +0 -1
- package/dist/cssm/components/ImageBase/ImageBase.js +3 -1
- package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/cssm/components/Input/Input.module.css +0 -4
- package/dist/cssm/components/SimpleCell/SimpleCell.module.css +1 -5
- package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
- package/dist/cssm/components/Textarea/Textarea.module.css +0 -4
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +1 -1
- package/src/components/Alert/Alert.tsx +2 -0
- package/src/components/AppRoot/ScrollContext.tsx +6 -0
- package/src/components/CarouselBase/CarouselBase.module.css +0 -5
- package/src/components/CarouselBase/CarouselBase.tsx +29 -22
- package/src/components/CarouselBase/helpers.ts +23 -8
- package/src/components/ChipsInputBase/ChipsInputBase.module.css +0 -4
- package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css +0 -4
- package/src/components/Header/Header.module.css +0 -1
- package/src/components/ImageBase/ImageBase.tsx +7 -0
- package/src/components/Input/Input.module.css +0 -4
- package/src/components/SimpleCell/SimpleCell.module.css +1 -5
- package/src/components/TabsItem/TabsItem.tsx +1 -0
- package/src/components/Textarea/Textarea.module.css +0 -4
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import { type UseFocusTrapProps } from '../../hooks/useFocusTrap';
|
|
2
3
|
import type { AlignType, AnchorHTMLAttributesOnly, HasDataAttribute, HasRootRef } from '../../types';
|
|
3
4
|
import type { AppRootPortalProps } from '../AppRoot/AppRootPortal';
|
|
4
5
|
import type { ButtonProps } from '../Button/Button';
|
|
@@ -21,7 +22,7 @@ export interface AlertActionInterface extends Pick<ButtonProps, 'Component'>, An
|
|
|
21
22
|
autoCloseDisabled?: boolean;
|
|
22
23
|
mode: AlertActionMode;
|
|
23
24
|
}
|
|
24
|
-
export interface AlertProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'>, HasRootRef<HTMLDivElement> {
|
|
25
|
+
export interface AlertProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'>, Pick<UseFocusTrapProps, 'restoreFocus'>, HasRootRef<HTMLDivElement> {
|
|
25
26
|
actionsLayout?: 'vertical' | 'horizontal';
|
|
26
27
|
actionsAlign?: AlignType;
|
|
27
28
|
actions?: AlertActionInterface[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alert.d.ts","sourceRoot":"","sources":["../../../src/components/Alert/Alert.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Alert.d.ts","sourceRoot":"","sources":["../../../src/components/Alert/Alert.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,OAAO,KAAK,EACV,SAAS,EACT,wBAAwB,EACxB,gBAAgB,EAChB,UAAU,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKtD,KAAK,eAAe,GAAG,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,oBACf,SAAQ,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EACpC,wBAAwB,EACxB,gBAAgB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,YAAY,CAAA;KAAE,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,UACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,EACtD,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,EACvC,UAAU,CAAC,cAAc,CAAC;IAC5B,aAAa,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IAC1C,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACzC;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,eAAO,MAAM,KAAK,+MAiBf,UAAU,KAAG,KAAK,CAAC,SAkHrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/Alert/Alert.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Icon20Cancel } from '@vkontakte/icons';\nimport { classNames, hasReactNode, noop } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useCSSKeyframesAnimationController } from '../../lib/animation';\nimport { stopPropagation } from '../../lib/utils';\nimport type {\n AlignType,\n AnchorHTMLAttributesOnly,\n HasDataAttribute,\n HasRootRef,\n} from '../../types';\nimport type { AppRootPortalProps } from '../AppRoot/AppRootPortal';\nimport { AppRootPortal } from '../AppRoot/AppRootPortal';\nimport { useScrollLock } from '../AppRoot/ScrollContext';\nimport type { ButtonProps } from '../Button/Button';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { IconButton } from '../IconButton/IconButton';\nimport { ModalDismissButton } from '../ModalDismissButton/ModalDismissButton';\nimport { PopoutWrapper } from '../PopoutWrapper/PopoutWrapper';\nimport type { AlertActionProps } from './AlertAction';\nimport { AlertActions } from './AlertActions';\nimport { AlertDescription, AlertTitle } from './AlertTypography';\nimport styles from './Alert.module.css';\n\ntype AlertActionMode = 'cancel' | 'destructive' | 'default';\n\nexport interface AlertActionInterface\n extends Pick<ButtonProps, 'Component'>,\n AnchorHTMLAttributesOnly,\n HasDataAttribute {\n title: string;\n /**\n * Обработчик клика на опцию. Если свойство `autoCloseDisabled` включено,\n * то в аргументы `action` передаётся объект с функцией close,\n * вызвав которую можно закрыть `action` вручную.\n */\n action?: (args?: { close?: VoidFunction }) => void;\n /**\n * По умолчанию клик на опцию вызывает переданную в `Alert` функцию `onClose`, данное свойство\n * позволяет отключить такое поведение\n */\n autoCloseDisabled?: boolean;\n mode: AlertActionMode;\n}\n\nexport interface AlertProps\n extends Omit<React.HTMLAttributes<HTMLElement>, 'title'>,\n HasRootRef<HTMLDivElement> {\n actionsLayout?: 'vertical' | 'horizontal';\n actionsAlign?: AlignType;\n actions?: AlertActionInterface[];\n renderAction?: (props: AlertActionProps) => React.ReactNode;\n title?: React.ReactNode;\n description?: React.ReactNode;\n onClose: VoidFunction;\n /**\n * Текст кнопки закрытия. Делает ее доступной для ассистивных технологий\n */\n dismissLabel?: string;\n /**\n * Расположение кнопки закрытия (внутри и вне `popout'a`)\n * Доступно только в `compact`-режиме, не отображается на `iOS`\n */\n dismissButtonMode?: 'inside' | 'outside';\n /**\n * Передает атрибут `data-testid` для кнопки закрытия\n */\n dismissButtonTestId?: string;\n usePortal?: AppRootPortalProps['usePortal'];\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Alert\n */\nexport const Alert = ({\n actions,\n actionsLayout = 'horizontal',\n children,\n className,\n style,\n title,\n description,\n onClose,\n dismissLabel = 'Закрыть предупреждение',\n renderAction,\n actionsAlign,\n dismissButtonMode = 'outside',\n dismissButtonTestId,\n getRootRef,\n usePortal,\n ...restProps\n}: AlertProps): React.ReactNode => {\n const generatedId = React.useId();\n\n const titleId = `vkui-alert-${generatedId}-title`;\n const descriptionId = `vkui-alert-${generatedId}-description`;\n\n const platform = usePlatform();\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n\n const [closing, setClosing] = React.useState(false);\n const itemActionCallbackRef = React.useRef(noop);\n const [animationState, animationHandlers] = useCSSKeyframesAnimationController(\n closing ? 'exit' : 'enter',\n {\n onExited() {\n itemActionCallbackRef.current();\n itemActionCallbackRef.current = noop;\n onClose();\n },\n },\n );\n const isDismissButtonVisible = isDesktop && platform !== 'ios';\n const elementRef = React.useRef<HTMLDivElement>(null);\n\n const close = React.useCallback(() => {\n setClosing(true);\n }, []);\n\n const onItemClick = React.useCallback(\n (item: AlertActionInterface) => {\n const { action: itemAction, autoCloseDisabled = false } = item;\n\n if (autoCloseDisabled) {\n itemAction && itemAction({ close });\n } else {\n if (itemAction) {\n itemActionCallbackRef.current = itemAction;\n }\n setClosing(true);\n }\n },\n [close],\n );\n\n useScrollLock();\n\n return (\n <AppRootPortal usePortal={usePortal}>\n <PopoutWrapper\n className={className}\n closing={closing}\n style={style}\n onClick={close}\n getRootRef={getRootRef}\n >\n <FocusTrap\n {...restProps}\n {...animationHandlers}\n getRootRef={elementRef}\n onClick={stopPropagation}\n onClose={close}\n autoFocus={animationState === 'entered'}\n className={classNames(\n styles.host,\n platform === 'ios' && styles.ios,\n platform === 'vkcom' && styles.vkcom,\n closing ? styles.closing : styles.opening,\n isDesktop && styles.desktop,\n )}\n role=\"alertdialog\"\n aria-modal\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n <div\n className={classNames(\n styles.content,\n dismissButtonMode === 'inside' && styles.contentWithButton,\n )}\n >\n {hasReactNode(title) && <AlertTitle id={titleId}>{title}</AlertTitle>}\n {hasReactNode(description) && (\n <AlertDescription id={descriptionId}>{description}</AlertDescription>\n )}\n {children}\n {isDismissButtonVisible && dismissButtonMode === 'inside' && (\n <IconButton\n label={dismissLabel}\n className={classNames(styles.dismiss, 'vkuiInternalAlert__dismiss')}\n onClick={close}\n hoverMode=\"opacity\"\n activeMode=\"opacity\"\n data-testid={dismissButtonTestId}\n >\n <Icon20Cancel />\n </IconButton>\n )}\n </div>\n <AlertActions\n actions={actions}\n actionsAlign={actionsAlign}\n actionsLayout={actionsLayout}\n renderAction={renderAction}\n onItemClick={onItemClick}\n />\n {isDismissButtonVisible && dismissButtonMode === 'outside' && (\n <ModalDismissButton onClick={close} data-testid={dismissButtonTestId}>\n {dismissLabel}\n </ModalDismissButton>\n )}\n </FocusTrap>\n </PopoutWrapper>\n </AppRootPortal>\n );\n};\n"],"names":["React","Icon20Cancel","classNames","hasReactNode","noop","useAdaptivityWithJSMediaQueries","usePlatform","useCSSKeyframesAnimationController","stopPropagation","AppRootPortal","useScrollLock","FocusTrap","IconButton","ModalDismissButton","PopoutWrapper","AlertActions","AlertDescription","AlertTitle","Alert","actions","actionsLayout","children","className","style","title","description","onClose","dismissLabel","renderAction","actionsAlign","dismissButtonMode","dismissButtonTestId","getRootRef","usePortal","restProps","generatedId","useId","titleId","descriptionId","platform","isDesktop","closing","setClosing","useState","itemActionCallbackRef","useRef","animationState","animationHandlers","onExited","current","isDismissButtonVisible","elementRef","close","useCallback","onItemClick","item","action","itemAction","autoCloseDisabled","onClick","autoFocus","role","aria-modal","aria-labelledby","aria-describedby","div","id","label","hoverMode","activeMode","data-testid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Alert/Alert.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Icon20Cancel } from '@vkontakte/icons';\nimport { classNames, hasReactNode, noop } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { type UseFocusTrapProps } from '../../hooks/useFocusTrap';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useCSSKeyframesAnimationController } from '../../lib/animation';\nimport { stopPropagation } from '../../lib/utils';\nimport type {\n AlignType,\n AnchorHTMLAttributesOnly,\n HasDataAttribute,\n HasRootRef,\n} from '../../types';\nimport type { AppRootPortalProps } from '../AppRoot/AppRootPortal';\nimport { AppRootPortal } from '../AppRoot/AppRootPortal';\nimport { useScrollLock } from '../AppRoot/ScrollContext';\nimport type { ButtonProps } from '../Button/Button';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { IconButton } from '../IconButton/IconButton';\nimport { ModalDismissButton } from '../ModalDismissButton/ModalDismissButton';\nimport { PopoutWrapper } from '../PopoutWrapper/PopoutWrapper';\nimport type { AlertActionProps } from './AlertAction';\nimport { AlertActions } from './AlertActions';\nimport { AlertDescription, AlertTitle } from './AlertTypography';\nimport styles from './Alert.module.css';\n\ntype AlertActionMode = 'cancel' | 'destructive' | 'default';\n\nexport interface AlertActionInterface\n extends Pick<ButtonProps, 'Component'>,\n AnchorHTMLAttributesOnly,\n HasDataAttribute {\n title: string;\n /**\n * Обработчик клика на опцию. Если свойство `autoCloseDisabled` включено,\n * то в аргументы `action` передаётся объект с функцией close,\n * вызвав которую можно закрыть `action` вручную.\n */\n action?: (args?: { close?: VoidFunction }) => void;\n /**\n * По умолчанию клик на опцию вызывает переданную в `Alert` функцию `onClose`, данное свойство\n * позволяет отключить такое поведение\n */\n autoCloseDisabled?: boolean;\n mode: AlertActionMode;\n}\n\nexport interface AlertProps\n extends Omit<React.HTMLAttributes<HTMLElement>, 'title'>,\n Pick<UseFocusTrapProps, 'restoreFocus'>,\n HasRootRef<HTMLDivElement> {\n actionsLayout?: 'vertical' | 'horizontal';\n actionsAlign?: AlignType;\n actions?: AlertActionInterface[];\n renderAction?: (props: AlertActionProps) => React.ReactNode;\n title?: React.ReactNode;\n description?: React.ReactNode;\n onClose: VoidFunction;\n /**\n * Текст кнопки закрытия. Делает ее доступной для ассистивных технологий\n */\n dismissLabel?: string;\n /**\n * Расположение кнопки закрытия (внутри и вне `popout'a`)\n * Доступно только в `compact`-режиме, не отображается на `iOS`\n */\n dismissButtonMode?: 'inside' | 'outside';\n /**\n * Передает атрибут `data-testid` для кнопки закрытия\n */\n dismissButtonTestId?: string;\n usePortal?: AppRootPortalProps['usePortal'];\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Alert\n */\nexport const Alert = ({\n actions,\n actionsLayout = 'horizontal',\n children,\n className,\n style,\n title,\n description,\n onClose,\n dismissLabel = 'Закрыть предупреждение',\n renderAction,\n actionsAlign,\n dismissButtonMode = 'outside',\n dismissButtonTestId,\n getRootRef,\n usePortal,\n ...restProps\n}: AlertProps): React.ReactNode => {\n const generatedId = React.useId();\n\n const titleId = `vkui-alert-${generatedId}-title`;\n const descriptionId = `vkui-alert-${generatedId}-description`;\n\n const platform = usePlatform();\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n\n const [closing, setClosing] = React.useState(false);\n const itemActionCallbackRef = React.useRef(noop);\n const [animationState, animationHandlers] = useCSSKeyframesAnimationController(\n closing ? 'exit' : 'enter',\n {\n onExited() {\n itemActionCallbackRef.current();\n itemActionCallbackRef.current = noop;\n onClose();\n },\n },\n );\n const isDismissButtonVisible = isDesktop && platform !== 'ios';\n const elementRef = React.useRef<HTMLDivElement>(null);\n\n const close = React.useCallback(() => {\n setClosing(true);\n }, []);\n\n const onItemClick = React.useCallback(\n (item: AlertActionInterface) => {\n const { action: itemAction, autoCloseDisabled = false } = item;\n\n if (autoCloseDisabled) {\n itemAction && itemAction({ close });\n } else {\n if (itemAction) {\n itemActionCallbackRef.current = itemAction;\n }\n setClosing(true);\n }\n },\n [close],\n );\n\n useScrollLock();\n\n return (\n <AppRootPortal usePortal={usePortal}>\n <PopoutWrapper\n className={className}\n closing={closing}\n style={style}\n onClick={close}\n getRootRef={getRootRef}\n >\n <FocusTrap\n {...restProps}\n {...animationHandlers}\n getRootRef={elementRef}\n onClick={stopPropagation}\n onClose={close}\n autoFocus={animationState === 'entered'}\n className={classNames(\n styles.host,\n platform === 'ios' && styles.ios,\n platform === 'vkcom' && styles.vkcom,\n closing ? styles.closing : styles.opening,\n isDesktop && styles.desktop,\n )}\n role=\"alertdialog\"\n aria-modal\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n <div\n className={classNames(\n styles.content,\n dismissButtonMode === 'inside' && styles.contentWithButton,\n )}\n >\n {hasReactNode(title) && <AlertTitle id={titleId}>{title}</AlertTitle>}\n {hasReactNode(description) && (\n <AlertDescription id={descriptionId}>{description}</AlertDescription>\n )}\n {children}\n {isDismissButtonVisible && dismissButtonMode === 'inside' && (\n <IconButton\n label={dismissLabel}\n className={classNames(styles.dismiss, 'vkuiInternalAlert__dismiss')}\n onClick={close}\n hoverMode=\"opacity\"\n activeMode=\"opacity\"\n data-testid={dismissButtonTestId}\n >\n <Icon20Cancel />\n </IconButton>\n )}\n </div>\n <AlertActions\n actions={actions}\n actionsAlign={actionsAlign}\n actionsLayout={actionsLayout}\n renderAction={renderAction}\n onItemClick={onItemClick}\n />\n {isDismissButtonVisible && dismissButtonMode === 'outside' && (\n <ModalDismissButton onClick={close} data-testid={dismissButtonTestId}>\n {dismissLabel}\n </ModalDismissButton>\n )}\n </FocusTrap>\n </PopoutWrapper>\n </AppRootPortal>\n );\n};\n"],"names":["React","Icon20Cancel","classNames","hasReactNode","noop","useAdaptivityWithJSMediaQueries","usePlatform","useCSSKeyframesAnimationController","stopPropagation","AppRootPortal","useScrollLock","FocusTrap","IconButton","ModalDismissButton","PopoutWrapper","AlertActions","AlertDescription","AlertTitle","Alert","actions","actionsLayout","children","className","style","title","description","onClose","dismissLabel","renderAction","actionsAlign","dismissButtonMode","dismissButtonTestId","getRootRef","usePortal","restProps","generatedId","useId","titleId","descriptionId","platform","isDesktop","closing","setClosing","useState","itemActionCallbackRef","useRef","animationState","animationHandlers","onExited","current","isDismissButtonVisible","elementRef","close","useCallback","onItemClick","item","action","itemAction","autoCloseDisabled","onClick","autoFocus","role","aria-modal","aria-labelledby","aria-describedby","div","id","label","hoverMode","activeMode","data-testid"],"mappings":"AAAA;;;;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,YAAY,QAAQ,mBAAmB;AAChD,SAASC,UAAU,EAAEC,YAAY,EAAEC,IAAI,QAAQ,kBAAkB;AACjE,SAASC,+BAA+B,QAAQ,iDAA8C;AAE9F,SAASC,WAAW,QAAQ,6BAA0B;AACtD,SAASC,kCAAkC,QAAQ,+BAAsB;AACzE,SAASC,eAAe,QAAQ,qBAAkB;AAQlD,SAASC,aAAa,QAAQ,8BAA2B;AACzD,SAASC,aAAa,QAAQ,8BAA2B;AAEzD,SAASC,SAAS,QAAQ,4BAAyB;AACnD,SAASC,UAAU,QAAQ,8BAA2B;AACtD,SAASC,kBAAkB,QAAQ,8CAA2C;AAC9E,SAASC,aAAa,QAAQ,oCAAiC;AAE/D,SAASC,YAAY,QAAQ,oBAAiB;AAC9C,SAASC,gBAAgB,EAAEC,UAAU,QAAQ,uBAAoB;AAmDjE;;CAEC,GACD,OAAO,MAAMC,QAAQ;QAAC,EACpBC,OAAO,EACPC,gBAAgB,YAAY,EAC5BC,QAAQ,EACRC,SAAS,EACTC,KAAK,EACLC,KAAK,EACLC,WAAW,EACXC,OAAO,EACPC,eAAe,wBAAwB,EACvCC,YAAY,EACZC,YAAY,EACZC,oBAAoB,SAAS,EAC7BC,mBAAmB,EACnBC,UAAU,EACVC,SAAS,EAEE,WADRC;QAfHf;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,MAAME,cAAcnC,MAAMoC,KAAK;IAE/B,MAAMC,UAAU,CAAC,WAAW,EAAEF,YAAY,MAAM,CAAC;IACjD,MAAMG,gBAAgB,CAAC,WAAW,EAAEH,YAAY,YAAY,CAAC;IAE7D,MAAMI,WAAWjC;IACjB,MAAM,EAAEkC,SAAS,EAAE,GAAGnC;IAEtB,MAAM,CAACoC,SAASC,WAAW,GAAG1C,MAAM2C,QAAQ,CAAC;IAC7C,MAAMC,wBAAwB5C,MAAM6C,MAAM,CAACzC;IAC3C,MAAM,CAAC0C,gBAAgBC,kBAAkB,GAAGxC,mCAC1CkC,UAAU,SAAS,SACnB;QACEO;YACEJ,sBAAsBK,OAAO;YAC7BL,sBAAsBK,OAAO,GAAG7C;YAChCsB;QACF;IACF;IAEF,MAAMwB,yBAAyBV,aAAaD,aAAa;IACzD,MAAMY,aAAanD,MAAM6C,MAAM,CAAiB;IAEhD,MAAMO,QAAQpD,MAAMqD,WAAW,CAAC;QAC9BX,WAAW;IACb,GAAG,EAAE;IAEL,MAAMY,cAActD,MAAMqD,WAAW,CACnC,CAACE;QACC,MAAM,EAAEC,QAAQC,UAAU,EAAEC,oBAAoB,KAAK,EAAE,GAAGH;QAE1D,IAAIG,mBAAmB;YACrBD,cAAcA,WAAW;gBAAEL;YAAM;QACnC,OAAO;YACL,IAAIK,YAAY;gBACdb,sBAAsBK,OAAO,GAAGQ;YAClC;YACAf,WAAW;QACb;IACF,GACA;QAACU;KAAM;IAGT1C;IAEA,qBACE,KAACD;QAAcwB,WAAWA;kBACxB,cAAA,KAACnB;YACCQ,WAAWA;YACXmB,SAASA;YACTlB,OAAOA;YACPoC,SAASP;YACTpB,YAAYA;sBAEZ,cAAA,MAACrB,mDACKuB,WACAa;gBACJf,YAAYmB;gBACZQ,SAASnD;gBACTkB,SAAS0B;gBACTQ,WAAWd,mBAAmB;gBAC9BxB,WAAWpB,8BAETqC,aAAa,2BACbA,aAAa,+BACbE,uDACAD;gBAEFqB,MAAK;gBACLC,YAAU;gBACVC,mBAAiB1B;gBACjB2B,oBAAkB1B;;kCAElB,MAAC2B;wBACC3C,WAAWpB,iCAET4B,sBAAsB;;4BAGvB3B,aAAaqB,wBAAU,KAACP;gCAAWiD,IAAI7B;0CAAUb;;4BACjDrB,aAAasB,8BACZ,KAACT;gCAAiBkD,IAAI5B;0CAAgBb;;4BAEvCJ;4BACA6B,0BAA0BpB,sBAAsB,0BAC/C,KAAClB;gCACCuD,OAAOxC;gCACPL,WAAWpB,iCAA2B;gCACtCyD,SAASP;gCACTgB,WAAU;gCACVC,YAAW;gCACXC,eAAavC;0CAEb,cAAA,KAAC9B;;;;kCAIP,KAACc;wBACCI,SAASA;wBACTU,cAAcA;wBACdT,eAAeA;wBACfQ,cAAcA;wBACd0B,aAAaA;;oBAEdJ,0BAA0BpB,sBAAsB,2BAC/C,KAACjB;wBAAmB8C,SAASP;wBAAOkB,eAAavC;kCAC9CJ;;;;;;AAOf,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollContext.d.ts","sourceRoot":"","sources":["../../../src/components/AppRoot/ScrollContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAuB/C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD;;OAEG;IACH,0BAA0B,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACjD;;OAEG;IACH,0BAA0B,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACjD,wBAAwB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAM5D,CAAC;AAEL,eAAO,MAAM,SAAS,QAAO,sBAAyD,CAAC;
|
|
1
|
+
{"version":3,"file":"ScrollContext.d.ts","sourceRoot":"","sources":["../../../src/components/AppRoot/ScrollContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAuB/C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD;;OAEG;IACH,0BAA0B,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACjD;;OAEG;IACH,0BAA0B,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACjD,wBAAwB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAM5D,CAAC;AAEL,eAAO,MAAM,SAAS,QAAO,sBAAyD,CAAC;AAgCvF,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACxD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAC5C;AAED,eAAO,MAAM,sBAAsB,iBAAkB,qBAAqB,KAAG,KAAK,CAAC,SAwElF,CAAC;AAEF,eAAO,MAAM,uBAAuB,yBAGjC,qBAAqB,KAAG,KAAK,CAAC,SA4EhC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,yBAAqB,IAW9C,CAAC"}
|
|
@@ -37,9 +37,14 @@ export const useScroll = ()=>React.useContext(ScrollContext);
|
|
|
37
37
|
* Управляет блокировкой окна в зависимости от внутреннего счетчика.
|
|
38
38
|
* Если счетчик больше нуля, требуется заблокировать прокрутку
|
|
39
39
|
*/ function useScrollLockController(enableScrollLock, disableScrollLock) {
|
|
40
|
+
const isFirstEffect = React.useRef(true);
|
|
40
41
|
const [count, { increment: incrementScrollLockCounter, decrement: decrementScrollLockCounter }] = useCounter(0);
|
|
41
42
|
const needLockScroll = count > 0;
|
|
42
43
|
React.useEffect(()=>{
|
|
44
|
+
if (isFirstEffect.current) {
|
|
45
|
+
isFirstEffect.current = false;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
43
48
|
if (needLockScroll) {
|
|
44
49
|
enableScrollLock();
|
|
45
50
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/AppRoot/ScrollContext.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { noop } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { useCounter } from '../../hooks/useCounter';\nimport { useDOM } from '../../lib/dom';\nimport type { HasChildren } from '../../types';\n\nconst clearDisableScrollStyle = (node: HTMLElement) => {\n Object.assign(node.style, {\n position: '',\n top: '',\n left: '',\n right: '',\n overscrollBehavior: '',\n overflowY: '',\n overflowX: '',\n });\n};\n\nconst getPageYOffsetWithoutKeyboardHeight = (window: Window) => {\n // Note: здесь расчёт на то, что `clientHeight` равен `window.innerHeight`.\n // Это достигается тем, что тегу `html` задали`height: 100%` и у него нет отступов сверху и снизу. Если есть отступы,\n // то надо задать `box-sizing: border-box`, чтобы они не учитывались.\n const diffOfClientHeightAndViewportHeight =\n window.document.documentElement.clientHeight - window.innerHeight;\n return window.pageYOffset - diffOfClientHeightAndViewportHeight;\n};\n\nexport type GetScrollOptions = {\n compensateKeyboardHeight?: boolean;\n};\n\nexport interface ScrollContextInterface {\n getScroll: (this: void, options?: GetScrollOptions) => { x: number; y: number };\n scrollTo: (this: void, x?: number, y?: number) => void;\n /**\n * Увеличивает счетчик блокировки прокрутки\n */\n incrementScrollLockCounter: (this: void) => void;\n /**\n * Уменьшает счетчик блокировки прокрутки\n */\n decrementScrollLockCounter: (this: void) => void;\n beforeScrollLockFnSetRef?: React.RefObject<Set<() => void>>;\n}\n\nexport const ScrollContext: React.Context<ScrollContextInterface> =\n React.createContext<ScrollContextInterface>({\n getScroll: () => ({ x: 0, y: 0 }),\n scrollTo: noop,\n incrementScrollLockCounter: noop,\n decrementScrollLockCounter: noop,\n });\n\nexport const useScroll = (): ScrollContextInterface => React.useContext(ScrollContext);\n\n/**\n * Управляет блокировкой окна в зависимости от внутреннего счетчика.\n * Если счетчик больше нуля, требуется заблокировать прокрутку\n */\nfunction useScrollLockController(enableScrollLock: () => void, disableScrollLock: () => void) {\n const [count, { increment: incrementScrollLockCounter, decrement: decrementScrollLockCounter }] =\n useCounter(0);\n\n const needLockScroll = count > 0;\n\n React.useEffect(() => {\n if (needLockScroll) {\n enableScrollLock();\n } else {\n disableScrollLock();\n }\n }, [needLockScroll, enableScrollLock, disableScrollLock]);\n\n return {\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n };\n}\n\nexport interface ScrollControllerProps extends HasChildren {\n elRef: React.RefObject<HTMLElement | null>;\n}\n\nexport const GlobalScrollController = ({ children }: ScrollControllerProps): React.ReactNode => {\n const { window, document } = useDOM();\n const beforeScrollLockFnSetRef = React.useRef<Set<() => void>>(new Set());\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(\n (options = { compensateKeyboardHeight: true }) => ({\n x: window!.pageXOffset,\n y: options.compensateKeyboardHeight\n ? getPageYOffsetWithoutKeyboardHeight(window!)\n : window!.pageYOffset,\n }),\n [window],\n );\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n // Some iOS versions do not normalize scroll — do it manually.\n window!.scrollTo(\n x ? clamp(x, 0, document!.body.scrollWidth - window!.innerWidth) : 0,\n y ? clamp(y, 0, document!.body.scrollHeight - window!.innerHeight) : 0,\n );\n },\n [document, window],\n );\n\n const enableScrollLock = React.useCallback(() => {\n beforeScrollLockFnSetRef.current.forEach((fn) => {\n fn();\n });\n\n const scrollY = window!.pageYOffset;\n const scrollX = window!.pageXOffset;\n const overflowY = window!.innerWidth > document!.documentElement.clientWidth ? 'scroll' : '';\n const overflowX = window!.innerHeight > document!.documentElement.clientHeight ? 'scroll' : '';\n\n Object.assign(document!.documentElement.style, { overscrollBehavior: 'none' });\n Object.assign(document!.body.style, {\n position: 'fixed',\n top: `-${scrollY}px`,\n left: `-${scrollX}px`,\n right: '0',\n overscrollBehavior: 'none',\n overflowY,\n overflowX,\n });\n }, [document, window]);\n\n const disableScrollLock = React.useCallback(() => {\n const scrollY = document!.body.style.top;\n const scrollX = document!.body.style.left;\n\n Object.assign(document!.documentElement.style, { overscrollBehavior: '' });\n clearDisableScrollStyle(document!.body);\n window!.scrollTo(-parseInt(scrollX || '0'), -parseInt(scrollY || '0'));\n }, [document, window]);\n\n const { incrementScrollLockCounter, decrementScrollLockCounter } = useScrollLockController(\n enableScrollLock,\n disableScrollLock,\n );\n\n const scrollController = React.useMemo<ScrollContextInterface>(\n () => ({\n getScroll,\n scrollTo,\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n beforeScrollLockFnSetRef: beforeScrollLockFnSetRef,\n }),\n [getScroll, scrollTo, incrementScrollLockCounter, decrementScrollLockCounter],\n );\n\n return <ScrollContext.Provider value={scrollController}>{children}</ScrollContext.Provider>;\n};\n\nexport const ElementScrollController = ({\n elRef,\n children,\n}: ScrollControllerProps): React.ReactNode => {\n const beforeScrollLockFnSetRef = React.useRef<Set<() => void>>(new Set());\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(\n () => ({\n x: elRef.current?.scrollLeft ?? 0,\n y: elRef.current?.scrollTop ?? 0,\n }),\n [elRef],\n );\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n const el = elRef.current;\n // Some iOS versions do not normalize scroll — do it manually.\n el?.scrollTo(\n x ? clamp(x, 0, el.scrollWidth - el.clientWidth) : 0,\n y ? clamp(y, 0, el.scrollHeight - el.clientHeight) : 0,\n );\n },\n [elRef],\n );\n\n const enableScrollLock = React.useCallback(() => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n beforeScrollLockFnSetRef.current.forEach((fn) => {\n fn();\n });\n\n const scrollY = el.scrollTop;\n const scrollX = el.scrollLeft;\n const overflowY = el.scrollWidth > el.clientWidth ? 'scroll' : '';\n const overflowX = el.scrollHeight > el.clientHeight ? 'scroll' : '';\n\n Object.assign(el.style, {\n position: 'absolute',\n top: `-${scrollY}px`,\n left: `-${scrollX}px`,\n right: '0',\n overflowY,\n overflowX,\n });\n }, [elRef]);\n\n const disableScrollLock = React.useCallback(() => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n\n const scrollY = el.style.top;\n const scrollX = el.style.left;\n\n clearDisableScrollStyle(el);\n el.scrollTo(-parseInt(scrollX || '0'), -parseInt(scrollY || '0'));\n }, [elRef]);\n\n const { incrementScrollLockCounter, decrementScrollLockCounter } = useScrollLockController(\n enableScrollLock,\n disableScrollLock,\n );\n\n const scrollController = React.useMemo<ScrollContextInterface>(\n () => ({\n getScroll,\n scrollTo,\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n beforeScrollLockFnSetRef,\n }),\n [getScroll, scrollTo, incrementScrollLockCounter, decrementScrollLockCounter],\n );\n\n return <ScrollContext.Provider value={scrollController}>{children}</ScrollContext.Provider>;\n};\n\n/**\n * Блокирует прокрутку окна\n *\n * @param enabled - если false то не будет блокировать\n */\nexport const useScrollLock = (enabled = true): void => {\n const { incrementScrollLockCounter, decrementScrollLockCounter } = useScroll();\n\n React.useEffect(() => {\n if (enabled) {\n incrementScrollLockCounter();\n return decrementScrollLockCounter;\n }\n\n return noop;\n }, [enabled, incrementScrollLockCounter, decrementScrollLockCounter]);\n};\n"],"names":["React","noop","clamp","useCounter","useDOM","clearDisableScrollStyle","node","Object","assign","style","position","top","left","right","overscrollBehavior","overflowY","overflowX","getPageYOffsetWithoutKeyboardHeight","window","diffOfClientHeightAndViewportHeight","document","documentElement","clientHeight","innerHeight","pageYOffset","ScrollContext","createContext","getScroll","x","y","scrollTo","incrementScrollLockCounter","decrementScrollLockCounter","useScroll","useContext","useScrollLockController","enableScrollLock","disableScrollLock","count","increment","decrement","needLockScroll","useEffect","GlobalScrollController","children","beforeScrollLockFnSetRef","useRef","Set","useCallback","options","compensateKeyboardHeight","pageXOffset","body","scrollWidth","innerWidth","scrollHeight","current","forEach","fn","scrollY","scrollX","clientWidth","parseInt","scrollController","useMemo","Provider","value","ElementScrollController","elRef","scrollLeft","scrollTop","el","useScrollLock","enabled"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/AppRoot/ScrollContext.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { noop } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { useCounter } from '../../hooks/useCounter';\nimport { useDOM } from '../../lib/dom';\nimport type { HasChildren } from '../../types';\n\nconst clearDisableScrollStyle = (node: HTMLElement) => {\n Object.assign(node.style, {\n position: '',\n top: '',\n left: '',\n right: '',\n overscrollBehavior: '',\n overflowY: '',\n overflowX: '',\n });\n};\n\nconst getPageYOffsetWithoutKeyboardHeight = (window: Window) => {\n // Note: здесь расчёт на то, что `clientHeight` равен `window.innerHeight`.\n // Это достигается тем, что тегу `html` задали`height: 100%` и у него нет отступов сверху и снизу. Если есть отступы,\n // то надо задать `box-sizing: border-box`, чтобы они не учитывались.\n const diffOfClientHeightAndViewportHeight =\n window.document.documentElement.clientHeight - window.innerHeight;\n return window.pageYOffset - diffOfClientHeightAndViewportHeight;\n};\n\nexport type GetScrollOptions = {\n compensateKeyboardHeight?: boolean;\n};\n\nexport interface ScrollContextInterface {\n getScroll: (this: void, options?: GetScrollOptions) => { x: number; y: number };\n scrollTo: (this: void, x?: number, y?: number) => void;\n /**\n * Увеличивает счетчик блокировки прокрутки\n */\n incrementScrollLockCounter: (this: void) => void;\n /**\n * Уменьшает счетчик блокировки прокрутки\n */\n decrementScrollLockCounter: (this: void) => void;\n beforeScrollLockFnSetRef?: React.RefObject<Set<() => void>>;\n}\n\nexport const ScrollContext: React.Context<ScrollContextInterface> =\n React.createContext<ScrollContextInterface>({\n getScroll: () => ({ x: 0, y: 0 }),\n scrollTo: noop,\n incrementScrollLockCounter: noop,\n decrementScrollLockCounter: noop,\n });\n\nexport const useScroll = (): ScrollContextInterface => React.useContext(ScrollContext);\n\n/**\n * Управляет блокировкой окна в зависимости от внутреннего счетчика.\n * Если счетчик больше нуля, требуется заблокировать прокрутку\n */\nfunction useScrollLockController(enableScrollLock: () => void, disableScrollLock: () => void) {\n const isFirstEffect = React.useRef(true);\n const [count, { increment: incrementScrollLockCounter, decrement: decrementScrollLockCounter }] =\n useCounter(0);\n\n const needLockScroll = count > 0;\n\n React.useEffect(() => {\n if (isFirstEffect.current) {\n isFirstEffect.current = false;\n return;\n }\n\n if (needLockScroll) {\n enableScrollLock();\n } else {\n disableScrollLock();\n }\n }, [needLockScroll, enableScrollLock, disableScrollLock]);\n\n return {\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n };\n}\n\nexport interface ScrollControllerProps extends HasChildren {\n elRef: React.RefObject<HTMLElement | null>;\n}\n\nexport const GlobalScrollController = ({ children }: ScrollControllerProps): React.ReactNode => {\n const { window, document } = useDOM();\n const beforeScrollLockFnSetRef = React.useRef<Set<() => void>>(new Set());\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(\n (options = { compensateKeyboardHeight: true }) => ({\n x: window!.pageXOffset,\n y: options.compensateKeyboardHeight\n ? getPageYOffsetWithoutKeyboardHeight(window!)\n : window!.pageYOffset,\n }),\n [window],\n );\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n // Some iOS versions do not normalize scroll — do it manually.\n window!.scrollTo(\n x ? clamp(x, 0, document!.body.scrollWidth - window!.innerWidth) : 0,\n y ? clamp(y, 0, document!.body.scrollHeight - window!.innerHeight) : 0,\n );\n },\n [document, window],\n );\n\n const enableScrollLock = React.useCallback(() => {\n beforeScrollLockFnSetRef.current.forEach((fn) => {\n fn();\n });\n\n const scrollY = window!.pageYOffset;\n const scrollX = window!.pageXOffset;\n const overflowY = window!.innerWidth > document!.documentElement.clientWidth ? 'scroll' : '';\n const overflowX = window!.innerHeight > document!.documentElement.clientHeight ? 'scroll' : '';\n\n Object.assign(document!.documentElement.style, { overscrollBehavior: 'none' });\n Object.assign(document!.body.style, {\n position: 'fixed',\n top: `-${scrollY}px`,\n left: `-${scrollX}px`,\n right: '0',\n overscrollBehavior: 'none',\n overflowY,\n overflowX,\n });\n }, [document, window]);\n\n const disableScrollLock = React.useCallback(() => {\n const scrollY = document!.body.style.top;\n const scrollX = document!.body.style.left;\n\n Object.assign(document!.documentElement.style, { overscrollBehavior: '' });\n clearDisableScrollStyle(document!.body);\n window!.scrollTo(-parseInt(scrollX || '0'), -parseInt(scrollY || '0'));\n }, [document, window]);\n\n const { incrementScrollLockCounter, decrementScrollLockCounter } = useScrollLockController(\n enableScrollLock,\n disableScrollLock,\n );\n\n const scrollController = React.useMemo<ScrollContextInterface>(\n () => ({\n getScroll,\n scrollTo,\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n beforeScrollLockFnSetRef: beforeScrollLockFnSetRef,\n }),\n [getScroll, scrollTo, incrementScrollLockCounter, decrementScrollLockCounter],\n );\n\n return <ScrollContext.Provider value={scrollController}>{children}</ScrollContext.Provider>;\n};\n\nexport const ElementScrollController = ({\n elRef,\n children,\n}: ScrollControllerProps): React.ReactNode => {\n const beforeScrollLockFnSetRef = React.useRef<Set<() => void>>(new Set());\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(\n () => ({\n x: elRef.current?.scrollLeft ?? 0,\n y: elRef.current?.scrollTop ?? 0,\n }),\n [elRef],\n );\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n const el = elRef.current;\n // Some iOS versions do not normalize scroll — do it manually.\n el?.scrollTo(\n x ? clamp(x, 0, el.scrollWidth - el.clientWidth) : 0,\n y ? clamp(y, 0, el.scrollHeight - el.clientHeight) : 0,\n );\n },\n [elRef],\n );\n\n const enableScrollLock = React.useCallback(() => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n beforeScrollLockFnSetRef.current.forEach((fn) => {\n fn();\n });\n\n const scrollY = el.scrollTop;\n const scrollX = el.scrollLeft;\n const overflowY = el.scrollWidth > el.clientWidth ? 'scroll' : '';\n const overflowX = el.scrollHeight > el.clientHeight ? 'scroll' : '';\n\n Object.assign(el.style, {\n position: 'absolute',\n top: `-${scrollY}px`,\n left: `-${scrollX}px`,\n right: '0',\n overflowY,\n overflowX,\n });\n }, [elRef]);\n\n const disableScrollLock = React.useCallback(() => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n\n const scrollY = el.style.top;\n const scrollX = el.style.left;\n\n clearDisableScrollStyle(el);\n el.scrollTo(-parseInt(scrollX || '0'), -parseInt(scrollY || '0'));\n }, [elRef]);\n\n const { incrementScrollLockCounter, decrementScrollLockCounter } = useScrollLockController(\n enableScrollLock,\n disableScrollLock,\n );\n\n const scrollController = React.useMemo<ScrollContextInterface>(\n () => ({\n getScroll,\n scrollTo,\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n beforeScrollLockFnSetRef,\n }),\n [getScroll, scrollTo, incrementScrollLockCounter, decrementScrollLockCounter],\n );\n\n return <ScrollContext.Provider value={scrollController}>{children}</ScrollContext.Provider>;\n};\n\n/**\n * Блокирует прокрутку окна\n *\n * @param enabled - если false то не будет блокировать\n */\nexport const useScrollLock = (enabled = true): void => {\n const { incrementScrollLockCounter, decrementScrollLockCounter } = useScroll();\n\n React.useEffect(() => {\n if (enabled) {\n incrementScrollLockCounter();\n return decrementScrollLockCounter;\n }\n\n return noop;\n }, [enabled, incrementScrollLockCounter, decrementScrollLockCounter]);\n};\n"],"names":["React","noop","clamp","useCounter","useDOM","clearDisableScrollStyle","node","Object","assign","style","position","top","left","right","overscrollBehavior","overflowY","overflowX","getPageYOffsetWithoutKeyboardHeight","window","diffOfClientHeightAndViewportHeight","document","documentElement","clientHeight","innerHeight","pageYOffset","ScrollContext","createContext","getScroll","x","y","scrollTo","incrementScrollLockCounter","decrementScrollLockCounter","useScroll","useContext","useScrollLockController","enableScrollLock","disableScrollLock","isFirstEffect","useRef","count","increment","decrement","needLockScroll","useEffect","current","GlobalScrollController","children","beforeScrollLockFnSetRef","Set","useCallback","options","compensateKeyboardHeight","pageXOffset","body","scrollWidth","innerWidth","scrollHeight","forEach","fn","scrollY","scrollX","clientWidth","parseInt","scrollController","useMemo","Provider","value","ElementScrollController","elRef","scrollLeft","scrollTop","el","useScrollLock","enabled"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CarouselBase.d.ts","sourceRoot":"","sources":["../../../src/components/CarouselBase/CarouselBase.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsB/B,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,SAAS,CAAC;AAKjB,eAAO,MAAM,YAAY,gSAwBtB,gBAAgB,KAAG,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"CarouselBase.d.ts","sourceRoot":"","sources":["../../../src/components/CarouselBase/CarouselBase.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsB/B,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,SAAS,CAAC;AAKjB,eAAO,MAAM,YAAY,gSAwBtB,gBAAgB,KAAG,KAAK,CAAC,SAkc3B,CAAC"}
|
|
@@ -167,22 +167,24 @@ export const CarouselBase = (_param)=>{
|
|
|
167
167
|
var _localSlides_slideIndex_width;
|
|
168
168
|
const currentSlideOffsetOnCenterAlignment = (containerWidth - ((_localSlides_slideIndex_width = (_localSlides_slideIndex = localSlides[slideIndex]) === null || _localSlides_slideIndex === void 0 ? void 0 : _localSlides_slideIndex.width) !== null && _localSlides_slideIndex_width !== void 0 ? _localSlides_slideIndex_width : 0)) / 2;
|
|
169
169
|
const isFullyVisible = align === 'center' ? layerWidth + currentSlideOffsetOnCenterAlignment <= containerWidth : layerWidth <= containerWidth;
|
|
170
|
+
const onlyOneSlide = localSlides.length === 1;
|
|
170
171
|
slidesManager.current = _object_spread_props(_object_spread({}, slidesManager.current), {
|
|
171
172
|
layerWidth,
|
|
172
173
|
containerWidth,
|
|
173
174
|
viewportOffsetWidth,
|
|
174
175
|
slides: localSlides,
|
|
175
176
|
isFullyVisible,
|
|
176
|
-
max: looped ? null : calcMax({
|
|
177
|
+
max: looped || onlyOneSlide ? null : calcMax({
|
|
177
178
|
slides: localSlides,
|
|
178
179
|
containerWidth,
|
|
179
180
|
isCenterAlign
|
|
180
181
|
}),
|
|
181
|
-
min: looped ? null : calcMin({
|
|
182
|
+
min: looped || onlyOneSlide ? null : calcMin({
|
|
182
183
|
containerWidth,
|
|
183
184
|
layerWidth,
|
|
184
185
|
slides: localSlides,
|
|
185
186
|
viewportOffsetWidth,
|
|
187
|
+
isFullyVisible,
|
|
186
188
|
align
|
|
187
189
|
})
|
|
188
190
|
});
|
|
@@ -193,7 +195,8 @@ export const CarouselBase = (_param)=>{
|
|
|
193
195
|
}
|
|
194
196
|
slidesManager.current.snaps = snaps;
|
|
195
197
|
slidesManager.current.contentSize = contentSize;
|
|
196
|
-
|
|
198
|
+
// Если галерея не зациклена и слайд всего один, то рассчитывать loopPoints тоже не надо
|
|
199
|
+
if (looped && !onlyOneSlide && !isFullyVisible) {
|
|
197
200
|
slidesManager.current.loopPoints = getLoopPoints(slidesManager.current, containerWidth);
|
|
198
201
|
}
|
|
199
202
|
shiftXCurrentRef.current = snaps[slideIndex];
|
|
@@ -342,7 +345,14 @@ export const CarouselBase = (_param)=>{
|
|
|
342
345
|
isDragging.current = false;
|
|
343
346
|
let targetIndex = slideIndex;
|
|
344
347
|
if (e.isSlide) {
|
|
345
|
-
targetIndex = getTargetIndex(
|
|
348
|
+
targetIndex = getTargetIndex({
|
|
349
|
+
slides: slidesManager.current.slides,
|
|
350
|
+
slideIndex,
|
|
351
|
+
currentShiftX: shiftXCurrentRef.current,
|
|
352
|
+
currentShiftXDelta: shiftXDeltaRef.current,
|
|
353
|
+
max: slidesManager.current.max,
|
|
354
|
+
looped
|
|
355
|
+
});
|
|
346
356
|
}
|
|
347
357
|
onDragEnd === null || onDragEnd === void 0 ? void 0 : onDragEnd(e, targetIndex);
|
|
348
358
|
if (targetIndex !== slideIndex) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/CarouselBase/CarouselBase.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useMutationObserver } from '../../hooks/useMutationObserver';\nimport { useResizeObserver } from '../../hooks/useResizeObserver';\nimport { useDOM } from '../../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { type CustomTouchEvent } from '../Touch/Touch';\nimport { Bullets } from './Bullets';\nimport { CarouselViewPort } from './CarouselViewPort';\nimport { ScrollArrows } from './ScrollArrows';\nimport {\n ANIMATION_DURATION,\n CONTROL_ELEMENTS_STATE,\n SLIDE_THRESHOLD,\n SLIDES_MANAGER_STATE,\n} from './constants';\nimport { calcMax, calcMin, calculateIndent, getLoopPoints, getTargetIndex } from './helpers';\nimport { useSlideAnimation } from './hooks';\nimport {\n type BaseGalleryProps,\n type ControlElementsState,\n type GallerySlidesState,\n type SlidesManagerState,\n} from './types';\nimport styles from './CarouselBase.module.css';\n\nconst warn = warnOnce('Gallery');\n\nexport const CarouselBase = ({\n bullets = false,\n getRootRef,\n children,\n slideWidth = '100%',\n slideIndex = 0,\n dragDisabled = false,\n resizeSource = 'window',\n onDragStart,\n onDragEnd,\n onChange,\n onPrevClick,\n onNextClick,\n align = 'left',\n showArrows,\n getRef,\n arrowSize,\n arrowAreaHeight,\n slideTestId,\n bulletTestId,\n nextArrowTestId,\n prevArrowTestId,\n looped = false,\n ...restProps\n}: BaseGalleryProps): React.ReactNode => {\n const slidesStore = React.useRef<Record<string, HTMLDivElement | null>>({});\n const slidesManager = React.useRef<SlidesManagerState>(SLIDES_MANAGER_STATE);\n\n const rootRef = useExternRef(getRootRef);\n const viewportRef = useExternRef(getRef);\n const layerRef = React.useRef<HTMLDivElement>(null);\n const animationFrameRef = React.useRef<ReturnType<typeof requestAnimationFrame> | null>(null);\n const shiftXCurrentRef = React.useRef<number>(0);\n const shiftXDeltaRef = React.useRef<number>(0);\n const initialized = React.useRef<boolean>(false);\n const { addToAnimationQueue, getAnimateFunction, startAnimation } = useSlideAnimation();\n const isDragging = React.useRef(false);\n\n const [controlElementsState, setControlElementsState] =\n React.useState<ControlElementsState>(CONTROL_ELEMENTS_STATE);\n\n const hasPointer = useAdaptivityHasPointer();\n\n const isCenterAlign = align === 'center';\n\n /*\n * Считает отступ слоя галереи во время драга\n * Используется только для looped=false галереи\n * так как только у нее есть пределы по краям\n */\n const calculateDragIndent = () => {\n const localMax = slidesManager.current.max ?? 0;\n const localMin = slidesManager.current.min ?? 0;\n const indent = shiftXCurrentRef.current + shiftXDeltaRef.current;\n\n if (indent > localMax) {\n return localMax + Number((indent - localMax) / 3);\n } else if (indent < localMin) {\n return localMin + Number((indent - localMin) / 3);\n }\n\n return indent;\n };\n\n const calculateCanSlideLeft = () => {\n if (looped) {\n return !slidesManager.current.isFullyVisible;\n }\n return !slidesManager.current.isFullyVisible && shiftXCurrentRef.current < 0;\n };\n\n const calculateCanSlideRight = () => {\n if (looped) {\n return !slidesManager.current.isFullyVisible;\n }\n return (\n !slidesManager.current.isFullyVisible &&\n // we can't move right when gallery layer fully scrolled right, if gallery aligned by left side\n ((align === 'left' &&\n slidesManager.current.containerWidth - shiftXCurrentRef.current <\n (slidesManager.current.layerWidth ?? 0)) ||\n // otherwise we need to check current slide index (align = right or align = center)\n (align !== 'left' && slideIndex < slidesManager.current.slides.length - 1))\n );\n };\n\n const transformCssStyles = (shiftX: number, animation = false) => {\n shiftX = Math.round(shiftX);\n if (looped) {\n slidesManager.current.loopPoints.forEach((loopPoint) => {\n const { target, index } = loopPoint;\n const slide = slidesStore.current[index];\n if (slide) {\n slide.style.transform = `translate3d(${target(shiftX)}px, 0, 0)`;\n }\n });\n } else {\n Object.values(slidesStore.current).forEach((slide) => {\n if (slide) {\n slide.style.transform = '';\n }\n });\n }\n\n if (layerRef.current) {\n const indent = isDragging.current && !looped ? calculateDragIndent() : shiftX;\n\n layerRef.current.style.transform = `translate3d(${indent}px, 0, 0)`;\n layerRef.current.style.transition = animation\n ? `transform ${ANIMATION_DURATION}ms cubic-bezier(.1, 0, .25, 1)`\n : '';\n }\n };\n\n const requestTransform = (shiftX: number, animation = false) => {\n const { snaps, contentSize, slides } = slidesManager.current;\n\n if (animationFrameRef.current !== null) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n animationFrameRef.current = requestAnimationFrame(() => {\n if (looped && shiftX > snaps[0]) {\n shiftXCurrentRef.current = -contentSize + snaps[0];\n shiftX = shiftXCurrentRef.current + shiftXDeltaRef.current;\n }\n const lastPoint = slides[slides.length - 1].width + slides[slides.length - 1].coordX;\n\n if (looped && shiftX <= -lastPoint) {\n shiftXCurrentRef.current = Math.abs(shiftXDeltaRef.current) + snaps[0];\n }\n transformCssStyles(shiftX, animation);\n });\n };\n\n const initializeSlides = () => {\n if (!rootRef.current || !viewportRef.current) {\n return;\n }\n let localSlides =\n React.Children.map(children, (_item, i): GallerySlidesState => {\n const elem = slidesStore.current[i] || { offsetLeft: 0, offsetWidth: 0 };\n return { coordX: elem.offsetLeft, width: elem.offsetWidth };\n }) || [];\n\n if (localSlides.length === 0) {\n initialized.current = false;\n return;\n }\n\n const containerWidth = rootRef.current.offsetWidth;\n const viewportOffsetWidth = viewportRef.current.offsetWidth;\n const layerWidth = localSlides.reduce((val, slide) => slide.width + val, 0);\n\n if (process.env.NODE_ENV === 'development' && looped) {\n let remainingWidth = containerWidth;\n let slideIndex = 0;\n\n while (remainingWidth > 0 && slideIndex < localSlides.length) {\n remainingWidth -= localSlides[slideIndex].width;\n slideIndex++;\n }\n if (remainingWidth <= 0 && slideIndex === localSlides.length) {\n warn(\n 'Ширины слайдов недостаточно для корректной работы свойства \"looped\". Пожалуйста, сделайте её больше.',\n );\n }\n }\n\n const currentSlideOffsetOnCenterAlignment =\n (containerWidth - (localSlides[slideIndex]?.width ?? 0)) / 2;\n const isFullyVisible =\n align === 'center'\n ? layerWidth + currentSlideOffsetOnCenterAlignment <= containerWidth\n : layerWidth <= containerWidth;\n\n slidesManager.current = {\n ...slidesManager.current,\n layerWidth,\n containerWidth,\n viewportOffsetWidth,\n slides: localSlides,\n isFullyVisible,\n max: looped\n ? null\n : calcMax({\n slides: localSlides,\n containerWidth,\n isCenterAlign,\n }),\n min: looped\n ? null\n : calcMin({\n containerWidth,\n layerWidth,\n slides: localSlides,\n viewportOffsetWidth,\n align,\n }),\n };\n const snaps = localSlides.map((_, index) =>\n calculateIndent(index, slidesManager.current, isCenterAlign, looped),\n );\n\n let contentSize = -snaps[snaps.length - 1] + localSlides[localSlides.length - 1].width;\n if (align === 'center') {\n contentSize += snaps[0];\n }\n\n slidesManager.current.snaps = snaps;\n slidesManager.current.contentSize = contentSize;\n if (looped) {\n slidesManager.current.loopPoints = getLoopPoints(slidesManager.current, containerWidth);\n }\n\n shiftXCurrentRef.current = snaps[slideIndex];\n initialized.current = true;\n\n setControlElementsState({\n canSlideLeft: calculateCanSlideLeft(),\n canSlideRight: calculateCanSlideRight(),\n isDraggable: !(dragDisabled || slidesManager.current.isFullyVisible),\n });\n requestTransform(shiftXCurrentRef.current);\n };\n\n const onResize = () => {\n if (initialized.current) {\n initializeSlides();\n }\n };\n const { window } = useDOM();\n useResizeObserver(resizeSource === 'element' ? rootRef : window, onResize);\n\n const loopedSlideChangePerform = () => {\n const { snaps, slides } = slidesManager.current;\n const indent = snaps[slideIndex];\n let startPoint = shiftXCurrentRef.current;\n\n /**\n * Переключаемся с последнего элемента на первый\n * Для корректной анимации мы прокручиваем последний слайд на всю длину (shiftX) \"вперед\"\n * В конце анимации при отрисовке следующего кадра задаем всем слайдам начальные значения\n */\n if (indent === snaps[0] && shiftXCurrentRef.current <= snaps[snaps.length - 1]) {\n const distance =\n Math.abs(snaps[snaps.length - 1]) + slides[slides.length - 1].width + startPoint;\n\n addToAnimationQueue(\n getAnimateFunction((progress) => {\n const shiftX = startPoint + progress * distance * -1;\n\n transformCssStyles(shiftX);\n\n if (shiftX <= snaps[snaps.length - 1] - slides[slides.length - 1].width) {\n requestAnimationFrame(() => {\n shiftXCurrentRef.current = indent;\n transformCssStyles(snaps[0]);\n });\n }\n }),\n );\n /**\n * Переключаемся с первого слайда на последний\n * Для корректной анимации сначала задаем первым видимым слайдам смещение\n * В следующем кадре начинаем анимация прокрутки \"назад\"\n */\n } else if (indent === snaps[snaps.length - 1] && shiftXCurrentRef.current === snaps[0]) {\n startPoint = indent - slides[slides.length - 1].width;\n\n addToAnimationQueue(() => {\n requestAnimationFrame(() => {\n const shiftX = indent - slides[slides.length - 1].width;\n transformCssStyles(shiftX);\n\n getAnimateFunction((progress) => {\n transformCssStyles(startPoint + progress * slides[slides.length - 1].width);\n })();\n });\n });\n /**\n * Если не обработаны `corner`-кейсы выше, то просто проигрываем анимацию смещения\n */\n } else {\n addToAnimationQueue(() => {\n const distance = Math.abs(indent - startPoint);\n let direction = startPoint <= indent ? 1 : -1;\n\n getAnimateFunction((progress) => {\n const shiftX = startPoint + progress * distance * direction;\n transformCssStyles(shiftX);\n })();\n });\n }\n };\n\n const simpleSlideChangePerform = () => {\n const { snaps } = slidesManager.current;\n const startPoint = shiftXCurrentRef.current;\n const endPoint = snaps[slideIndex];\n const distance = endPoint - startPoint;\n addToAnimationQueue(\n getAnimateFunction((progress) => transformCssStyles(startPoint + distance * progress)),\n );\n };\n\n useIsomorphicLayoutEffect(\n function performSlideChange() {\n if (!initialized.current) {\n return;\n }\n const { snaps } = slidesManager.current;\n const indent = snaps[slideIndex];\n\n if (looped) {\n loopedSlideChangePerform();\n } else {\n simpleSlideChangePerform();\n }\n\n startAnimation();\n\n shiftXCurrentRef.current = indent;\n\n setControlElementsState((v) => ({\n ...v,\n canSlideLeft: calculateCanSlideLeft(),\n canSlideRight: calculateCanSlideRight(),\n }));\n },\n [slideIndex],\n );\n\n useIsomorphicLayoutEffect(\n function updateIsDraggable() {\n setControlElementsState((v) => ({\n ...v,\n isDraggable: !(dragDisabled || slidesManager.current.isFullyVisible),\n }));\n },\n [dragDisabled],\n );\n\n useMutationObserver(layerRef, initializeSlides);\n\n useIsomorphicLayoutEffect(initializeSlides, [align, slideWidth, looped]);\n\n const calculateMinDeltaXToSlide = () => {\n return slidesManager.current.slides[slideIndex].width * SLIDE_THRESHOLD;\n };\n\n const slideLeft = (event: React.MouseEvent) => {\n if (slideIndex > 0) {\n shiftXCurrentRef.current += calculateMinDeltaXToSlide();\n }\n onChange?.(\n (slideIndex - 1 + slidesManager.current.slides.length) % slidesManager.current.slides.length,\n );\n onPrevClick?.(event);\n };\n\n const slideRight = (event: React.MouseEvent) => {\n if (slideIndex < slidesManager.current.slides.length - 1) {\n shiftXCurrentRef.current -= calculateMinDeltaXToSlide();\n }\n onChange?.((slideIndex + 1) % slidesManager.current.slides.length);\n onNextClick?.(event);\n };\n\n const onStart = (e: CustomTouchEvent) => {\n e.originalEvent.stopPropagation();\n if (controlElementsState.isDraggable) {\n onDragStart?.(e);\n shiftXCurrentRef.current = slidesManager.current.snaps[slideIndex];\n shiftXDeltaRef.current = 0;\n }\n };\n\n const onMoveX = (e: CustomTouchEvent) => {\n if (controlElementsState.isDraggable) {\n e.originalEvent.preventDefault();\n\n if (e.isSlideX) {\n isDragging.current = true;\n if (shiftXDeltaRef.current !== e.shiftX) {\n shiftXDeltaRef.current = e.shiftX;\n requestTransform(shiftXCurrentRef.current + shiftXDeltaRef.current);\n }\n }\n }\n };\n\n const onEnd = (e: CustomTouchEvent) => {\n if (controlElementsState.isDraggable) {\n isDragging.current = false;\n let targetIndex = slideIndex;\n if (e.isSlide) {\n targetIndex = getTargetIndex(\n slidesManager.current.slides,\n slideIndex,\n shiftXCurrentRef.current,\n shiftXDeltaRef.current,\n looped,\n );\n }\n onDragEnd?.(e, targetIndex);\n\n if (targetIndex !== slideIndex) {\n shiftXCurrentRef.current = shiftXCurrentRef.current + shiftXDeltaRef.current;\n onChange?.(targetIndex);\n } else {\n const initialShiftX = slidesManager.current.snaps[targetIndex];\n requestTransform(initialShiftX, true);\n }\n }\n };\n\n const setSlideRef = (slideRef: HTMLDivElement | null, slideIndex: number) => {\n slidesStore.current[slideIndex] = slideRef;\n };\n\n const { isDraggable, canSlideRight, canSlideLeft } = controlElementsState;\n\n return (\n <RootComponent\n {...restProps}\n baseClassName={classNames(\n styles.host,\n slideWidth === 'custom' && styles.customWidth,\n isDraggable && styles.draggable,\n )}\n getRootRef={rootRef}\n >\n <CarouselViewPort\n slideWidth={slideWidth}\n slideTestId={slideTestId}\n onStart={onStart}\n onMoveX={onMoveX}\n onEnd={onEnd}\n getRootRef={viewportRef}\n layerRef={layerRef}\n setSlideRef={setSlideRef}\n >\n {children}\n </CarouselViewPort>\n\n {bullets && (\n <Bullets\n bullets={bullets}\n slideIndex={slideIndex}\n count={React.Children.count(children)}\n bulletTestId={bulletTestId}\n />\n )}\n <ScrollArrows\n hasPointer={hasPointer}\n canSlideLeft={canSlideLeft}\n canSlideRight={canSlideRight}\n onSlideRight={slideRight}\n onSlideLeft={slideLeft}\n showArrows={showArrows}\n arrowSize={arrowSize}\n arrowAreaHeight={arrowAreaHeight}\n prevArrowTestId={prevArrowTestId}\n nextArrowTestId={nextArrowTestId}\n />\n </RootComponent>\n );\n};\n"],"names":["React","classNames","useAdaptivityHasPointer","useExternRef","useMutationObserver","useResizeObserver","useDOM","useIsomorphicLayoutEffect","warnOnce","RootComponent","Bullets","CarouselViewPort","ScrollArrows","ANIMATION_DURATION","CONTROL_ELEMENTS_STATE","SLIDE_THRESHOLD","SLIDES_MANAGER_STATE","calcMax","calcMin","calculateIndent","getLoopPoints","getTargetIndex","useSlideAnimation","warn","CarouselBase","bullets","getRootRef","children","slideWidth","slideIndex","dragDisabled","resizeSource","onDragStart","onDragEnd","onChange","onPrevClick","onNextClick","align","showArrows","getRef","arrowSize","arrowAreaHeight","slideTestId","bulletTestId","nextArrowTestId","prevArrowTestId","looped","restProps","slidesStore","useRef","slidesManager","rootRef","viewportRef","layerRef","animationFrameRef","shiftXCurrentRef","shiftXDeltaRef","initialized","addToAnimationQueue","getAnimateFunction","startAnimation","isDragging","controlElementsState","setControlElementsState","useState","hasPointer","isCenterAlign","calculateDragIndent","localMax","current","max","localMin","min","indent","Number","calculateCanSlideLeft","isFullyVisible","calculateCanSlideRight","containerWidth","layerWidth","slides","length","transformCssStyles","shiftX","animation","Math","round","loopPoints","forEach","loopPoint","target","index","slide","style","transform","Object","values","transition","requestTransform","snaps","contentSize","cancelAnimationFrame","requestAnimationFrame","lastPoint","width","coordX","abs","initializeSlides","localSlides","Children","map","_item","i","elem","offsetLeft","offsetWidth","viewportOffsetWidth","reduce","val","process","env","NODE_ENV","remainingWidth","currentSlideOffsetOnCenterAlignment","_","canSlideLeft","canSlideRight","isDraggable","onResize","window","loopedSlideChangePerform","startPoint","distance","progress","direction","simpleSlideChangePerform","endPoint","performSlideChange","v","updateIsDraggable","calculateMinDeltaXToSlide","slideLeft","event","slideRight","onStart","e","originalEvent","stopPropagation","onMoveX","preventDefault","isSlideX","onEnd","targetIndex","isSlide","initialShiftX","setSlideRef","slideRef","baseClassName","count","onSlideRight","onSlideLeft"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/CarouselBase/CarouselBase.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useMutationObserver } from '../../hooks/useMutationObserver';\nimport { useResizeObserver } from '../../hooks/useResizeObserver';\nimport { useDOM } from '../../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { type CustomTouchEvent } from '../Touch/Touch';\nimport { Bullets } from './Bullets';\nimport { CarouselViewPort } from './CarouselViewPort';\nimport { ScrollArrows } from './ScrollArrows';\nimport {\n ANIMATION_DURATION,\n CONTROL_ELEMENTS_STATE,\n SLIDE_THRESHOLD,\n SLIDES_MANAGER_STATE,\n} from './constants';\nimport { calcMax, calcMin, calculateIndent, getLoopPoints, getTargetIndex } from './helpers';\nimport { useSlideAnimation } from './hooks';\nimport {\n type BaseGalleryProps,\n type ControlElementsState,\n type GallerySlidesState,\n type SlidesManagerState,\n} from './types';\nimport styles from './CarouselBase.module.css';\n\nconst warn = warnOnce('Gallery');\n\nexport const CarouselBase = ({\n bullets = false,\n getRootRef,\n children,\n slideWidth = '100%',\n slideIndex = 0,\n dragDisabled = false,\n resizeSource = 'window',\n onDragStart,\n onDragEnd,\n onChange,\n onPrevClick,\n onNextClick,\n align = 'left',\n showArrows,\n getRef,\n arrowSize,\n arrowAreaHeight,\n slideTestId,\n bulletTestId,\n nextArrowTestId,\n prevArrowTestId,\n looped = false,\n ...restProps\n}: BaseGalleryProps): React.ReactNode => {\n const slidesStore = React.useRef<Record<string, HTMLDivElement | null>>({});\n const slidesManager = React.useRef<SlidesManagerState>(SLIDES_MANAGER_STATE);\n\n const rootRef = useExternRef(getRootRef);\n const viewportRef = useExternRef(getRef);\n const layerRef = React.useRef<HTMLDivElement>(null);\n const animationFrameRef = React.useRef<ReturnType<typeof requestAnimationFrame> | null>(null);\n const shiftXCurrentRef = React.useRef<number>(0);\n const shiftXDeltaRef = React.useRef<number>(0);\n const initialized = React.useRef<boolean>(false);\n const { addToAnimationQueue, getAnimateFunction, startAnimation } = useSlideAnimation();\n const isDragging = React.useRef(false);\n\n const [controlElementsState, setControlElementsState] =\n React.useState<ControlElementsState>(CONTROL_ELEMENTS_STATE);\n\n const hasPointer = useAdaptivityHasPointer();\n\n const isCenterAlign = align === 'center';\n\n /*\n * Считает отступ слоя галереи во время драга\n * Используется только для looped=false галереи\n * так как только у нее есть пределы по краям\n */\n const calculateDragIndent = () => {\n const localMax = slidesManager.current.max ?? 0;\n const localMin = slidesManager.current.min ?? 0;\n const indent = shiftXCurrentRef.current + shiftXDeltaRef.current;\n\n if (indent > localMax) {\n return localMax + Number((indent - localMax) / 3);\n } else if (indent < localMin) {\n return localMin + Number((indent - localMin) / 3);\n }\n\n return indent;\n };\n\n const calculateCanSlideLeft = () => {\n if (looped) {\n return !slidesManager.current.isFullyVisible;\n }\n return !slidesManager.current.isFullyVisible && shiftXCurrentRef.current < 0;\n };\n\n const calculateCanSlideRight = () => {\n if (looped) {\n return !slidesManager.current.isFullyVisible;\n }\n return (\n !slidesManager.current.isFullyVisible &&\n // we can't move right when gallery layer fully scrolled right, if gallery aligned by left side\n ((align === 'left' &&\n slidesManager.current.containerWidth - shiftXCurrentRef.current <\n (slidesManager.current.layerWidth ?? 0)) ||\n // otherwise we need to check current slide index (align = right or align = center)\n (align !== 'left' && slideIndex < slidesManager.current.slides.length - 1))\n );\n };\n\n const transformCssStyles = (shiftX: number, animation = false) => {\n shiftX = Math.round(shiftX);\n if (looped) {\n slidesManager.current.loopPoints.forEach((loopPoint) => {\n const { target, index } = loopPoint;\n const slide = slidesStore.current[index];\n if (slide) {\n slide.style.transform = `translate3d(${target(shiftX)}px, 0, 0)`;\n }\n });\n } else {\n Object.values(slidesStore.current).forEach((slide) => {\n if (slide) {\n slide.style.transform = '';\n }\n });\n }\n\n if (layerRef.current) {\n const indent = isDragging.current && !looped ? calculateDragIndent() : shiftX;\n\n layerRef.current.style.transform = `translate3d(${indent}px, 0, 0)`;\n layerRef.current.style.transition = animation\n ? `transform ${ANIMATION_DURATION}ms cubic-bezier(.1, 0, .25, 1)`\n : '';\n }\n };\n\n const requestTransform = (shiftX: number, animation = false) => {\n const { snaps, contentSize, slides } = slidesManager.current;\n\n if (animationFrameRef.current !== null) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n animationFrameRef.current = requestAnimationFrame(() => {\n if (looped && shiftX > snaps[0]) {\n shiftXCurrentRef.current = -contentSize + snaps[0];\n shiftX = shiftXCurrentRef.current + shiftXDeltaRef.current;\n }\n const lastPoint = slides[slides.length - 1].width + slides[slides.length - 1].coordX;\n\n if (looped && shiftX <= -lastPoint) {\n shiftXCurrentRef.current = Math.abs(shiftXDeltaRef.current) + snaps[0];\n }\n transformCssStyles(shiftX, animation);\n });\n };\n\n const initializeSlides = () => {\n if (!rootRef.current || !viewportRef.current) {\n return;\n }\n let localSlides =\n React.Children.map(children, (_item, i): GallerySlidesState => {\n const elem = slidesStore.current[i] || { offsetLeft: 0, offsetWidth: 0 };\n return { coordX: elem.offsetLeft, width: elem.offsetWidth };\n }) || [];\n\n if (localSlides.length === 0) {\n initialized.current = false;\n return;\n }\n\n const containerWidth = rootRef.current.offsetWidth;\n const viewportOffsetWidth = viewportRef.current.offsetWidth;\n const layerWidth = localSlides.reduce((val, slide) => slide.width + val, 0);\n\n if (process.env.NODE_ENV === 'development' && looped) {\n let remainingWidth = containerWidth;\n let slideIndex = 0;\n\n while (remainingWidth > 0 && slideIndex < localSlides.length) {\n remainingWidth -= localSlides[slideIndex].width;\n slideIndex++;\n }\n if (remainingWidth <= 0 && slideIndex === localSlides.length) {\n warn(\n 'Ширины слайдов недостаточно для корректной работы свойства \"looped\". Пожалуйста, сделайте её больше.',\n );\n }\n }\n\n const currentSlideOffsetOnCenterAlignment =\n (containerWidth - (localSlides[slideIndex]?.width ?? 0)) / 2;\n const isFullyVisible =\n align === 'center'\n ? layerWidth + currentSlideOffsetOnCenterAlignment <= containerWidth\n : layerWidth <= containerWidth;\n\n const onlyOneSlide = localSlides.length === 1;\n\n slidesManager.current = {\n ...slidesManager.current,\n layerWidth,\n containerWidth,\n viewportOffsetWidth,\n slides: localSlides,\n isFullyVisible,\n max:\n looped || onlyOneSlide\n ? null\n : calcMax({\n slides: localSlides,\n containerWidth,\n isCenterAlign,\n }),\n min:\n looped || onlyOneSlide\n ? null\n : calcMin({\n containerWidth,\n layerWidth,\n slides: localSlides,\n viewportOffsetWidth,\n isFullyVisible,\n align,\n }),\n };\n const snaps = localSlides.map((_, index) =>\n calculateIndent(index, slidesManager.current, isCenterAlign, looped),\n );\n\n let contentSize = -snaps[snaps.length - 1] + localSlides[localSlides.length - 1].width;\n if (align === 'center') {\n contentSize += snaps[0];\n }\n\n slidesManager.current.snaps = snaps;\n slidesManager.current.contentSize = contentSize;\n // Если галерея не зациклена и слайд всего один, то рассчитывать loopPoints тоже не надо\n if (looped && !onlyOneSlide && !isFullyVisible) {\n slidesManager.current.loopPoints = getLoopPoints(slidesManager.current, containerWidth);\n }\n\n shiftXCurrentRef.current = snaps[slideIndex];\n initialized.current = true;\n\n setControlElementsState({\n canSlideLeft: calculateCanSlideLeft(),\n canSlideRight: calculateCanSlideRight(),\n isDraggable: !(dragDisabled || slidesManager.current.isFullyVisible),\n });\n requestTransform(shiftXCurrentRef.current);\n };\n\n const onResize = () => {\n if (initialized.current) {\n initializeSlides();\n }\n };\n const { window } = useDOM();\n useResizeObserver(resizeSource === 'element' ? rootRef : window, onResize);\n\n const loopedSlideChangePerform = () => {\n const { snaps, slides } = slidesManager.current;\n const indent = snaps[slideIndex];\n let startPoint = shiftXCurrentRef.current;\n\n /**\n * Переключаемся с последнего элемента на первый\n * Для корректной анимации мы прокручиваем последний слайд на всю длину (shiftX) \"вперед\"\n * В конце анимации при отрисовке следующего кадра задаем всем слайдам начальные значения\n */\n if (indent === snaps[0] && shiftXCurrentRef.current <= snaps[snaps.length - 1]) {\n const distance =\n Math.abs(snaps[snaps.length - 1]) + slides[slides.length - 1].width + startPoint;\n\n addToAnimationQueue(\n getAnimateFunction((progress) => {\n const shiftX = startPoint + progress * distance * -1;\n\n transformCssStyles(shiftX);\n\n if (shiftX <= snaps[snaps.length - 1] - slides[slides.length - 1].width) {\n requestAnimationFrame(() => {\n shiftXCurrentRef.current = indent;\n transformCssStyles(snaps[0]);\n });\n }\n }),\n );\n /**\n * Переключаемся с первого слайда на последний\n * Для корректной анимации сначала задаем первым видимым слайдам смещение\n * В следующем кадре начинаем анимация прокрутки \"назад\"\n */\n } else if (indent === snaps[snaps.length - 1] && shiftXCurrentRef.current === snaps[0]) {\n startPoint = indent - slides[slides.length - 1].width;\n\n addToAnimationQueue(() => {\n requestAnimationFrame(() => {\n const shiftX = indent - slides[slides.length - 1].width;\n transformCssStyles(shiftX);\n\n getAnimateFunction((progress) => {\n transformCssStyles(startPoint + progress * slides[slides.length - 1].width);\n })();\n });\n });\n /**\n * Если не обработаны `corner`-кейсы выше, то просто проигрываем анимацию смещения\n */\n } else {\n addToAnimationQueue(() => {\n const distance = Math.abs(indent - startPoint);\n let direction = startPoint <= indent ? 1 : -1;\n\n getAnimateFunction((progress) => {\n const shiftX = startPoint + progress * distance * direction;\n transformCssStyles(shiftX);\n })();\n });\n }\n };\n\n const simpleSlideChangePerform = () => {\n const { snaps } = slidesManager.current;\n const startPoint = shiftXCurrentRef.current;\n const endPoint = snaps[slideIndex];\n const distance = endPoint - startPoint;\n addToAnimationQueue(\n getAnimateFunction((progress) => transformCssStyles(startPoint + distance * progress)),\n );\n };\n\n useIsomorphicLayoutEffect(\n function performSlideChange() {\n if (!initialized.current) {\n return;\n }\n const { snaps } = slidesManager.current;\n const indent = snaps[slideIndex];\n\n if (looped) {\n loopedSlideChangePerform();\n } else {\n simpleSlideChangePerform();\n }\n\n startAnimation();\n\n shiftXCurrentRef.current = indent;\n\n setControlElementsState((v) => ({\n ...v,\n canSlideLeft: calculateCanSlideLeft(),\n canSlideRight: calculateCanSlideRight(),\n }));\n },\n [slideIndex],\n );\n\n useIsomorphicLayoutEffect(\n function updateIsDraggable() {\n setControlElementsState((v) => ({\n ...v,\n isDraggable: !(dragDisabled || slidesManager.current.isFullyVisible),\n }));\n },\n [dragDisabled],\n );\n\n useMutationObserver(layerRef, initializeSlides);\n\n useIsomorphicLayoutEffect(initializeSlides, [align, slideWidth, looped]);\n\n const calculateMinDeltaXToSlide = () => {\n return slidesManager.current.slides[slideIndex].width * SLIDE_THRESHOLD;\n };\n\n const slideLeft = (event: React.MouseEvent) => {\n if (slideIndex > 0) {\n shiftXCurrentRef.current += calculateMinDeltaXToSlide();\n }\n onChange?.(\n (slideIndex - 1 + slidesManager.current.slides.length) % slidesManager.current.slides.length,\n );\n onPrevClick?.(event);\n };\n\n const slideRight = (event: React.MouseEvent) => {\n if (slideIndex < slidesManager.current.slides.length - 1) {\n shiftXCurrentRef.current -= calculateMinDeltaXToSlide();\n }\n onChange?.((slideIndex + 1) % slidesManager.current.slides.length);\n onNextClick?.(event);\n };\n\n const onStart = (e: CustomTouchEvent) => {\n e.originalEvent.stopPropagation();\n if (controlElementsState.isDraggable) {\n onDragStart?.(e);\n shiftXCurrentRef.current = slidesManager.current.snaps[slideIndex];\n shiftXDeltaRef.current = 0;\n }\n };\n\n const onMoveX = (e: CustomTouchEvent) => {\n if (controlElementsState.isDraggable) {\n e.originalEvent.preventDefault();\n\n if (e.isSlideX) {\n isDragging.current = true;\n if (shiftXDeltaRef.current !== e.shiftX) {\n shiftXDeltaRef.current = e.shiftX;\n requestTransform(shiftXCurrentRef.current + shiftXDeltaRef.current);\n }\n }\n }\n };\n\n const onEnd = (e: CustomTouchEvent) => {\n if (controlElementsState.isDraggable) {\n isDragging.current = false;\n let targetIndex = slideIndex;\n if (e.isSlide) {\n targetIndex = getTargetIndex({\n slides: slidesManager.current.slides,\n slideIndex,\n currentShiftX: shiftXCurrentRef.current,\n currentShiftXDelta: shiftXDeltaRef.current,\n max: slidesManager.current.max,\n looped,\n });\n }\n onDragEnd?.(e, targetIndex);\n\n if (targetIndex !== slideIndex) {\n shiftXCurrentRef.current = shiftXCurrentRef.current + shiftXDeltaRef.current;\n onChange?.(targetIndex);\n } else {\n const initialShiftX = slidesManager.current.snaps[targetIndex];\n requestTransform(initialShiftX, true);\n }\n }\n };\n\n const setSlideRef = (slideRef: HTMLDivElement | null, slideIndex: number) => {\n slidesStore.current[slideIndex] = slideRef;\n };\n\n const { isDraggable, canSlideRight, canSlideLeft } = controlElementsState;\n\n return (\n <RootComponent\n {...restProps}\n baseClassName={classNames(\n styles.host,\n slideWidth === 'custom' && styles.customWidth,\n isDraggable && styles.draggable,\n )}\n getRootRef={rootRef}\n >\n <CarouselViewPort\n slideWidth={slideWidth}\n slideTestId={slideTestId}\n onStart={onStart}\n onMoveX={onMoveX}\n onEnd={onEnd}\n getRootRef={viewportRef}\n layerRef={layerRef}\n setSlideRef={setSlideRef}\n >\n {children}\n </CarouselViewPort>\n\n {bullets && (\n <Bullets\n bullets={bullets}\n slideIndex={slideIndex}\n count={React.Children.count(children)}\n bulletTestId={bulletTestId}\n />\n )}\n <ScrollArrows\n hasPointer={hasPointer}\n canSlideLeft={canSlideLeft}\n canSlideRight={canSlideRight}\n onSlideRight={slideRight}\n onSlideLeft={slideLeft}\n showArrows={showArrows}\n arrowSize={arrowSize}\n arrowAreaHeight={arrowAreaHeight}\n prevArrowTestId={prevArrowTestId}\n nextArrowTestId={nextArrowTestId}\n />\n </RootComponent>\n );\n};\n"],"names":["React","classNames","useAdaptivityHasPointer","useExternRef","useMutationObserver","useResizeObserver","useDOM","useIsomorphicLayoutEffect","warnOnce","RootComponent","Bullets","CarouselViewPort","ScrollArrows","ANIMATION_DURATION","CONTROL_ELEMENTS_STATE","SLIDE_THRESHOLD","SLIDES_MANAGER_STATE","calcMax","calcMin","calculateIndent","getLoopPoints","getTargetIndex","useSlideAnimation","warn","CarouselBase","bullets","getRootRef","children","slideWidth","slideIndex","dragDisabled","resizeSource","onDragStart","onDragEnd","onChange","onPrevClick","onNextClick","align","showArrows","getRef","arrowSize","arrowAreaHeight","slideTestId","bulletTestId","nextArrowTestId","prevArrowTestId","looped","restProps","slidesStore","useRef","slidesManager","rootRef","viewportRef","layerRef","animationFrameRef","shiftXCurrentRef","shiftXDeltaRef","initialized","addToAnimationQueue","getAnimateFunction","startAnimation","isDragging","controlElementsState","setControlElementsState","useState","hasPointer","isCenterAlign","calculateDragIndent","localMax","current","max","localMin","min","indent","Number","calculateCanSlideLeft","isFullyVisible","calculateCanSlideRight","containerWidth","layerWidth","slides","length","transformCssStyles","shiftX","animation","Math","round","loopPoints","forEach","loopPoint","target","index","slide","style","transform","Object","values","transition","requestTransform","snaps","contentSize","cancelAnimationFrame","requestAnimationFrame","lastPoint","width","coordX","abs","initializeSlides","localSlides","Children","map","_item","i","elem","offsetLeft","offsetWidth","viewportOffsetWidth","reduce","val","process","env","NODE_ENV","remainingWidth","currentSlideOffsetOnCenterAlignment","onlyOneSlide","_","canSlideLeft","canSlideRight","isDraggable","onResize","window","loopedSlideChangePerform","startPoint","distance","progress","direction","simpleSlideChangePerform","endPoint","performSlideChange","v","updateIsDraggable","calculateMinDeltaXToSlide","slideLeft","event","slideRight","onStart","e","originalEvent","stopPropagation","onMoveX","preventDefault","isSlideX","onEnd","targetIndex","isSlide","currentShiftX","currentShiftXDelta","initialShiftX","setSlideRef","slideRef","baseClassName","count","onSlideRight","onSlideLeft"],"mappings":"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"}
|
|
@@ -9,11 +9,18 @@ export declare function getShiftedIndexes(direction: 1 | -1, slides: GallerySlid
|
|
|
9
9
|
* Вычисляем "ключевые" точки, на которых должно происходить смещение слайдов
|
|
10
10
|
*/
|
|
11
11
|
export declare function getLoopPoints(slidesManager: SlidesManagerState, containerWidth: number): LoopPoint[];
|
|
12
|
-
export declare function getTargetIndex(slides
|
|
12
|
+
export declare function getTargetIndex({ slides, slideIndex, currentShiftX, currentShiftXDelta, looped, max, }: {
|
|
13
|
+
slides: GallerySlidesState[];
|
|
14
|
+
slideIndex: number;
|
|
15
|
+
currentShiftX: number;
|
|
16
|
+
currentShiftXDelta: number;
|
|
17
|
+
looped: boolean;
|
|
18
|
+
max?: number | null;
|
|
19
|
+
}): number;
|
|
13
20
|
interface CalcMin extends Partial<LayoutState> {
|
|
14
21
|
align: AlignType;
|
|
15
22
|
}
|
|
16
|
-
export declare const calcMin: ({ containerWidth, layerWidth, slides, viewportOffsetWidth, align, }: CalcMin) => number;
|
|
23
|
+
export declare const calcMin: ({ containerWidth, layerWidth, slides, viewportOffsetWidth, isFullyVisible, align, }: CalcMin) => number;
|
|
17
24
|
interface CalcMax extends Partial<LayoutState> {
|
|
18
25
|
isCenterAlign: boolean;
|
|
19
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/components/CarouselBase/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAC;AAkBjB,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,kBAAkB,EACjC,QAAQ,EAAE,OAAO,EACjB,MAAM,UAAQ,GACb,MAAM,CAkBR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,EACjB,MAAM,EAAE,kBAAkB,EAAE,EAC5B,cAAc,EAAE,MAAM,GACrB,MAAM,EAAE,CAoBV;AA4BD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,kBAAkB,EACjC,cAAc,EAAE,MAAM,GACrB,SAAS,EAAE,CASb;AAKD,wBAAgB,cAAc,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/components/CarouselBase/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAC;AAkBjB,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,kBAAkB,EACjC,QAAQ,EAAE,OAAO,EACjB,MAAM,UAAQ,GACb,MAAM,CAkBR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,EACjB,MAAM,EAAE,kBAAkB,EAAE,EAC5B,cAAc,EAAE,MAAM,GACrB,MAAM,EAAE,CAoBV;AA4BD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,kBAAkB,EACjC,cAAc,EAAE,MAAM,GACrB,SAAS,EAAE,CASb;AAKD,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,MAAc,EACd,GAAU,GACX,EAAE;IACD,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,GAAG,MAAM,CA+BT;AAED,UAAU,OAAQ,SAAQ,OAAO,CAAC,WAAW,CAAC;IAC5C,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,eAAO,MAAM,OAAO,wFAOjB,OAAO,KAAG,MAkBZ,CAAC;AAEF,UAAU,OAAQ,SAAQ,OAAO,CAAC,WAAW,CAAC;IAC5C,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,OAAO,8CAAwD,OAAO,KAAG,MAMrF,CAAC"}
|
|
@@ -14,7 +14,7 @@ const validateIndent = (slidesManager, value)=>{
|
|
|
14
14
|
/*
|
|
15
15
|
* Считает отступ слоя галереи
|
|
16
16
|
*/ export function calculateIndent(targetIndex, slidesManager, isCenter, looped = false) {
|
|
17
|
-
if (
|
|
17
|
+
if (!slidesManager.slides.length) {
|
|
18
18
|
return 0;
|
|
19
19
|
}
|
|
20
20
|
const targetSlide = slidesManager.slides[targetIndex];
|
|
@@ -73,8 +73,8 @@ function calculateLoopPoints(indexes, edge, slidesManager, containerWidth) {
|
|
|
73
73
|
}
|
|
74
74
|
/*
|
|
75
75
|
* Получает индекс слайда, к которому будет осуществлен переход
|
|
76
|
-
*/ export function getTargetIndex(slides, slideIndex, currentShiftX, currentShiftXDelta, looped = false) {
|
|
77
|
-
const shift = currentShiftX + currentShiftXDelta;
|
|
76
|
+
*/ export function getTargetIndex({ slides, slideIndex, currentShiftX, currentShiftXDelta, looped = false, max = null }) {
|
|
77
|
+
const shift = currentShiftX + currentShiftXDelta - (max !== null && max !== void 0 ? max : 0);
|
|
78
78
|
const direction = currentShiftXDelta < 0 ? 1 : -1;
|
|
79
79
|
// Находим ближайшую границу слайда к текущему отступу
|
|
80
80
|
let targetIndex = slides.reduce((val, item, index)=>{
|
|
@@ -97,11 +97,17 @@ function calculateLoopPoints(indexes, edge, slidesManager, containerWidth) {
|
|
|
97
97
|
}
|
|
98
98
|
return targetIndex;
|
|
99
99
|
}
|
|
100
|
-
export const calcMin = ({ containerWidth = 0, layerWidth = 0, slides = [], viewportOffsetWidth = 0, align })=>{
|
|
100
|
+
export const calcMin = ({ containerWidth = 0, layerWidth = 0, slides = [], viewportOffsetWidth = 0, isFullyVisible, align })=>{
|
|
101
101
|
switch(align){
|
|
102
102
|
case 'left':
|
|
103
|
+
if (isFullyVisible) {
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
103
106
|
return containerWidth - layerWidth;
|
|
104
107
|
case 'right':
|
|
108
|
+
if (isFullyVisible) {
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
105
111
|
return viewportOffsetWidth - layerWidth;
|
|
106
112
|
case 'center':
|
|
107
113
|
const { coordX, width } = slides[slides.length - 1];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/CarouselBase/helpers.ts"],"sourcesContent":["import { type AlignType } from '../../types';\nimport { SLIDE_THRESHOLD } from './constants';\nimport {\n type GallerySlidesState,\n type LayoutState,\n type LoopPoint,\n type SlidesManagerState,\n} from './types';\n\nconst validateIndent = (slidesManager: SlidesManagerState, value: number) => {\n const localMax = slidesManager.max ?? 0;\n const localMin = slidesManager.min ?? 0;\n\n if (value < localMin) {\n return localMin;\n } else if (value > localMax) {\n return localMax;\n }\n\n return value;\n};\n\n/*\n * Считает отступ слоя галереи\n */\nexport function calculateIndent(\n targetIndex: number,\n slidesManager: SlidesManagerState,\n isCenter: boolean,\n looped = false,\n): number {\n if (slidesManager.isFullyVisible || !slidesManager.slides.length) {\n return 0;\n }\n\n const targetSlide = slidesManager.slides[targetIndex];\n\n if (targetSlide) {\n const { coordX, width } = targetSlide;\n\n if (isCenter) {\n return slidesManager.containerWidth / 2 - coordX - width / 2;\n }\n const indent = -1 * coordX;\n return looped ? indent : validateIndent(slidesManager, indent);\n }\n\n return 0;\n}\n\n/**\n * Вычисляем индексы слайдов, которые необходимо смещать\n */\nexport function getShiftedIndexes(\n direction: 1 | -1,\n slides: GallerySlidesState[],\n availableWidth: number,\n): number[] {\n let gap = availableWidth;\n const shiftedSlideIndexes = [];\n const startIndex = direction === 1 ? 0 : slides.length - 1;\n const endIndex = direction === 1 ? slides.length - 1 : 0;\n\n for (\n let i = startIndex;\n (direction === 1 ? i <= endIndex : i >= endIndex) && gap > 0;\n i += direction\n ) {\n const slideWidth = slides[i].width;\n\n if (gap > 0) {\n shiftedSlideIndexes.push(i);\n }\n gap -= slideWidth;\n }\n\n return shiftedSlideIndexes;\n}\n\nfunction calculateLoopPoints(\n indexes: number[],\n edge: 'start' | 'end',\n slidesManager: SlidesManagerState,\n containerWidth: number,\n): LoopPoint[] {\n const { contentSize, slides, snaps } = slidesManager;\n const isStartEdge = edge === 'start';\n const offset = isStartEdge ? -contentSize : contentSize;\n\n return indexes.map((index) => {\n const initial = isStartEdge ? 0 : -contentSize;\n const altered = isStartEdge ? contentSize : 0;\n const loopPoint = isStartEdge\n ? snaps[index] + containerWidth + offset\n : snaps[index] - slides[index].width + offset - snaps[0];\n\n return {\n index,\n target: (currentLocation) => {\n return currentLocation >= loopPoint ? initial : altered;\n },\n };\n });\n}\n\n/**\n * Вычисляем \"ключевые\" точки, на которых должно происходить смещение слайдов\n */\nexport function getLoopPoints(\n slidesManager: SlidesManagerState,\n containerWidth: number,\n): LoopPoint[] {\n const { slides, snaps } = slidesManager;\n const startShiftedIndexes = getShiftedIndexes(-1, slides, snaps[0]);\n const endShiftedIndexes = getShiftedIndexes(1, slides, containerWidth - snaps[0]);\n\n return [\n ...calculateLoopPoints(endShiftedIndexes, 'start', slidesManager, containerWidth),\n ...calculateLoopPoints(startShiftedIndexes, 'end', slidesManager, containerWidth),\n ];\n}\n\n/*\n * Получает индекс слайда, к которому будет осуществлен переход\n */\nexport function getTargetIndex(\n slides: GallerySlidesState[],\n slideIndex: number,\n currentShiftX: number,\n currentShiftXDelta: number,\n looped = false,\n): number {\n const shift = currentShiftX + currentShiftXDelta;\n const direction = currentShiftXDelta < 0 ? 1 : -1;\n\n // Находим ближайшую границу слайда к текущему отступу\n let targetIndex = slides.reduce((val: number, item: GallerySlidesState, index: number) => {\n const previousValue = Math.abs(slides[val].coordX + shift);\n const currentValue = Math.abs(item.coordX + shift);\n\n return previousValue < currentValue ? val : index;\n }, slideIndex);\n\n if (targetIndex === slideIndex) {\n let targetSlide = slideIndex + direction;\n\n if (targetSlide >= 0 && targetSlide < slides.length) {\n if (Math.abs(currentShiftXDelta) > slides[targetSlide].width * SLIDE_THRESHOLD) {\n return targetSlide;\n }\n return targetIndex;\n }\n if (!looped) {\n return direction < 0 ? Math.max(targetIndex, 0) : Math.min(targetIndex, slides.length - 1);\n }\n\n return direction < 0\n ? (targetSlide + slides.length) % slides.length\n : targetSlide % slides.length;\n }\n\n return targetIndex;\n}\n\ninterface CalcMin extends Partial<LayoutState> {\n align: AlignType;\n}\n\nexport const calcMin = ({\n containerWidth = 0,\n layerWidth = 0,\n slides = [],\n viewportOffsetWidth = 0,\n align,\n}: CalcMin): number => {\n switch (align) {\n case 'left':\n return containerWidth - layerWidth;\n case 'right':\n return viewportOffsetWidth - layerWidth;\n case 'center':\n const { coordX, width } = slides[slides.length - 1];\n return containerWidth / 2 - coordX - width / 2;\n default:\n throw new Error(`unknown align ${align}`);\n }\n};\n\ninterface CalcMax extends Partial<LayoutState> {\n isCenterAlign: boolean;\n}\n\nexport const calcMax = ({ slides = [], containerWidth = 0, isCenterAlign }: CalcMax): number => {\n if (isCenterAlign && slides.length) {\n const { width, coordX } = slides[0];\n return containerWidth / 2 - coordX - width / 2;\n }\n return 0;\n};\n"],"names":["SLIDE_THRESHOLD","validateIndent","slidesManager","value","localMax","max","localMin","min","calculateIndent","targetIndex","isCenter","looped","isFullyVisible","slides","length","targetSlide","coordX","width","containerWidth","indent","getShiftedIndexes","direction","availableWidth","gap","shiftedSlideIndexes","startIndex","endIndex","i","slideWidth","push","calculateLoopPoints","indexes","edge","contentSize","snaps","isStartEdge","offset","map","index","initial","altered","loopPoint","target","currentLocation","getLoopPoints","startShiftedIndexes","endShiftedIndexes","getTargetIndex","slideIndex","currentShiftX","currentShiftXDelta","shift","reduce","val","item","previousValue","Math","abs","currentValue","calcMin","layerWidth","viewportOffsetWidth","align","Error","calcMax","isCenterAlign"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/CarouselBase/helpers.ts"],"sourcesContent":["import { type AlignType } from '../../types';\nimport { SLIDE_THRESHOLD } from './constants';\nimport {\n type GallerySlidesState,\n type LayoutState,\n type LoopPoint,\n type SlidesManagerState,\n} from './types';\n\nconst validateIndent = (slidesManager: SlidesManagerState, value: number) => {\n const localMax = slidesManager.max ?? 0;\n const localMin = slidesManager.min ?? 0;\n\n if (value < localMin) {\n return localMin;\n } else if (value > localMax) {\n return localMax;\n }\n\n return value;\n};\n\n/*\n * Считает отступ слоя галереи\n */\nexport function calculateIndent(\n targetIndex: number,\n slidesManager: SlidesManagerState,\n isCenter: boolean,\n looped = false,\n): number {\n if (!slidesManager.slides.length) {\n return 0;\n }\n\n const targetSlide = slidesManager.slides[targetIndex];\n\n if (targetSlide) {\n const { coordX, width } = targetSlide;\n\n if (isCenter) {\n return slidesManager.containerWidth / 2 - coordX - width / 2;\n }\n const indent = -1 * coordX;\n return looped ? indent : validateIndent(slidesManager, indent);\n }\n\n return 0;\n}\n\n/**\n * Вычисляем индексы слайдов, которые необходимо смещать\n */\nexport function getShiftedIndexes(\n direction: 1 | -1,\n slides: GallerySlidesState[],\n availableWidth: number,\n): number[] {\n let gap = availableWidth;\n const shiftedSlideIndexes = [];\n const startIndex = direction === 1 ? 0 : slides.length - 1;\n const endIndex = direction === 1 ? slides.length - 1 : 0;\n\n for (\n let i = startIndex;\n (direction === 1 ? i <= endIndex : i >= endIndex) && gap > 0;\n i += direction\n ) {\n const slideWidth = slides[i].width;\n\n if (gap > 0) {\n shiftedSlideIndexes.push(i);\n }\n gap -= slideWidth;\n }\n\n return shiftedSlideIndexes;\n}\n\nfunction calculateLoopPoints(\n indexes: number[],\n edge: 'start' | 'end',\n slidesManager: SlidesManagerState,\n containerWidth: number,\n): LoopPoint[] {\n const { contentSize, slides, snaps } = slidesManager;\n const isStartEdge = edge === 'start';\n const offset = isStartEdge ? -contentSize : contentSize;\n\n return indexes.map((index) => {\n const initial = isStartEdge ? 0 : -contentSize;\n const altered = isStartEdge ? contentSize : 0;\n const loopPoint = isStartEdge\n ? snaps[index] + containerWidth + offset\n : snaps[index] - slides[index].width + offset - snaps[0];\n\n return {\n index,\n target: (currentLocation) => {\n return currentLocation >= loopPoint ? initial : altered;\n },\n };\n });\n}\n\n/**\n * Вычисляем \"ключевые\" точки, на которых должно происходить смещение слайдов\n */\nexport function getLoopPoints(\n slidesManager: SlidesManagerState,\n containerWidth: number,\n): LoopPoint[] {\n const { slides, snaps } = slidesManager;\n const startShiftedIndexes = getShiftedIndexes(-1, slides, snaps[0]);\n const endShiftedIndexes = getShiftedIndexes(1, slides, containerWidth - snaps[0]);\n\n return [\n ...calculateLoopPoints(endShiftedIndexes, 'start', slidesManager, containerWidth),\n ...calculateLoopPoints(startShiftedIndexes, 'end', slidesManager, containerWidth),\n ];\n}\n\n/*\n * Получает индекс слайда, к которому будет осуществлен переход\n */\nexport function getTargetIndex({\n slides,\n slideIndex,\n currentShiftX,\n currentShiftXDelta,\n looped = false,\n max = null,\n}: {\n slides: GallerySlidesState[];\n slideIndex: number;\n currentShiftX: number;\n currentShiftXDelta: number;\n looped: boolean;\n max?: number | null;\n}): number {\n const shift = currentShiftX + currentShiftXDelta - (max ?? 0);\n const direction = currentShiftXDelta < 0 ? 1 : -1;\n\n // Находим ближайшую границу слайда к текущему отступу\n let targetIndex = slides.reduce((val: number, item: GallerySlidesState, index: number) => {\n const previousValue = Math.abs(slides[val].coordX + shift);\n const currentValue = Math.abs(item.coordX + shift);\n\n return previousValue < currentValue ? val : index;\n }, slideIndex);\n\n if (targetIndex === slideIndex) {\n let targetSlide = slideIndex + direction;\n\n if (targetSlide >= 0 && targetSlide < slides.length) {\n if (Math.abs(currentShiftXDelta) > slides[targetSlide].width * SLIDE_THRESHOLD) {\n return targetSlide;\n }\n return targetIndex;\n }\n if (!looped) {\n return direction < 0 ? Math.max(targetIndex, 0) : Math.min(targetIndex, slides.length - 1);\n }\n\n return direction < 0\n ? (targetSlide + slides.length) % slides.length\n : targetSlide % slides.length;\n }\n\n return targetIndex;\n}\n\ninterface CalcMin extends Partial<LayoutState> {\n align: AlignType;\n}\n\nexport const calcMin = ({\n containerWidth = 0,\n layerWidth = 0,\n slides = [],\n viewportOffsetWidth = 0,\n isFullyVisible,\n align,\n}: CalcMin): number => {\n switch (align) {\n case 'left':\n if (isFullyVisible) {\n return 0;\n }\n return containerWidth - layerWidth;\n case 'right':\n if (isFullyVisible) {\n return 0;\n }\n return viewportOffsetWidth - layerWidth;\n case 'center':\n const { coordX, width } = slides[slides.length - 1];\n return containerWidth / 2 - coordX - width / 2;\n default:\n throw new Error(`unknown align ${align}`);\n }\n};\n\ninterface CalcMax extends Partial<LayoutState> {\n isCenterAlign: boolean;\n}\n\nexport const calcMax = ({ slides = [], containerWidth = 0, isCenterAlign }: CalcMax): number => {\n if (isCenterAlign && slides.length) {\n const { width, coordX } = slides[0];\n return containerWidth / 2 - coordX - width / 2;\n }\n return 0;\n};\n"],"names":["SLIDE_THRESHOLD","validateIndent","slidesManager","value","localMax","max","localMin","min","calculateIndent","targetIndex","isCenter","looped","slides","length","targetSlide","coordX","width","containerWidth","indent","getShiftedIndexes","direction","availableWidth","gap","shiftedSlideIndexes","startIndex","endIndex","i","slideWidth","push","calculateLoopPoints","indexes","edge","contentSize","snaps","isStartEdge","offset","map","index","initial","altered","loopPoint","target","currentLocation","getLoopPoints","startShiftedIndexes","endShiftedIndexes","getTargetIndex","slideIndex","currentShiftX","currentShiftXDelta","shift","reduce","val","item","previousValue","Math","abs","currentValue","calcMin","layerWidth","viewportOffsetWidth","isFullyVisible","align","Error","calcMax","isCenterAlign"],"mappings":"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"}
|
|
@@ -63,6 +63,10 @@ export interface ImageBaseProps extends React.ImgHTMLAttributes<HTMLElement>, An
|
|
|
63
63
|
* Для корректной работы необходимо задать размеры хотя бы одной стороны картинки
|
|
64
64
|
*/
|
|
65
65
|
keepAspectRatio?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* см. https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/elementtiming
|
|
68
|
+
*/
|
|
69
|
+
elementTiming?: string;
|
|
66
70
|
}
|
|
67
71
|
/**
|
|
68
72
|
* @see https://vkcom.github.io/VKUI/#/ImageBase
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageBase.d.ts","sourceRoot":"","sources":["../../../src/components/ImageBase/ImageBase.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EACV,wBAAwB,EAExB,MAAM,EACN,UAAU,EACV,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,qBAAqB,EACrB,KAAK,0BAA0B,EAChC,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIhG,YAAY,EACV,aAAa,EACb,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,GACxB,CAAC;AAEF,OAAO,EACL,+BAA+B,EAC/B,kCAAkC,EAClC,iCAAiC,GAClC,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAO5B,MAAM,WAAW,cACf,SAAQ,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAC1C,wBAAwB,EACxB,UAAU,CAAC,cAAc,CAAC,EAC1B,MAAM,CAAC,gBAAgB,CAAC;IAC1B;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC3C;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;IAC9D;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC7C;;;OAGG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACvD;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageBase.d.ts","sourceRoot":"","sources":["../../../src/components/ImageBase/ImageBase.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EACV,wBAAwB,EAExB,MAAM,EACN,UAAU,EACV,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,qBAAqB,EACrB,KAAK,0BAA0B,EAChC,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIhG,YAAY,EACV,aAAa,EACb,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,GACxB,CAAC;AAEF,OAAO,EACL,+BAA+B,EAC/B,kCAAkC,EAClC,iCAAiC,GAClC,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAO5B,MAAM,WAAW,cACf,SAAQ,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAC1C,wBAAwB,EACxB,UAAU,CAAC,cAAc,CAAC,EAC1B,MAAM,CAAC,gBAAgB,CAAC;IAC1B;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC3C;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;IAC9D;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC7C;;;OAGG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACvD;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA8BD;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG;IACjD,KAAK,EAAE,OAAO,cAAc,CAAC;IAC7B,OAAO,EAAE,OAAO,gBAAgB,CAAC;IACjC,YAAY,EAAE,OAAO,qBAAqB,CAAC;CAsK5C,CAAC"}
|
|
@@ -49,7 +49,7 @@ const sizeToNumber = (size)=>{
|
|
|
49
49
|
/**
|
|
50
50
|
* @see https://vkcom.github.io/VKUI/#/ImageBase
|
|
51
51
|
*/ export const ImageBase = (_param)=>{
|
|
52
|
-
var { alt, crossOrigin, decoding, loading, referrerPolicy, sizes, src, srcSet, useMap, fetchPriority, getRef, size: sizeProp, width: widthImg, height: heightImg, widthSize, heightSize, noBorder = false, fallbackIcon: fallbackIconProp, children, onLoad, onError, withTransparentBackground, objectFit = 'cover', objectPosition, keepAspectRatio = false, getRootRef } = _param, restProps = _object_without_properties(_param, [
|
|
52
|
+
var { alt, crossOrigin, decoding, loading, referrerPolicy, sizes, src, srcSet, useMap, fetchPriority, getRef, size: sizeProp, width: widthImg, height: heightImg, widthSize, heightSize, noBorder = false, fallbackIcon: fallbackIconProp, children, onLoad, onError, withTransparentBackground, objectFit = 'cover', objectPosition, keepAspectRatio = false, getRootRef, elementTiming } = _param, restProps = _object_without_properties(_param, [
|
|
53
53
|
"alt",
|
|
54
54
|
"crossOrigin",
|
|
55
55
|
"decoding",
|
|
@@ -75,7 +75,8 @@ const sizeToNumber = (size)=>{
|
|
|
75
75
|
"objectFit",
|
|
76
76
|
"objectPosition",
|
|
77
77
|
"keepAspectRatio",
|
|
78
|
-
"getRootRef"
|
|
78
|
+
"getRootRef",
|
|
79
|
+
"elementTiming"
|
|
79
80
|
]);
|
|
80
81
|
const size = sizeProp !== null && sizeProp !== void 0 ? sizeProp : minOr([
|
|
81
82
|
sizeToNumber(widthSize),
|
|
@@ -177,7 +178,9 @@ const sizeToNumber = (size)=>{
|
|
|
177
178
|
width: widthImg,
|
|
178
179
|
height: heightImg,
|
|
179
180
|
onLoad: handleImageLoad,
|
|
180
|
-
onError: handleImageError
|
|
181
|
+
onError: handleImageError,
|
|
182
|
+
// @ts-expect-error: TS2322 отсутствует в @types/react
|
|
183
|
+
elementtiming: elementTiming
|
|
181
184
|
}, getFetchPriorityProp(fetchPriority))),
|
|
182
185
|
fallbackIcon && /*#__PURE__*/ _jsx("div", {
|
|
183
186
|
className: "vkuiImageBase__fallback",
|