{"version":3,"file":"coopse.script.6239.76345357.chunk.js","mappings":"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","sources":["webpack:///../../packages/icons/src/stroke2/clock.svg","webpack:///../../packages/icons/src/stroke2/trash.svg","webpack:///./src/microApps/cart/components/molecules/ProductListingItem/ProductListingItem.tsx","webpack:///./src/microApps/cart/selectors/cartRecipeSelectors.ts","webpack:///./src/microApps/common/components/atoms/SubstituteTrigger.tsx","webpack:///./src/microApps/common/components/atoms/Tooltip.tsx","webpack:///./src/microApps/common/components/molecules/ProductSubstitutes.tsx","webpack:///./src/microApps/common/components/molecules/TabSwitcher/TabSwitcher.hooks.ts","webpack:///./src/microApps/common/components/molecules/TabSwitcher/TabSwitcher.tsx","webpack:///./src/microApps/common/components/molecules/TabSwitcher/StatefulTabSwitcher.tsx","webpack:///./src/microApps/common/hooks/useSwiperOverflowClasses.ts","webpack:///./src/microApps/recipe/components/CommonRecipesTooltip/CommonRecipesTooltip.tsx","webpack:///./src/microApps/recipe/components/SharedRecipesTooltip/SharedRecipesTooltip.tsx","webpack:///./src/microApps/recipe/components/SharedBetweenRecipesTooltip/SharedBetweenRecipesTooltip.tsx","webpack:///./src/utility/coopSwiperBreakpointsUnique.ts"],"sourcesContent":["var _path, _path2;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgClock = _ref => {\n  let {\n    title,\n    titleId,\n    ...props\n  } = _ref;\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    width: \"1em\",\n    height: \"1em\",\n    viewBox: \"0 0 24 24\",\n    xmlns: \"http://www.w3.org/2000/svg\",\n    \"aria-labelledby\": titleId\n  }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n    id: titleId\n  }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    d: \"M11 5C11 4.44772 11.4477 4 12 4C12.5523 4 13 4.44772 13 5V12.3343C13 12.6687 12.8328 12.981 12.5545 13.1664L8.55451 15.8318C8.09491 16.138 7.47407 16.0137 7.16782 15.5541C6.86158 15.0945 6.98589 14.4737 7.44549 14.1674L11 11.7989V5Z\"\n  })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M12 0C5.37258 0 0 5.37258 0 12C0 18.6274 5.37258 24 12 24C18.6274 24 24 18.6274 24 12C24 5.37258 18.6274 0 12 0ZM2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12Z\"\n  })));\n};\nexport default SvgClock;","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgTrash = _ref => {\n  let {\n    title,\n    titleId,\n    ...props\n  } = _ref;\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    width: \"1em\",\n    height: \"1em\",\n    viewBox: \"0 0 24 24\",\n    xmlns: \"http://www.w3.org/2000/svg\",\n    \"aria-labelledby\": titleId\n  }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n    id: titleId\n  }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M8 5C8 3.34315 9.34315 2 11 2H13C14.6569 2 16 3.34315 16 5V6H20C20.5523 6 21 6.44772 21 7C21 7.55228 20.5523 8 20 8H19V19C19 20.6569 17.6569 22 16 22H8C6.34315 22 5 20.6569 5 19V8H4C3.44772 8 3 7.55228 3 7C3 6.44772 3.44772 6 4 6H8V5ZM10 6H14V5C14 4.44772 13.5523 4 13 4H11C10.4477 4 10 4.44772 10 5V6ZM7 8V19C7 19.5523 7.44772 20 8 20H16C16.5523 20 17 19.5523 17 19V8H7ZM10 10C10.5523 10 11 10.4477 11 11V17C11 17.5523 10.5523 18 10 18C9.44772 18 9 17.5523 9 17V11C9 10.4477 9.44772 10 10 10ZM14 10C14.5523 10 15 10.4477 15 11V17C15 17.5523 14.5523 18 14 18C13.4477 18 13 17.5523 13 17V11C13 10.4477 13.4477 10 14 10Z\"\n  })));\n};\nexport default SvgTrash;","import classnames from 'classnames';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport type { AnalyticsListOptions } from '../../../../../analytics/analyticsHandler';\nimport CloudinaryImage from '../../../../common/components/atoms/CloudinaryImage';\nimport { ConditionalMultipleWrappers } from '../../../../common/components/atoms/ConditionalWrapper';\nimport { ItemMedicalInfo } from '../../../../common/components/atoms/MedicalInfo';\nimport {\n    getFormattedComparativePrice,\n    getFormattedPackagingInfo,\n} from '../../../../common/utils/productUtils';\nimport MaxPromotionUsage from '../../../../ecommerce/components/MaxPromotionUsage';\n\ninterface ProductListingItemProps {\n    innerRef?: React.Ref<HTMLLIElement>;\n    name?: string;\n    packageSizeInformation?: string;\n    variantName?: string;\n    image?: string;\n    manufacturer?: string;\n    productUrl?: string;\n    additionalClassNames?: string;\n    slotLeft?: ReactNode;\n    slotPrice?: ReactNode;\n    slotSplash?: ReactNode;\n    analyticsOptions: AnalyticsListOptions | null;\n    bottomRow?: ReactNode;\n    handleLinkClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n    comparativePrice?: number;\n    comparativeText?: string;\n    isNicotineProduct: boolean;\n    isPharmaceutical: boolean;\n    promotion?: EcomPromotion;\n    isOutOfStock?: boolean;\n    isALink?: boolean;\n}\n\nconst ProductListingItem = ({\n    isALink = true,\n    ...props\n}: React.PropsWithChildren<ProductListingItemProps>) => {\n    return (\n        <li ref={props.innerRef} className={classnames('Cart-item', props.additionalClassNames)}>\n            <div className={classnames('Cart-itemRow', props.isOutOfStock && 'u-textLineThrough')}>\n                {props.slotLeft}\n                <div className={classnames('Cart-itemContainer', 'Cart-itemContainerWrapped')}>\n                    <div className=\"Cart-itemRow Cart-itemRowPrimary\">\n                        <div\n                            className={classnames(\n                                'Cart-itemWrapperImage',\n                                !!props.slotSplash && 'Cart-itemWrapperImageWithPromo',\n                            )}\n                        >\n                            <ProductItemImage\n                                productUrl={props.productUrl}\n                                handleLinkClick={props.handleLinkClick}\n                                image={props.image}\n                                name={props.name}\n                                isALink={isALink}\n                            />\n                            {props.slotSplash && (\n                                <div className=\"Cart-itemSplash\">{props.slotSplash}</div>\n                            )}\n                        </div>\n                        <div className=\"Cart-itemWrapper\">\n                            <div className=\"Cart-itemWrapperProduct\">\n                                <div className=\"Cart-itemWrapperDetail\">\n                                    <ProductItemInfo\n                                        productUrl={props.productUrl}\n                                        name={props.name}\n                                        manufacturer={props.manufacturer}\n                                        variantName={props.variantName}\n                                        packageSizeInformation={props.packageSizeInformation}\n                                        comparativePrice={props.comparativePrice}\n                                        comparativeText={props.comparativeText}\n                                        handleLinkClick={props.handleLinkClick}\n                                        isNicotineProduct={props.isNicotineProduct}\n                                        isPharmaceutical={props.isPharmaceutical}\n                                        promotion={props.promotion}\n                                        isALink={isALink}\n                                    />\n                                </div>\n                                <div className=\"Cart-itemWrapperPrice\">{props.slotPrice}</div>\n                            </div>\n                            {!!props.children && (\n                                <div className=\"Cart-itemRow\">\n                                    <div className=\"Cart-itemWrapperActions\">{props.children}</div>\n                                </div>\n                            )}\n                        </div>\n                    </div>\n                </div>\n            </div>\n            {!!props.bottomRow && <div className=\"Cart-itemRow\">{props.bottomRow}</div>}\n        </li>\n    );\n};\n\ninterface ProductItemInfoProps {\n    productUrl?: string;\n    handleLinkClick?: React.MouseEventHandler<HTMLAnchorElement>;\n    name?: string | ReactElement;\n    manufacturer?: string;\n    variantName?: string;\n    packageSizeInformation?: string;\n    comparativePrice?: number;\n    comparativeText?: string;\n    isNicotineProduct?: boolean;\n    isPharmaceutical?: boolean;\n    promotion?: EcomPromotion;\n    isALink?: boolean;\n}\n\nconst ProductItemInfo = ({\n    productUrl,\n    handleLinkClick,\n    name,\n    manufacturer,\n    variantName,\n    packageSizeInformation,\n    comparativePrice,\n    comparativeText,\n    isNicotineProduct,\n    isPharmaceutical,\n    promotion,\n    isALink = true,\n}: ProductItemInfoProps) => {\n    const packagingInfo = getFormattedPackagingInfo(variantName, packageSizeInformation);\n\n    const comparativePriceFormatted = getFormattedComparativePrice(\n        comparativePrice,\n        comparativeText,\n    );\n\n    return (\n        <div className=\"u-flexAlignSelfCenter u-textLeft\">\n            <ConditionalMultipleWrappers\n                choices={[\n                    {\n                        condition: !!productUrl && isALink,\n                        renderWrapper: (ch) => (\n                            <a\n                                href={productUrl}\n                                className=\"Cart-itemHeading Cart-itemHeading--link\"\n                                style={{ whiteSpace: 'normal' }}\n                                onClick={handleLinkClick}\n                                data-test=\"cart-productitem-name\"\n                                tabIndex={-1}\n                            >\n                                {ch}\n                            </a>\n                        ),\n                    },\n                    {\n                        condition: !isALink || !productUrl,\n                        renderWrapper: (ch) => (\n                            <div\n                                className=\"Cart-itemHeading\"\n                                style={{ whiteSpace: 'normal' }}\n                                data-test=\"cart-productitem-name\"\n                            >\n                                {ch}\n                            </div>\n                        ),\n                    },\n                ]}\n            >\n                {name}\n            </ConditionalMultipleWrappers>\n            <p\n                className=\"Cart-itemSubtitle Cart-itemSubtitleWrapped\"\n                style={{ whiteSpace: 'normal' }}\n            >\n                {manufacturer && (\n                    <span className=\"u-textWeightBold\">\n                        {`${manufacturer}`}\n                        {manufacturer && '. '}\n                    </span>\n                )}\n                {!!packagingInfo && (\n                    <span>\n                        {packagingInfo}\n                        {!!comparativePriceFormatted && '. '}\n                    </span>\n                )}\n                {!!comparativePriceFormatted && <span>{comparativePriceFormatted}</span>}\n                {!!promotion?.maxUseText && <MaxPromotionUsage text={promotion.maxUseText} />}\n            </p>\n            <ItemMedicalInfo isNicotine={isNicotineProduct} isPharmaceutical={isPharmaceutical} />\n        </div>\n    );\n};\n\ninterface ProductItemImageProps {\n    productUrl?: string;\n    handleLinkClick?: React.MouseEventHandler<HTMLAnchorElement>;\n    image?: string;\n    name?: string;\n    isALink?: boolean;\n}\n\nconst ProductItemImage = ({\n    productUrl,\n    handleLinkClick,\n    image,\n    name,\n    isALink = true,\n}: ProductItemImageProps) => {\n    return (\n        <ConditionalMultipleWrappers\n            choices={[\n                {\n                    condition: !!productUrl && isALink,\n                    renderWrapper: (ch) => (\n                        <a href={productUrl} className=\"u-block\" onClick={handleLinkClick}>\n                            {ch}\n                        </a>\n                    ),\n                },\n                {\n                    condition: !isALink || !productUrl,\n                    renderWrapper: (ch) => ch,\n                },\n            ]}\n        >\n            <CloudinaryImage\n                cssClass=\"Cart-itemImage\"\n                url={image}\n                name={name || ''}\n                transform=\"e_sharpen,f_auto,fl_clip,fl_progressive,q_90,c_lpad,g_center,h_68,w_68\"\n                retinaTransform=\"e_sharpen,f_auto,fl_clip,fl_progressive,q_70,c_lpad,g_center,h_136,w_136\"\n                fallbackUrl=\"/Assets/Images/missing-image-product.png\"\n            />\n        </ConditionalMultipleWrappers>\n    );\n};\n\nexport default ProductListingItem;\n\nexport const ProductListItem = {\n    Image: ProductItemImage,\n    Info: ProductItemInfo,\n};\n","import { createSelector } from '@reduxjs/toolkit';\n\nimport { recipesAdapter } from '../../common/store/adapters/recipesAdapter';\nimport type { RootState } from '../../common/store/structureDefinitions/cartState';\n\nconst recipeSelectors = recipesAdapter.getSelectors((state: RootState) => state.cart.recipes);\nconst selectNonEmptyRecipes = createSelector(recipeSelectors.selectAll, (cartRecipes) =>\n    cartRecipes.filter((x) => !!x.productsMap?.length),\n);\n\nconst selectNonEmptyRecipeIds = createSelector(selectNonEmptyRecipes, (cartRecipes) =>\n    cartRecipes.map((item) => item.code),\n);\nconst selectNonEmptyRecipebyId = createSelector(\n    selectNonEmptyRecipes,\n    (_: RootState, recipeId: string) => recipeId,\n    (cartRecipes, recipeId) => cartRecipes.find((item) => item.code === recipeId),\n);\n\nconst hasFoodboxInCart = createSelector(recipeSelectors.selectAll, (cartRecipes) =>\n    cartRecipes.some((r) => r.group === 'foodbox'),\n);\n\nconst cartRecipeSelectors = {\n    all: recipeSelectors,\n    nonEmpty: {\n        selectAll: selectNonEmptyRecipes,\n        selectIds: selectNonEmptyRecipeIds,\n        selectById: selectNonEmptyRecipebyId,\n    },\n    hasFoodboxInCart,\n};\n\nexport default cartRecipeSelectors;\n","import { ChipButton, ChipIconButton } from '@coop/components';\nimport { CloseIcon } from '@coop/icons';\nimport type { FC } from 'react';\n\ntype SubstituteTriggerButtonTheme = 'whiteGreen' | 'greenCta';\n\ninterface SubstituteTriggerProps {\n    handleSubsituteTrigger: () => void;\n    theme: SubstituteTriggerButtonTheme;\n    isActive: boolean;\n}\n\nconst SubstituteTrigger: FC<React.PropsWithChildren<SubstituteTriggerProps>> = (\n    props: SubstituteTriggerProps,\n) => {\n    return props.isActive ? (\n        <ChipIconButton\n            icon={CloseIcon}\n            label=\"Stäng\"\n            isActive\n            theme=\"whiteGreen\"\n            onClick={props.handleSubsituteTrigger}\n            size={32}\n        />\n    ) : (\n        <ChipButton theme={props.theme} onClick={props.handleSubsituteTrigger} size={32}>\n            Byt vara\n        </ChipButton>\n    );\n};\n\nexport default SubstituteTrigger;\n","import { useElementEvent, useOutsideClick } from '@coop/hooks';\nimport classnames from 'classnames';\nimport type { CSSProperties, FC, MutableRefObject, ReactNode } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport * as _ from 'underscore';\n\ninterface TooltipProps {\n    children: ReactNode;\n    content: string | ReactNode;\n    className?: string;\n    style?: CSSProperties;\n    tooltipStyle?: CSSProperties;\n    disabled?: boolean;\n    defaultCursor?: boolean;\n    visibleTooltip?: boolean;\n    handleClick?: () => void;\n    handleMouseOver?: () => void;\n    handleMouseOut?: () => void;\n    handleOutsideClick?: () => void;\n    useOutsideClick?: boolean;\n    arrowPlacement?: string;\n    arrowOffset?: number;\n}\n\nenum ArrowPosition {\n    Center,\n    Right,\n    Left,\n}\n\nconst TOOLTIP_WIDTH = 250;\nconst TOOLTIP_DEFAULT = 'Tooltip u-textLeft u-posAbsolute';\nconst ARROW_TOP = 'Tooltip--topArrow';\nconst ARROW_BOTTOM = 'Tooltip--bottomArrow';\nconst ARROW_LEFT = 'Tooltip--left Tooltip--leftArrow';\nconst ARROW_CENTER = 'Tooltip--center Tooltip--centerArrow';\nconst ARROW_RIGHT = 'Tooltip--right Tooltip--rightArrow';\n\nconst getPosFromCss = (tooltipCss: string): ArrowPosition => {\n    if (tooltipCss?.indexOf('left') > -1) {\n        return ArrowPosition.Left;\n    }\n    if (tooltipCss?.indexOf('right') > -1) {\n        return ArrowPosition.Right;\n    }\n    return ArrowPosition.Center;\n};\n\nconst getFreeSpace = (\n    oldPos: ArrowPosition,\n    left: number,\n): { spaceOnLeft: number; spaceOnRight: number } => {\n    if (oldPos === ArrowPosition.Center) {\n        return {\n            spaceOnLeft: TOOLTIP_WIDTH / 2 + left,\n            spaceOnRight: window.innerWidth - (TOOLTIP_WIDTH / 2 + left),\n        };\n    }\n    if (oldPos === ArrowPosition.Left) {\n        return { spaceOnLeft: left, spaceOnRight: window.innerWidth - left };\n    }\n    return {\n        spaceOnLeft: left + TOOLTIP_WIDTH,\n        spaceOnRight: window.innerWidth - (left + TOOLTIP_WIDTH),\n    };\n};\n\nconst calculateTooltipArrowPosition = (\n    propsArrowPlacement: string | undefined,\n    oldTooltipCss: string,\n    tooltipRef: MutableRefObject<HTMLSpanElement | null>,\n    setCurrentPosRef: (arrowPosition: ArrowPosition) => void,\n    currentPosRef: MutableRefObject<ArrowPosition | null>,\n): string => {\n    if (propsArrowPlacement) {\n        const arrowPlacement = [TOOLTIP_DEFAULT];\n\n        if (propsArrowPlacement?.indexOf('top') > -1) {\n            arrowPlacement.push(ARROW_TOP);\n        } else {\n            arrowPlacement.push(ARROW_BOTTOM);\n        }\n\n        if (propsArrowPlacement?.indexOf('left') > -1) {\n            arrowPlacement.push(ARROW_LEFT);\n        } else if (propsArrowPlacement?.indexOf('right') > -1) {\n            arrowPlacement.push(ARROW_RIGHT);\n        } else {\n            arrowPlacement.push(ARROW_CENTER);\n        }\n\n        return arrowPlacement.join(' ');\n    }\n\n    if (!tooltipRef?.current) {\n        return `${TOOLTIP_DEFAULT} ${ARROW_BOTTOM} ${ARROW_CENTER}`;\n    }\n\n    const { left } = tooltipRef.current.getBoundingClientRect();\n\n    const oldPos = currentPosRef?.current ?? getPosFromCss(oldTooltipCss);\n    const { spaceOnLeft, spaceOnRight } = getFreeSpace(oldPos, left);\n    const changeToCenter = spaceOnLeft > TOOLTIP_WIDTH / 2 && spaceOnRight > TOOLTIP_WIDTH / 2;\n\n    // if possible change to center\n    if (changeToCenter) {\n        setCurrentPosRef(ArrowPosition.Center);\n        return `${TOOLTIP_DEFAULT} ${ARROW_BOTTOM} ${ARROW_CENTER}`;\n    }\n\n    if (spaceOnLeft > spaceOnRight) {\n        setCurrentPosRef(ArrowPosition.Right);\n        return `${TOOLTIP_DEFAULT} ${ARROW_BOTTOM} ${ARROW_RIGHT}`;\n    }\n\n    setCurrentPosRef(ArrowPosition.Left);\n    return `${TOOLTIP_DEFAULT} ${ARROW_BOTTOM} ${ARROW_LEFT}`;\n};\n\nconst arrowHeight = 20;\n\n// NOTE: margin on props.children will make the tooltips placement slightly off. So use props.style for margins.\nexport const Tooltip: FC<React.PropsWithChildren<TooltipProps>> = (props) => {\n    const [tooltipClassNames, setTooltipClassNames] = useState(\n        `${TOOLTIP_DEFAULT} ${ARROW_BOTTOM} ${ARROW_CENTER}`,\n    );\n    const currentPosRef = useRef<ArrowPosition | null>(null);\n\n    const setCurrentPosRef = (position: ArrowPosition) => {\n        currentPosRef.current = position;\n    };\n\n    const [uniqueIdForAria] = useState(() => _.uniqueId('tooltip-'));\n\n    const tooltipRef = useRef<HTMLSpanElement | null>(null);\n\n    useOutsideClick(\n        tooltipRef,\n        props.handleOutsideClick!,\n        !!props.handleOutsideClick && !!props.useOutsideClick,\n    );\n\n    const top =\n        props.arrowPlacement && props.arrowPlacement?.indexOf('top') > -1\n            ? undefined\n            : -arrowHeight - (props.arrowOffset || 0) - (tooltipRef.current?.offsetHeight || 0);\n\n    const bottom =\n        props.arrowPlacement && props.arrowPlacement?.indexOf('top') > -1\n            ? -arrowHeight - (props.arrowOffset || 0) - (tooltipRef.current?.offsetHeight || 0)\n            : undefined;\n\n    const resetTooltipPosition = useCallback(() => {\n        const tooltipArrowPosCss = calculateTooltipArrowPosition(\n            props.arrowPlacement,\n            tooltipClassNames,\n            tooltipRef,\n            setCurrentPosRef,\n            currentPosRef,\n        );\n        if (tooltipArrowPosCss !== tooltipClassNames) {\n            setTooltipClassNames(tooltipArrowPosCss);\n        }\n    }, [props.arrowPlacement, tooltipClassNames]);\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    const onResize = useCallback(\n        _.debounce(() => {\n            resetTooltipPosition();\n        }, 200),\n        [resetTooltipPosition],\n    );\n\n    useEffect(() => {\n        resetTooltipPosition();\n        // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [props.disabled]);\n\n    useElementEvent(window, 'resize', onResize, true);\n\n    return (\n        <div\n            style={{ position: 'relative', ...props.style }}\n            className={props.defaultCursor ? 'u-cursorDefault' : 'u-cursorPointer'}\n            onClick={props.handleClick}\n            onMouseEnter={props.handleMouseOver}\n            onMouseLeave={props.handleMouseOut}\n            // onMouseOver={props.handleMouseOver}\n            // onMouseOut={props.handleMouseOut}\n            // onFocus={props.handleMouseOver}\n            // onBlur={props.handleMouseOut}\n            aria-labelledby={uniqueIdForAria}\n        >\n            {props.children}\n\n            <span\n                id={uniqueIdForAria}\n                role=\"tooltip\"\n                ref={tooltipRef}\n                style={{\n                    top,\n                    bottom,\n                    whiteSpace: 'normal',\n                    color: '#333',\n                    transition: 'visibility 0.3s ease, opacity 0.3s ease',\n                    ...props.tooltipStyle,\n                }}\n                className={classnames(\n                    'u-textWeightNormal',\n                    tooltipClassNames,\n                    props.visibleTooltip ? 'u-isVisible u-opacity1' : 'u-isInvisible u-opacity0',\n                    props.className ? props.className : '',\n                )}\n            >\n                {props.content}\n            </span>\n        </div>\n    );\n};\n\nconst withHover =\n    (TooltipComponent: FC<React.PropsWithChildren<TooltipProps>>) => (props: TooltipProps) => {\n        const [hovering, setHovering] = useState<boolean>(false);\n        const onMouseOver = () => {\n            setHovering(true);\n            if (props.handleMouseOver) {\n                props.handleMouseOver();\n            }\n        };\n        const onMouseOut = () => {\n            setHovering(false);\n            if (props.handleMouseOut) {\n                props.handleMouseOut();\n            }\n        };\n\n        return (\n            <TooltipComponent\n                arrowPlacement={props.arrowPlacement}\n                content={props.content}\n                className={props.className}\n                defaultCursor={props.defaultCursor}\n                disabled={props.disabled}\n                handleClick={props.handleClick}\n                handleOutsideClick={props.handleOutsideClick}\n                style={props.style}\n                tooltipStyle={props.tooltipStyle}\n                useOutsideClick={props.useOutsideClick}\n                visibleTooltip={props.disabled ? false : hovering}\n                handleMouseOver={onMouseOver}\n                handleMouseOut={onMouseOut}\n            >\n                {props.children}\n            </TooltipComponent>\n        );\n    };\n\nexport const TooltipOnHover = withHover(Tooltip);\n","import { Button } from '@coop/components';\nimport type { FC } from 'react';\nimport { useMemo } from 'react';\nimport type { SwiperOptions } from 'swiper/types';\n\nimport type { AnalyticsListOptions } from '../../../../analytics/analyticsHandler';\nimport type { SwiperBreakpoints } from '../../../../utility/coopSwiperBreakpoints';\nimport { useIsInCheckoutMicroApp } from '../../contexts/microAppContext';\nimport { useSwiperOverflowClasses } from '../../hooks/useSwiperOverflowClasses';\nimport type { PriceType } from '../../models/priceData/priceData';\nimport { mapProductToProps } from '../../utils/productUtils';\nimport { useIsMobile } from '../atoms/ResponsiveBreakpoints';\nimport { SwipableList } from '../SwipableList';\nimport EcomProductTeaser from './EcomProductTeaser';\n\nexport interface ProductSubstitutesProps {\n    substitutes: ApiProduct[];\n    handleProductSubstitution: (product: ApiProduct) => void;\n    analyticsOptions?: AnalyticsListOptions;\n    activeSubstituteId?: string;\n    productSubstitutesBreakpoints: SwiperBreakpoints;\n    isConstrained?: boolean;\n    priceType: PriceType;\n}\n\nconst ProductSubstitutes: FC<React.PropsWithChildren<ProductSubstitutesProps>> = (props) => {\n    const isInCheckout = useIsInCheckoutMicroApp();\n    const isMobile = useIsMobile();\n\n    const { mainSwiperClasses, spaceBetween } = useSwiperOverflowClasses({\n        constrainedX: (isInCheckout && isMobile) || props.isConstrained,\n        constrainedY: true,\n    });\n\n    const swiperOptions: SwiperOptions = useMemo(\n        () => ({\n            spaceBetween,\n            breakpoints: props.productSubstitutesBreakpoints,\n        }),\n        [props.productSubstitutesBreakpoints, spaceBetween],\n    );\n\n    const onButtonClick = (item: ApiProduct) => (e: React.MouseEvent) => {\n        e.stopPropagation();\n        props.handleProductSubstitution(item);\n    };\n\n    if (!props.substitutes?.length) {\n        return null;\n    }\n\n    return (\n        <SwipableList swiperOptions={swiperOptions} swiperMainClassName={mainSwiperClasses}>\n            {props.substitutes.map((item: ApiProduct) => (\n                <EcomProductTeaser\n                    key={item.identifier}\n                    handleTeaserClick={() => props.handleProductSubstitution(item)}\n                    product={mapProductToProps(item)}\n                    isALink={false}\n                    containerCss=\"u-borderAllGrayLight2\"\n                    priceType={props.priceType}\n                    actionsSlot={\n                        props.activeSubstituteId === item.identifier ? (\n                            <Button theme=\"light\" onClick={onButtonClick(item)} fullWidth>\n                                Vald\n                            </Button>\n                        ) : (\n                            <Button theme=\"primary\" onClick={onButtonClick(item)} fullWidth>\n                                Välj\n                            </Button>\n                        )\n                    }\n                />\n            ))}\n        </SwipableList>\n    );\n};\n\nexport default ProductSubstitutes;\n","import { useElementEvent } from '@coop/hooks';\nimport { useCallback, useLayoutEffect, useRef } from 'react';\nimport _ from 'underscore';\n\nexport const useTabSwitcher = () => {\n    const indicatorRef = useRef<HTMLDivElement>(null);\n\n    const tabScrollableRef = useRef<HTMLDivElement>(null);\n    const activeItemRef = useRef<HTMLButtonElement>(null);\n    const tabListRef = useRef<HTMLDivElement>(null);\n\n    const renderIndicator = useCallback(() => {\n        if (activeItemRef.current && indicatorRef.current) {\n            const linkWidth = activeItemRef.current.offsetWidth;\n\n            const linkPos = activeItemRef.current.offsetLeft;\n\n            indicatorRef.current.style.width = `${linkWidth}px`;\n            indicatorRef.current.style.left = `${linkPos}px`;\n        }\n    }, []);\n\n    const onLeftArrowClick = (e: React.MouseEvent | React.FocusEvent) => {\n        e.preventDefault();\n        if (tabScrollableRef.current) {\n            tabScrollableRef.current.scrollBy({\n                left:\n                    tabScrollableRef.current.scrollLeft -\n                    tabScrollableRef.current.scrollWidth +\n                    100,\n                behavior: 'smooth',\n            });\n        }\n    };\n\n    const onRightArrowClick = (e: React.MouseEvent | React.FocusEvent) => {\n        e.preventDefault();\n        if (tabScrollableRef.current) {\n            tabScrollableRef.current.scrollBy({\n                left:\n                    tabScrollableRef.current.scrollLeft +\n                    tabScrollableRef.current.clientWidth -\n                    100,\n                behavior: 'smooth',\n            });\n        }\n    };\n\n    const arrowLeftRef = useRef<HTMLDivElement>(null);\n    const arrowRightRef = useRef<HTMLDivElement>(null);\n\n    const toggleNavigationButtons = useCallback(() => {\n        const tabScrollable = tabScrollableRef.current;\n        if (!tabScrollable) {\n            return null;\n        }\n        const tabScrollableWidth = tabScrollable.clientWidth;\n\n        if (!tabListRef.current) {\n            return null;\n        }\n\n        const tabListWidth = tabListRef.current.clientWidth;\n        const { scrollLeft } = tabScrollable;\n        const leftButton = arrowLeftRef.current;\n        const rightButton = arrowRightRef.current;\n\n        if (tabListWidth > tabScrollableWidth) {\n            if (leftButton) {\n                if (scrollLeft > 0) {\n                    // leftButton.fadeIn(200);\n                    // leftButton.animate({ display: 'block' }, 200);\n                    leftButton.style.display = 'block'; // ({ display: 'block' }, 200);\n                } else {\n                    // leftButton.fadeOut(200);\n                    // leftButton.animate({ display: 'none' }, 200);\n                    leftButton.style.display = 'none';\n                }\n            }\n\n            if (rightButton) {\n                if (scrollLeft + tabScrollableWidth < tabListWidth - 2) {\n                    // rightButton.fadeIn(200);\n                    // rightButton.animate({ display: 'block' }, 200);\n                    rightButton.style.display = 'block';\n                } else {\n                    // rightButton.fadeOut(200);\n                    // rightButton.animate({ display: 'none' }, 200);\n                    rightButton.style.display = 'none';\n                }\n            }\n        } else {\n            // leftButton.fadeOut(200);\n            // rightButton.fadeOut(200);\n            // leftButton.animate({ display: 'none' }, 200);\n            if (leftButton) {\n                leftButton.style.display = 'none';\n            }\n\n            // rightButton.animate({ display: 'none' }, 200);\n            if (rightButton) {\n                rightButton.style.display = 'none';\n            }\n        }\n    }, [tabListRef, tabScrollableRef]);\n\n    const centerSelected = useCallback(() => {\n        const tabScrollable = tabScrollableRef.current;\n        const tabActive = activeItemRef.current;\n        if (!tabScrollable || !tabActive) {\n            return null;\n        }\n        const tabActiveWidth = tabActive.clientWidth;\n        const lastKnownScrollPosition = tabScrollable.scrollLeft;\n\n        const tabActivePosition = tabActive.getBoundingClientRect().left + tabActiveWidth;\n\n        tabScrollable.scroll({ left: lastKnownScrollPosition, behavior: 'smooth' });\n        tabScrollable.scrollBy({\n            left: tabActivePosition - window.innerWidth / 2 - tabActiveWidth / 2,\n            behavior: 'smooth',\n        });\n    }, [activeItemRef, tabScrollableRef]);\n\n    const onResize = useCallback(\n        () =>\n            _.debounce(() => {\n                toggleNavigationButtons();\n                centerSelected();\n                renderIndicator();\n            }, 200),\n        [centerSelected, renderIndicator, toggleNavigationButtons],\n    );\n\n    useLayoutEffect(() => {\n        renderIndicator();\n        centerSelected();\n        toggleNavigationButtons();\n    }, [centerSelected, renderIndicator, toggleNavigationButtons]);\n\n    const onItemClick = () => {\n        renderIndicator();\n        centerSelected();\n        toggleNavigationButtons();\n    };\n\n    useElementEvent(window, 'resize', onResize, true);\n    useElementEvent(tabScrollableRef.current, 'scroll', toggleNavigationButtons, true);\n\n    return {\n        onItemClick,\n        indicatorRef,\n        tabScrollableRef,\n        activeItemRef,\n        tabListRef,\n        onLeftArrowClick,\n        onRightArrowClick,\n        arrowLeftRef,\n        arrowRightRef,\n    };\n};\n","/* eslint-disable react/no-danger */\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useLayoutEffect, useRef } from 'react';\n\nimport { useTabSwitcher } from './TabSwitcher.hooks';\nimport type { TabItem, TabItemRenderer } from './TabSwitcher.types';\n\ntype AlignType = 'left' | 'center' | 'right';\n\nexport interface TabSwitcherProps<TData, TId extends string> {\n    items: TabItem<TData, TId>[];\n    align?: AlignType;\n    wrapperClasses?: string;\n    containerClasses?: string;\n    itemClasses?: (isActive: boolean) => string;\n    listClasses?: string;\n    renderNextToTabs?: () => React.ReactNode;\n    panelClasses?: string;\n    handleClick: (tab: TabItem<TData, TId>) => void;\n    renderTabItem?: TabItemRenderer<TData, TId>;\n    activeTabId: TId;\n    forcePanelRerenderOnTabChange?: boolean;\n    panelSlot?: React.ReactNode;\n    disableTabAnimation?: boolean;\n    hidePanelsWithCss?: boolean /** Use when SEO is important - this will render all content up front and hide with css, making it crawlable */;\n    noTabIndicator?: boolean;\n}\n\n/**\n * The TabSwitcher is always scrollable and animated\n * */\nconst TabSwitcher = <TData, TId extends string>(props: TabSwitcherProps<TData, TId>) => {\n    const ref = useRef<HTMLDivElement>(null);\n    const {\n        indicatorRef,\n        tabScrollableRef,\n        activeItemRef: currentLinkRef,\n        tabListRef,\n        onLeftArrowClick,\n        onRightArrowClick,\n        arrowLeftRef,\n        arrowRightRef,\n        onItemClick,\n    } = useTabSwitcher();\n\n    useLayoutEffect(() => {\n        onItemClick();\n    }, [props.activeTabId, onItemClick]);\n\n    const handleNavItemClick = (item: TabItem<TData, TId>) => {\n        props.handleClick?.(item);\n    };\n\n    const activeTab = props.items.find((item) => item.id === props.activeTabId);\n\n    const getAlignmentClass = (align?: AlignType) => {\n        if (align === 'left') return 'u-textLeft';\n        if (align === 'right') return 'u-textRight';\n        return 'u-textCenter';\n    };\n\n    const renderDefaultTab: TabItemRenderer<TData, TId> = (\n        { tab, handleClick: handleTabClick, isActive },\n        _ref,\n    ) => {\n        const cssClasses = classNames(\n            'Tab-item',\n            isActive && 'is-active',\n            props.itemClasses && props.itemClasses(isActive),\n        );\n\n        return (\n            <button\n                ref={_ref as React.Ref<HTMLButtonElement>}\n                type=\"button\"\n                className={cssClasses}\n                onClick={() => {\n                    handleTabClick(tab);\n                }}\n                aria-label={tab.ariaLabel}\n                dangerouslySetInnerHTML={{ __html: tab.name }}\n            />\n        );\n    };\n\n    return (\n        <div\n            ref={ref}\n            className={classNames(\n                'Tab',\n                !props.disableTabAnimation && 'Tab--animated',\n                'Tab--scrollable',\n                props.wrapperClasses,\n            )}\n        >\n            <div\n                ref={tabScrollableRef}\n                className={classNames(\n                    'Tab-container',\n                    getAlignmentClass(props.align),\n                    props.containerClasses,\n                )}\n            >\n                <div ref={tabListRef} className={classNames('Tab-list', props.listClasses)}>\n                    {props.items.map((item) => {\n                        const isActive = props.activeTabId === item.id;\n                        return (\n                            <TabNavigationItem\n                                ref={isActive ? currentLinkRef : null}\n                                key={item.id}\n                                tabItem={item}\n                                isActive={isActive}\n                                renderTabItem={\n                                    props.renderTabItem ? props.renderTabItem : renderDefaultTab\n                                }\n                                handleNavItemClick={() => handleNavItemClick(item)}\n                                additinalClasses={props.itemClasses}\n                            />\n                        );\n                    })}\n                    {props.noTabIndicator || <div ref={indicatorRef} className=\"Tab-indicator\" />}\n                </div>\n                {props.renderNextToTabs && props.renderNextToTabs()}\n            </div>\n            {props.hidePanelsWithCss\n                ? props.items.map((item) => {\n                      const isActive = props.activeTabId === item.id;\n                      return (\n                          <TabPanel\n                              key={item.id}\n                              isActive={isActive}\n                              panelClasses={props.panelClasses}\n                          >\n                              {item.component}\n                          </TabPanel>\n                      );\n                  })\n                : props.panelSlot || (\n                      <TabPanel\n                          key={props.forcePanelRerenderOnTabChange ? props.activeTabId : undefined}\n                          isActive={props.activeTabId === activeTab?.id}\n                          panelClasses={props.panelClasses}\n                      >\n                          {activeTab?.component}\n                      </TabPanel>\n                  )}\n            <div\n                ref={arrowLeftRef}\n                className=\"Tab-arrow Tab-arrow--left\"\n                style={{ display: 'none' }}\n                onClick={onLeftArrowClick}\n                onMouseOver={onLeftArrowClick}\n                onFocus={onLeftArrowClick}\n            />\n            <div\n                ref={arrowRightRef}\n                className=\"Tab-arrow Tab-arrow--right\"\n                style={{ display: 'none' }}\n                onClick={onRightArrowClick}\n                onMouseOver={onRightArrowClick}\n                onFocus={onRightArrowClick}\n            />\n        </div>\n    );\n};\n\nconst TabNavigationItemInner = <TData, TId>(\n    props: {\n        isActive: boolean;\n        tabItem: TabItem<TData, TId>;\n        handleNavItemClick: (tab: TabItem<TData, TId>) => void;\n        additinalClasses?: (isActive: boolean) => string;\n        renderTabItem: TabItemRenderer<TData, TId>;\n    },\n    ref: React.Ref<HTMLButtonElement>,\n) => {\n    return (\n        <>\n            {props.renderTabItem(\n                {\n                    tab: props.tabItem,\n                    handleClick: props.handleNavItemClick,\n                    isActive: props.isActive,\n                },\n                ref,\n            )}\n        </>\n    );\n};\n\nconst TabNavigationItem = React.forwardRef(TabNavigationItemInner);\n\ninterface TabPanelProps {\n    children: React.ReactNode;\n    isActive: boolean;\n    panelClasses?: string;\n}\n\nconst TabPanel = ({ children, isActive, panelClasses }: TabPanelProps) => {\n    const cssClasses = classNames('Tab-panel ', isActive ? 'is-active' : null, panelClasses);\n\n    return <div className={cssClasses}>{children}</div>;\n};\n\nexport default TabSwitcher;\n","import { useEffect, useState } from 'react';\n\nimport type { TabSwitcherProps } from './TabSwitcher';\nimport TabSwitcher from './TabSwitcher';\n\ntype StatefulTabSwitcherProps<T, TId extends string> = {\n    initialActiveId?: TId;\n} & Omit<TabSwitcherProps<T, TId>, 'activeTabId' | 'setActiveTabId' | 'handleClick'> &\n    Partial<Pick<TabSwitcherProps<T, TId>, 'handleClick'>>;\n\nconst StatefulTabSwitcher = <T, TId extends string>(props: StatefulTabSwitcherProps<T, TId>) => {\n    const [activeTabId, setActiveTabId] = useState(props.initialActiveId ?? props.items[0].id);\n\n    useEffect(() => {\n        if (props.initialActiveId) {\n            setActiveTabId(props.initialActiveId);\n        }\n    }, [props.initialActiveId]);\n\n    const handleItemClick: (typeof props)['handleClick'] = (tab) => {\n        setActiveTabId(tab.id);\n        props.handleClick?.(tab);\n    };\n\n    // eslint-disable-next-line react/jsx-props-no-spreading\n    return <TabSwitcher {...props} activeTabId={activeTabId} handleClick={handleItemClick} />;\n};\n\nexport default StatefulTabSwitcher;\n","import classNames from 'classnames';\n\nimport { useIsMobile } from '../components/atoms/ResponsiveBreakpoints';\nimport { useIsInsideModalContext } from '../contexts/siteContext';\n\nexport const useSwiperOverflowClasses = (params?: {\n    constrainedX?: boolean;\n    constrainedY?: boolean;\n}) => {\n    const isInsideModal = useIsInsideModalContext();\n\n    const swiperIsXConstrained = isInsideModal || params?.constrainedX;\n    const swiperIsYConstrained = !!params?.constrainedY;\n\n    const isMobile = useIsMobile();\n\n    // shadow must be the same size as space between slides, to not have cut shadows\n    const classes = classNames(\n        'swiper-overflow',\n        swiperIsYConstrained && 'swiper-overflow--constrainedY',\n        isMobile ? 'swiper-overflow20' : 'swiper-overflow10', // mobila has 20, to overflow until the edge of the screen - 20 is the main content's padding\n        swiperIsXConstrained && 'swiper-overflow--constrainedX',\n    );\n\n    return {\n        spaceBetween: 10,\n        mainSwiperClasses: classes,\n    };\n};\n","import type { FC } from 'react';\nimport * as React from 'react';\n\nimport { TooltipOnHover } from '../../../common/components/atoms/Tooltip';\nimport type { SharedRecipe } from '../../models';\n\ninterface CommonRecipesTooltipProps {\n    sharedRecipes: SharedRecipe[];\n}\n\nconst CommonRecipesTooltip: FC<React.PropsWithChildren<CommonRecipesTooltipProps>> = (props) => {\n    const recipeNamesJoinedText = props.sharedRecipes.map((recipe, index) => {\n        return (\n            <React.Fragment key={recipe.code}>\n                {index > 0 ? ' och ' : ''}\n                <span className=\"u-colorGreen\">{recipe.name}</span>\n            </React.Fragment>\n        );\n    });\n\n    const TooltipContent = <span>Den här produkten ingår i recepten {recipeNamesJoinedText}</span>;\n\n    return <TooltipOnHover content={TooltipContent}>{props.children}</TooltipOnHover>;\n};\n\nexport default CommonRecipesTooltip;\n","import type { FC } from 'react';\nimport * as React from 'react';\n\nimport { TooltipOnHover } from '../../../common/components/atoms/Tooltip';\nimport type { SharedRecipe } from '../../models';\n\ninterface SharedRecipesTooltipProps {\n    sharedRecipes: SharedRecipe[];\n}\n\nconst SharedRecipesTooltip: FC<React.PropsWithChildren<SharedRecipesTooltipProps>> = (props) => {\n    const recipeNamesJoinedText = props.sharedRecipes.map((recipe, index) => {\n        return (\n            <React.Fragment key={recipe.code}>\n                {index > 0 ? ' och ' : ''}\n                <span className=\"u-colorGreen\">{recipe.name}</span>\n            </React.Fragment>\n        );\n    });\n\n    const TooltipContent = (\n        <span>Den här produkten delas mellan recepten {recipeNamesJoinedText}</span>\n    );\n\n    return <TooltipOnHover content={TooltipContent}>{props.children}</TooltipOnHover>;\n};\n\nexport default SharedRecipesTooltip;\n","import { Chip, Icon } from '@coop/components';\nimport { PaperIcon } from '@coop/icons';\nimport type { FC } from 'react';\nimport type React from 'react';\n\nimport type { RecipeSectionType, SharedRecipe } from '../../models';\nimport CommonRecipesTooltip from '../CommonRecipesTooltip/CommonRecipesTooltip';\nimport SharedRecipesTooltip from '../SharedRecipesTooltip/SharedRecipesTooltip';\n\ninterface SharedBetweenRecipesTooltipProps {\n    sectionType: RecipeSectionType;\n    belongsToRecipes: SharedRecipe[];\n}\n\nconst SharedBetweenRecipesTooltip: FC<React.PropsWithChildren<SharedBetweenRecipesTooltipProps>> = (\n    props,\n) => {\n    if (props.belongsToRecipes.length === 0) return null;\n\n    switch (props.sectionType) {\n        case 'shared':\n            return (\n                <SharedRecipesTooltip sharedRecipes={props.belongsToRecipes}>\n                    <Chip theme=\"whiteGreen\" asIcon size={32}>\n                        <Icon icon={PaperIcon} width={16} height={16} />\n                    </Chip>\n                </SharedRecipesTooltip>\n            );\n        case 'common':\n            return (\n                <CommonRecipesTooltip sharedRecipes={props.belongsToRecipes}>\n                    <Chip theme=\"whiteGreen\" asIcon size={32}>\n                        <Icon icon={PaperIcon} width={16} height={16} />\n                    </Chip>\n                </CommonRecipesTooltip>\n            );\n\n        default:\n            return null;\n    }\n};\n\nexport default SharedBetweenRecipesTooltip;\n","import { BREAKPOINT_MIN_FROM, BrowserSize } from './browser';\nimport type { SwiperBreakpoints } from './coopSwiperBreakpoints';\nimport { getSwiperBreakpoint } from './coopSwiperBreakpoints';\n\nexport class CoopSwiperBreakpointsUnique {\n    public static readonly AREA_MINICART = 'MiniCart';\n\n    public static readonly AREA_CHECKOUT_STEP_2 = 'CheckoutStep2';\n\n    public static readonly AREA_RECIPE_MODAL = 'RecipeModal';\n\n    static getUniqueBreakpointsFor(uniqueArea: keyof SwiperBreakpointsCollectionUnique) {\n        return UNIQUE_AREA_BREAKPOINTS[uniqueArea];\n    }\n}\n\ninterface SwiperBreakpointsCollectionUnique {\n    MiniCart: {\n        ProductList: SwiperBreakpoints;\n    };\n    CheckoutStep2: {\n        ProductList: SwiperBreakpoints;\n    };\n    RecipeModal: {\n        ProductList: SwiperBreakpoints;\n    };\n}\n\nconst UNIQUE_AREA_BREAKPOINTS: SwiperBreakpointsCollectionUnique = {\n    MiniCart: {\n        ProductList: {\n            [BREAKPOINT_MIN_FROM]: {\n                slidesPerView: 2.1,\n                slidesPerGroup: 2,\n            },\n            [getSwiperBreakpoint(BrowserSize.sm)]: {\n                slidesPerView: 2.5,\n                slidesPerGroup: 2,\n            },\n        },\n    },\n    CheckoutStep2: {\n        ProductList: {\n            [BREAKPOINT_MIN_FROM]: {\n                slidesPerView: 2.1,\n                slidesPerGroup: 2,\n            },\n            [getSwiperBreakpoint(BrowserSize.sm)]: {\n                slidesPerView: 3,\n                slidesPerGroup: 3,\n            },\n            [getSwiperBreakpoint(BrowserSize.xlg)]: {\n                slidesPerView: 4,\n                slidesPerGroup: 4,\n            },\n        },\n    },\n    RecipeModal: {\n        ProductList: {\n            [BREAKPOINT_MIN_FROM]: {\n                slidesPerView: 2.1,\n                slidesPerGroup: 2,\n            },\n            [getSwiperBreakpoint(BrowserSize.xsm)]: {\n                slidesPerView: 2.5,\n                slidesPerGroup: 2.5,\n            },\n            [getSwiperBreakpoint(BrowserSize.sm)]: {\n                slidesPerView: 3,\n                slidesPerGroup: 3,\n            },\n            [getSwiperBreakpoint(BrowserSize.md)]: {\n                slidesPerView: 4,\n                slidesPerGroup: 4,\n            },\n        },\n    },\n};\n"],"names":["_path","_path2","_extends","Object","assign","bind","n","e","arguments","length","t","r","hasOwnProperty","call","apply","_ref","title","titleId","props","width","height","viewBox","xmlns","id","d","fillRule","clipRule","ProductItemInfo","productUrl","handleLinkClick","name","manufacturer","variantName","packageSizeInformation","comparativePrice","comparativeText","isNicotineProduct","isPharmaceutical","promotion","isALink","packagingInfo","comparativePriceFormatted","className","choices","condition","renderWrapper","ch","href","style","whiteSpace","onClick","tabIndex","maxUseText","text","isNicotine","ProductItemImage","image","cssClass","url","transform","retinaTransform","fallbackUrl","ref","innerRef","additionalClassNames","isOutOfStock","slotLeft","slotSplash","slotPrice","children","bottomRow","ProductListItem","Image","Info","recipeSelectors","getSelectors","state","cart","recipes","selectNonEmptyRecipes","selectAll","cartRecipes","filter","x","productsMap","cartRecipeSelectors","all","nonEmpty","selectIds","map","item","code","selectById","_","recipeId","find","hasFoodboxInCart","some","group","isActive","icon","label","theme","handleSubsituteTrigger","size","ArrowPosition","TOOLTIP_DEFAULT","ARROW_BOTTOM","ARROW_LEFT","ARROW_CENTER","ARROW_RIGHT","Tooltip","tooltipClassNames","setTooltipClassNames","useState","currentPosRef","useRef","setCurrentPosRef","position","current","uniqueIdForAria","tooltipRef","handleOutsideClick","useOutsideClick","top","arrowPlacement","indexOf","undefined","arrowOffset","offsetHeight","bottom","resetTooltipPosition","useCallback","tooltipArrowPosCss","propsArrowPlacement","oldTooltipCss","push","join","left","getBoundingClientRect","oldPos","tooltipCss","Left","Right","Center","spaceOnLeft","spaceOnRight","TOOLTIP_WIDTH","window","innerWidth","getFreeSpace","calculateTooltipArrowPosition","onResize","useEffect","disabled","defaultCursor","handleClick","onMouseEnter","handleMouseOver","onMouseLeave","handleMouseOut","role","color","transition","tooltipStyle","visibleTooltip","content","TooltipOnHover","TooltipComponent","hovering","setHovering","isInCheckout","isMobile","mainSwiperClasses","spaceBetween","constrainedX","isConstrained","constrainedY","swiperOptions","useMemo","breakpoints","productSubstitutesBreakpoints","onButtonClick","stopPropagation","handleProductSubstitution","substitutes","swiperMainClassName","handleTeaserClick","product","containerCss","priceType","actionsSlot","activeSubstituteId","identifier","fullWidth","TabNavigationItem","renderTabItem","tab","tabItem","handleNavItemClick","TabPanel","panelClasses","cssClasses","indicatorRef","tabScrollableRef","activeItemRef","currentLinkRef","tabListRef","onLeftArrowClick","onRightArrowClick","arrowLeftRef","arrowRightRef","onItemClick","renderIndicator","linkWidth","offsetWidth","linkPos","offsetLeft","toggleNavigationButtons","tabScrollable","tabScrollableWidth","clientWidth","tabListWidth","scrollLeft","leftButton","rightButton","display","centerSelected","tabActive","tabActiveWidth","lastKnownScrollPosition","tabActivePosition","scroll","behavior","scrollBy","useLayoutEffect","useElementEvent","preventDefault","scrollWidth","useTabSwitcher","activeTabId","activeTab","items","renderDefaultTab","handleTabClick","itemClasses","type","ariaLabel","dangerouslySetInnerHTML","__html","disableTabAnimation","wrapperClasses","align","containerClasses","listClasses","additinalClasses","noTabIndicator","renderNextToTabs","hidePanelsWithCss","component","panelSlot","forcePanelRerenderOnTabChange","onMouseOver","onFocus","setActiveTabId","initialActiveId","useSwiperOverflowClasses","params","swiperIsXConstrained","swiperIsYConstrained","recipeNamesJoinedText","sharedRecipes","recipe","index","TooltipContent","belongsToRecipes","sectionType","Chip","asIcon","Icon","CoopSwiperBreakpointsUnique","getUniqueBreakpointsFor","uniqueArea","UNIQUE_AREA_BREAKPOINTS","AREA_MINICART","AREA_CHECKOUT_STEP_2","AREA_RECIPE_MODAL","MiniCart","ProductList","slidesPerView","slidesPerGroup","sm","CheckoutStep2","xlg","RecipeModal","xsm","md"],"sourceRoot":""}