{"version":3,"file":"TechnicalSpecification-Chunk-e61be4e2187a93878dc9.js","mappings":"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","sources":["webpack://nikon-client/./components/atoms/LoadMoreButton/LoadMoreButton.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/atoms/Tag/Tag.tsx","webpack://nikon-client/./components/molecules/TechnicalSpecificationItem/TechnicalSpecificationItem.tsx","webpack://nikon-client/./components/organisms/TechnicalSpecification/TechnicalSpecification.tsx","webpack://nikon-client/./models/enums/ScrollProgressEnum.ts","webpack://nikon-client/./models/enums/SizeEnum.ts","webpack://nikon-client/./models/enums/TagTypesEnum.ts","webpack://nikon-client/./utility/helpers/gtm.ts","webpack://nikon-client/./utility/helpers/truncateText.ts","webpack://nikon-client/./utility/hooks/useIsTouchDevice.ts","webpack://nikon-client/./utility/hooks/useMediaQuery.ts","webpack://nikon-client/./node_modules/.pnpm/react-icomoon@2.6.0_react@18.3.1/node_modules/react-icomoon/dist/index.js"],"sourcesContent":["import Icon from '@atoms/Icon/Icon';\nimport classNames from 'classnames';\nimport { motion } from 'framer-motion';\nimport { ButtonHTMLAttributes, DetailedHTMLProps } from 'react';\n\ninterface Props\n  extends DetailedHTMLProps<\n    ButtonHTMLAttributes<HTMLButtonElement>,\n    HTMLButtonElement\n  > {\n  readonly open?: boolean;\n  readonly loadMoreLabel: string;\n  readonly loadLessLabel?: string;\n  readonly _type?: 'BASIC' | 'YELLOW-HIGHLIGHT';\n  readonly isLightMode?: boolean;\n  readonly dataTestId?: string;\n}\n\nconst LoadMoreButton = ({\n  open = false,\n  loadMoreLabel,\n  loadLessLabel,\n  _type = 'BASIC',\n  isLightMode,\n  dataTestId,\n  ...props\n}: Props) => (\n  <button\n    className={classNames(\n      'z-10 flex cursor-pointer flex-row items-center justify-center gap-4',\n      _type === 'YELLOW-HIGHLIGHT' && open\n        ? 'text-yellow underline decoration-1 underline-offset-4'\n        : `text-black-100 ${isLightMode ? '' : 'dark:text-white'}`\n    )}\n    data-testid={dataTestId}\n    {...props}\n  >\n    {(!open || loadLessLabel) && (\n      <p className=\"h6\">{open ? loadLessLabel : loadMoreLabel}</p>\n    )}\n\n    <motion.span\n      animate={{\n        rotate: open ? -180 : 0,\n      }}\n    >\n      <Icon name=\"downArrow\" size=\"1.25rem\" colorClassName=\"text-yellow\" />\n    </motion.span>\n  </button>\n);\n\nexport default LoadMoreButton;\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 SizeEnum from '@models/enums/SizeEnum';\nimport TagTypesEnum from '@models/enums/TagTypesEnum';\nimport { 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 disabled?: boolean;\n  readonly editHint?: string;\n  readonly link?: ILink;\n  readonly linkCallback?: () => void;\n  readonly pointerStates?: boolean;\n  readonly size?: Exclude<SizeEnum, SizeEnum.XLarge | SizeEnum.Medium>;\n  readonly tagType?: TagTypesEnum;\n  readonly text?: string;\n  readonly span?: boolean;\n  readonly isLightMode?: boolean;\n  readonly dataTestId?: string;\n}\n\ntype TagProps = Props &\n  DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;\n\nconst Tag = ({\n  children,\n  className,\n  disabled = false,\n  editHint,\n  link,\n  linkCallback,\n  pointerStates = true,\n  size = SizeEnum.Small,\n  span = false,\n  tagType,\n  text,\n  isLightMode,\n  dataTestId,\n  ...buttonProps\n}: PropsWithChildren<TagProps>) => {\n  const tagClasses = classNames(\n    {\n      [`text-black-100 bg-grey-200 ${\n        isLightMode ? '' : 'dark:bg-grey-600 dark:text-white'\n      }`]: tagType === TagTypesEnum.Primary,\n      //\n      [`hover:bg-grey active:text-white active:bg-black-100 ${\n        isLightMode\n          ? ''\n          : 'dark:hover:text-white dark:hover:bg-grey-500 dark:active:text-black-100 dark:active:bg-white'\n      }`]: tagType === TagTypesEnum.Primary && pointerStates,\n      //\n      [`text-white bg-black-100 ${\n        isLightMode ? '' : 'dark:bg-white dark:text-black-100'\n      }`]:\n        tagType === TagTypesEnum.Secondary || tagType === TagTypesEnum.Square,\n      //\n      [`hover:bg-grey hover:text-black-100 active:text-black-100 active:bg-grey-200 ${\n        isLightMode\n          ? ''\n          : 'dark:hover:text-white dark:hover:bg-grey-500 dark:active:text-white dark:active:bg-grey-600'\n      }`]: tagType === TagTypesEnum.Secondary && pointerStates,\n      //\n      [`text-black-100 bg-white ${\n        isLightMode ? '' : 'dark:bg-black-100 dark:text-white'\n      }`]: tagType === TagTypesEnum.Three,\n      //\n      [`hover:bg-grey active:bg-grey-400 ${\n        isLightMode\n          ? ''\n          : 'dark:hover:text-white dark:hover:bg-grey-500 dark:active:text-black-100 dark:active:bg-white'\n      }`]: tagType === TagTypesEnum.Three && pointerStates,\n      //\n      'text-yellow bg-black-100': tagType === TagTypesEnum.Four,\n      //\n      'hover:bg-grey hover:text-black-100 active:text-black-100 active:bg-grey-100':\n        tagType === TagTypesEnum.Four && pointerStates,\n      //\n      'py-2.5 px-5': size === SizeEnum.Large && tagType !== TagTypesEnum.Square,\n      //\n      'px-4 py-1': size === SizeEnum.Small && tagType !== TagTypesEnum.Square,\n      //\n      'pointer-events-none': !pointerStates,\n    },\n    tagType === TagTypesEnum.Square ? 'rounded-[3px]' : 'rounded-full body-two',\n    'select-none',\n    className\n  );\n\n  if (span) {\n    return (\n      <span className={tagClasses} data-testid={dataTestId}>\n        {text}\n      </span>\n    );\n  }\n\n  return link?.url && (link?.name || children) && !disabled ? (\n    <a\n      className={classNames('appearance-none', tagClasses)}\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={tagClasses}\n      disabled={disabled}\n      data-epi-property-name={editHint}\n      data-testid={dataTestId}\n    >\n      {children || text}\n    </button>\n  );\n};\n\nexport default Tag;\n","import Icon from '@atoms/Icon/Icon';\nimport { ITechnicalSpecificationItem } from '@models/ITechnicalSpecificationItem';\nimport truncateText from '@utils/helpers/truncateText';\nimport useMediaQuery from '@utils/hooks/useMediaQuery';\nimport { useState } from 'react';\n\ninterface Props extends ITechnicalSpecificationItem {\n  readonly dataTestId: string;\n  readonly showIcons: boolean;\n  readonly readMoreLabel: string;\n  readonly readLessLabel: string;\n}\n\nconst TechnicalSpecificationItem = ({\n  dataTestId,\n  title,\n  icon,\n  text,\n  readMoreLabel,\n  readLessLabel,\n  showIcons,\n}: Props) => {\n  const [readMore, setReadMore] = useState(false);\n  const isMobile = useMediaQuery(400);\n\n  return (\n    <div\n      className=\"grid grid-flow-col grid-cols-5 gap-5 border-b border-solid border-grey-500/40 py-5 first:border-t xl:grid-cols-12 xl:gap-4 xl:py-10\"\n      data-testid={dataTestId}\n    >\n      {showIcons && icon && (\n        <div className=\"col-start-1 col-end-2\">\n          <div className=\"w-6 xl:w-12\">\n            <Icon\n              name={icon}\n              size=\"100%\"\n              colorClassName=\"dark:text-white\"\n              data-testid={`${dataTestId}-Icon`}\n            />\n          </div>\n        </div>\n      )}\n      {(title || text) && (\n        <div className=\"col-span-4 grid grid-flow-row items-center xl:col-span-12 xl:grid-flow-col xl:grid-cols-12 xl:gap-4\">\n          {title && (\n            <span\n              dangerouslySetInnerHTML={{ __html: title }}\n              className=\"h6 pb-2 dark:text-white xl:col-span-3\"\n              data-testid={`${dataTestId}-Title`}\n            />\n          )}\n          {text && (\n            <span\n              dangerouslySetInnerHTML={{\n                __html:\n                  text.length > 165 && isMobile && !readMore\n                    ? truncateText(text, 165, ' ')\n                    : text,\n              }}\n              className=\"body-one col-span-9 text-grey-600 dark:text-grey-500\"\n              data-testid={`${dataTestId}-Text`}\n            />\n          )}\n\n          {text && text.length > 165 && isMobile && (\n            <div\n              onClick={() => setReadMore(!readMore)}\n              className=\"w-full cursor-pointer text-black-100 underline dark:text-grey-200\"\n              aria-hidden=\"true\"\n              data-testid={`${dataTestId}-Read-More`}\n            >\n              {readMore ? readLessLabel : readMoreLabel}\n            </div>\n          )}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default TechnicalSpecificationItem;\n","import LoadMoreButton from '@atoms/LoadMoreButton/LoadMoreButton';\nimport ShadowContainerHorizontal from '@atoms/ShadowContainerHorizontal/ShadowContainerHorizontal';\nimport Tag from '@atoms/Tag/Tag';\nimport TagTypesEnum from '@models/enums/TagTypesEnum';\nimport { ITechnicalSpecification } from '@models/ITechnicalSpecification';\nimport { ITechnicalSpecificationItem } from '@models/ITechnicalSpecificationItem';\nimport TechnicalSpecificationItem from '@molecules/TechnicalSpecificationItem/TechnicalSpecificationItem';\nimport updateDataLayer from '@utils/helpers/gtm';\nimport useIsTouchDevice from '@utils/hooks/useIsTouchDevice';\nimport { useState } from 'react';\n\nconst TechnicalSpecification = ({\n  anchorId = '',\n  defaultCount = 8,\n  tabs,\n  loadLessLabel,\n  loadMoreLabel,\n  meta,\n  readLessLabel,\n  readMoreLabel,\n  title,\n}: ITechnicalSpecification) => {\n  const [open, setOpen] = useState(false);\n  const isTouchDevice = useIsTouchDevice();\n  const [activeTabIndex, setActiveTabIndex] = useState(0);\n\n  const currentTab = tabs[activeTabIndex];\n\n  const scrollTo = (id: string) => {\n    const element = document.getElementById(id);\n    const y =\n      (element?.getBoundingClientRect().top || 0) +\n      window.scrollY -\n      (isTouchDevice ? 180 : 150);\n    window.scrollTo({ top: y, behavior: 'smooth' });\n  };\n\n  return (\n    <section\n      id={`a-${anchorId ?? 'tech-specs'}`}\n      className=\"component-padding bg-white text-grey-600 dark:bg-black-100 dark:text-white\"\n      data-testid=\"CT-16-Technical-Specification\"\n    >\n      <div className=\"container grid w-full grid-flow-row lg:grid-flow-col lg:grid-cols-8 xl:grid-cols-12\">\n        {title && (\n          <h2\n            className=\"col-span-full mb-10 lg:mb-13\"\n            data-epi-property-name={meta?.editHints?.title}\n            data-testid=\"CT-16-Technical-Specification-Title\"\n          >\n            {title}\n          </h2>\n        )}\n        {tabs.length > 1 && (\n          <ShadowContainerHorizontal className=\"col-span-full mb-10 lg:mb-13 overflow-x-scroll scrollbar-hide\">\n            <div className=\"flex gap-5\">\n              {tabs.map((tab, index) => {\n                const isActive = activeTabIndex === index;\n                return (\n                  <Tag\n                    className=\"shrink-0 whitespace-nowrap\"\n                    key={`tag-tmc-${tab.title}`}\n                    tagType={\n                      isActive ? TagTypesEnum.Secondary : TagTypesEnum.Primary\n                    }\n                    text={tab.title}\n                    pointerStates={!isActive}\n                    onClick={() => {\n                      setActiveTabIndex(index);\n                    }}\n                    dataTestId={`CT-16-Technical-Specification-Tab-${index}`}\n                  />\n                );\n              })}\n            </div>\n          </ShadowContainerHorizontal>\n        )}\n\n        {currentTab && !!currentTab.items?.length && (\n          <div\n            data-epi-property-name={meta?.editHints?.items}\n            className=\"col-span-full\"\n            data-testid=\"CT-16-Technical-Specification-Items\"\n          >\n            {currentTab.items\n              .slice(0, !open ? defaultCount : currentTab.items.length)\n              .map((item: ITechnicalSpecificationItem, index) => (\n                <TechnicalSpecificationItem\n                  dataTestId={`CT-16-Technical-Specification-Item-${index}`}\n                  key={item.title}\n                  {...item}\n                  showIcons={currentTab.items!.every((obj) => obj.icon)} // only show icons if all icons are populated\n                  readMoreLabel={readMoreLabel}\n                  readLessLabel={readLessLabel}\n                />\n              ))}\n          </div>\n        )}\n        {currentTab &&\n          currentTab.items &&\n          currentTab.items.length > defaultCount && (\n            <div className=\"flew-row col-span-full mt-9 flex w-full justify-center overflow-hidden lg:mt-15\">\n              <LoadMoreButton\n                loadLessLabel={loadLessLabel}\n                loadMoreLabel={loadMoreLabel}\n                open={open}\n                onClick={() => {\n                  if (open) {\n                    scrollTo(`a-${anchorId ?? 'tech-specs'}`);\n                  }\n                  setOpen(!open);\n                  updateDataLayer({\n                    event: 'selectContent',\n                    content_type: 'technical_specifications',\n                    link_text: 'load_more',\n                  });\n                }}\n                dataTestId=\"CT-16-Technical-Specification-Load-More-Button\"\n              />\n            </div>\n          )}\n      </div>\n    </section>\n  );\n};\n\nexport default TechnicalSpecification;\n","enum ScrollProgressEnum {\n  Start = 'Start',\n  Middle = 'Middle',\n  End = 'End',\n}\n\nexport default ScrollProgressEnum;\n","enum SizeEnum {\n  Small = 'SMALL',\n  Medium = 'MEDIUM',\n  Large = 'LARGE',\n  XLarge = 'XLARGE',\n}\n\nexport default SizeEnum;\n","enum TagTypesEnum {\n  Primary = 'PRIMARY',\n  Secondary = 'SECONDARY',\n  Three = 'THREE',\n  Four = 'FOUR',\n  Square = 'SQUARE',\n}\n\nexport default TagTypesEnum;\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","// Truncates text to the specific limit but keeps the last matched word intact even if it exceeds the limit\nconst truncateText = (text: string, charLimit: number, suffix: string) => {\n  const truncatedText = text.replace(\n    new RegExp(`^(.{${charLimit}}[^\\\\s]*).*`),\n    '$1'\n  );\n  const isLastCharFullStop =\n    truncatedText.substring(truncatedText.length - 1) === '.';\n\n  return isLastCharFullStop\n    ? `${truncatedText.slice(0, -1)}${suffix}`\n    : `${truncatedText}${suffix}`;\n};\n\nexport default truncateText;\n","import { useEffect, useState } from 'react';\n\nconst useIsTouchDevice = () => {\n  const [isTouchDevice, setIsTouchDevice] = useState<boolean>();\n\n  const handleIsTouchDevice = (): void => {\n    setIsTouchDevice('ontouchstart' in window || navigator.maxTouchPoints > 0);\n  };\n\n  useEffect(() => {\n    handleIsTouchDevice();\n\n    window.addEventListener('resize', handleIsTouchDevice);\n\n    return () => window.removeEventListener('resize', handleIsTouchDevice);\n  }, []);\n\n  return isTouchDevice;\n};\n\nexport default useIsTouchDevice;\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","\"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"],"names":["_ref","open","loadMoreLabel","loadLessLabel","_type","isLightMode","dataTestId","props","React","createElement","_extends","className","classNames","motion","span","animate","rotate","Icon","name","size","colorClassName","useHorizontalGrabScroll","containerRef","disabled","isMouseDown","setIsMouseDown","useState","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","ref","children","disableScroll","shadowColour","showStart","showEnd","shadowWidth","isNoWrapEnabled","useImperativeHandle","leftOffset","getOffsetWidth","offsetWidth","AnimatePresence","opacity","exit","initial","transition","duration","tabIndex","editHint","link","linkCallback","pointerStates","SizeEnum","Small","tagType","text","buttonProps","tagClasses","TagTypesEnum","Primary","Secondary","Square","Three","Four","Large","url","href","target","onClick","title","icon","readMoreLabel","readLessLabel","showIcons","readMore","setReadMore","isMobile","useMediaQuery","dangerouslySetInnerHTML","__html","length","truncateText","anchorId","defaultCount","tabs","meta","setOpen","isTouchDevice","useIsTouchDevice","activeTabIndex","setActiveTabIndex","currentTab","id","editHints","ShadowContainerHorizontal","map","tab","index","isActive","Tag","key","items","slice","item","TechnicalSpecificationItem","every","obj","LoadMoreButton","element","getElementById","getBoundingClientRect","window","scrollY","updateDataLayer","event","content_type","link_text","eventPayload","dataLayer","push","charLimit","suffix","truncatedText","replace","RegExp","substring","setIsTouchDevice","handleIsTouchDevice","navigator","maxTouchPoints","minWidth","isSmallerThan","setIsSmallerThan","handler","useCallback","isDesiredWidth","innerWidth","__assign","this","Object","assign","t","s","i","n","arguments","p","prototype","hasOwnProperty","call","apply","__rest","indexOf","getOwnPropertySymbols","propertyIsEnumerable","defineProperty","exports","iconList","react_1","iconSet","Array","isArray","icons","properties","_a","disableFill","removeInlineStyle","native","SvgComponent","PathComponent","currentIcon","find","initialStyle","display","stroke","fill","flexDirection","flexWrap","comptuedStyle","width","height","_b","viewBox","concat","paths","path","attrs","pathProps","d"],"sourceRoot":""}