{"version":3,"file":"8263-03af4a0f6a90d25d4236.js","mappings":"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","sources":["webpack://nikon-client/./components/atoms/Button/Button.tsx","webpack://nikon-client/./components/atoms/Image/Image.tsx","webpack://nikon-client/./components/atoms/PriceDisplayText/PriceDisplayText.tsx","webpack://nikon-client/./components/atoms/ReturnLink/ReturnLink.tsx","webpack://nikon-client/./utility/hooks/useHorizontalGrabScroll.ts","webpack://nikon-client/./utility/hooks/useHorizontalScrollShadows.ts","webpack://nikon-client/./components/atoms/ShadowContainerHorizontal/ShadowContainerHorizontal.tsx","webpack://nikon-client/./utility/hooks/useVerticalGrabScroll.ts","webpack://nikon-client/./utility/hooks/useVerticalScrollShadows.ts","webpack://nikon-client/./components/atoms/ShadowContainerVertical/ShadowContainerVertical.tsx","webpack://nikon-client/./utility/hooks/useDebounce.ts","webpack://nikon-client/./components/molecules/StickyNavigation/StickyNavigation.tsx","webpack://nikon-client/./models/enums/BreakpointEnum.ts","webpack://nikon-client/./models/enums/IBackgroundColourEnum.ts","webpack://nikon-client/./models/enums/ScrollProgressEnum.ts","webpack://nikon-client/./models/enums/StickyNavPositionEnum.ts","webpack://nikon-client/./state-management/AriaLabelsStore.ts","webpack://nikon-client/./state-management/StickyNavStore.ts","webpack://nikon-client/./utility/helpers/gtm.ts","webpack://nikon-client/./utility/hooks/useAriaLabels.ts","webpack://nikon-client/./utility/hooks/useBreakpoint.ts","webpack://nikon-client/./utility/hooks/useMediaQuery.ts","webpack://nikon-client/./utility/hooks/useResizeObserver.ts","webpack://nikon-client/./node_modules/.pnpm/react-icomoon@2.6.0_react@18.3.1/node_modules/react-icomoon/dist/index.js","webpack://nikon-client/./node_modules/.pnpm/zustand@3.7.2_react@18.3.1/node_modules/zustand/esm/index.js"],"sourcesContent":["import { ILink } from '@models/ILink';\nimport classNames from 'classnames';\nimport {\n  ButtonHTMLAttributes,\n  DetailedHTMLProps,\n  PropsWithChildren,\n} from 'react';\n\ninterface Props {\n  readonly className?: string;\n  readonly dataTestId?: string;\n  readonly disabled?: boolean;\n  readonly editHint?: string;\n  readonly link?: ILink;\n  readonly linkCallback?: () => void;\n  readonly secondary?: boolean;\n  readonly secondaryBackgroundClassName?: string;\n  readonly isLightMode?: boolean;\n  readonly inverted?: boolean;\n}\n\ntype ButtonProps = Props &\n  DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;\n\nconst Button = ({\n  children,\n  className,\n  dataTestId,\n  disabled = false,\n  editHint,\n  link,\n  linkCallback,\n  secondary = false,\n  secondaryBackgroundClassName = 'bg-transparent',\n  isLightMode,\n  inverted = false,\n  ...buttonProps\n}: PropsWithChildren<ButtonProps>) => {\n  const buttonClasses = classNames(\n    {\n      'bg-yellow py-1 px-4 text-black-100 hover:bg-yellow-100 focus:bg-yellow-500 active:bg-yellow-500':\n        !disabled && !secondary && !inverted,\n      //\n      [`${secondaryBackgroundClassName} border border-yellow py-[3px] px-[15px] text-black-100 hover:border-yellow-100 hover:bg-yellow-100 hover:text-black-100 focus:border-yellow-500 focus:bg-yellow-500 active:border-yellow-500 active:bg-yellow-500 ${\n        isLightMode\n          ? ''\n          : 'dark:text-white dark:hover:text-black-100 dark:focus:text-black-100 dark:active:text-black-100'\n      }`]: !disabled && secondary && !inverted,\n      //\n      'bg-grey text-grey-500 py-1 px-4': disabled,\n      //\n      'bg-black text-white py-1 px-4 active:bg-grey-600 hover:bg-grey-600 focus:bg-grey-600':\n        !disabled && !secondary && inverted,\n    },\n    'cta rounded-full inline-block min-h-min select-none',\n    className\n  );\n\n  return link?.url && (link?.name || children) && !disabled ? (\n    <a\n      className={buttonClasses}\n      href={link.url}\n      target={link.target}\n      data-epi-property-name={editHint}\n      onClick={linkCallback}\n      data-testid={dataTestId}\n    >\n      {children || link.name}\n    </a>\n  ) : (\n    <button\n      {...buttonProps}\n      className={buttonClasses}\n      disabled={disabled}\n      data-epi-property-name={editHint}\n      data-testid={dataTestId}\n    >\n      {children}\n    </button>\n  );\n};\n\nexport default Button;\n","import BreakpointEnum from '@models/enums/BreakpointEnum';\nimport { IImage } from '@models/IImage';\nimport useBreakpoint from '@utils/hooks/useBreakpoint';\nimport classNames from 'classnames';\nimport { PropsWithChildren, RefObject, useState } from 'react';\n\ninterface Props {\n  readonly classes?: string;\n  readonly dataTestId?: string;\n  readonly epiEdit?: string;\n  readonly image?: IImage;\n  readonly imageClasses?: string;\n  readonly imageRef?:\n    | RefObject<HTMLImageElement>\n    | ((node: HTMLElement | null) => void);\n  readonly lazyLoad?: boolean;\n  readonly progressiveLoad?: boolean;\n  readonly sizes?: string;\n}\n\nconst Image = ({\n  children,\n  classes,\n  dataTestId,\n  epiEdit,\n  image,\n  imageClasses,\n  imageRef,\n  lazyLoad = true,\n  progressiveLoad = true,\n  sizes = '',\n}: PropsWithChildren<Props>) => {\n  const mobileSource = image?.mobile;\n  const tabletSource = image?.tablet;\n  const desktopSource = image?.desktop;\n  const largeDesktopSource = image?.largeDesktop;\n  const breakpoint = useBreakpoint() as BreakpointEnum;\n  const [isLoaded, setIsLoaded] = useState<boolean>(false);\n\n  if (!desktopSource?.url) return null;\n\n  const currentSrc = {\n    [BreakpointEnum.Small]: mobileSource,\n    [BreakpointEnum.Medium]: tabletSource,\n    [BreakpointEnum.Large]: desktopSource,\n    [BreakpointEnum.XLarge]: largeDesktopSource,\n  };\n\n  return (\n    <picture className={classNames(classes)}>\n      <source\n        type=\"image/webp\"\n        sizes={sizes}\n        srcSet={`${mobileSource?.url} 376w, ${tabletSource?.url} 768w, ${desktopSource?.url} 1024w, ${largeDesktopSource?.url} 1440w`}\n      />\n      <img\n        ref={imageRef}\n        alt={image?.altText?.length ? image?.altText : 'nikon-image'}\n        className={classNames(\n          imageClasses,\n          'transition duration-500 ease-in-out'\n        )}\n        data-epi-property-name={epiEdit}\n        draggable=\"false\"\n        loading={lazyLoad ? 'lazy' : 'eager'}\n        onLoad={() => setIsLoaded(true)}\n        sizes={sizes}\n        src={\n          isLoaded && progressiveLoad\n            ? currentSrc[breakpoint]?.url\n            : mobileSource?.url\n        }\n        height={currentSrc[breakpoint]?.height}\n        width={currentSrc[breakpoint]?.width}\n        srcSet={`${mobileSource?.originalUrl} 376w, ${tabletSource?.originalUrl} 768w, ${desktopSource?.originalUrl} 1024w, ${largeDesktopSource?.originalUrl} 1440w`}\n        {...(dataTestId && { 'data-testid': dataTestId })}\n      />\n      {isLoaded && children}\n    </picture>\n  );\n};\n\nexport default Image;\n","import { IPricingData } from '@models/IPricingData';\nimport classNames from 'classnames';\n\ninterface Props {\n  readonly centerText?: boolean;\n  readonly fromPriceLabel?: string;\n  readonly pricingData: IPricingData;\n  readonly vatLabel?: string;\n  readonly shippingLabel?: string;\n  readonly rrpLabel?: string;\n  readonly smallText?: boolean;\n  readonly containerClassName?: string;\n  readonly taxesTopMarginClassName?: string;\n  readonly taxesClassName?: string;\n  readonly priceClassName?: string;\n  readonly dataTestId?: string;\n  readonly isLightMode?: boolean;\n}\n\nconst PriceDisplayText = ({\n  fromPriceLabel,\n  pricingData,\n  vatLabel,\n  shippingLabel,\n  rrpLabel,\n  centerText = false,\n  smallText = false,\n  containerClassName,\n  taxesTopMarginClassName = 'mt-2',\n  taxesClassName,\n  priceClassName,\n  dataTestId,\n  isLightMode,\n}: Props) => {\n  const {\n    amountSaved,\n    formattedPrice,\n    formattedCalculatedPrice,\n    shippingCost,\n    price,\n  } = pricingData;\n\n  if (typeof price !== 'number') {\n    return null;\n  }\n\n  return (\n    <div\n      className={classNames(\n        containerClassName,\n        smallText ? 'body-two font-light' : 'body-one',\n        {\n          'flex flex-col items-center': centerText,\n        }\n      )}\n      data-testid={dataTestId}\n    >\n      {(centerText ||\n        (amountSaved > 0 && formattedPrice) ||\n        formattedCalculatedPrice) && (\n        <span className=\"flex flex-wrap gap-x-2\">\n          {fromPriceLabel && <span>{fromPriceLabel}</span>}\n\n          {amountSaved > 0 && formattedPrice && (\n            <>\n              {rrpLabel && <span className=\"mr-2\">{rrpLabel}</span>}\n              <span\n                className=\"font-extralight line-through decoration-1\"\n                data-testid=\"Price-Display-Text-Discount-Price\"\n              >\n                {formattedPrice}\n              </span>\n            </>\n          )}\n\n          {formattedCalculatedPrice && (\n            <span\n              className={classNames(\n                {\n                  'font-normal': !smallText,\n                  'text-grey-450': amountSaved > 0,\n                  'dark:text-yellow': amountSaved > 0 && !isLightMode,\n                },\n                priceClassName\n              )}\n              data-testid=\"Price-Display-Text-Price\"\n            >\n              {formattedCalculatedPrice}\n            </span>\n          )}\n        </span>\n      )}\n\n      {(vatLabel || (!shippingCost && shippingLabel)) && (\n        <p\n          className={classNames(taxesClassName, 'body-four block', {\n            [`${taxesTopMarginClassName}`]: !smallText,\n          })}\n          data-testid=\"Price-Display-Text-VAT/Shipping\"\n        >\n          {vatLabel && vatLabel}\n          {vatLabel && !shippingCost && shippingLabel && ' + '}\n          {!shippingCost && shippingLabel && shippingLabel}\n        </p>\n      )}\n    </div>\n  );\n};\n\nexport default PriceDisplayText;\n","import Icon from '@atoms/Icon/Icon';\nimport { ILink } from '@models/ILink';\nimport classNames from 'classnames';\n\ninterface Props {\n  readonly className?: string;\n  readonly editHint?: string;\n  readonly link: ILink;\n  readonly dataTestId?: string;\n}\n\nconst ReturnLink = ({\n  className,\n  editHint,\n  link,\n  dataTestId = 'Return-Link',\n}: Props) => (\n  <a\n    href={link.url}\n    className={classNames(\n      className,\n      'body-two group flex flex-row items-center gap-x-1 text-black-100 hover:text-grey-500 dark:text-white dark:hover:text-yellow'\n    )}\n    data-epi-property-name={editHint}\n    data-testid={dataTestId}\n  >\n    <Icon\n      name=\"chevron_right\"\n      className=\"-translate-x-2 rotate-180\"\n      colorClassName=\"text-black-100 group-hover:text-grey-500 dark:text-white dark:group-hover:text-yellow\"\n    />\n    {link.name}\n  </a>\n);\n\nexport default ReturnLink;\n","import { RefObject, useEffect, useRef, useState } from 'react';\n\nconst useHorizontalGrabScroll = (\n  containerRef: RefObject<HTMLElement>,\n  disabled: boolean\n) => {\n  const [isMouseDown, setIsMouseDown] = useState(false);\n  const mouseScrollPosition = useRef<{\n    top: number;\n    left: number;\n    x: number;\n    y: number;\n  }>({\n    top: 0,\n    left: 0,\n    x: 0,\n    y: 0,\n  });\n\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container?.clientWidth) return;\n\n    if (container.clientWidth >= container.scrollWidth || disabled) {\n      container.style.cursor = 'inherit';\n      return;\n    }\n\n    if (isMouseDown) {\n      container.style.cursor = 'grabbing';\n      return;\n    }\n\n    container.style.cursor = 'grab';\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [isMouseDown, disabled]);\n\n  useEffect(() => {\n    mouseScrollPosition.current = { top: 0, left: 0, x: 0, y: 0 };\n    const container = containerRef.current;\n\n    if (!container) return () => ({});\n    if (disabled) {\n      container.scrollTop = 0;\n      container.scrollLeft = 0;\n\n      return () => ({});\n    }\n\n    const mouseMoveHandler = (e: MouseEvent) => {\n      const dx = e.clientX - mouseScrollPosition.current.x;\n      const dy = e.clientY - mouseScrollPosition.current.y;\n\n      container.scrollTop = mouseScrollPosition.current.top - dy;\n      container.scrollLeft = mouseScrollPosition.current.left - dx;\n    };\n\n    const mouseUpHandler = () => {\n      document.removeEventListener('mousemove', mouseMoveHandler);\n      document.removeEventListener('mouseup', mouseUpHandler);\n      setIsMouseDown(false);\n    };\n\n    const mouseDownHandler = (e: MouseEvent) => {\n      mouseScrollPosition.current = {\n        top: container.scrollTop,\n        left: container.scrollLeft,\n        x: e.clientX,\n        y: e.clientY,\n      };\n      setIsMouseDown(true);\n\n      document.addEventListener('mousemove', mouseMoveHandler);\n      document.addEventListener('mouseup', mouseUpHandler);\n    };\n\n    const onWheel = (e: WheelEvent) => {\n      if (e.deltaY === 0) return;\n\n      container.scrollTo({\n        left: container.scrollLeft + e.deltaY,\n        behavior: 'smooth',\n      });\n    };\n\n    container.addEventListener('mousedown', mouseDownHandler);\n    container.addEventListener('wheel', onWheel, { passive: true });\n\n    return () => {\n      container.removeEventListener('mousedown', mouseDownHandler);\n      container.removeEventListener('wheel', onWheel);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [disabled]);\n};\n\nexport default useHorizontalGrabScroll;\n","import ScrollProgressEnum from '@models/enums/ScrollProgressEnum';\nimport { useMotionValueEvent, useScroll } from 'framer-motion';\nimport { RefObject, useEffect, useState } from 'react';\n\nconst useHorizontalScrollShadows = (\n  containerRef: RefObject<HTMLElement>,\n  threshold: number,\n  disabled: boolean\n) => {\n  const { scrollXProgress } = useScroll({ container: containerRef });\n  const [isStart, setIsStart] = useState(true);\n  const [isEnd, setIsEnd] = useState(false);\n  const [scrollProgress, setScrollProgress] = useState(\n    ScrollProgressEnum.Start\n  );\n\n  useMotionValueEvent(scrollXProgress, 'change', (value: number) => {\n    if (value < threshold) {\n      setScrollProgress(ScrollProgressEnum.Start);\n    }\n\n    if (value >= threshold && value <= 1 - threshold) {\n      setScrollProgress(ScrollProgressEnum.Middle);\n    }\n\n    if (value > 1 - threshold) {\n      setScrollProgress(ScrollProgressEnum.End);\n    }\n  });\n\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container?.clientWidth || disabled) return;\n\n    const { clientWidth, scrollWidth } = container;\n    if (clientWidth >= scrollWidth) {\n      setIsStart(true);\n      setIsEnd(true);\n\n      return;\n    }\n\n    if (scrollProgress === ScrollProgressEnum.Start) {\n      setIsStart(true);\n      setIsEnd(false);\n    }\n\n    if (scrollProgress === ScrollProgressEnum.Middle) {\n      setIsStart(false);\n      setIsEnd(false);\n    }\n\n    if (scrollProgress === ScrollProgressEnum.End) {\n      setIsEnd(true);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [disabled, scrollProgress]);\n\n  return { isStart, isEnd };\n};\n\nexport default useHorizontalScrollShadows;\n","import useHorizontalGrabScroll from '@utils/hooks/useHorizontalGrabScroll';\nimport useHorizontalScrollShadows from '@utils/hooks/useHorizontalScrollShadows';\nimport classNames from 'classnames';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport {\n  PropsWithChildren,\n  forwardRef,\n  useImperativeHandle,\n  useRef,\n} from 'react';\n\nexport interface IShadowContainerHorizontalRef {\n  readonly scrollTo: (offset: number) => void;\n  readonly getOffsetWidth: () => number;\n}\n\ninterface Props {\n  readonly className?: string;\n  readonly shadowColour?: string;\n  readonly threshold?: number;\n  readonly showStart?: boolean; // Manually override shadows from a parent component\n  readonly showEnd?: boolean;\n  readonly disableScroll?: boolean; // Used together with showStart/showEnd to disable scrolling within the container (e.g. when we want to wrap a carousel within some left/right shadows, we want to use the carousel's scrolling/swiping, not the container's one)\n  readonly shadowWidth?: string;\n  readonly isNoWrapEnabled?: boolean;\n}\n\nconst ShadowContainerHorizontal = forwardRef<\n  IShadowContainerHorizontalRef,\n  PropsWithChildren<Props>\n>(\n  (\n    {\n      children,\n      className,\n      disableScroll = false,\n      shadowColour = 'from-white dark:from-black-100',\n      threshold = 0.05,\n      showStart = false,\n      showEnd = true,\n      shadowWidth = 'w-10',\n      isNoWrapEnabled = true,\n    },\n    ref\n  ) => {\n    const containerRef = useRef<HTMLDivElement>(null);\n    const { isStart, isEnd } = useHorizontalScrollShadows(\n      containerRef,\n      threshold,\n      disableScroll\n    );\n    useHorizontalGrabScroll(containerRef, disableScroll);\n\n    useImperativeHandle(ref, () => ({\n      scrollTo: (leftOffset: number) => {\n        containerRef.current?.scrollTo({\n          left: leftOffset,\n          behavior: 'smooth',\n        });\n      },\n      getOffsetWidth: () => containerRef.current?.offsetWidth ?? 0,\n    }));\n\n    return (\n      <div className={classNames(className, 'relative')}>\n        <AnimatePresence>\n          {(!isStart || showStart) && (\n            <motion.span\n              animate={{ opacity: 1 }}\n              className={classNames(\n                shadowColour,\n                shadowWidth,\n                'pointer-events-none absolute left-0 top-0 z-10 -ml-[1px] h-full bg-gradient-to-r to-transparent'\n              )}\n              exit={{ opacity: 0 }}\n              initial={{ opacity: 0 }}\n              transition={{ duration: 0.25 }}\n            />\n          )}\n        </AnimatePresence>\n\n        <div\n          ref={containerRef}\n          // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n          tabIndex={0}\n          className={classNames(\n            {\n              'z-0 overflow-x-hidden': disableScroll,\n              'overflow-x-auto': !disableScroll,\n              'whitespace-nowrap': isNoWrapEnabled,\n            },\n            'relative select-none scrollbar-hide'\n          )}\n        >\n          {children}\n        </div>\n\n        {/* isEnd is always false when using showEnd override so !isEnd is always true */}\n        <AnimatePresence>\n          {!isEnd && showEnd && (\n            <motion.span\n              animate={{ opacity: 1 }}\n              className={classNames(\n                shadowColour || 'from-white dark:from-black-100',\n                shadowWidth,\n                'pointer-events-none absolute right-0 top-0 z-10 -ml-[1px] h-full bg-gradient-to-l to-transparent'\n              )}\n              exit={{ opacity: 0 }}\n              initial={{ opacity: 0 }}\n              transition={{ duration: 0.25 }}\n            />\n          )}\n        </AnimatePresence>\n      </div>\n    );\n  }\n);\n\nexport default ShadowContainerHorizontal;\n","import { RefObject, useEffect, useRef, useState } from 'react';\n\nconst useVerticalGrabScroll = (\n  containerRef: RefObject<HTMLElement>,\n  containerHeight: number,\n  contentHeight: number,\n  disabled = false\n) => {\n  const [isMouseDown, setIsMouseDown] = useState(false);\n  const mouseScrollPosition = useRef<{ top: number; y: number }>({\n    top: 0,\n    y: 0,\n  });\n\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container?.clientWidth) return;\n\n    if (containerHeight >= contentHeight || disabled) {\n      container.style.cursor = 'inherit';\n      return;\n    }\n\n    if (isMouseDown) {\n      container.style.cursor = 'grabbing';\n      return;\n    }\n\n    container.style.cursor = 'grab';\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [containerHeight, contentHeight, isMouseDown, disabled]);\n\n  useEffect(() => {\n    mouseScrollPosition.current = { top: 0, y: 0 };\n    const container = containerRef.current;\n\n    if (!container) return () => ({});\n    if (disabled) {\n      container.scrollTop = 0;\n\n      return () => ({});\n    }\n\n    const mouseMoveHandler = (e: MouseEvent) => {\n      const dy = e.clientY - mouseScrollPosition.current.y;\n\n      container.scrollTop = mouseScrollPosition.current.top - dy;\n    };\n\n    const mouseUpHandler = () => {\n      document.removeEventListener('mousemove', mouseMoveHandler);\n      document.removeEventListener('mouseup', mouseUpHandler);\n      setIsMouseDown(false);\n    };\n\n    const mouseDownHandler = (e: MouseEvent) => {\n      mouseScrollPosition.current = {\n        top: container.scrollTop,\n        y: e.clientY,\n      };\n      setIsMouseDown(true);\n\n      document.addEventListener('mousemove', mouseMoveHandler);\n      document.addEventListener('mouseup', mouseUpHandler);\n    };\n\n    container.addEventListener('mousedown', mouseDownHandler);\n\n    return () => {\n      container.removeEventListener('mousedown', mouseDownHandler);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [disabled]);\n};\n\nexport default useVerticalGrabScroll;\n","import ScrollProgressEnum from '@models/enums/ScrollProgressEnum';\nimport { useMotionValueEvent, useScroll } from 'framer-motion';\nimport { RefObject, useEffect, useState } from 'react';\n\nconst useVerticalScrollShadows = (\n  containerRef: RefObject<HTMLElement>,\n  containerHeight: number,\n  contentHeight: number,\n  disabled = false\n) => {\n  const { scrollYProgress } = useScroll({\n    container: containerRef,\n  });\n  const [isStart, setIsStart] = useState(true);\n  const [isEnd, setIsEnd] = useState(false);\n  const [scrollProgress, setScrollProgress] = useState(\n    ScrollProgressEnum.Start\n  );\n  const threshold = 0.05;\n\n  useMotionValueEvent(scrollYProgress, 'change', (value: number) => {\n    if (value < threshold) {\n      setScrollProgress(ScrollProgressEnum.Start);\n    }\n\n    if (value >= threshold && value <= 1 - threshold) {\n      setScrollProgress(ScrollProgressEnum.Middle);\n    }\n\n    if (value > 1 - threshold) {\n      setScrollProgress(ScrollProgressEnum.End);\n    }\n  });\n\n  useEffect(() => {\n    if (!containerHeight || disabled) return;\n\n    if (containerHeight >= contentHeight) {\n      setIsStart(true);\n      setIsEnd(true);\n\n      return;\n    }\n\n    if (scrollProgress === ScrollProgressEnum.Start) {\n      setIsStart(true);\n      setIsEnd(false);\n    }\n\n    if (scrollProgress === ScrollProgressEnum.Middle) {\n      setIsStart(false);\n      setIsEnd(false);\n    }\n\n    if (scrollProgress === ScrollProgressEnum.End) {\n      setIsEnd(true);\n    }\n  }, [disabled, scrollProgress, containerHeight, contentHeight]);\n\n  return { isStart, isEnd };\n};\n\nexport default useVerticalScrollShadows;\n","import useResizeObserver from '@utils/hooks/useResizeObserver';\nimport useVerticalGrabScroll from '@utils/hooks/useVerticalGrabScroll';\nimport useVerticalScrollShadows from '@utils/hooks/useVerticalScrollShadows';\nimport classNames from 'classnames';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport {\n  PropsWithChildren,\n  forwardRef,\n  useImperativeHandle,\n  useRef,\n} from 'react';\n\nexport interface IShadowContainerVerticalRef {\n  readonly scrollTo: (offset: number, behavior?: ScrollBehavior) => void;\n}\n\ninterface Props {\n  readonly className?: string;\n  readonly customScrollbarTheme?: 'light' | 'dark';\n  readonly hideScrollbar?: boolean;\n  readonly shadowColour?: string;\n  readonly disableScroll?: boolean;\n  readonly shadowHeight?: string;\n}\n\nconst ShadowContainerVertical = forwardRef<\n  IShadowContainerVerticalRef,\n  PropsWithChildren<Props>\n>(\n  (\n    {\n      children,\n      className,\n      customScrollbarTheme,\n      disableScroll = false,\n      shadowColour = 'from-white dark:from-black-100',\n      hideScrollbar = true,\n      shadowHeight = 'h-10',\n    },\n    ref\n  ) => {\n    const containerRef = useRef<HTMLDivElement | null>(null);\n    const [containerRefCallback, { height: containerHeight }] =\n      useResizeObserver();\n    const [contentRefCallback, { height: contentHeight }] = useResizeObserver();\n    const { isStart, isEnd } = useVerticalScrollShadows(\n      containerRef,\n      containerHeight,\n      contentHeight,\n      disableScroll\n    );\n    useVerticalGrabScroll(\n      containerRef,\n      containerHeight,\n      contentHeight,\n      disableScroll\n    );\n\n    useImperativeHandle(ref, () => ({\n      scrollTo: (topOffset: number, behavior: ScrollBehavior = 'smooth') => {\n        containerRef.current?.scrollTo({ top: topOffset, behavior });\n      },\n    }));\n\n    return (\n      <div className={classNames(className, 'relative h-full')}>\n        <AnimatePresence>\n          {!isStart && !disableScroll && (\n            <motion.span\n              animate={{ opacity: 1 }}\n              className={classNames(\n                shadowColour,\n                shadowHeight,\n                `pointer-events-none absolute top-0 z-10 w-full bg-gradient-to-b to-transparent`\n              )}\n              exit={{ opacity: 0 }}\n              initial={{ opacity: 0 }}\n              transition={{ duration: 0.25 }}\n            />\n          )}\n        </AnimatePresence>\n\n        <div\n          ref={(node) => {\n            containerRef.current = node;\n            containerRefCallback(node);\n          }}\n          // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n          tabIndex={0}\n          className={classNames(\n            {\n              'scrollbar-hide': hideScrollbar,\n              'overflow-y-hidden': disableScroll,\n              'overflow-y-auto': !disableScroll,\n              'custom-scrollbar': !disableScroll && customScrollbarTheme,\n              'custom-scrollbar--light': customScrollbarTheme === 'light',\n              'custom-scrollbar--dark': customScrollbarTheme === 'dark',\n            },\n            'relative h-full select-none'\n          )}\n        >\n          <div ref={contentRefCallback}>{children}</div>\n        </div>\n\n        <AnimatePresence>\n          {!isEnd && !disableScroll && (\n            <motion.span\n              animate={{ opacity: 1 }}\n              className={classNames(\n                shadowColour || 'from-white dark:from-black-100',\n                shadowHeight,\n                `pointer-events-none absolute bottom-0 z-10 w-full bg-gradient-to-t to-transparent`\n              )}\n              exit={{ opacity: 0 }}\n              initial={{ opacity: 0 }}\n              transition={{ duration: 0.25 }}\n            />\n          )}\n        </AnimatePresence>\n      </div>\n    );\n  }\n);\n\nexport default ShadowContainerVertical;\n","import { useEffect, useState } from 'react';\n\nfunction useDebounce<T>(value: T, delay?: number): T {\n  const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n  useEffect(() => {\n    const timer = setTimeout(() => setDebouncedValue(value), delay || 500);\n\n    return () => {\n      clearTimeout(timer);\n    };\n  }, [value, delay]);\n\n  return debouncedValue;\n}\n\nexport default useDebounce;\n","import Button from '@atoms/Button/Button';\nimport Icon from '@atoms/Icon/Icon';\nimport Image from '@atoms/Image/Image';\nimport PriceDisplayText from '@atoms/PriceDisplayText/PriceDisplayText';\nimport ReturnLink from '@atoms/ReturnLink/ReturnLink';\nimport ShadowContainerHorizontal, {\n  IShadowContainerHorizontalRef,\n} from '@atoms/ShadowContainerHorizontal/ShadowContainerHorizontal';\nimport ShadowContainerVertical from '@atoms/ShadowContainerVertical/ShadowContainerVertical';\nimport BackgroundColourEnum from '@models/enums/IBackgroundColourEnum';\nimport StickyNavPosition from '@models/enums/StickyNavPositionEnum';\nimport { IAnchorLink } from '@models/IAnchorLink';\nimport { ICTALinks } from '@models/ICTALinks';\nimport { IImage } from '@models/IImage';\nimport { ILink } from '@models/ILink';\nimport { IPricingData } from '@models/IPricingData';\nimport useStickyNavPositionStore from '@state/StickyNavStore';\nimport updateDataLayer from '@utils/helpers/gtm';\nimport useAriaLabels from '@utils/hooks/useAriaLabels';\nimport useDebounce from '@utils/hooks/useDebounce';\nimport useMediaQuery from '@utils/hooks/useMediaQuery';\nimport useResizeObserver from '@utils/hooks/useResizeObserver';\nimport classNames from 'classnames';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface INavItem extends IAnchorLink {\n  readonly name?: string;\n  readonly url?: string;\n  readonly isActive?: boolean;\n}\n\ninterface Props {\n  readonly title?: string;\n  readonly subTitle?: string;\n  readonly vatLabel?: string;\n  readonly shippingLabel?: string;\n  readonly thumbnail?: IImage;\n  readonly icon?: IImage;\n  readonly buyNowLink?: ILink;\n  readonly anchorNavigationItems: IAnchorLink[] | undefined;\n  readonly ctaLinks?: ICTALinks;\n  readonly pricingData?: IPricingData;\n  readonly fromPriceLabel?: string;\n  readonly navPosition?: StickyNavPosition.Top | StickyNavPosition.Bottom;\n  readonly returnLink?: ILink;\n  readonly backgroundColour?:\n    | BackgroundColourEnum.Black\n    | BackgroundColourEnum.Grey;\n  readonly showReturnLinkMobileOnly?: boolean;\n  readonly tabbedNavigation?: ILink[];\n  readonly shouldHavePadding?: boolean;\n}\n\nconst StickyNavigation = ({\n  title,\n  subTitle,\n  vatLabel,\n  shippingLabel,\n  thumbnail,\n  icon,\n  buyNowLink,\n  anchorNavigationItems,\n  ctaLinks,\n  pricingData,\n  fromPriceLabel,\n  navPosition = StickyNavPosition.Top,\n  returnLink,\n  backgroundColour = BackgroundColourEnum.Black,\n  showReturnLinkMobileOnly,\n  tabbedNavigation = [],\n  shouldHavePadding,\n}: Props) => {\n  const [isNavItemsDropdownDisplayed, setIsNavItemsDropdownDisplayed] =\n    useState(false);\n  const [activeElement, setActiveElement] = useState('');\n  const [stickToBottom, setStickToBottom] = useState(false);\n  const debouncedValue = useDebounce(activeElement, 250);\n  const isMobile = useMediaQuery(1024);\n  const isBelowLargeDesktop = useMediaQuery(1440);\n  const isTabbed = tabbedNavigation.length > 0;\n  const [productNavRefCallback, { clientHeight: productNavHeight }] =\n    useResizeObserver();\n  const navRef = useRef<HTMLDivElement | null>(null);\n  const tabbedNavRef = useRef<HTMLDivElement | null>(null);\n  const containerRef = useRef<IShadowContainerHorizontalRef>(null);\n  const [currentBackgroundColour, setCurrentBackgroundColour] =\n    useState(backgroundColour);\n  const { setStickyNavPosition } = useStickyNavPositionStore((state) => ({\n    setStickyNavPosition: state.setStickyNavPosition,\n  }));\n  const { closeModalAriaLabel, openMenuAriaLabel } = useAriaLabels();\n  const colourCodesMapper = {\n    [BackgroundColourEnum.Grey]: '#1F191A',\n    [BackgroundColourEnum.Black]: '#0A0203',\n  };\n  const navPadding = (tabbedNavRef.current?.offsetHeight ?? 40) + 15;\n\n  useEffect(() => {\n    if (!isBelowLargeDesktop) {\n      setIsNavItemsDropdownDisplayed(false);\n    }\n  }, [isBelowLargeDesktop]);\n\n  const navItems: INavItem[] = anchorNavigationItems\n    ? anchorNavigationItems.map((item) => ({\n        title: item.title,\n        primary: item.primary,\n        secondary: item.secondary,\n        anchor: item.anchor,\n      }))\n    : tabbedNavigation.map((item) => ({\n        name: item.name,\n        url: item.url,\n        primary: false,\n        secondary: false,\n        isActive: item.isActive,\n      }));\n\n  const ctaNavItems = ctaLinks\n    ? []\n    : navItems.filter((item) => item.primary || item.secondary).slice(0, 2);\n\n  const nonCtaNavItems = ctaLinks\n    ? navItems.map((item) => ({\n        ...item,\n        primary: false,\n        secondary: false,\n      }))\n    : navItems.filter((item) => !item.primary && !item.secondary);\n\n  const mobileDropdownNavItems = [\n    ...nonCtaNavItems,\n    ...(ctaNavItems.length === 2 ? ctaNavItems : []),\n  ];\n  const displayedCTALinks =\n    ctaLinks?.links\n      .filter((ctaLink) => ctaLink.link.url && ctaLink.link.name)\n      .slice(0, 2) ?? [];\n\n  const getScrollTopOffset = () => {\n    const anchorMenu = document.getElementById('AnchorMenu');\n    const productNavigation = document.getElementById('ProductNavigation');\n    const siteNotifications = document.getElementById('SiteNotifications');\n    let yOffset = -20;\n\n    if (anchorMenu) yOffset -= anchorMenu.clientHeight;\n    if (productNavigation && !stickToBottom)\n      yOffset -= productNavigation.clientHeight;\n    if (siteNotifications) yOffset -= siteNotifications.clientHeight;\n\n    return yOffset;\n  };\n\n  const scrollTo = (id: string) => {\n    const element = document.getElementById(id);\n    if (!element) return;\n\n    const lazyLoadedImages = Array.from(\n      document.querySelectorAll('img[loading=\"lazy\"]')\n    ) as HTMLImageElement[];\n    const imagesBeforeElement = lazyLoadedImages.filter(\n      (image) =>\n        element.compareDocumentPosition(image) ===\n        Node.DOCUMENT_POSITION_PRECEDING\n    );\n    imagesBeforeElement.forEach((image) => {\n      image.setAttribute('loading', 'eager');\n    });\n\n    // Need some timeout to allow for the images to load and adjust the page scrolling\n    const scrollTimeout = (() => {\n      if (imagesBeforeElement.length === 0) return 0;\n      return isMobile ? 400 : 300;\n    })();\n    setTimeout(() => {\n      const scrollTopPosition =\n        (element?.getBoundingClientRect().top || 0) +\n        window.scrollY +\n        getScrollTopOffset();\n\n      window.scrollTo({ top: scrollTopPosition, behavior: 'smooth' });\n    }, scrollTimeout);\n  };\n\n  const closeMobileNavDropdown = () => {\n    setTimeout(() => setIsNavItemsDropdownDisplayed(false), 750);\n  };\n\n  const filteredIds = useCallback(\n    () => navItems.map((item) => `#a-${item.anchor}`),\n    [navItems]\n  );\n\n  const updateActiveSection = useCallback(() => {\n    const elements = document.querySelectorAll(filteredIds().toString());\n\n    const observer = new IntersectionObserver(\n      (entries) => {\n        const listOfCurrentlyIntersecting = entries.filter(\n          (entry) => entry.isIntersecting\n        );\n\n        let chosenItem: IntersectionObserverEntry | undefined;\n\n        if (listOfCurrentlyIntersecting.length === 1) {\n          chosenItem = listOfCurrentlyIntersecting.at(0);\n        }\n\n        if (listOfCurrentlyIntersecting.length > 1) {\n          let found: IntersectionObserverEntry | undefined;\n          listOfCurrentlyIntersecting.forEach((el) => {\n            if (!found) found = el;\n            if (el.intersectionRatio >= found?.intersectionRatio) found = el;\n          });\n\n          chosenItem = found;\n        }\n\n        setActiveElement(chosenItem?.target.id.split('-')[1] || '');\n      },\n      {\n        rootMargin: '-30% 0% -30% 0%',\n        threshold: [0, 0.25, 0.5, 0.75, 1],\n      }\n    );\n\n    elements.forEach((el) => observer.observe(el));\n  }, [filteredIds]);\n\n  useEffect(() => {\n    window.addEventListener('scroll', updateActiveSection);\n\n    return () => window.removeEventListener('scroll', updateActiveSection);\n  }, [updateActiveSection]);\n\n  useEffect(() => {\n    if (!navRef?.current) return;\n\n    const observer = new IntersectionObserver(\n      ([entry]) => {\n        const newBackgroundColour =\n          entry?.intersectionRatio === 1\n            ? backgroundColour\n            : BackgroundColourEnum.Black;\n        setCurrentBackgroundColour(newBackgroundColour);\n      },\n      { threshold: 1 }\n    );\n\n    observer.observe(navRef.current);\n  }, [backgroundColour]);\n\n  useEffect(() => {\n    const productNav = document.getElementById('ProductNavigation');\n    if (!productNav) return;\n\n    productNavRefCallback(productNav);\n  }, [productNavRefCallback]);\n\n  useEffect(() => {\n    if (!stickToBottom) return;\n\n    const productNav = document.getElementById('ProductNavigation');\n    if (!productNav) return;\n\n    if (isMobile) {\n      document.documentElement.style.setProperty(\n        'padding-bottom',\n        `${productNavHeight - 1}px`\n        // Used that \"- 1\" to cover the sub-pixel rendering issue noticed in some browsers at certain zoom levels\n      );\n      productNav.classList.remove('sticky', 'top-0');\n      productNav.classList.add('fixed', 'bottom-0', 'w-full');\n      productNav.style.top = 'auto';\n    } else {\n      document.documentElement.style.removeProperty('padding-bottom');\n\n      if (productNav.style.top === 'auto') productNav.style.top = '';\n      productNav.classList.add('sticky', 'top-0');\n      productNav.classList.remove('fixed', 'bottom-0', 'w-full');\n    }\n  }, [stickToBottom, isMobile, productNavHeight]);\n\n  useEffect(() => {\n    setStickToBottom(navPosition === StickyNavPosition.Bottom && !!isMobile);\n    setStickyNavPosition(navPosition);\n  }, [navPosition, setStickyNavPosition, isMobile]);\n\n  useEffect(() => {\n    if (!containerRef.current || !tabbedNavRef.current) return;\n\n    const activeNavigationElement = tabbedNavRef.current?.querySelector(\n      'a[data-nav-active=\"true\"]'\n    ) as HTMLElement;\n\n    if (activeNavigationElement) {\n      const containerWidth = containerRef.current.getOffsetWidth();\n      const leftOffset =\n        activeNavigationElement.offsetLeft +\n        activeNavigationElement.clientWidth / 2 -\n        containerWidth / 2;\n\n      containerRef.current.scrollTo(leftOffset);\n    }\n  }, []);\n\n  return (\n    <motion.div\n      ref={navRef}\n      {...(!isTabbed\n        ? {\n            initial: {\n              backgroundColor: colourCodesMapper[backgroundColour],\n            },\n            animate: {\n              backgroundColor: colourCodesMapper[currentBackgroundColour],\n            },\n          }\n        : {})}\n      className={classNames(\n        {\n          'pt-20': navItems.length === 0,\n        },\n        'dark relative z-10 flex min-h-[76px] flex-row items-center px-5 xl:px-7.5 xl:py-6',\n        {\n          'bg-grey-600 py-5 lg:bg-black-100': isTabbed,\n          'py-7.5': !isTabbed,\n          'mb-7.5 lg:mb-24': shouldHavePadding,\n        }\n      )}\n      style={{\n        ...(isMobile && isTabbed && navPosition === StickyNavPosition.Top\n          ? {\n              paddingBottom: `${navPadding}px`,\n            }\n          : {}),\n        ...(isMobile && isTabbed && navPosition === StickyNavPosition.Bottom\n          ? {\n              paddingTop: `${navPadding}px`,\n            }\n          : {}),\n      }}\n      data-testid=\"CT-06-Sticky-Navigation\"\n    >\n      {returnLink?.name && returnLink?.url && (\n        <div\n          className={classNames(\n            'pointer-events-none absolute left-0 flex px-5 lg:px-7',\n            {\n              'xl:hidden': showReturnLinkMobileOnly,\n            }\n          )}\n        >\n          <span className=\"pointer-events-auto\">\n            <ReturnLink\n              link={returnLink}\n              dataTestId=\"CT-06-Sticky-Navigation-Return-Link\"\n            />\n          </span>\n        </div>\n      )}\n\n      {buyNowLink?.name && (\n        <div className=\"flex w-1/2 flex-col items-start text-white md:flex-row md:items-center xl:w-1/3\">\n          {thumbnail && (\n            <Image\n              image={thumbnail}\n              imageClasses=\"md:mr-7.5 w-20 object-contain hidden md:block\"\n              sizes=\"300px\"\n              dataTestId=\"CT-06-Sticky-Navigation-Thumbnail\"\n            />\n          )}\n\n          <div className=\"md:pr-7.5\">\n            {icon ? (\n              <Image\n                image={icon}\n                imageClasses=\"w-7.5 mb-2\"\n                sizes=\"300px\"\n                dataTestId=\"CT-06-Sticky-Navigation-Icon\"\n              />\n            ) : (\n              <p\n                className={isTabbed ? 'body-three' : 'body-two'}\n                data-testid=\"CT-06-Sticky-Navigation-Title\"\n              >\n                {title}\n              </p>\n            )}\n\n            {subTitle && (\n              <p\n                className=\"body-four hidden md:block\"\n                data-testid=\"CT-06-Sticky-Navigation-Subtitle\"\n              >\n                {subTitle}\n              </p>\n            )}\n          </div>\n\n          {pricingData?.formattedCalculatedPrice && (\n            <div className=\"mt-2 border-white md:mt-0 md:border-l md:pl-7.5\">\n              <PriceDisplayText\n                pricingData={pricingData}\n                vatLabel={vatLabel}\n                shippingLabel={shippingLabel}\n                fromPriceLabel={fromPriceLabel}\n                smallText\n                dataTestId=\"CT-06-Sticky-Navigation-Price-Display-Text\"\n              />\n            </div>\n          )}\n        </div>\n      )}\n\n      <ul\n        className=\"ml-auto flex h-full w-1/2 select-none items-center justify-end xl:w-2/3\"\n        data-testid=\"CT-06-Sticky-Navigation-Nav-Item-Container\"\n      >\n        <motion.li\n          className=\"flex h-full overflow-hidden\"\n          initial={{ opacity: 0 }}\n          animate={{ opacity: 1 }}\n        >\n          <ShadowContainerHorizontal\n            shadowColour={\n              backgroundColour === BackgroundColourEnum.Black\n                ? 'from-black-100'\n                : 'from-grey-600'\n            }\n            className=\"flex w-full justify-end\"\n            threshold={0.01}\n          >\n            <div className=\"flex\">\n              {nonCtaNavItems.map((item, index) => (\n                <div\n                  key={item.anchor || item.name}\n                  className={`hidden shrink-0 text-white ${\n                    isTabbed ? 'lg:block' : 'xl:block'\n                  }`}\n                  data-testid={`CT-06-Sticky-Navigation-Non-CTA-Nav-Item-${index}`}\n                >\n                  {item.title ? (\n                    <button\n                      type=\"button\"\n                      onClick={() => {\n                        scrollTo(`a-${item.anchor}`);\n                        if (pricingData?.formattedCalculatedPrice) {\n                          updateDataLayer({\n                            event: 'menuUsed',\n                            content_type: 'pdp_menu',\n                            main_category: item.title,\n                          });\n                        } else {\n                          updateDataLayer({\n                            event: 'menuUsed',\n                            content_type: 'anchor_menu',\n                            main_category: item.title,\n                          });\n                        }\n                      }}\n                      className={classNames(\n                        {\n                          'border-b border-yellow text-yellow':\n                            item.anchor === debouncedValue,\n                        },\n                        'body-two ml-7.5 transition-all duration-100 hover:text-grey-500'\n                      )}\n                      data-testid={`CT-06-Sticky-Navigation-Non-CTA-Nav-Item-${index}-Button`}\n                    >\n                      {item.title}\n                    </button>\n                  ) : (\n                    <a\n                      href={item.url}\n                      className={classNames(\n                        'body-two ml-7.5 transition-all duration-100 hover:text-grey-500',\n                        { 'text-yellow': item.isActive }\n                      )}\n                      onClick={() => {\n                        updateDataLayer({\n                          event: 'menuUsed',\n                          content_type: 'pdp_menu',\n                          main_category: item.name,\n                        });\n                      }}\n                      data-testid={`CT-06-Sticky-Navigation-Non-CTA-Nav-Item-${index}-Link`}\n                    >\n                      {item.name}\n                    </a>\n                  )}\n                </div>\n              ))}\n            </div>\n          </ShadowContainerHorizontal>\n        </motion.li>\n\n        {(mobileDropdownNavItems.length > 0 ||\n          displayedCTALinks.length === 2) &&\n          !isTabbed && (\n            <li className=\"flex items-center xl:hidden\">\n              <div className=\"mr-5 flex h-9 w-9 items-center justify-center rounded-full border border-yellow bg-grey-600\">\n                <motion.button\n                  animate={{\n                    rotate: isNavItemsDropdownDisplayed ? 180 : 0,\n                  }}\n                  type=\"button\"\n                  onClick={() =>\n                    setIsNavItemsDropdownDisplayed(!isNavItemsDropdownDisplayed)\n                  }\n                  aria-label={\n                    isNavItemsDropdownDisplayed\n                      ? closeModalAriaLabel\n                      : openMenuAriaLabel\n                  }\n                  data-testid=\"CT-06-Sticky-Navigation-Dropdown-Button\"\n                >\n                  <Icon\n                    name=\"caret_down\"\n                    colorClassName=\"text-yellow\"\n                    className={stickToBottom ? 'rotate-180' : ''}\n                  />\n                </motion.button>\n              </div>\n            </li>\n          )}\n\n        {ctaNavItems.map((item, index) => (\n          <li\n            className={classNames('ml-7.5 shrink-0', {\n              'hidden xl:block': ctaNavItems.length === 2,\n            })}\n            key={item.anchor || item.name}\n            data-testid={`CT-06-Sticky-Navigation-CTA-Nav-Item-${index}`}\n          >\n            <Button\n              className=\"min-h-min\"\n              onClick={() => scrollTo(`a-${item.anchor}`)}\n              secondary={!item.primary && item.secondary}\n              linkCallback={() => {\n                updateDataLayer({\n                  event: 'menuUsed',\n                  content_type: 'anchor_menu',\n                  main_cta: item.title,\n                });\n              }}\n              dataTestId={`CT-06-Sticky-Navigation-CTA-Nav-Item-${index}-Button`}\n            >\n              {item.title}\n            </Button>\n          </li>\n        ))}\n\n        {displayedCTALinks.map((ctaLink, index) => (\n          <li\n            className={classNames('ml-7.5 shrink-0', {\n              'hidden xl:block': displayedCTALinks.length === 2,\n            })}\n            key={`${ctaLink.link.name} - ${ctaLink.link.url}`}\n            data-testid={`CT-06-Sticky-Navigation-Displayed-CTA-Link-${index}`}\n          >\n            <Button\n              className=\"min-h-min\"\n              link={ctaLink.link}\n              secondary={ctaLink.secondary}\n              linkCallback={() => {\n                updateDataLayer({\n                  event: 'menuUsed',\n                  content_type: 'anchor_menu',\n                  main_cta: ctaLink.link.name,\n                });\n              }}\n              data-testid={`CT-06-Sticky-Navigation-Displayed-CTA-Link-${index}-Button`}\n            />\n          </li>\n        ))}\n\n        {buyNowLink?.name && buyNowLink.url && (\n          <li className=\"flex items-center\">\n            <Button\n              link={buyNowLink}\n              linkCallback={() => {\n                updateDataLayer({\n                  event: 'menuUsed',\n                  content_type: 'pdp_menu',\n                  main_cta: buyNowLink.name,\n                });\n              }}\n              dataTestId=\"CT-06-Sticky-Navigation-Buy-Now-Link\"\n              className=\"text-center lg:ml-5 xl:ml-7.5\"\n            />\n          </li>\n        )}\n      </ul>\n\n      <AnimatePresence>\n        {isNavItemsDropdownDisplayed && (\n          <motion.div\n            key=\"menu\"\n            initial={{ translateY: stickToBottom ? 20 : -20, opacity: 0 }}\n            animate={{ translateY: 0, opacity: 1 }}\n            exit={{ translateY: stickToBottom ? 20 : -20, opacity: 0 }}\n            transition={{\n              duration: 0.5,\n              ease: [0.74, 0, 0.19, 1.02],\n            }}\n            className={classNames(\n              stickToBottom ? 'bottom-full' : 'top-full',\n              'absolute left-0 z-0 w-full'\n            )}\n            data-testid=\"CT-06-Sticky-Navigation-Dropdown\"\n          >\n            <ShadowContainerVertical\n              className=\"flex max-h-60 flex-col gap-y-7.5 bg-white shadow-lg sm:max-h-80\"\n              shadowColour=\"from-white\"\n              shadowHeight=\"h-16 sm:h-20\"\n            >\n              <ul className=\"flex flex-col gap-y-7.5 px-5 py-7.5\">\n                {mobileDropdownNavItems.map((item, index) => (\n                  <li key={item.anchor || item.name}>\n                    {!item.primary && !item.secondary ? (\n                      (item.title && (\n                        <button\n                          type=\"button\"\n                          onClick={() => {\n                            scrollTo(`a-${item.anchor}`);\n                            closeMobileNavDropdown();\n\n                            if (pricingData?.formattedCalculatedPrice) {\n                              updateDataLayer({\n                                event: 'menuUsed',\n                                content_type: 'pdp_menu',\n                                main_category: item.title,\n                              });\n                            } else {\n                              updateDataLayer({\n                                event: 'menuUsed',\n                                content_type: 'anchor_menu',\n                                main_category: item.title,\n                              });\n                            }\n                          }}\n                          onKeyDown={() => {\n                            scrollTo(`a-${item.anchor}`);\n                            closeMobileNavDropdown();\n                          }}\n                          className={classNames(\n                            {\n                              'border-b-2 border-yellow':\n                                item.anchor === debouncedValue,\n                            },\n                            'body-three font-light text-black-100'\n                          )}\n                          data-testid={`CT-06-Sticky-Navigation-Dropdown-Item-${index}`}\n                        >\n                          {item.title}\n                        </button>\n                      )) ||\n                      (item.url && (\n                        <a\n                          href={item.url}\n                          data-testid={`CT-06-Sticky-Navigation-Dropdown-Item-${index}`}\n                        >\n                          {item.name}\n                        </a>\n                      ))\n                    ) : (\n                      <Button\n                        className=\"min-h-min\"\n                        link={{\n                          name: item.title,\n                          url: `#a-${item.anchor}`,\n                          target: '',\n                        }}\n                        linkCallback={closeMobileNavDropdown}\n                        secondary={!item.primary && item.secondary}\n                        isLightMode\n                        dataTestId={`CT-06-Sticky-Navigation-Dropdown-Button-${index}`}\n                      />\n                    )}\n                  </li>\n                ))}\n\n                {displayedCTALinks.length === 2 &&\n                  displayedCTALinks.map((ctaLink, index) => (\n                    <li key={`${ctaLink.link.name} - ${ctaLink.link.url}`}>\n                      <Button\n                        className=\"min-h-min\"\n                        link={ctaLink.link}\n                        linkCallback={closeMobileNavDropdown}\n                        isLightMode\n                        secondary={ctaLink.secondary}\n                        dataTestId={`CT-06-Sticky-Navigation-Dropdown-Displayed-CTA-Link-${index}`}\n                      />\n                    </li>\n                  ))}\n              </ul>\n            </ShadowContainerVertical>\n          </motion.div>\n        )}\n      </AnimatePresence>\n\n      <AnimatePresence>\n        {isTabbed && (\n          <motion.div\n            ref={tabbedNavRef}\n            className={classNames(\n              'absolute left-0 right-0 bg-black-100 pr-5 text-center lg:hidden lg:pr-0',\n              navPosition === StickyNavPosition.Top\n                ? 'bottom-0'\n                : 'max-lg:top-0'\n            )}\n            initial={{ opacity: 0 }}\n            animate={{ opacity: 1 }}\n            transition={{\n              duration: 0.5,\n              ease: [0.74, 0, 0.19, 1.02],\n            }}\n            data-testid=\"CT-06-Sticky-Navigation-Tabbed-Nav\"\n          >\n            <ShadowContainerHorizontal\n              ref={containerRef}\n              shadowColour=\"from-black-100\"\n              className=\"h-10 pb-2.5 pt-2\"\n              threshold={0.01}\n            >\n              {nonCtaNavItems.map(({ name, url, isActive }, index) => (\n                <a\n                  key={name}\n                  href={url}\n                  className={classNames(\n                    'body-four ml-5 text-white transition-all duration-100 hover:text-grey-500',\n                    { 'text-yellow': isActive }\n                  )}\n                  data-nav-active={isActive?.toString()}\n                  data-testid={`CT-06-Sticky-Navigation-Tabbed-Nav-Item-${index}`}\n                >\n                  {name}\n                </a>\n              ))}\n            </ShadowContainerHorizontal>\n          </motion.div>\n        )}\n      </AnimatePresence>\n    </motion.div>\n  );\n};\n\nexport default StickyNavigation;\n","const enum BreakpointEnum {\n  Small = 'sm',\n  Medium = 'md',\n  Large = 'lg',\n  XLarge = 'xl',\n}\n\nexport default BreakpointEnum;\n","const enum BackgroundColourEnum {\n  Black = 'black',\n  Grey = 'grey',\n  OffWhite = 'off-white',\n  ShadowGrey = 'shadow-grey',\n  Yellow = 'yellow',\n}\n\nexport default BackgroundColourEnum;\n","enum ScrollProgressEnum {\n  Start = 'Start',\n  Middle = 'Middle',\n  End = 'End',\n}\n\nexport default ScrollProgressEnum;\n","enum StickyNavPosition {\n  Top = 'top',\n  Bottom = 'bottom',\n}\n\nexport default StickyNavPosition;\n","import { IAriaLabels } from '@models/IAriaLabels';\nimport create from 'zustand';\n\ninterface IAriaLabelsState {\n  ariaLabels: IAriaLabels;\n  setAriaLabels: (ariaLabels: IAriaLabels) => void;\n}\n\nexport const initialAriaLabels: IAriaLabels = {\n  backToFirstLevelNavigationAriaLabel: 'Back to first level of navigation',\n  breadcrumbAriaLabel: 'Breadcrumb navigation',\n  breadcrumbFooterAriaLabel: 'Breadcrumb footer navigation',\n  clearFiltersAriaLabel: 'Clear filters',\n  closeMenuAriaLabel: 'Close menu',\n  closeAddressListAriaLabel: 'Close address list',\n  closeMobileNavigationAriaLabel: 'Close navigation',\n  closeModalAriaLabel: 'Close Modal',\n  closeSignUpFormAriaLabel: 'Close signup form',\n  closeSiteNotificationAriaLabel: 'Close site notification',\n  copyToClipboardAriaLabel: 'Copy to clipboard',\n  editOrDeleteAriaLabel: 'Edit or delete',\n  mainNavigationAriaLabel: 'Main navigation',\n  moreInformationAriaLabel: 'More information',\n  nextAriaLabel: 'Go to next slide',\n  openAddressListAriaLabel: 'Open address list',\n  openImageInFullScreenAriaLabel: 'Open image in full screen',\n  openMenuAriaLabel: 'Open menu',\n  overlayToCloseDesktopNavigationAriaLabel: 'Close overlay',\n  pauseVideoAriaLabel: 'Pause video',\n  playVideoAriaLabel: 'Play video',\n  previousAriaLabel: 'Go to previous slide',\n  searchAriaLabel: 'Search',\n  shareToFacebookAriaLabel: 'Share to Facebook',\n  shareToWhatsappAriaLabel: 'Share to Whatsapp',\n  shareToXAriaLabel: 'Share to X',\n  siteNotificationsAriaLabel: 'Site notifications banner',\n  uspStripAriaLabel: 'Unique Selling Point Strip',\n  zoomInAriaLabel: 'Zoom in',\n  zoomOutAriaLabel: 'Zoom out',\n};\n\nconst useAriaLabelsStore = create<IAriaLabelsState>((set) => ({\n  ariaLabels: initialAriaLabels,\n  setAriaLabels: (ariaLabels: IAriaLabels) => set({ ariaLabels }),\n}));\n\nexport default useAriaLabelsStore;\n","import StickyNavPosition from '@models/enums/StickyNavPositionEnum';\nimport create from 'zustand';\n\ntype StickyNavPositions = StickyNavPosition.Top | StickyNavPosition.Bottom;\n\ninterface IStickyNavPositionState {\n  readonly stickyNavPosition: StickyNavPosition;\n  readonly setStickyNavPosition: (navPosition: StickyNavPositions) => void;\n}\n\nconst useStickyNavPositionStore = create<IStickyNavPositionState>((set) => ({\n  stickyNavPosition: StickyNavPosition.Top,\n  setStickyNavPosition: (navPosition: StickyNavPositions) =>\n    set({ stickyNavPosition: navPosition }),\n}));\n\nexport default useStickyNavPositionStore;\n","const updateDataLayer = (eventPayload: Record<string, unknown>) => {\n  if (typeof window !== 'undefined') {\n    window.dataLayer = window.dataLayer || [];\n    window.dataLayer.push(eventPayload);\n  }\n};\n\nexport default updateDataLayer;\n","import { IAriaLabels } from '@models/IAriaLabels';\nimport useAriaLabelsStore, { initialAriaLabels } from '@state/AriaLabelsStore';\nimport { useEffect, useState } from 'react';\n\nconst useAriaLabels = () => {\n  const [ariaLabels, setAriaLabels] = useState<IAriaLabels>(initialAriaLabels);\n  const ariaLabelsFromStore = useAriaLabelsStore((state) => state.ariaLabels);\n\n  useEffect(() => {\n    setAriaLabels(ariaLabelsFromStore);\n  }, [ariaLabelsFromStore]);\n\n  return ariaLabels;\n};\n\nexport default useAriaLabels;\n","import BreakpointEnum from '@models/enums/BreakpointEnum';\nimport { useCallback, useEffect, useState } from 'react';\n\nconst getCurrentBreakpoint = () => {\n  const breakpoints = { tablet: 768, desktop: 1024, lgDesktop: 1440 };\n  const width = window.innerWidth;\n\n  if (width < breakpoints.tablet) {\n    return BreakpointEnum.Small;\n  }\n  if (width >= breakpoints.tablet && width < breakpoints.desktop) {\n    return BreakpointEnum.Medium;\n  }\n  if (width >= breakpoints.desktop && width < breakpoints.lgDesktop) {\n    return BreakpointEnum.Large;\n  }\n  return BreakpointEnum.XLarge;\n};\n\nconst useBreakpoint = () => {\n  const [screen, setScreen] = useState<BreakpointEnum>();\n\n  const resizeHandler = useCallback(\n    () => setScreen(getCurrentBreakpoint()),\n    []\n  );\n\n  useEffect(() => {\n    window.addEventListener('resize', resizeHandler);\n    setScreen(getCurrentBreakpoint());\n\n    return () => {\n      window.removeEventListener('resize', resizeHandler);\n    };\n  }, [resizeHandler]);\n\n  return screen;\n};\n\nexport default useBreakpoint;\n","import { useCallback, useEffect, useState } from 'react';\n\nconst useMediaQuery = (minWidth: number) => {\n  // Set the default value to undefined in order to properly distinguish the falsey values\n  // where undefined is the value before computing whether the screen size is smaller than the minWidth\n  // i.e. a state where we don't really know whether we're below the threshold or not\n  // and false is the value where the computation returns false\n  const [isSmallerThan, setIsSmallerThan] = useState<boolean>();\n\n  const handler = useCallback(() => {\n    const isDesiredWidth = window.innerWidth < minWidth;\n    setIsSmallerThan(isDesiredWidth);\n  }, [minWidth]);\n\n  useEffect(() => {\n    window.addEventListener('resize', handler);\n    handler();\n\n    return () => {\n      window.removeEventListener('resize', handler);\n    };\n  }, [handler]);\n\n  return isSmallerThan;\n};\n\nexport default useMediaQuery;\n","import { useCallback, useRef, useState } from 'react';\n\nconst useResizeObserver = () => {\n  const observerRef = useRef<ResizeObserver>();\n  const [resizeParameters, setResizeParameters] = useState({\n    width: 0,\n    height: 0,\n    clientWidth: 0,\n    clientHeight: 0,\n    scrollWidth: 0,\n    scrollHeight: 0,\n  });\n\n  const handleResize = useCallback((entries: ResizeObserverEntry[]) => {\n    if (!Array.isArray(entries)) return;\n\n    const entry = entries[0];\n\n    setResizeParameters({\n      width: entry?.contentRect.width ?? 0,\n      height: entry?.contentRect.height ?? 0,\n      clientWidth: entry?.target.clientWidth ?? 0,\n      clientHeight: entry?.target.clientHeight ?? 0,\n      scrollWidth: entry?.target.scrollWidth ?? 0,\n      scrollHeight: entry?.target.scrollHeight ?? 0,\n    });\n  }, []);\n\n  const ref = useCallback(\n    (node: HTMLElement | null) => {\n      if (observerRef.current && !node) {\n        observerRef.current.disconnect();\n        observerRef.current = undefined;\n      }\n\n      if (!observerRef.current && node) {\n        observerRef.current = new ResizeObserver(handleResize);\n        observerRef.current.observe(node);\n      }\n    },\n    [handleResize]\n  );\n\n  return [ref, resizeParameters] as const;\n};\n\nexport default useResizeObserver;\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n    var t = {};\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n        t[p] = s[p];\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                t[p[i]] = s[p[i]];\n        }\n    return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.iconList = void 0;\nvar react_1 = require(\"react\");\nvar IcoMoon = function (_a) {\n    var iconSet = _a.iconSet, icon = _a.icon, size = _a.size, title = _a.title, disableFill = _a.disableFill, removeInlineStyle = _a.removeInlineStyle, native = _a.native, SvgComponent = _a.SvgComponent, PathComponent = _a.PathComponent, props = __rest(_a, [\"iconSet\", \"icon\", \"size\", \"title\", \"disableFill\", \"removeInlineStyle\", \"native\", \"SvgComponent\", \"PathComponent\"]);\n    if (!iconSet || !icon)\n        return null;\n    var currentIcon = iconSet.icons.find(function (item) { return item.properties.name === icon; });\n    if (!currentIcon)\n        return null;\n    var initialStyle = {\n        display: \"inline-block\",\n        stroke: \"currentColor\",\n        fill: \"currentColor\",\n    };\n    if (native) {\n        initialStyle.display = \"flex\";\n        initialStyle.flexDirection = \"row\";\n        initialStyle.flexWrap = \"wrap\";\n    }\n    var comptuedStyle = __assign(__assign(__assign({}, (removeInlineStyle ? {} : initialStyle)), (size ? { width: size, height: size } : {})), (props.style || {}));\n    var _b = currentIcon.icon.width, width = _b === void 0 ? \"1024\" : _b;\n    var viewBox = \"0 0 \".concat(width, \" 1024\");\n    var children = currentIcon.icon.paths.map(function (path, index) {\n        var _a;\n        var attrs = (_a = currentIcon.icon.attrs) === null || _a === void 0 ? void 0 : _a[index];\n        var pathProps = __assign({ d: path, key: icon + index }, (!disableFill && attrs ? attrs : {}));\n        return (0, react_1.createElement)(PathComponent || \"path\", pathProps);\n    });\n    if (title && !native) {\n        children.push((0, react_1.createElement)(\"title\", { key: title }, title));\n    }\n    return (0, react_1.createElement)(SvgComponent || \"svg\", __assign(__assign({}, props), { viewBox: viewBox, style: comptuedStyle }), children);\n};\nvar iconList = function (iconSet) {\n    if (!iconSet || !Array.isArray(iconSet.icons))\n        return null;\n    return iconSet.icons.map(function (icon) { return icon.properties.name; });\n};\nexports.iconList = iconList;\nexports.default = IcoMoon;\n//# sourceMappingURL=index.js.map","import { useReducer, useRef, useDebugValue, useEffect, useLayoutEffect } from 'react';\n\nfunction createStore(createState) {\n  let state;\n  const listeners = /* @__PURE__ */ new Set();\n  const setState = (partial, replace) => {\n    const nextState = typeof partial === \"function\" ? partial(state) : partial;\n    if (nextState !== state) {\n      const previousState = state;\n      state = replace ? nextState : Object.assign({}, state, nextState);\n      listeners.forEach((listener) => listener(state, previousState));\n    }\n  };\n  const getState = () => state;\n  const subscribeWithSelector = (listener, selector = getState, equalityFn = Object.is) => {\n    console.warn(\"[DEPRECATED] Please use `subscribeWithSelector` middleware\");\n    let currentSlice = selector(state);\n    function listenerToAdd() {\n      const nextSlice = selector(state);\n      if (!equalityFn(currentSlice, nextSlice)) {\n        const previousSlice = currentSlice;\n        listener(currentSlice = nextSlice, previousSlice);\n      }\n    }\n    listeners.add(listenerToAdd);\n    return () => listeners.delete(listenerToAdd);\n  };\n  const subscribe = (listener, selector, equalityFn) => {\n    if (selector || equalityFn) {\n      return subscribeWithSelector(listener, selector, equalityFn);\n    }\n    listeners.add(listener);\n    return () => listeners.delete(listener);\n  };\n  const destroy = () => listeners.clear();\n  const api = { setState, getState, subscribe, destroy };\n  state = createState(setState, getState, api);\n  return api;\n}\n\nconst isSSR = typeof window === \"undefined\" || !window.navigator || /ServerSideRendering|^Deno\\//.test(window.navigator.userAgent);\nconst useIsomorphicLayoutEffect = isSSR ? useEffect : useLayoutEffect;\nfunction create(createState) {\n  const api = typeof createState === \"function\" ? createStore(createState) : createState;\n  const useStore = (selector = api.getState, equalityFn = Object.is) => {\n    const [, forceUpdate] = useReducer((c) => c + 1, 0);\n    const state = api.getState();\n    const stateRef = useRef(state);\n    const selectorRef = useRef(selector);\n    const equalityFnRef = useRef(equalityFn);\n    const erroredRef = useRef(false);\n    const currentSliceRef = useRef();\n    if (currentSliceRef.current === void 0) {\n      currentSliceRef.current = selector(state);\n    }\n    let newStateSlice;\n    let hasNewStateSlice = false;\n    if (stateRef.current !== state || selectorRef.current !== selector || equalityFnRef.current !== equalityFn || erroredRef.current) {\n      newStateSlice = selector(state);\n      hasNewStateSlice = !equalityFn(currentSliceRef.current, newStateSlice);\n    }\n    useIsomorphicLayoutEffect(() => {\n      if (hasNewStateSlice) {\n        currentSliceRef.current = newStateSlice;\n      }\n      stateRef.current = state;\n      selectorRef.current = selector;\n      equalityFnRef.current = equalityFn;\n      erroredRef.current = false;\n    });\n    const stateBeforeSubscriptionRef = useRef(state);\n    useIsomorphicLayoutEffect(() => {\n      const listener = () => {\n        try {\n          const nextState = api.getState();\n          const nextStateSlice = selectorRef.current(nextState);\n          if (!equalityFnRef.current(currentSliceRef.current, nextStateSlice)) {\n            stateRef.current = nextState;\n            currentSliceRef.current = nextStateSlice;\n            forceUpdate();\n          }\n        } catch (error) {\n          erroredRef.current = true;\n          forceUpdate();\n        }\n      };\n      const unsubscribe = api.subscribe(listener);\n      if (api.getState() !== stateBeforeSubscriptionRef.current) {\n        listener();\n      }\n      return unsubscribe;\n    }, []);\n    const sliceToReturn = hasNewStateSlice ? newStateSlice : currentSliceRef.current;\n    useDebugValue(sliceToReturn);\n    return sliceToReturn;\n  };\n  Object.assign(useStore, api);\n  useStore[Symbol.iterator] = function() {\n    console.warn(\"[useStore, api] = create() is deprecated and will be removed in v4\");\n    const items = [useStore, api];\n    return {\n      next() {\n        const done = items.length <= 0;\n        return { value: items.shift(), done };\n      }\n    };\n  };\n  return useStore;\n}\n\nexport { create as default };\n"],"names":["_ref","children","className","dataTestId","disabled","editHint","link","linkCallback","secondary","secondaryBackgroundClassName","isLightMode","inverted","buttonProps","buttonClasses","classNames","url","name","React","createElement","href","target","onClick","_extends","classes","epiEdit","image","imageClasses","imageRef","lazyLoad","progressiveLoad","sizes","mobileSource","mobile","tabletSource","tablet","desktopSource","desktop","largeDesktopSource","largeDesktop","breakpoint","useBreakpoint","isLoaded","setIsLoaded","useState","currentSrc","BreakpointEnum","Small","Medium","Large","XLarge","type","srcSet","ref","alt","altText","length","draggable","loading","onLoad","src","height","width","originalUrl","fromPriceLabel","pricingData","vatLabel","shippingLabel","rrpLabel","centerText","smallText","containerClassName","taxesTopMarginClassName","taxesClassName","priceClassName","amountSaved","formattedPrice","formattedCalculatedPrice","shippingCost","price","Fragment","Icon","colorClassName","useHorizontalGrabScroll","containerRef","isMouseDown","setIsMouseDown","mouseScrollPosition","useRef","top","left","x","y","useEffect","container","current","clientWidth","scrollWidth","style","cursor","scrollTop","scrollLeft","mouseMoveHandler","e","dx","clientX","dy","clientY","mouseUpHandler","document","removeEventListener","mouseDownHandler","addEventListener","onWheel","deltaY","scrollTo","behavior","passive","useHorizontalScrollShadows","threshold","scrollXProgress","useScroll","isStart","setIsStart","isEnd","setIsEnd","scrollProgress","setScrollProgress","ScrollProgressEnum","Start","useMotionValueEvent","value","Middle","End","forwardRef","disableScroll","shadowColour","showStart","showEnd","shadowWidth","isNoWrapEnabled","useImperativeHandle","leftOffset","getOffsetWidth","offsetWidth","AnimatePresence","motion","span","animate","opacity","exit","initial","transition","duration","tabIndex","containerHeight","contentHeight","arguments","undefined","scrollYProgress","customScrollbarTheme","hideScrollbar","shadowHeight","containerRefCallback","useResizeObserver","contentRefCallback","useVerticalScrollShadows","useVerticalGrabScroll","topOffset","node","delay","debouncedValue","setDebouncedValue","timer","setTimeout","clearTimeout","title","subTitle","thumbnail","icon","buyNowLink","anchorNavigationItems","ctaLinks","navPosition","StickyNavPosition","Top","returnLink","backgroundColour","BackgroundColourEnum","Black","showReturnLinkMobileOnly","tabbedNavigation","shouldHavePadding","isNavItemsDropdownDisplayed","setIsNavItemsDropdownDisplayed","activeElement","setActiveElement","stickToBottom","setStickToBottom","useDebounce","isMobile","useMediaQuery","isBelowLargeDesktop","isTabbed","productNavRefCallback","clientHeight","productNavHeight","navRef","tabbedNavRef","currentBackgroundColour","setCurrentBackgroundColour","setStickyNavPosition","useStickyNavPositionStore","state","closeModalAriaLabel","openMenuAriaLabel","useAriaLabels","colourCodesMapper","Grey","navPadding","offsetHeight","navItems","map","item","primary","anchor","isActive","ctaNavItems","filter","slice","nonCtaNavItems","mobileDropdownNavItems","displayedCTALinks","links","ctaLink","id","element","getElementById","imagesBeforeElement","Array","from","querySelectorAll","compareDocumentPosition","Node","DOCUMENT_POSITION_PRECEDING","forEach","setAttribute","scrollTimeout","scrollTopPosition","getBoundingClientRect","window","scrollY","getScrollTopOffset","anchorMenu","productNavigation","siteNotifications","yOffset","closeMobileNavDropdown","filteredIds","useCallback","updateActiveSection","elements","toString","observer","IntersectionObserver","entries","listOfCurrentlyIntersecting","entry","isIntersecting","chosenItem","at","found","el","intersectionRatio","split","rootMargin","observe","_ref2","newBackgroundColour","productNav","documentElement","setProperty","classList","remove","add","removeProperty","Bottom","activeNavigationElement","querySelector","containerWidth","offsetLeft","div","backgroundColor","paddingBottom","paddingTop","ReturnLink","Image","PriceDisplayText","li","ShadowContainerHorizontal","index","key","updateDataLayer","event","content_type","main_category","button","rotate","Button","main_cta","translateY","ease","ShadowContainerVertical","onKeyDown","_ref3","initialAriaLabels","backToFirstLevelNavigationAriaLabel","breadcrumbAriaLabel","breadcrumbFooterAriaLabel","clearFiltersAriaLabel","closeMenuAriaLabel","closeAddressListAriaLabel","closeMobileNavigationAriaLabel","closeSignUpFormAriaLabel","closeSiteNotificationAriaLabel","copyToClipboardAriaLabel","editOrDeleteAriaLabel","mainNavigationAriaLabel","moreInformationAriaLabel","nextAriaLabel","openAddressListAriaLabel","openImageInFullScreenAriaLabel","overlayToCloseDesktopNavigationAriaLabel","pauseVideoAriaLabel","playVideoAriaLabel","previousAriaLabel","searchAriaLabel","shareToFacebookAriaLabel","shareToWhatsappAriaLabel","shareToXAriaLabel","siteNotificationsAriaLabel","uspStripAriaLabel","zoomInAriaLabel","zoomOutAriaLabel","create","set","ariaLabels","setAriaLabels","stickyNavPosition","eventPayload","dataLayer","push","ariaLabelsFromStore","useAriaLabelsStore","getCurrentBreakpoint","breakpoints","innerWidth","screen","setScreen","resizeHandler","minWidth","isSmallerThan","setIsSmallerThan","handler","isDesiredWidth","observerRef","resizeParameters","setResizeParameters","scrollHeight","handleResize","isArray","contentRect","disconnect","ResizeObserver","__assign","this","Object","assign","t","s","i","n","p","prototype","hasOwnProperty","call","apply","__rest","indexOf","getOwnPropertySymbols","propertyIsEnumerable","defineProperty","exports","iconList","react_1","iconSet","icons","properties","_a","size","disableFill","removeInlineStyle","native","SvgComponent","PathComponent","props","currentIcon","find","initialStyle","display","stroke","fill","flexDirection","flexWrap","comptuedStyle","_b","viewBox","concat","paths","path","attrs","pathProps","d","createStore","createState","listeners","Set","setState","partial","replace","nextState","previousState","listener","getState","api","subscribe","selector","equalityFn","is","console","warn","currentSlice","listenerToAdd","nextSlice","previousSlice","delete","subscribeWithSelector","destroy","clear","useIsomorphicLayoutEffect","navigator","test","userAgent","useLayoutEffect","useStore","forceUpdate","useReducer","c","stateRef","selectorRef","equalityFnRef","erroredRef","currentSliceRef","newStateSlice","hasNewStateSlice","stateBeforeSubscriptionRef","nextStateSlice","error","unsubscribe","sliceToReturn","useDebugValue","Symbol","iterator","items","next","done","shift"],"sourceRoot":""}