{"version":3,"file":"coopse.script.1678.bb671aca.chunk.js","mappings":"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","sources":["webpack:///./src/microApps/common/components/ListBlock/ListBlock.module.less","webpack:///./src/microApps/common/components/Heading/Heading.module.less","webpack:///./src/microApps/common/components/Heading/Heading.tsx","webpack:///./src/microApps/common/components/ListBlock/ListBlock.utils.ts","webpack:///./src/microApps/common/components/ListBlock/ListBlock.hooks.ts","webpack:///./src/microApps/common/hooks/useInViewWithPrerender.ts","webpack:///./src/microApps/ecommerce/components/ItemGrid/ItemGridWithLoading.tsx","webpack:///./src/microApps/common/components/ListBlock/ListBlock.tsx","webpack:///./src/microApps/common/hooks/useGaListPositionCalculation.ts","webpack:///./src/microApps/common/components/SwipableList/SwipableList.tsx","webpack:///./src/microApps/common/hooks/useA11yAnnouncerDispatch.ts","webpack:///./src/microApps/common/components/atoms/RawPicture/RawPicture.tsx","webpack:///./src/microApps/common/components/atoms/RawPicture/RawPicture.module.less","webpack:///./src/microApps/common/components/organisms/ImageTextPropertyBlock/ImageTextPropertyBlock.module.scss","webpack:///./src/microApps/common/components/organisms/ImageTextPropertyBlock/ImageTextPropertyBlock.tsx","webpack:///./src/microApps/common/tracking/hooks/usePromotionTracking.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"WithBackgroundMixin\":\"b65Amywg\",\"Container\":\"WDsaDiRu\",\"Background--light1Green2\":\"W3bm0CoR\",\"Background--light1Green3\":\"Yx1KyJ9k\",\"Background--light1Green4\":\"j6LYvUjx\",\"SwiperContainer\":\"OCD_W3n9\",\"Banner\":\"GbEqA3cO\",\"GridBanner\":\"CV3g0Mw5\",\"ListContainer\":\"cLfu9QdN\",\"WithBanner\":\"zJ7EaBlZ\",\"Swiper\":\"Cly_TVWq\",\"SwiperPagination\":\"_SDu9HmR\",\"HeaderContainer\":\"Fz59m8zD\",\"Header\":\"y6lOtOf1\",\"Link\":\"c4WCyKHO\",\"BannerCell1of1\":\"M6gHKoNb\",\"BannerCell2of2\":\"ncyp1nr0\",\"BannerCell2of3\":\"sEGu_rWG\",\"BannerCell2of4\":\"YlXeup8u\",\"BannerCell2of5\":\"RLaVsKyL\",\"BannerCell2of6\":\"TloHg7FQ\",\"BannerCell3of7\":\"ZV6tHixn\",\"BannerCell3of8\":\"mHBC5kOY\"};","// extracted by mini-css-extract-plugin\nexport default {\"Heading\":\"E17FI2IV\",\"Heading--coopGreen\":\"JZ_2qqd6\",\"Heading--darkGreen\":\"htkN9xWM\",\"Heading--white\":\"y1M7QAC6\",\"Heading--black\":\"K8xICLcl\",\"Heading--colorGreen2\":\"wUVrHEa9\",\"FontFamilySecondary\":\"CO0BQ7N3\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useEffect } from 'react';\n\nimport styles from './Heading.module.less';\n\ninterface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {\n element: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p';\n stylingElement?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n fontFamilySecondary?: boolean;\n color?: 'coopGreen' | 'darkGreen' | 'white' | 'black' | 'colorGreen2';\n alignment?: 'start' | 'center' | 'end';\n}\n\nconst Heading = React.forwardRef<HTMLHeadingElement, React.PropsWithChildren<HeadingProps>>(\n (props, ref) => {\n if (!props.children) return null;\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n const { fontFamilySecondary, stylingElement, element, className, alignment, ...rest } =\n props;\n\n const alignStyles: React.CSSProperties = {\n width: '100%',\n };\n switch (alignment) {\n case 'start': {\n alignStyles.textAlign = 'left';\n break;\n }\n case 'end': {\n alignStyles.textAlign = 'right';\n break;\n }\n case 'center':\n default: {\n alignStyles.textAlign = 'center';\n break;\n }\n }\n return (\n <props.element\n ref={ref}\n className={classNames(\n styles.Heading,\n stylingElement && `Heading--${stylingElement}`,\n props.color ? styles[`Heading--${props.color}`] : styles['Heading--black'],\n fontFamilySecondary && styles.FontFamilySecondary,\n className,\n )}\n style={{\n ...rest.style,\n ...alignStyles,\n }}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...rest}\n >\n {props.children}\n </props.element>\n );\n },\n);\n\ninterface PageHeadingProps extends Omit<HeadingProps, 'element'> {\n visuallyHidden?: boolean;\n}\n\nexport const PageHeading = React.forwardRef<\n HTMLHeadingElement,\n React.PropsWithChildren<PageHeadingProps>\n>((props, ref) => {\n // The effect simulates what browsers do on a normal non-SPA apps - they reloading a page and set focus to the top of the page (body).\n useEffect(() => {\n document.body.focus();\n }, []);\n\n return (\n <Heading\n ref={ref}\n element=\"h1\"\n tabIndex={-1}\n stylingElement={props.stylingElement}\n fontFamilySecondary={props.fontFamilySecondary}\n className={classNames(props.className, props.visuallyHidden && 'u-hiddenVisually')}\n color={props.color}\n >\n {props.children}\n </Heading>\n );\n});\n\nexport default Heading;\n","export const getBannerSize = (cellsInRow: number) => {\n let x = 1;\n\n switch (cellsInRow) {\n case 1:\n x = 1;\n break;\n case 2:\n x = 2;\n break;\n case 3:\n x = 2;\n break;\n case 4:\n x = 2;\n break;\n case 5:\n x = 2;\n break;\n case 6:\n x = 2;\n break;\n case 7:\n x = 3;\n break;\n case 8:\n x = 3;\n break;\n default:\n break;\n }\n\n return x;\n};\n","import { useInViewWithPrerender } from '../../hooks/useInViewWithPrerender';\nimport { useBrowserMinMediaQuery } from '../atoms/ResponsiveBreakpoints';\nimport styles from './ListBlock.module.less';\nimport { getBannerSize } from './ListBlock.utils';\n\nexport const useListBlockLazyLoading = (lazyLoad: boolean = true) => {\n const inView = useInViewWithPrerender({\n triggerOnce: true,\n threshold: 0,\n rootMargin: '50px',\n initialInView: !lazyLoad,\n });\n\n return inView;\n};\n\nexport const useGridBannerSize = (cellsInRow: number) => {\n const isMoreThan900px = useBrowserMinMediaQuery(900);\n const bannerCellSize = getBannerSize(cellsInRow);\n\n if (cellsInRow === 3 && !isMoreThan900px) {\n return styles[`BannerCell${3}of${cellsInRow}`];\n }\n\n return styles[`BannerCell${bannerCellSize}of${cellsInRow}`];\n};\n","import { useInView } from 'react-intersection-observer';\n\nexport const useInViewWithPrerender = (options: Parameters<typeof useInView>[0]) => {\n const inView = useInView({\n ...options,\n initialInView: (options && options.initialInView) || window.isPrerenderCrawler,\n });\n\n return inView;\n};\n","import classnames from 'classnames';\nimport * as React from 'react';\n\nimport ItemGrid from './ItemGrid';\n\ntype ItemGridWithLoadingProps<T> = {\n horizontalHidden: boolean;\n isLoading: boolean;\n skeletonCount?: number;\n renderSkeleton?: () => React.ReactNode;\n} & React.ComponentPropsWithoutRef<typeof ItemGrid<T>>;\n\nconst ItemGridWithLoading = <T,>(\n props: ItemGridWithLoadingProps<T>,\n ref?: React.Ref<HTMLUListElement>,\n) => {\n if (!props.isLoading && props.items?.length === 0) return null;\n\n return props.isLoading ? (\n <ItemGrid\n ref={ref}\n cellsInRow={props.cellsInRow}\n gridClasses={classnames(\n props.horizontalHidden && 'Grid--horizontalHidden',\n props.gridClasses,\n )}\n itemUniqueKey={(item, index) => `${item.identifier}_${index}`}\n items={[...Array(props.skeletonCount || props.cellsInRow)].map((x, index) => ({\n identifier: index.toString(),\n }))}\n renderItem={() => (props.renderSkeleton ? props.renderSkeleton() : null)}\n renderAtRowStart={props.renderAtRowStart}\n renderAtRowEnd={props.renderAtRowEnd}\n itemClasses={props.itemClasses}\n noDefaultClasses={props.noDefaultClasses}\n styles={props.styles}\n />\n ) : (\n <ItemGrid\n ref={ref}\n cellsInRow={props.cellsInRow}\n gridClasses={classnames(\n props.horizontalHidden && 'Grid--horizontalHidden',\n props.gridClasses,\n )}\n items={props.items}\n itemUniqueKey={props.itemUniqueKey}\n renderItem={props.renderItem}\n renderAtRowStart={props.renderAtRowStart}\n renderAtRowEnd={props.renderAtRowEnd}\n itemClasses={props.itemClasses}\n noDefaultClasses={props.noDefaultClasses}\n styles={props.styles}\n />\n );\n};\n\nexport default React.forwardRef(ItemGridWithLoading);\n","/* eslint-disable react/jsx-props-no-spreading */\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { useImperativeHandle, useRef } from 'react';\nimport type { SwiperOptions } from 'swiper/types';\n\nimport { SkipLinkScoped } from '../../../base/components/SkipLink';\nimport ItemGridWithLoading from '../../../ecommerce/components/ItemGrid/ItemGridWithLoading';\nimport useGaListPositionCalculation from '../../hooks/useGaListPositionCalculation';\nimport type { ImageTextPropertyBlockProps } from '../organisms/ImageTextPropertyBlock/ImageTextPropertyBlock';\nimport ImageTextPropertyBlock from '../organisms/ImageTextPropertyBlock/ImageTextPropertyBlock';\nimport { SwipableList } from '../SwipableList';\nimport { useGridBannerSize } from './ListBlock.hooks';\nimport styles from './ListBlock.module.less';\n\nexport interface ListBlockProps<T> extends Omit<ListBlockOptions, 'lazyLoad'> {\n headerSlot?: React.ReactNode;\n items?: T[];\n renderItem: (item: T, index: number, listPosition: number | undefined) => React.ReactElement;\n itemUniqueKey: (item: T, index: number) => string;\n isLoading: boolean;\n cellsInRow: number;\n swiperOptions?: SwiperOptions;\n swiperMainClassName?: string;\n gridClasses?: string;\n skeletonCount?: number;\n renderSkeleton: () => React.ReactNode;\n}\n\nexport interface ListBlockOptions {\n analyticsListName: string;\n useSwiper: boolean;\n lazyLoad: boolean;\n horizontalHidden: boolean;\n backgroundColor?:\n | ''\n | 'Background--light1Green2'\n | 'Background--light1Green3'\n | 'Background--light1Green4';\n banner?: ImageTextPropertyBlockProps;\n}\n\nexport interface TeaserOptions {\n disableLink: boolean;\n disableAsyncLink: boolean;\n}\n\nconst ListBlock = React.forwardRef(\n <T, C extends React.ElementType = 'div'>(\n props: React.PolymorphicComponentPropsWithRef<C, ListBlockProps<T>>,\n ref: React.PolymorphicRef<C>,\n ) => {\n const listBlockRef = useRef<React.PolymorphicRef<C>>(null);\n\n const { isLoading, items, itemUniqueKey, renderSkeleton, cellsInRow, skeletonCount } =\n props;\n\n const { listPosition } = useGaListPositionCalculation(listBlockRef);\n\n useImperativeHandle(ref, () => listBlockRef.current);\n\n const renderItem = (product: T, index: number) =>\n props.renderItem(product, index, listPosition);\n\n const swiperOptions: SwiperOptions = {\n spaceBetween: 2,\n ...props.swiperOptions,\n };\n\n const bannerCellSize = useGridBannerSize(cellsInRow);\n\n const Component = props.as || 'div';\n\n return (\n <Component\n aria-labelledby={props['aria-labelledby']}\n role=\"group\"\n ref={listBlockRef}\n className={classnames(\n styles.Container,\n props.backgroundColor && styles[props.backgroundColor],\n )}\n data-list={props.analyticsListName}\n >\n <SkipLinkScoped\n skipLinkText=\"Hoppa över listan\"\n skipTargetText=\"Listan har hoppats över\"\n >\n {(isLoading || !!items?.length) && props.headerSlot}\n {props.useSwiper ? (\n <div\n className={classnames(\n styles.ListContainer,\n props.banner && styles.WithBanner,\n )}\n >\n {props.banner && (\n <div className={styles.Banner}>\n <ImageTextPropertyBlock {...props.banner} />\n </div>\n )}\n <div className={styles.SwiperContainer}>\n <SwipableList\n swiperMainClassName={classnames(\n props.swiperMainClassName,\n styles.Swiper,\n )}\n swiperPaginationClass={props.banner && styles.SwiperPagination}\n swiperOptions={swiperOptions}\n >\n {!items || !items.length\n ? Array.from({ length: 8 }).map((_item, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <React.Fragment key={index}>\n {renderSkeleton()}\n </React.Fragment>\n ))\n : items.map((item, index) => (\n <React.Fragment\n key={props.itemUniqueKey(item, index)}\n >\n {renderItem(item, index)}\n </React.Fragment>\n ))}\n </SwipableList>\n </div>\n </div>\n ) : (\n <ItemGridWithLoading\n renderAtRowStart={(row) => {\n if (row === 0) {\n return (\n props.banner && (\n <div className={`Grid-cell ${bannerCellSize}`}>\n <div\n className={classnames(\n styles.Banner,\n styles.GridBanner,\n )}\n >\n <ImageTextPropertyBlock {...props.banner} />\n </div>\n </div>\n )\n );\n }\n return undefined;\n }}\n isLoading={isLoading}\n items={items}\n itemUniqueKey={itemUniqueKey}\n renderItem={renderItem}\n renderSkeleton={renderSkeleton}\n horizontalHidden={props.horizontalHidden}\n cellsInRow={cellsInRow}\n gridClasses={classnames(props.gridClasses)}\n skeletonCount={skeletonCount}\n />\n )}\n </SkipLinkScoped>\n </Component>\n );\n },\n);\n\nexport default ListBlock;\n","import type React from 'react';\nimport { useLayoutEffect, useState } from 'react';\n\nconst useGaListPositionCalculation = <T extends Element>(ref: React.RefObject<T>) => {\n const [listPosition, setListPosition] = useState<number>();\n\n useLayoutEffect(() => {\n const lists = document.querySelectorAll('[data-list]');\n const position = Array.from(lists).findIndex((el) => el === ref.current);\n setListPosition(position > -1 ? position : undefined);\n }, [ref]);\n\n return {\n listPosition,\n };\n};\n\nexport default useGaListPositionCalculation;\n","/* eslint-disable no-param-reassign */\n/* eslint-disable react/jsx-props-no-spreading */\nimport 'swiper/less';\nimport 'swiper/less/navigation';\nimport 'swiper/less/pagination';\nimport 'swiper/less/scrollbar';\nimport './Swiper.less';\n\nimport { Icon } from '@coop/components';\nimport { ChevronLeftIcon, ChevronRightIcon } from '@coop/icons';\nimport classNames from 'classnames';\nimport type { FC } from 'react';\nimport * as React from 'react';\nimport { useMemo, useRef, useState } from 'react';\nimport { Navigation, Pagination, Scrollbar } from 'swiper/modules';\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport type { NavigationOptions, ScrollbarOptions, SwiperOptions } from 'swiper/types';\n\nimport { useA11yAnnouncerDispatch } from '../../hooks/useA11yAnnouncerDispatch';\nimport { useIsMobile } from '../atoms/ResponsiveBreakpoints';\n\nexport interface SwipableListProps {\n swiperMainClassName?: string;\n swiperButtonClassName?: string;\n swiperPaginationClass?: string;\n swiperOptions?: SwiperOptions;\n onSwiper?: React.ComponentProps<typeof Swiper>['onSwiper'];\n}\n\ninterface NavButtonProps {\n hasScrollbar: boolean;\n class?: string;\n}\n\nconst PrevButton = React.forwardRef<HTMLButtonElement, NavButtonProps>((props, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={classNames(\n 'swiper-button swiper-button--prev',\n props.hasScrollbar && 'swiper-button--scrollbar',\n props.class,\n )}\n aria-label=\"Se tidigare i listan\"\n >\n <Icon icon={ChevronLeftIcon} className=\"swiper-arrow\" aria-hidden />\n </button>\n));\n\nconst NextButton = React.forwardRef<HTMLButtonElement, NavButtonProps>((props, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={classNames(\n 'swiper-button swiper-button--next',\n props.hasScrollbar && 'swiper-button--scrollbar',\n props.class,\n )}\n aria-label=\"Se fler i listan\"\n >\n <Icon icon={ChevronRightIcon} className=\"swiper-arrow\" aria-hidden />\n </button>\n));\n\nconst isScrollbarOptions = (\n scrollbar: boolean | ScrollbarOptions,\n): scrollbar is ScrollbarOptions => {\n return (scrollbar as ScrollbarOptions).el !== undefined;\n};\n\nconst modifySwiperOptions = (customSwiperOptions?: SwiperOptions): SwiperOptions => {\n let scrollbar: boolean | ScrollbarOptions = false;\n\n if (customSwiperOptions && customSwiperOptions.scrollbar) {\n if (!isScrollbarOptions(customSwiperOptions.scrollbar)) {\n scrollbar = {\n el: '.swiper-scrollbar-container',\n draggable: true,\n };\n } else {\n scrollbar = {\n el: '.swiper-scrollbar-container',\n draggable: true,\n ...customSwiperOptions.scrollbar,\n };\n }\n }\n\n return {\n watchSlidesProgress: true,\n ...customSwiperOptions,\n containerModifierClass: classNames('swiper-container--'),\n scrollbar,\n };\n};\n\nconst SwipableList: FC<React.PropsWithChildren<SwipableListProps>> = (props) => {\n const [nextEl, setNextEl] = useState<HTMLButtonElement | null>(null);\n const [prevEl, setPrevEl] = useState<HTMLButtonElement | null>(null);\n const [paginationEl, setPaginationEl] = useState<HTMLDivElement | null>(null);\n\n const focusTimer = useRef<NodeJS.Timeout | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const announce = useA11yAnnouncerDispatch();\n\n // iphone crashes if we have too many items in the swiper\n const MAX_NUMBER_OF_SWIPABLE_ITEMS = 60;\n\n // this is important becase the ref wont change but the value in the ref will. So we need to use the element to trigger useMemo, not the ref\n const swiperOptions: SwiperOptions = useMemo(() => {\n return {\n threshold: 5,\n navigation: {\n ...(props.swiperOptions?.navigation as NavigationOptions),\n disabledClass: 'is-hidden',\n nextEl,\n prevEl,\n },\n pagination: {\n clickable: true,\n el: paginationEl,\n lockClass: 'is-hidden',\n dynamicBullets: true,\n dynamicMainBullets: 5,\n },\n ...modifySwiperOptions(props.swiperOptions),\n };\n }, [nextEl, prevEl, paginationEl, props.swiperOptions]);\n const isMobile = useIsMobile();\n return (\n <>\n <div\n ref={containerRef}\n className={classNames(\n 'swiper',\n props.swiperMainClassName,\n isMobile && 'swiper-disabledNavigation',\n !isMobile && swiperOptions?.watchSlidesProgress && 'swiper-watch',\n )}\n >\n <PrevButton\n class={props.swiperButtonClassName}\n ref={setPrevEl}\n hasScrollbar={!!swiperOptions.scrollbar}\n />\n\n <Swiper\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...swiperOptions}\n modules={[Navigation, Pagination, Scrollbar]}\n onSwiper={props.onSwiper}\n wrapperTag=\"ul\"\n onSlideChange={(swiper) => {\n if (focusTimer.current) {\n clearTimeout(focusTimer.current);\n }\n const setFocus = () => {\n const focusElement = containerRef.current?.querySelector<HTMLElement>(\n '.swiper-slide-active a, .swiper-slide-active button',\n );\n if (focusElement) {\n focusElement.focus();\n }\n };\n\n announce(`Visar sida ${swiper.snapIndex + 1}`);\n /** timeout much match transitiontime which is 400ms */\n focusTimer.current = setTimeout(setFocus, 500);\n }}\n >\n {React.Children.map(\n props.children,\n (child, index) =>\n child &&\n index < MAX_NUMBER_OF_SWIPABLE_ITEMS && (\n <SwiperSlide tag=\"li\">{child}</SwiperSlide>\n ),\n )}\n {swiperOptions.scrollbar && <div className=\"swiper-scrollbar-container\" />}\n </Swiper>\n\n <NextButton\n class={props.swiperButtonClassName}\n ref={setNextEl}\n hasScrollbar={!!swiperOptions.scrollbar}\n />\n </div>\n {swiperOptions.pagination && (\n <div\n ref={setPaginationEl}\n className={classNames('swiper-pagination', props.swiperPaginationClass)}\n />\n )}\n </>\n );\n};\n\nexport default SwipableList;\n","import { useCallback, useEffect } from 'react';\n\nimport { currentPageActions } from '../store/slices/currentPage/currentPageSlice';\nimport { useAppDispatch } from './useThunkDispatch';\n\nexport const useA11yAnnouncerDispatch = () => {\n const dispatch = useAppDispatch();\n\n const a11yAnnounceDispatch = useCallback(\n (value: string) => {\n dispatch(currentPageActions.setA11yAnnounceText(value));\n },\n [dispatch],\n );\n\n return a11yAnnounceDispatch;\n};\n\nexport const useA11yAnnouncerDispatchEffect = (value: string | undefined) => {\n const dispatchA11yAnnouncer = useA11yAnnouncerDispatch();\n\n useEffect(() => {\n if (!value) {\n return;\n }\n\n dispatchA11yAnnouncer(value);\n }, [dispatchA11yAnnouncer, value]);\n};\n","import classNames from 'classnames';\n\nimport styles from './RawPicture.module.less';\n\ntype SourceMedia = {\n minWidth: number;\n height?: number;\n srcSet: string;\n};\n\ninterface RawPictureProps {\n altText?: string;\n src?: string;\n height?: number;\n srcSet?: SourceMedia[];\n imgClassName?: string;\n className?: string;\n lazy?: boolean;\n}\n\n/**\n * Use this component for solving Art Direction problem in the images.\n * As opposed to RawImage component, browser will not download the image it thinks is the best - you tell it which image to download based on the viewport size size.\n */\nconst RawPicture = (props: RawPictureProps) => {\n const srcSet = props.srcSet?.sort((a, b) => b.minWidth - a.minWidth);\n\n return (\n <picture className={classNames(styles.Container, props.className)}>\n {srcSet?.map((item, index) => {\n return (\n <source\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n media={`(min-width: ${item.minWidth}px)`}\n srcSet={item.srcSet}\n height={item.height}\n />\n );\n })}\n <img\n loading={props.lazy ? 'lazy' : undefined}\n className={classNames(styles.Image, props.imgClassName)}\n src={props.src}\n alt={props.altText || ''}\n height={props.height}\n />\n </picture>\n );\n};\n\nexport default RawPicture;\n","// extracted by mini-css-extract-plugin\nexport default {\"Container\":\"J5qjoGvQ\",\"Image\":\"qk0vMZV4\"};","// extracted by mini-css-extract-plugin\nexport default {\"Container\":\"Ypd0HvZh\",\"LinkWrapper\":\"UB_NKnuP\",\"ButtonWrapper\":\"clSqay92\",\"Content\":\"krz_Qx3J\",\"Content--horizontalCenter\":\"qCMRntMQ\",\"Content--verticalCenter\":\"QpI1gwuM\",\"Content--noVerticalCenter\":\"aW1pr0rh\",\"Content--contentLessPadding\":\"hIdzuq5u\",\"Content--contentLessHorizontalPadding\":\"MQ5LaEBg\",\"Image\":\"ZT2h_6Ah\",\"ImageContainer\":\"rZSamSNn\",\"ImageContainer--absolute\":\"FThob5tX\",\"ImageContainer--relative\":\"rX4dLvHh\",\"Image--noExplicitHeight\":\"Sj8KwF9F\",\"Heading\":\"dZ6aR3XU\"};","/* eslint-disable react/jsx-props-no-spreading */\nimport type { Button } from '@coop/components';\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useCallback } from 'react';\n\nimport usePromotionTracking from '../../../tracking/hooks/usePromotionTracking';\nimport type { IGaPromoData } from '../../../tracking/models/IGaPromoData';\nimport RawHtml from '../../atoms/RawHtml';\nimport RawPicture from '../../atoms/RawPicture';\nimport type Heading from '../../Heading';\nimport styles from './ImageTextPropertyBlock.module.scss';\n\nexport interface ImageTextPropertyBlockProps extends IGaPromoData {\n imageUrl?: string;\n imageHeight?: number;\n srcSet?: { srcSet: string; height?: number; minWidth: number }[];\n imageAltText?: string;\n\n centerBlockVertically: boolean;\n centerBlockHorizontally: boolean;\n contentLessPadding: boolean;\n contentLessHorizontalPadding: boolean;\n backgroundColor?:\n | 'u-bgWhite'\n | 'u-bgGreenDark'\n | 'u-bgGreen'\n | 'u-bgGreenLight2'\n | 'u-bgGrayLight';\n linkUrl?: string;\n target: '_self' | '_blank';\n isClickable: boolean;\n body?: string;\n textColor?: string;\n lazy?: boolean;\n ariaLabel: string;\n buttonProps?: React.ComponentPropsWithoutRef<typeof Button>;\n renderButton?: (props: React.ComponentPropsWithoutRef<typeof Button>) => React.ReactNode;\n secondaryButtonProps?: React.ComponentPropsWithoutRef<typeof Button>;\n renderSecondaryButton?: (\n props: React.ComponentPropsWithoutRef<typeof Button>,\n ) => React.ReactNode;\n headingProps?: React.ComponentPropsWithoutRef<typeof Heading>;\n renderHeading?: (props: React.ComponentPropsWithoutRef<typeof Heading>) => React.ReactNode;\n}\n\nconst ImageTextPropertyBlock = (props: ImageTextPropertyBlockProps) => {\n const { ref: trackingRef, click: trackClick } = usePromotionTracking({\n gaPromoCreative: props.gaPromoCreative,\n gaPromoId: props.gaPromoId,\n gaPromoName: props.gaPromoName,\n gaPromoPosition: props.gaPromoPosition,\n });\n\n const ref = useCallback(\n (node: HTMLElement | null) => {\n trackingRef(node);\n },\n [trackingRef],\n );\n\n const anchorRel = props.target?.includes('blank') ? 'noopener noreferrer' : undefined;\n\n // If whole banner is clickable, render is as anchor and dont render the button inside to not have nested interactive elements\n if (props.isClickable) {\n return (\n <a\n ref={ref}\n className={classNames(styles.Container, styles.LinkWrapper, props.backgroundColor)}\n href={props.linkUrl}\n target={props.target}\n rel={anchorRel}\n onClick={trackClick}\n aria-label={props.ariaLabel}\n >\n <Content {...props} />\n </a>\n );\n }\n return (\n <div ref={ref} className={classNames(styles.Container, props.backgroundColor)}>\n <Content\n {...props}\n belowTextSlot={\n !!props.buttonProps &&\n !!props.renderButton && (\n <BottomSlot\n onClick={trackClick}\n centerBlockHorizontally={props.centerBlockHorizontally}\n centerBlockVertically={props.centerBlockVertically}\n buttonProps={props.buttonProps}\n renderButton={props.renderButton}\n secondaryButtonProps={props.secondaryButtonProps}\n renderSecondaryButton={props.renderSecondaryButton}\n />\n )\n }\n />\n </div>\n );\n};\n\nconst Content = (props: ImageTextPropertyBlockProps & { belowTextSlot?: React.ReactNode }) => {\n const bannerPositionClassNames = classNames(\n styles.Content,\n props.centerBlockHorizontally && styles['Content--horizontalCenter'],\n props.centerBlockVertically\n ? styles['Content--verticalCenter']\n : styles['Content--noVerticalCenter'],\n props.contentLessPadding && styles['Content--contentLessPadding'],\n props.contentLessHorizontalPadding && styles['Content--contentLessHorizontalPadding'],\n );\n\n const hasContent =\n !!props.body ||\n React.isValidElement(props.belowTextSlot) ||\n (!!props.headingProps &&\n !!props.renderHeading &&\n React.isValidElement(props.renderHeading(props.headingProps)));\n\n return (\n <>\n {(props.imageUrl || !!props.srcSet?.length) && (\n <RawPicture\n altText={props.imageAltText}\n srcSet={props.srcSet}\n src={props.imageUrl}\n height={props.imageHeight}\n imgClassName={classNames(\n styles.Image,\n !props.imageHeight && styles['Image--noExplicitHeight'],\n )}\n className={classNames(\n styles.ImageContainer,\n hasContent && styles['ImageContainer--absolute'], // if there is any content, it should dictate the height of the block, so make image absolute to be positioned behind the content\n !hasContent && styles['ImageContainer--relative'], // no content - image is dictating the height of the block\n )}\n lazy={props.lazy}\n />\n )}\n {hasContent && (\n <div className={bannerPositionClassNames}>\n <div className=\"u-sizeFull\">\n {!!props.headingProps &&\n !!props.renderHeading &&\n props.renderHeading({\n ...props.headingProps,\n fontFamilySecondary: true,\n alignment: props.centerBlockHorizontally\n ? 'center'\n : props.headingProps.alignment,\n className: classNames(\n props.headingProps.className,\n styles.Heading,\n 'u-marginBsm',\n ),\n })}\n {props.body && (\n <div className={classNames('Editorial', props.textColor)}>\n <RawHtml html={props.body} />\n </div>\n )}\n </div>\n\n {props.belowTextSlot}\n </div>\n )}\n </>\n );\n};\n\nconst BottomSlot = (props: {\n centerBlockHorizontally: boolean;\n centerBlockVertically: boolean;\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n buttonProps: React.ComponentPropsWithoutRef<typeof Button>;\n renderButton: (props: React.ComponentPropsWithoutRef<typeof Button>) => React.ReactNode;\n secondaryButtonProps?: React.ComponentPropsWithoutRef<typeof Button>;\n renderSecondaryButton?: (\n props: React.ComponentPropsWithoutRef<typeof Button>,\n ) => React.ReactNode;\n}) => {\n const bothButtonsExist = props.buttonProps && props.secondaryButtonProps;\n\n const wrapperClassNames = classNames(\n styles.ButtonWrapper,\n bothButtonsExist && props.centerBlockHorizontally && 'u-flexJustifyCenter',\n );\n\n return (\n <div className={wrapperClassNames}>\n {props.renderButton({\n ...props.buttonProps,\n style:\n bothButtonsExist && props.centerBlockHorizontally\n ? {\n ...props.buttonProps.style,\n // when two buttons exist and are centered then they will be aligned not by themselves, but by the parent component\n margin: 0,\n }\n : props.buttonProps.style,\n onClick: (e) => {\n props.onClick?.(e);\n props.buttonProps?.onClick?.(e);\n },\n })}\n {/* Secondary is rendered only if primary already exists */}\n {!!props.buttonProps &&\n !!props.renderButton &&\n !!props.secondaryButtonProps &&\n props.renderSecondaryButton?.({\n ...props.secondaryButtonProps,\n style:\n bothButtonsExist && props.centerBlockHorizontally\n ? {\n ...props.secondaryButtonProps.style,\n // when two buttons exist and are centered then they will be aligned not by themselves, but by the parent component\n margin: 0,\n }\n : props.secondaryButtonProps.style,\n onClick: (e) => {\n props.onClick?.(e);\n props.secondaryButtonProps?.onClick?.(e);\n },\n })}\n </div>\n );\n};\n\nexport default ImageTextPropertyBlock;\n","import { useEffect } from 'react';\nimport { useInView } from 'react-intersection-observer';\n\nimport { ga4PromotionTracking } from '../ga4/promotion';\nimport type { IGaPromoData } from '../models/IGaPromoData';\n\nconst usePromotionTracking = ({\n gaPromoCreative,\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n}: IGaPromoData) => {\n const [ref, inView] = useInView({\n triggerOnce: true,\n threshold: 0.5,\n });\n\n useEffect(() => {\n if (inView) {\n ga4PromotionTracking.viewPromotion({\n gaPromoCreative,\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n });\n }\n }, [gaPromoCreative, gaPromoId, gaPromoName, gaPromoPosition, inView]);\n\n const click = () => {\n ga4PromotionTracking.selectPromotion({\n gaPromoCreative,\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n });\n };\n\n return { ref, click };\n};\n\nexport default usePromotionTracking;\n"],"names":["Heading","props","ref","children","fontFamilySecondary","stylingElement","element","className","alignment","rest","alignStyles","width","textAlign","color","FontFamilySecondary","style","useEffect","document","body","focus","tabIndex","visuallyHidden","useListBlockLazyLoading","lazyLoad","options","triggerOnce","threshold","rootMargin","initialInView","window","isPrerenderCrawler","useGridBannerSize","cellsInRow","isMoreThan900px","bannerCellSize","x","getBannerSize","isLoading","items","length","ItemGrid","gridClasses","horizontalHidden","itemUniqueKey","item","index","identifier","Array","skeletonCount","map","toString","renderItem","renderSkeleton","renderAtRowStart","renderAtRowEnd","itemClasses","noDefaultClasses","styles","listBlockRef","useRef","listPosition","setListPosition","useState","useLayoutEffect","lists","querySelectorAll","position","from","findIndex","el","current","undefined","useImperativeHandle","product","swiperOptions","spaceBetween","Component","as","role","Container","backgroundColor","analyticsListName","SkipLink","skipLinkText","skipTargetText","headerSlot","useSwiper","ListContainer","banner","WithBanner","Banner","ImageTextPropertyBlock","SwiperContainer","SwipableList","swiperMainClassName","Swiper","swiperPaginationClass","SwiperPagination","_item","row","GridBanner","PrevButton","type","hasScrollbar","class","Icon","icon","NextButton","nextEl","setNextEl","prevEl","setPrevEl","paginationEl","setPaginationEl","focusTimer","containerRef","announce","dispatch","useCallback","value","c","setA11yAnnounceText","useA11yAnnouncerDispatch","useMemo","navigation","disabledClass","pagination","clickable","lockClass","dynamicBullets","dynamicMainBullets","customSwiperOptions","scrollbar","isScrollbarOptions","draggable","watchSlidesProgress","containerModifierClass","modifySwiperOptions","isMobile","swiperButtonClassName","modules","onSwiper","wrapperTag","onSlideChange","swiper","clearTimeout","snapIndex","setTimeout","focusElement","querySelector","child","tag","srcSet","sort","a","b","minWidth","media","height","loading","lazy","imgClassName","src","alt","altText","Content","bannerPositionClassNames","centerBlockHorizontally","centerBlockVertically","contentLessPadding","contentLessHorizontalPadding","hasContent","belowTextSlot","headingProps","renderHeading","imageUrl","RawPicture","imageAltText","imageHeight","textColor","RawHtml","html","BottomSlot","bothButtonsExist","buttonProps","secondaryButtonProps","wrapperClassNames","renderButton","margin","onClick","e","renderSecondaryButton","trackingRef","click","trackClick","usePromotionTracking","gaPromoCreative","gaPromoId","gaPromoName","gaPromoPosition","node","anchorRel","target","includes","isClickable","href","linkUrl","rel","ariaLabel","inView","viewPromotion","selectPromotion"],"sourceRoot":""}