{"version":3,"file":"Footer-Chunk-32c4d5f68f50923fc6c9.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/./utility/hooks/useHorizontalGrabScroll.ts","webpack://nikon-client/./utility/hooks/useHorizontalScrollShadows.ts","webpack://nikon-client/./components/atoms/ShadowContainerHorizontal/ShadowContainerHorizontal.tsx","webpack://nikon-client/./components/molecules/StoreLocatorAutosuggest/StoreLocatorAutosuggest.tsx","webpack://nikon-client/./components/molecules/BreadcrumbLinks/BreadcrumbLinks.tsx","webpack://nikon-client/./components/organisms/Breadcrumb/Breadcrumb.tsx","webpack://nikon-client/./components/atoms/SupportButton/SupportButton.tsx","webpack://nikon-client/./components/organisms/Footer/LinksList.tsx","webpack://nikon-client/./components/organisms/Footer/LinksSection.tsx","webpack://nikon-client/./components/organisms/Footer/Footer.tsx","webpack://nikon-client/./models/enums/BreakpointEnum.ts","webpack://nikon-client/./models/enums/ScrollProgressEnum.ts","webpack://nikon-client/./services/storeLocatorAutocomplete.ts","webpack://nikon-client/./services/storeLocatorSearch.ts","webpack://nikon-client/./utility/helpers/gtm.ts","webpack://nikon-client/./utility/hooks/useBreakpoint.ts","webpack://nikon-client/./utility/hooks/useResizeObserver.ts"],"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 { 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 loadable from '@loadable/component';\nimport {\n  IStoreLocatorAutocomplete,\n  IStoreLocatorPlace,\n} from '@models/IStoreLocatorAutocomplete';\nimport storeLocatorAutocomplete from '@services/storeLocatorAutocomplete';\nimport updateDataLayer from '@utils/helpers/gtm';\nimport classNames from 'classnames';\nimport { useState } from 'react';\nimport { AutosuggestProps } from 'react-autosuggest';\n\nconst Autosuggest = loadable<\n  AutosuggestProps<IStoreLocatorAutocomplete, unknown>\n>(\n  () => import(/* webpackChunkName: \"react-autosuggest\" */ 'react-autosuggest')\n);\n\ninterface Props {\n  readonly autocompleteEndpoint: string;\n  readonly className?: string;\n  readonly countryCode: string;\n  readonly dataTestId: string;\n  readonly queryText: string;\n  readonly searchPlaceholderLabel: string;\n  readonly type: string;\n  readonly onSearch: () => void;\n  readonly onSetPlace: (place: IStoreLocatorPlace) => void;\n  readonly onSetQueryText: (queryText: string) => void;\n}\n\nconst StoreLocatorAutosuggest = ({\n  autocompleteEndpoint,\n  className,\n  countryCode,\n  dataTestId,\n  queryText,\n  searchPlaceholderLabel,\n  type,\n  onSearch,\n  onSetPlace,\n  onSetQueryText,\n}: Props) => {\n  const [autoCompleteSuggestions, setAutoCompleteSuggestions] = useState<\n    IStoreLocatorAutocomplete[]\n  >([]);\n\n  const fetchAutoCompleteSuggestions = async ({\n    value,\n    reason,\n  }: {\n    value: string;\n    reason: string;\n  }) => {\n    if (reason === 'input-changed') {\n      if (value.length < 3) {\n        if (autoCompleteSuggestions.length > 0) setAutoCompleteSuggestions([]);\n\n        return;\n      }\n\n      try {\n        const autoCompleteResponse = await storeLocatorAutocomplete({\n          endpoint: autocompleteEndpoint,\n          countryCode,\n          searchTerm: value,\n        });\n\n        setAutoCompleteSuggestions(autoCompleteResponse);\n      } catch (error) {\n        // eslint-disable-next-line no-console\n        console.log({ error });\n      }\n    }\n  };\n\n  return (\n    <div\n      className={classNames('autosuggest-wrapper', className)}\n      data-testid={dataTestId}\n    >\n      <Autosuggest\n        suggestions={autoCompleteSuggestions || []}\n        onSuggestionsFetchRequested={fetchAutoCompleteSuggestions}\n        onSuggestionsClearRequested={() => setAutoCompleteSuggestions([])}\n        getSuggestionValue={(suggestion) => suggestion.description}\n        renderSuggestion={(suggestion) => <span>{suggestion.description}</span>}\n        onSuggestionSelected={(event, { suggestion }) => {\n          event.stopPropagation();\n          onSetPlace({\n            id: suggestion.placeId,\n            name: suggestion.description,\n          });\n          onSetQueryText(suggestion.description);\n        }}\n        inputProps={{\n          value: queryText || '',\n          onChange: (_, { newValue }) => {\n            onSetQueryText(newValue);\n          },\n          onKeyUp: (event) => {\n            if (event.key === 'Enter' && queryText.length >= 3) {\n              onSearch();\n              updateDataLayer({\n                event: 'searchBar',\n                search_term: queryText,\n                content_type: `store_listing_${type}`,\n                page_type: 'Store Locator',\n              });\n            }\n          },\n          placeholder: searchPlaceholderLabel,\n        }}\n      />\n    </div>\n  );\n};\n\nexport default StoreLocatorAutosuggest;\n","import Icon from '@atoms/Icon/Icon';\nimport { IBreadcrumbLinks } from '@models/IBreadcrumbLinks';\nimport updateDataLayer from '@utils/helpers/gtm';\nimport useAriaLabels from '@utils/hooks/useAriaLabels';\nimport classNames from 'classnames';\n\nconst BreadcrumbLinks = ({\n  activePage,\n  links,\n  scrollRef,\n  isInFooter,\n}: IBreadcrumbLinks) => {\n  const { breadcrumbAriaLabel, breadcrumbFooterAriaLabel } = useAriaLabels();\n  return (\n    <nav\n      ref={scrollRef}\n      className={classNames(\n        'relative flex w-full overflow-visible whitespace-nowrap scrollbar-hide',\n        {\n          'px-2.5 md:px-0': !isInFooter,\n        }\n      )}\n      data-testid=\"CT-31-Breadcrumbs-Nav\"\n      aria-label={isInFooter ? breadcrumbFooterAriaLabel : breadcrumbAriaLabel}\n    >\n      <ul className=\"flex whitespace-nowrap\">\n        {links?.length > 0 &&\n          links.map((link, index) => (\n            <li className=\"flex flex-row items-center\" key={link.name}>\n              {link.name && link.url && (\n                <>\n                  <a\n                    className=\"body-two text-black-100 hover:underline dark:text-white\"\n                    href={link.url}\n                    onClick={() =>\n                      updateDataLayer({\n                        event: 'breadcrumbs',\n                        content_type: link.name,\n                      })\n                    }\n                    data-testid={`CT-31-Breadcrumbs-Link-Item-${index}`}\n                  >\n                    {link.name.length > 15\n                      ? `${link.name.substring(0, 15)}...`\n                      : link.name}\n                  </a>\n\n                  <Icon\n                    name=\"chevron_right\"\n                    colorClassName=\"dark:text-white\"\n                    className=\"lg:mx-1\"\n                  />\n                </>\n              )}\n            </li>\n          ))}\n        {activePage && (\n          <li\n            className=\"body-two text-grey-450 dark:text-grey-500\"\n            data-testid=\"CT-31-Breadcrumbs-Active-Page-Item\"\n          >\n            {activePage.name && activePage.name.length > 15\n              ? `${activePage.name.substring(0, 15)}...`\n              : activePage.name}\n          </li>\n        )}\n      </ul>\n    </nav>\n  );\n};\n\nexport default BreadcrumbLinks;\n","import ShadowContainerHorizontal from '@atoms/ShadowContainerHorizontal/ShadowContainerHorizontal';\nimport { IBreadcrumb } from '@models/IBreadcrumb';\nimport BreadcrumbLinks from '@molecules/BreadcrumbLinks/BreadcrumbLinks';\nimport classNames from 'classnames';\nimport { useRef } from 'react';\n\nconst Breadcrumb = ({ links, activePage, isInFooter }: IBreadcrumb) => {\n  const scrollRef = useRef<HTMLHeadingElement>(null);\n\n  return (\n    <section\n      className={classNames('relative w-full', {\n        'bg-white dark:bg-black-100 lg:py-6': !isInFooter,\n      })}\n      data-testid=\"CT-31-Breadcrumbs\"\n    >\n      <div className={classNames({ 'md:container': !isInFooter })}>\n        <ShadowContainerHorizontal\n          shadowColour=\"from-grey-100 dark:from-grey-600\"\n          shadowWidth=\"w-13\"\n          className=\"py-4\"\n          threshold={0.01}\n        >\n          <BreadcrumbLinks\n            links={links}\n            activePage={activePage}\n            scrollRef={scrollRef}\n            isInFooter={isInFooter}\n          />\n        </ShadowContainerHorizontal>\n      </div>\n    </section>\n  );\n};\n\nexport default Breadcrumb;\n","import Icon from '@atoms/Icon/Icon';\nimport { ILink } from '@models/ILink';\nimport useMediaQuery from '@utils/hooks/useMediaQuery';\nimport useWindowScrollPositions from '@utils/hooks/useWindowScrollPosition';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { useEffect, useState } from 'react';\n\ninterface Props {\n  readonly link: ILink;\n  readonly desktopBottomLimit: number;\n}\n\nconst SupportButton = ({ link, desktopBottomLimit }: Props) => {\n  const [bottomPosition, setBottomPosition] = useState(10);\n  const { scrollY } = useWindowScrollPositions();\n  const isBelowLargeDesktop = useMediaQuery(1440);\n  const scrollDistanceForButtonVisibility = isBelowLargeDesktop ? 1000 : 2000;\n\n  useEffect(() => {\n    const scrollableHeight = document.documentElement.scrollHeight;\n    const scrolledPosition = scrollY + window.innerHeight;\n    const bottomScrollOffset = scrollableHeight - scrolledPosition;\n\n    setBottomPosition(\n      bottomScrollOffset <= desktopBottomLimit && !isBelowLargeDesktop\n        ? desktopBottomLimit - bottomScrollOffset + 10\n        : 10\n    );\n  }, [desktopBottomLimit, scrollY, isBelowLargeDesktop]);\n\n  return (\n    <div id=\"supportButton\">\n      <AnimatePresence>\n        {scrollY > scrollDistanceForButtonVisibility && (\n          <motion.a\n            href={link.url}\n            target={link.target}\n            initial={{ opacity: 0 }}\n            animate={{\n              opacity: 1,\n              bottom: bottomPosition,\n            }}\n            exit={{ opacity: 0 }}\n            transition={{\n              opacity: { duration: 0.3 },\n              bottom: { duration: 0.1 },\n            }}\n            className=\"body-four fixed left-5 z-max flex items-center gap-x-2.5 rounded-[48px] bg-grey-100 px-6 py-2.5 text-black-100 md:left-15\"\n          >\n            <Icon name=\"screen_search_desktop\" size=\"33px\" />\n\n            {link.name}\n          </motion.a>\n        )}\n      </AnimatePresence>\n    </div>\n  );\n};\n\nexport default SupportButton;\n","import { ILink } from '@models/ILink';\nimport updateDataLayer from '@utils/helpers/gtm';\nimport useIsInIFrame from '@utils/hooks/useIsInIFrame';\n\ninterface Props {\n  readonly links: ILink[];\n  readonly title: string;\n}\n\nconst LinksList = ({ links, title }: Props) => {\n  const isInIFrame = useIsInIFrame();\n\n  const handleLinkClick = (link: ILink, linkTitle: string) => {\n    updateDataLayer({\n      event: 'menuUsed',\n      content_type: 'footer_menu',\n      main_category: linkTitle,\n      sub_category: link.name,\n    });\n  };\n\n  return (\n    <ul className=\"mb-10 xl:mb-0\">\n      {links?.map((link) => (\n        <li className=\"ml-5 mt-5 md:ml-0\" key={`list-${link.name}`}>\n          <a\n            className=\"body-two link-underline text-white\"\n            href={link.url}\n            onClick={() => handleLinkClick(link, title)}\n            target={isInIFrame ? '_parent' : link.target}\n            data-testid=\"CT-02-Footer-Links-List-Link\"\n            aria-label={link.name}\n          >\n            <span dangerouslySetInnerHTML={{ __html: `${link.name}` }} />\n          </a>\n        </li>\n      ))}\n    </ul>\n  );\n};\n\nexport default LinksList;\n","import { ILink } from '@models/ILink';\nimport classNames from 'classnames';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { Dispatch, SetStateAction } from 'react';\nimport LinksList from './LinksList';\n\ninterface Props {\n  readonly links: ILink[];\n  readonly title: string;\n  readonly isOpen: boolean;\n  readonly onSetOpenTitle: Dispatch<SetStateAction<string>>;\n}\n\nconst LinksSection = ({ links, title, isOpen, onSetOpenTitle }: Props) => (\n  <div className=\"flex flex-col\">\n    {title && (\n      <button\n        type=\"button\"\n        className={classNames(\n          'body-two flex items-center justify-between text-left md:pointer-events-none md:text-grey-500',\n          {\n            'text-yellow': isOpen,\n          }\n        )}\n        onClick={() => onSetOpenTitle(isOpen ? '' : title)}\n        data-testid=\"CT-02-Footer-Link-Lists-Title\"\n        aria-label={title}\n      >\n        <span dangerouslySetInnerHTML={{ __html: title }} />\n        <div className=\"relative flex items-center md:hidden\">\n          <span className=\"relative block h-0.5 w-3 bg-yellow-500\" />\n          <span\n            className={classNames(\n              'absolute block h-0.5 w-3 rotate-90 transform bg-yellow-500',\n              { hidden: isOpen }\n            )}\n          />\n        </div>\n      </button>\n    )}\n\n    <div className=\"hidden md:block\">\n      <LinksList links={links} title={title} />\n    </div>\n\n    <div className=\"block md:hidden\">\n      <AnimatePresence>\n        {isOpen && (\n          <motion.div\n            className=\"overflow-hidden\"\n            initial={{ height: 0 }}\n            animate={{ height: 'auto' }}\n            exit={{ height: 0 }}\n          >\n            <LinksList links={links} title={title} />\n          </motion.div>\n        )}\n      </AnimatePresence>\n    </div>\n  </div>\n);\n\nexport default LinksSection;\n","import Button from '@atoms/Button/Button';\nimport Icon from '@atoms/Icon/Icon';\nimport Image from '@atoms/Image/Image';\nimport SupportButton from '@atoms/SupportButton/SupportButton';\nimport { IBreadcrumb } from '@models/IBreadcrumb';\nimport { IImage } from '@models/IImage';\nimport ILanguageSelector from '@models/ILanguageSelector';\nimport { ILink } from '@models/ILink';\nimport IListOfLinks from '@models/IListOfLinks';\nimport { IPaymentMethods } from '@models/IPaymentMethods';\nimport { IStoreLocatorPlace } from '@models/IStoreLocatorAutocomplete';\nimport { IStoreLocatorSearch } from '@models/IStoreLocatorSearch';\nimport FooterBanner from '@molecules/FooterBanner/FooterBanner';\nimport StoreLocatorAutosuggest from '@molecules/StoreLocatorAutosuggest/StoreLocatorAutosuggest';\nimport Breadcrumbs from '@organisms/Breadcrumb/Breadcrumb';\nimport updateDataLayer from '@utils/helpers/gtm';\nimport useIsInIFrame from '@utils/hooks/useIsInIFrame';\nimport useResizeObserver from '@utils/hooks/useResizeObserver';\nimport classNames from 'classnames';\nimport qs from 'qs';\nimport { useState } from 'react';\nimport storeLocatorAutocomplete from '../../../services/storeLocatorAutocomplete';\nimport storeLocatorSearch from '../../../services/storeLocatorSearch';\nimport LinksSection from './LinksSection';\n\ninterface Props {\n  readonly backToTopButtonText?: string;\n  readonly breadcrumb: IBreadcrumb;\n  readonly copyrightNotice: string;\n  readonly enableFindAStore: boolean;\n  readonly enableStickyBackToTopButton: boolean;\n  readonly externalSitesLinks: IListOfLinks;\n  readonly findAStoreAutocompleteEndpoint: string;\n  readonly findAStoreButtonText: string;\n  readonly findAStoreCountryCode: string;\n  readonly findAStoreHeader: string;\n  readonly findAStorePlaceholder: string;\n  readonly findAStoreRedirectUrl: string;\n  readonly findAStoreSearchEndpoint: string;\n  readonly findAStoreSubHeader: string;\n  readonly footerLinks?: IListOfLinks[];\n  readonly homepageLink?: ILink;\n  readonly language: string;\n  readonly languageSelector?: ILanguageSelector;\n  readonly logo: IImage;\n  readonly campaignLogo: IImage;\n  readonly secondaryNavigationLinks: ILink[];\n  readonly socialLinks: ILink[];\n  readonly supportButtonLink: ILink;\n  readonly enableSupportButton: boolean;\n  readonly paymentMethods?: IPaymentMethods;\n  readonly cookieSettingsLabel?: string;\n}\n\nconst Footer = ({\n  findAStoreAutocompleteEndpoint,\n  findAStoreButtonText,\n  findAStoreCountryCode,\n  findAStoreHeader,\n  findAStorePlaceholder,\n  findAStoreRedirectUrl,\n  findAStoreSearchEndpoint,\n  findAStoreSubHeader,\n  backToTopButtonText,\n  breadcrumb,\n  copyrightNotice,\n  enableFindAStore,\n  enableStickyBackToTopButton,\n  externalSitesLinks,\n  footerLinks = [],\n  homepageLink,\n  language,\n  languageSelector,\n  logo,\n  campaignLogo,\n  secondaryNavigationLinks,\n  socialLinks,\n  supportButtonLink,\n  enableSupportButton,\n  paymentMethods,\n  cookieSettingsLabel,\n}: Props) => {\n  const [storeQueryText, setStoreQueryText] = useState<string>('');\n  const [place, setPlace] = useState<IStoreLocatorPlace | null>(null);\n  const [openLinksSectionTitle, setOpenLinksSectionTitle] = useState('');\n  const isInIFrame = useIsInIFrame();\n  const [footerBannerRef, { clientHeight: footerBannerHeight }] =\n    useResizeObserver();\n  const [paymentMethodsRef, { clientHeight: paymentMethodsHeight }] =\n    useResizeObserver();\n\n  const { url: homepageUrl = '', target: homepageTarget = '_self' } =\n    homepageLink || {};\n\n  const getFirstAutocompletePlace = async (searchTerm: string) => {\n    try {\n      const autoCompleteResponse = await storeLocatorAutocomplete({\n        endpoint: findAStoreAutocompleteEndpoint,\n        countryCode: findAStoreCountryCode,\n        searchTerm,\n      });\n      const firstSuggestion = autoCompleteResponse[0];\n      const newPlace = firstSuggestion\n        ? {\n            id: firstSuggestion.placeId,\n            name: firstSuggestion.description,\n          }\n        : null;\n\n      return newPlace;\n    } catch (error) {\n      // eslint-disable-next-line no-console\n      console.log({ error });\n      return null;\n    }\n  };\n\n  const getSearchedPlace = async (\n    currentPlace: IStoreLocatorPlace | null,\n    currentQueryText: string\n  ) => {\n    if (currentPlace) return currentPlace;\n    if (!currentQueryText) return null;\n\n    const firstSuggestedPlace = await getFirstAutocompletePlace(\n      currentQueryText\n    );\n    return firstSuggestedPlace;\n  };\n\n  const handleStoresSearch = async () => {\n    try {\n      const searchedPlace = await getSearchedPlace(place, storeQueryText);\n      const { latitude, longitude } = searchedPlace\n        ? await storeLocatorSearch({\n            endpoint: findAStoreSearchEndpoint,\n            countryCode: findAStoreCountryCode,\n            languageCode: language,\n            placeId: searchedPlace.id,\n          })\n        : ({} as IStoreLocatorSearch);\n\n      updateDataLayer({\n        event: 'storeFinder',\n        search_term: storeQueryText,\n      });\n\n      const newQueryText = searchedPlace?.name || storeQueryText;\n      const newQueryParams = {\n        distance: 50,\n        ...(newQueryText ? { query: newQueryText } : {}),\n        ...(parseFloat(latitude) ? { latitude } : {}),\n        ...(parseFloat(longitude) ? { longitude } : {}),\n      };\n      const newQueryString = qs.stringify(newQueryParams, {\n        addQueryPrefix: true,\n      });\n\n      window.location.href = `${findAStoreRedirectUrl}${newQueryString}`;\n    } catch (error) {\n      // eslint-disable-next-line no-console\n      console.log({ error });\n    }\n  };\n\n  const handleSocialClick = (platform: string) => {\n    updateDataLayer({\n      event: 'socialClick',\n      platform,\n    });\n  };\n\n  return (\n    <footer className=\"dark bg-black-100 text-white\" data-testid=\"CT-02-Footer\">\n      <div className=\"bg-grey-600 pt-3 md:pb-28 xl:pt-10\">\n        <div className=\"container flex py-0.5\">\n          <div className=\"flex flex-row items-center\">\n            {logo?.desktop?.url && (\n              <a\n                href={homepageUrl}\n                target={isInIFrame ? '_parent' : homepageTarget}\n                className=\"mr-5 shrink-0 xl:mr-8\"\n              >\n                <Image\n                  image={logo}\n                  imageClasses=\"h-10 w-auto\"\n                  dataTestId=\"CT-02-Footer-Logo\"\n                />\n              </a>\n            )}\n            {campaignLogo?.desktop?.url && (\n              <Image\n                image={campaignLogo}\n                imageClasses=\"md:h-[21px] h-[19px] w-auto\"\n              />\n            )}\n          </div>\n\n          <div className=\"ml-auto hidden md:block\">\n            <ul className=\"flex\">\n              {socialLinks?.map((link) => (\n                <li\n                  className=\"ml-5 first:ml-0\"\n                  key={`social-links-${link.url}`}\n                >\n                  <a\n                    href={link.url}\n                    onClick={() => handleSocialClick(`${link.name}`)}\n                    target={isInIFrame ? '_parent' : '_blank'}\n                    rel=\"noreferrer\"\n                    aria-label={link.name}\n                    data-testid={`CT-02-Footer-Social-Icon-${link.name}`}\n                  >\n                    {link.linkIcon && (\n                      <Icon\n                        name={link.linkIcon}\n                        className=\"text-white transition duration-300 ease-in-out hover:text-yellow\"\n                      />\n                    )}\n                  </a>\n                </li>\n              ))}\n            </ul>\n          </div>\n        </div>\n\n        {breadcrumb && (\n          <div className=\"container pb-3 pt-[58px]\">\n            <Breadcrumbs\n              activePage={breadcrumb.activePage}\n              links={breadcrumb.links}\n              isInFooter\n            />\n          </div>\n        )}\n\n        <div\n          className={classNames(\n            'container grid py-12 max-md:gap-7.5 md:grid-cols-2 md:gap-4',\n            enableFindAStore ? 'xl:grid-cols-6' : 'xl:grid-cols-5'\n          )}\n        >\n          {footerLinks?.length > 0 &&\n            footerLinks.map((links) => (\n              <LinksSection\n                {...links}\n                key={`footer-links-${links.title}`}\n                isOpen={openLinksSectionTitle === links.title}\n                onSetOpenTitle={setOpenLinksSectionTitle}\n              />\n            ))}\n\n          {enableFindAStore && (\n            <div className=\"col-span-full mt-12 md:mt-0 md:w-1/2 xl:col-start-6 xl:ml-auto xl:w-full\">\n              {findAStoreHeader && (\n                <p className=\"body-two text-grey-500 mb-5\">\n                  {findAStoreHeader}\n                </p>\n              )}\n\n              <div>\n                <p className=\"mb-[5px]\">{findAStoreSubHeader}</p>\n\n                <StoreLocatorAutosuggest\n                  autocompleteEndpoint={findAStoreAutocompleteEndpoint}\n                  className=\"rounded-[5px] bg-white\"\n                  countryCode={findAStoreCountryCode}\n                  dataTestId=\"CT-02-Footer-Store-Locator-Autosuggest-Field\"\n                  queryText={storeQueryText}\n                  searchPlaceholderLabel={findAStorePlaceholder}\n                  type=\"footer\"\n                  onSetPlace={setPlace}\n                  onSetQueryText={setStoreQueryText}\n                  onSearch={handleStoresSearch}\n                />\n              </div>\n\n              <div className=\"mt-2.5\">\n                <Button onClick={handleStoresSearch}>\n                  {findAStoreButtonText}\n                </Button>\n              </div>\n            </div>\n          )}\n\n          <div className=\"mt-12 md:hidden\">\n            <ul className=\"flex justify-between\">\n              {socialLinks\n                .filter((link) => link.url && link.linkIcon)\n                .map(({ name = '', url = '', linkIcon = '' }) => (\n                  <li\n                    className=\"ml-5 first:ml-0\"\n                    key={`social-links-mobile-${url}`}\n                  >\n                    <a\n                      href={url}\n                      target={isInIFrame ? '_parent' : '_blank'}\n                      rel=\"noreferrer\"\n                      aria-label={name}\n                      data-testid={`CT-02-Footer-Social-Icon-${name}`}\n                    >\n                      <Icon\n                        name={linkIcon}\n                        className=\"text-white transition duration-300 ease-in-out hover:text-yellow\"\n                      />\n                    </a>\n                  </li>\n                ))}\n            </ul>\n          </div>\n        </div>\n      </div>\n\n      {!!paymentMethods?.items?.length && (\n        <div\n          ref={paymentMethodsRef}\n          className=\"border-t-[0.0625rem] border-t-white/30 bg-grey-600\"\n          data-testid=\"CT-02-Footer-Payment-Methods\"\n        >\n          <div className=\"container flex flex-wrap items-center justify-center gap-x-[2.375rem] gap-y-5 py-[1.5625rem] max-md:px-[1.1875rem] md:justify-start md:gap-x-[0.9375rem] md:py-[1.4375rem]\">\n            {paymentMethods.items.map((paymentMethod) => (\n              <div\n                key={paymentMethod.title}\n                className=\"h-[1.5625rem] w-[2.3125rem] md:h-[1.375rem] md:w-[2.0625rem]\"\n              >\n                <Image\n                  image={paymentMethod.image}\n                  imageClasses=\"h-full object-contain rounded-sm\"\n                  dataTestId=\"CT-02-Footer-Payment-Methods\"\n                />\n              </div>\n            ))}\n          </div>\n        </div>\n      )}\n\n      <div ref={footerBannerRef}>\n        <FooterBanner\n          backToTopButtonText={backToTopButtonText}\n          copyrightNotice={copyrightNotice}\n          enableStickyBackToTopButton={enableStickyBackToTopButton}\n          externalSitesLinks={externalSitesLinks}\n          language={language}\n          languageSelector={languageSelector}\n          secondaryNavigationLinks={secondaryNavigationLinks}\n          cookieSettingsLabel={cookieSettingsLabel}\n        />\n      </div>\n\n      {enableSupportButton &&\n        supportButtonLink?.url &&\n        supportButtonLink?.name &&\n        !isInIFrame && (\n          <SupportButton\n            link={supportButtonLink}\n            desktopBottomLimit={footerBannerHeight + paymentMethodsHeight}\n          />\n        )}\n    </footer>\n  );\n};\n\nexport default Footer;\n","const enum BreakpointEnum {\n  Small = 'sm',\n  Medium = 'md',\n  Large = 'lg',\n  XLarge = 'xl',\n}\n\nexport default BreakpointEnum;\n","enum ScrollProgressEnum {\n  Start = 'Start',\n  Middle = 'Middle',\n  End = 'End',\n}\n\nexport default ScrollProgressEnum;\n","import axios from 'axios';\nimport qs from 'qs';\nimport { IStoreLocatorAutocomplete } from '../models/IStoreLocatorAutocomplete';\n\nconst storeLocatorAutocomplete = async ({\n  endpoint,\n  countryCode,\n  searchTerm,\n}: {\n  endpoint: string;\n  countryCode: string;\n  searchTerm: string;\n}): Promise<IStoreLocatorAutocomplete[]> => {\n  const query = qs.stringify({\n    countryCode,\n    input: searchTerm,\n  });\n\n  const { data } = await axios.get<{\n    predictions: IStoreLocatorAutocomplete[];\n  } | null>(`${endpoint}?${query}`);\n\n  return data?.predictions || [];\n};\n\nexport default storeLocatorAutocomplete;\n","import { IStoreLocatorSearch } from '@models/IStoreLocatorSearch';\nimport { IStoreLocatorSearchParams } from '@models/IStoreLocatorSearchParams';\nimport axios from 'axios';\nimport qs from 'qs';\n\nconst storeLocatorSearch = async ({\n  endpoint,\n  input,\n  latitude,\n  longitude,\n  distance,\n  countryCode,\n  languageCode,\n  placeId,\n}: IStoreLocatorSearchParams): Promise<IStoreLocatorSearch> => {\n  const query = qs.stringify({\n    Input: input || '',\n    PlaceId: placeId || '',\n    Latitude: latitude || '0',\n    Longitude: longitude || '0',\n    MarketId: countryCode?.toUpperCase() || '',\n    SiteLanguageCode: languageCode,\n    Distance: distance || 50,\n    SearchByDistance: true,\n    IsDealerRequest: true,\n    IsPurchaseIntentRequest: false,\n    Type: 'physical',\n  });\n\n  const { data } = await axios.get<IStoreLocatorSearch>(`${endpoint}?${query}`);\n\n  return data;\n};\n\nexport default storeLocatorSearch;\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 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, 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"],"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","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","Autosuggest","loadable","autocompleteEndpoint","countryCode","queryText","searchPlaceholderLabel","onSearch","onSetPlace","onSetQueryText","autoCompleteSuggestions","setAutoCompleteSuggestions","suggestions","onSuggestionsFetchRequested","async","reason","_ref2","autoCompleteResponse","storeLocatorAutocomplete","endpoint","searchTerm","error","console","log","onSuggestionsClearRequested","getSuggestionValue","suggestion","description","renderSuggestion","onSuggestionSelected","event","_ref3","stopPropagation","id","placeId","inputProps","onChange","_","_ref4","newValue","onKeyUp","key","updateDataLayer","search_term","content_type","page_type","placeholder","activePage","links","scrollRef","isInFooter","breadcrumbAriaLabel","breadcrumbFooterAriaLabel","useAriaLabels","map","index","Fragment","substring","Icon","colorClassName","ShadowContainerHorizontal","BreadcrumbLinks","desktopBottomLimit","bottomPosition","setBottomPosition","scrollY","useWindowScrollPositions","isBelowLargeDesktop","useMediaQuery","scrollDistanceForButtonVisibility","bottomScrollOffset","documentElement","scrollHeight","window","innerHeight","a","bottom","size","title","isInIFrame","useIsInIFrame","handleLinkClick","linkTitle","main_category","sub_category","dangerouslySetInnerHTML","__html","isOpen","onSetOpenTitle","hidden","LinksList","div","findAStoreAutocompleteEndpoint","findAStoreButtonText","findAStoreCountryCode","findAStoreHeader","findAStorePlaceholder","findAStoreRedirectUrl","findAStoreSearchEndpoint","findAStoreSubHeader","backToTopButtonText","breadcrumb","copyrightNotice","enableFindAStore","enableStickyBackToTopButton","externalSitesLinks","footerLinks","homepageLink","language","languageSelector","logo","campaignLogo","secondaryNavigationLinks","socialLinks","supportButtonLink","enableSupportButton","paymentMethods","cookieSettingsLabel","storeQueryText","setStoreQueryText","place","setPlace","openLinksSectionTitle","setOpenLinksSectionTitle","footerBannerRef","clientHeight","footerBannerHeight","useResizeObserver","paymentMethodsRef","paymentMethodsHeight","homepageUrl","homepageTarget","getSearchedPlace","currentPlace","currentQueryText","firstSuggestion","getFirstAutocompletePlace","handleStoresSearch","searchedPlace","latitude","longitude","storeLocatorSearch","languageCode","newQueryText","newQueryParams","distance","query","parseFloat","newQueryString","qs","addQueryPrefix","location","Image","handleSocialClick","platform","rel","linkIcon","Breadcrumbs","LinksSection","StoreLocatorAutosuggest","Button","filter","items","paymentMethod","FooterBanner","SupportButton","input","data","axios","predictions","Input","PlaceId","Latitude","Longitude","MarketId","toUpperCase","SiteLanguageCode","Distance","SearchByDistance","IsDealerRequest","IsPurchaseIntentRequest","Type","eventPayload","dataLayer","push","getCurrentBreakpoint","breakpoints","innerWidth","screen","setScreen","resizeHandler","useCallback","observerRef","resizeParameters","setResizeParameters","handleResize","entries","Array","isArray","entry","contentRect","node","disconnect","undefined","ResizeObserver","observe"],"sourceRoot":""}