{"version":3,"file":"related.0762b8fcdb5d6ea68677.chunk.js","mappings":"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","sources":["webpack://AlfaLaval/./node_modules/classnames/index.js","webpack://AlfaLaval/./assets/icons/common/Profile.tsx","webpack://AlfaLaval/./assets/icons/common/IconContainer.tsx","webpack://AlfaLaval/./assets/icons/common/Facebook.tsx","webpack://AlfaLaval/./assets/icons/common/Twitter.tsx","webpack://AlfaLaval/./assets/icons/common/ExternalLink.tsx","webpack://AlfaLaval/./assets/icons/common/Arrow.tsx","webpack://AlfaLaval/./assets/icons/common/Cross.tsx","webpack://AlfaLaval/./assets/icons/common/Delete.tsx","webpack://AlfaLaval/./assets/icons/common/Email.tsx","webpack://AlfaLaval/./assets/icons/common/Phone.tsx","webpack://AlfaLaval/./components/Accordion/Accordion.tsx","webpack://AlfaLaval/./components/Accordion/index.ts","webpack://AlfaLaval/./components/Button/Button.tsx","webpack://AlfaLaval/./components/QuoteItem/QuoteItem.tsx","webpack://AlfaLaval/./components/RadioButton/RadioButton.tsx","webpack://AlfaLaval/./helpers/noScroll.ts","webpack://AlfaLaval/./helpers/quoteClickHelper.ts","webpack://AlfaLaval/./hooks/useOutsideClick.tsx","webpack://AlfaLaval/./layouts/Related/Related.types.ts","webpack://AlfaLaval/./layouts/Related/components/common/RelatedFilter.tsx","webpack://AlfaLaval/./layouts/Related/components/common/RelatedItem.tsx","webpack://AlfaLaval/./layouts/Related/components/common/RelatedList.tsx","webpack://AlfaLaval/./helpers/numHelpers.ts","webpack://AlfaLaval/./layouts/Related/components/RelatedContainer/RelatedContainer.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocFilter/RelatedDocFilter.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocList/DocListShowMoreBtn.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocList/RelatedDocList.hooks.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocItem/Thumbnail.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocItem/RelatedDocItem.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocList/RelatedDocList.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/RelatedDocContainer.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/RelatedDocContainer.hooks.ts","webpack://AlfaLaval/./layouts/Related/components/RelatedServiceContainer/RelatedServiceContainer.tsx","webpack://AlfaLaval/./components/Modal/Modal.tsx","webpack://AlfaLaval/./components/IconButton/IconButton.tsx","webpack://AlfaLaval/./components/ScrollableContainer/ScrollableContainer.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/TechnicalDetailsContainer/TechnicalDetailsContainer.utils.ts","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/TechnicalDetailsContainer/components/TechnicalDetailsTopics/TechnicalDetailsTopics.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/TechnicalDetailsContainer/components/TechnicalDetailsTopics/TechnicalDetailsTopics.hooks.tsx","webpack://AlfaLaval/./components/Dropdown/Dropdown.tsx","webpack://AlfaLaval/./components/ListItem/ListItem.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/TechnicalDetailsContainer/components/ProductSelector/ProductSelector.tsx","webpack://AlfaLaval/./hooks/useDropdown.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/TechnicalDetailsContainer/TechnicalDetailsContainer.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/RelatedProductModelContainer.tsx","webpack://AlfaLaval/./layouts/Related/Related.service.ts","webpack://AlfaLaval/./layouts/Related/Related.tsx","webpack://AlfaLaval/./layouts/Related/index.ts","webpack://AlfaLaval/./pages/ContactUs/ContactUs.service.ts","webpack://AlfaLaval/./services/endpoints.ts"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\tvar nativeCodeString = '[native code]';\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import React from 'react';\r\n\r\nexport const Profile = () => (\r\n  <svg\r\n    xmlns='http://www.w3.org/2000/svg'\r\n    width='21'\r\n    height='21'\r\n    viewBox='0 0 21 21'\r\n    fill='none'\r\n    stroke='#11387f'\r\n    strokeWidth='2'\r\n    strokeLinecap='round'\r\n    strokeLinejoin='round'\r\n  >\r\n    <circle cx='12' cy='7' r='4' />\r\n    <path d='M12 14s-8-1.5-8 4h16c0-5.5-8-4-8-4z' />\r\n  </svg>\r\n);\r\n","import React, { ReactNode } from 'react';\r\n\r\ninterface IconContainerProps {\r\n  icon: ReactNode;\r\n  className?: string;\r\n}\r\n\r\nexport const IconContainer = ({ icon, className }: IconContainerProps) => {\r\n  return (\r\n    <i className={className} aria-hidden=\"true\">\r\n      {icon}\r\n    </i>\r\n  )\r\n};","import React from 'react';\r\n\r\nexport const Facebook = () => (\r\n  <svg xmlns=\"http://www.w3.org/2000/svg\" enable-background=\"new 0 0 24 24\" height=\"20\" viewBox=\"0 0 24 24\" width=\"20\">\r\n    <rect fill=\"none\" height=\"20\" width=\"20\" />\r\n    <path d=\"M22,12c0-5.52-4.48-10-10-10S2,6.48,2,12c0,4.84,3.44,8.87,8,9.8V15H8v-3h2V9.5C10,7.57,11.57,6,13.5,6H16v3h-2 c-0.55,0-1,0.45-1,1v2h3v3h-3v6.95C18.05,21.45,22,17.19,22,12z\" />\r\n  </svg>\r\n);\r\n\r\n\r\n","import React from 'react';\r\n\r\nexport const Twitter = () => (\r\n  <svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\">\r\n    <path d=\"M 2.3671875 3 L 9.4628906 13.140625 L 2.7402344 21 L 5.3808594 21 L 10.644531 14.830078 L 14.960938 21 L 21.871094 21 L 14.449219 10.375 L 20.740234 3 L 18.140625 3 L 13.271484 8.6875 L 9.2988281 3 L 2.3671875 3 z M 6.2070312 5 L 8.2558594 5 L 18.033203 19 L 16.001953 19 L 6.2070312 5 z\"></path>\r\n  </svg>\r\n);","import React from 'react';\r\n\r\nexport const ExternalLink = () => (\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <g id=\"external-link\">\r\n      <path id=\"Vector\" d=\"M18 13V17C18 18.0609 17.5786 19.0783 16.8284 19.8284C16.0783 20.5786 15.0609 21 14 21H3V6H11\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n      <path id=\"Vector_2\" d=\"M15 3H21V9\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n      <path id=\"Vector_3\" d=\"M10 14L21 3\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n    </g>\r\n  </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const Arrow = ({ stroke = '#10387F', rotate = 0 }) => {\r\n  return (\r\n    <svg\r\n      xmlns='http://www.w3.org/2000/svg'\r\n      width='24'\r\n      height='24'\r\n      viewBox='0 0 24 24'\r\n      fill='none'\r\n      style={{\r\n        transformBox: 'fill-box',\r\n        transformOrigin: 'center',\r\n        transform: `rotate(${rotate}deg)`,\r\n      }}\r\n    >\r\n      <path d='M9 18.5L15 12.5L9 6.5' stroke={stroke} strokeWidth='2' />\r\n    </svg>\r\n  );\r\n};\r\n","import React from 'react';\r\n\r\nexport const Cross = () => (\r\n  <svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'>\r\n    <path\r\n      d='M18 6L6 18'\r\n      stroke='currentColor'\r\n      strokeWidth='2'\r\n      strokeLinecap='round'\r\n      strokeLinejoin='round'\r\n    />\r\n    <path\r\n      d='M6 6L18 18'\r\n      stroke='currentColor'\r\n      strokeWidth='2'\r\n      strokeLinecap='round'\r\n      strokeLinejoin='round'\r\n    />\r\n  </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const Delete = () => (\r\n  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n    <path d=\"M3 6H5H21\" stroke=\"#3D3935\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n    <path d=\"M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6M19 6V18C19 19.0609 18.5786 20.0783 17.8284 20.8284C17.0783 21.5786 16.0609 22 15 22H5V6H19Z\" stroke=\"#3D3935\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n    <path d=\"M10 11V17\" stroke=\"#3D3935\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n    <path d=\"M14 11V17\" stroke=\"#3D3935\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n  </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const EmailSvg = () => (\r\n  <svg width='20' height='15' viewBox='0 0 20 15' fill='none' xmlns='http://www.w3.org/2000/svg'>\r\n    <path\r\n      d='M0.833496 2.74939C0.833496 1.64482 1.72893 0.74939 2.8335 0.74939H17.1668C18.2714 0.74939 19.1668 1.64482 19.1668 2.74939V3.50801L11.7086 8.675C10.6809 9.38697 9.31942 9.38697 8.29173 8.675L0.833496 3.50801V2.74939Z'\r\n      fill='#3D3935'\r\n    />\r\n    <path\r\n      d='M0.833496 4.42755L8.29173 9.59454C9.31942 10.3065 10.6809 10.3065 11.7086 9.59454L19.1668 4.42755V12.0827C19.1668 13.1873 18.2714 14.0827 17.1668 14.0827H2.8335C1.72893 14.0827 0.833496 13.1873 0.833496 12.0827V4.42755Z'\r\n      fill='#3D3935'\r\n    />\r\n  </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const PhoneSvg = () => (\r\n  <svg width='18' height='17' viewBox='0 0 18 17' fill='none' xmlns='http://www.w3.org/2000/svg'>\r\n    <path\r\n      fillRule='evenodd'\r\n      clipRule='evenodd'\r\n      d='M17.3327 12.5608V15.0698C17.3336 15.3028 17.2857 15.5333 17.1923 15.7468C17.0988 15.9602 16.9617 16.1517 16.7896 16.3092C16.6177 16.4667 16.4146 16.5865 16.1936 16.6611C15.9725 16.7358 15.7382 16.7635 15.5058 16.7425C12.9272 16.4629 10.4502 15.5835 8.27395 14.175C6.24917 12.8909 4.53255 11.1777 3.24595 9.15694C1.82971 6.97511 0.948369 4.49104 0.673306 1.90593C0.652365 1.67465 0.679901 1.44157 0.754173 1.22149C0.828436 1.00143 0.947808 0.799203 1.10467 0.627696C1.26154 0.456188 1.45247 0.319163 1.66532 0.225335C1.87815 0.131506 2.10824 0.0829403 2.34091 0.0827228H4.8549C5.26157 0.0787251 5.65584 0.222458 5.9642 0.487116C6.27256 0.751775 6.47396 1.11931 6.53088 1.52122C6.63701 2.32415 6.83377 3.11253 7.11751 3.87132C7.23022 4.17066 7.25461 4.49599 7.18782 4.80875C7.12095 5.12151 6.96567 5.4086 6.74042 5.63599L5.67613 6.69811C6.86905 8.79196 8.60613 10.5256 10.7041 11.7161L11.7684 10.654C11.9961 10.4292 12.2838 10.2742 12.5972 10.2075C12.9106 10.1408 13.2365 10.1651 13.5365 10.2776C14.2968 10.5608 15.0868 10.7572 15.8913 10.8631C16.2983 10.9204 16.6701 11.125 16.9359 11.438C17.2016 11.7511 17.3428 12.1507 17.3327 12.5608Z'\r\n      fill='#3D3935'\r\n    />\r\n  </svg>\r\n);\r\n","import { useWinSize } from '@contexts/WinSizeContext';\r\nimport classNames from 'classnames';\r\nimport React, { useState, useEffect } from 'react';\r\nimport './Accordion.scss';\r\n\r\ninterface ContainerProps {\r\n  className?: string;\r\n  children: React.ReactNode;\r\n}\r\n\r\nconst Container = ({ className, children }: ContainerProps) => {\r\n  return <div className={`c-accordion-tabs ${className}`}>{children}</div>;\r\n};\r\n\r\ninterface Tab {\r\n  id: string | number;\r\n  name: string | React.ReactNode;\r\n}\r\n\r\ninterface SectionProps {\r\n  isOpen?: boolean;\r\n  index?: number;\r\n  // used to open first accordion of a specific block on mobile\r\n  accordionBlockSelector?: string;\r\n  onClick?: (tab: Tab) => void;\r\n  children: React.ReactNode;\r\n  tab: Tab;\r\n  className?: string;\r\n  url?: string | null;\r\n  iconUrl?: string;\r\n  hasIcon?: boolean;\r\n  isLight?: boolean;\r\n}\r\n\r\nconst Section = ({\r\n  isOpen,\r\n  index,\r\n  onClick,\r\n  accordionBlockSelector = '#RelatedTabs',\r\n  children,\r\n  tab,\r\n  className,\r\n  url,\r\n  iconUrl,\r\n  isLight,\r\n  hasIcon,\r\n}: SectionProps) => {\r\n  const tabHead = '.c-accordion-tabs-head';\r\n  const tabBody = '.c-accordion-tabs-body';\r\n  const firstAccordionStyle = 'c-accordion-tabs-is-open';\r\n\r\n  const [isOpened, setIsOpened] = useState<boolean>(!!isOpen);\r\n  const { isDesktop } = useWinSize();\r\n  const isMobile = !isDesktop;\r\n\r\n  useEffect(() => {\r\n    openFirstAccordion();\r\n\r\n    if (isDesktop) {\r\n      window.addEventListener('resize', openFirstAccordion);\r\n      return () => {\r\n        window.removeEventListener('resize', openFirstAccordion);\r\n      };\r\n    }\r\n  }, []);\r\n\r\n  const handleClick = (tab: Tab) => {\r\n    const firstAccordionIsOpen =\r\n      index == 0 &&\r\n      document\r\n        .querySelector(`${accordionBlockSelector} ${tabHead}`)\r\n        .classList.contains(firstAccordionStyle);\r\n\r\n    if (firstAccordionIsOpen) {\r\n      closeFirstAccordion();\r\n    } else {\r\n      setIsOpened(!isOpened);\r\n    }\r\n\r\n    if (onClick) onClick(tab);\r\n  };\r\n\r\n  // To open 1st accordion(related tabs) by default for screens < 800 px\r\n  const openFirstAccordion = () => {\r\n    const accordionHead = document.querySelector(`${accordionBlockSelector} ${tabHead}`);\r\n    const accordionBody = document.querySelector(`${accordionBlockSelector} ${tabBody}`);\r\n    if (window.innerWidth < 800 && accordionHead && accordionBody) {\r\n      accordionHead.classList.add(firstAccordionStyle);\r\n      accordionBody.classList.add(firstAccordionStyle);\r\n    }\r\n  };\r\n\r\n  // To close 1st accordion(related tabs) conditionally for screens < 800 px as state is common for all accordions\r\n  const closeFirstAccordion = () => {\r\n    const accordionHead = document.querySelector(`${accordionBlockSelector} ${tabHead}`);\r\n    const accordionBody = document.querySelector(`${accordionBlockSelector} ${tabBody}`);\r\n    if (window.innerWidth < 800 && accordionHead && accordionBody) {\r\n      accordionHead.classList.remove(firstAccordionStyle);\r\n      accordionBody.classList.remove(firstAccordionStyle);\r\n      setIsOpened(false);\r\n    }\r\n  };\r\n\r\n  const itemheading = !(className || isMobile) ? 'c-accordion-tabs-is-open' : '';\r\n\r\n  return (\r\n    <div className='c-accordion-tabs-wrapper'>\r\n      <div\r\n        onClick={() => handleClick(tab)}\r\n        className={classNames(\r\n          `c-accordion-tabs-head ${className}`,\r\n          `c-tabs-${tab.id}`,\r\n          itemheading || '',\r\n          isOpened ? 'c-accordion-tabs-is-open' : '',\r\n          isLight ? 'c-accordion-tabs-head-light' : ''\r\n        )}\r\n      >\r\n        <div className='c-accordion-tabs-head-container is-bound'>\r\n          {hasIcon && (\r\n            <div\r\n              className='c-accordion-tabs-head-title-icon'\r\n              style={{ background: `url(${iconUrl}) no-repeat` }}\r\n            />\r\n          )}\r\n          <h4 className='c-accordion-tabs-head-title'>\r\n            {url !== null ? (\r\n              <a href={url}>\r\n                <span onClick={(event) => event.stopPropagation()}>{tab.name}</span>\r\n              </a>\r\n            ) : (\r\n              tab.name\r\n            )}\r\n          </h4>\r\n          {(!!className || isMobile) && (\r\n            <i className='c-accordion-tabs-chevron-down c-accordion-tabs-head-icon' />\r\n          )}\r\n        </div>\r\n      </div>\r\n      <div\r\n        className={`c-accordion-tabs-body ${itemheading} ${\r\n          isOpened ? 'c-accordion-tabs-is-open' : ''\r\n        }`}\r\n      >\r\n        {children}\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport { Container, Section };\r\n","import {Section, Container} from \"./Accordion\";\r\n\r\nexport const Accordion = {Section, Container};\r\n","import { createElement, ReactNode, MouseEvent } from 'react';\r\nimport classNames from 'classnames';\r\n\r\nexport interface ButtonProps extends React.HTMLAttributes<HTMLButtonElement | HTMLAnchorElement> {\r\n  text: string;\r\n  className?: string;\r\n  type?: 'button' | 'submit' | 'reset';\r\n  onClick?: (e: MouseEvent<HTMLButtonElement>) => void;\r\n  href?: string;\r\n  size?: 'xs' | 'small' | 'medium' | 'large';\r\n  disabled?: boolean;\r\n  color?: 'grey' | 'default' | 'primary' | 'cta';\r\n  border?: boolean;\r\n  children?: ReactNode;\r\n}\r\n\r\nexport const Button = ({\r\n  text,\r\n  className = '',\r\n  onClick = () => {},\r\n  href,\r\n  size = 'medium',\r\n  disabled = false,\r\n  color = 'default',\r\n  border = false,\r\n  children,\r\n  type,\r\n  ...props\r\n}: ButtonProps) => {\r\n  const tag = href ? 'a' : 'button';\r\n\r\n  return createElement(\r\n    tag,\r\n    {\r\n      onClick,\r\n      className:\r\n        classNames('c-button', {\r\n          'is-xs': size === 'xs',\r\n          'is-small': size === 'small',\r\n          'is-medium': size === 'medium',\r\n          'is-large': size === 'large',\r\n          'is-disabled': !!disabled,\r\n          'is-grey': color === 'grey',\r\n          'is-default': color === 'default',\r\n          'is-primary': color === 'primary',\r\n          'is-cta': color === 'cta',\r\n          'is-border': !!border,\r\n        }) +\r\n        ' ' +\r\n        className,\r\n      href,\r\n      ...(tag === 'a' && { target: '_blank' }),\r\n      type,\r\n      ...props,\r\n    },\r\n    [text, children]\r\n  );\r\n};\r\n","import React from 'react';\r\nimport { Delete } from '@icons/common';\r\nimport { RadioButton } from '@components/RadioButton';\r\nimport classNames from 'classnames';\r\nimport './QuoteItem.scss';\r\n\r\ninterface QuoteItemProps {\r\n  itemImage: string;\r\n  itemName: string;\r\n  itemDescription?: string;\r\n  buttonType: string;\r\n  className?: string;\r\n  onSelect?: (itemName: string) => void;\r\n  onButtonClick?: (itemName: string) => void;\r\n}\r\n\r\nexport const QuoteItem = ({\r\n  itemImage,\r\n  itemName,\r\n  itemDescription,\r\n  buttonType,\r\n  className,\r\n  onSelect,\r\n  onButtonClick = () => {},\r\n}: QuoteItemProps) => {\r\n  const renderButtonComponent = () => {\r\n    switch (buttonType) {\r\n      case 'delete':\r\n        return <Delete />;\r\n      case 'radio':\r\n        return <RadioButton id='quote_radio' name='quote_item' />;\r\n      default:\r\n        return null;\r\n    }\r\n  };\r\n\r\n  return (\r\n    <label\r\n      className={classNames(`quote-item ${className}`)}\r\n      onClick={() => onSelect && onSelect(itemName)}\r\n    >\r\n      <div className='quote-image-container'>\r\n        <img loading='lazy' src={itemImage} alt={itemName} />\r\n      </div>\r\n\r\n      <div className='quote-item-text'>\r\n        <div className='title'>{itemName}</div>\r\n        {itemDescription && <p className='description'>{itemDescription}</p>}\r\n      </div>\r\n      <div className='quote-item-button' onClick={() => onButtonClick(itemName)}>\r\n        {renderButtonComponent()}\r\n      </div>\r\n    </label>\r\n  );\r\n};\r\n","import React, { forwardRef } from 'react';\r\nimport classNames from 'classnames';\r\n\r\ninterface RadioButtonProps {\r\n  title?: string;\r\n  id: string;\r\n  name: string;\r\n  onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\r\n  checked?: boolean;\r\n  value?: string;\r\n}\r\n\r\nexport const RadioButton = forwardRef<HTMLInputElement, RadioButtonProps>(\r\n  ({ title, id, name, onChange, checked = false, value, ...props }, ref) => {\r\n    return (\r\n      <div className='c-radio-button'>\r\n        <label className='c-radio-button-container'>\r\n          <input\r\n            ref={ref}\r\n            type='radio'\r\n            onChange={onChange}\r\n            className='checkmark'\r\n            name={name}\r\n            value={value || title}\r\n            id={id}\r\n            defaultChecked={checked}\r\n            {...props}\r\n          />\r\n          {title}\r\n        </label>\r\n      </div>\r\n    );\r\n  }\r\n);\r\n","export const disableScroll = () => {\r\n  document.body.classList.add(\"no-scroll\");\r\n};\r\n\r\nexport const enableScroll = () => {\r\n  document.body.classList.remove(\"no-scroll\");\r\n};\r\n","import dataLayer from '@helpers/dataLayer';\r\n\r\nexport const quoteClickHelper = (contactUsForm: { I18: Record<string, string> }, redirect?: () => void) => {\r\n  localStorage.setItem('CategoryID', contactUsForm.I18.CategoryID);\r\n  // quoteOriginPageID is used as parent page id in contact-us/enquiry type form\r\n  localStorage.setItem('quoteOriginPageID', window.pageId);\r\n  localStorage.setItem('quoteOriginPageUrl', window.location.href);\r\n\r\n  dataLayer.push('contact_button', {\r\n    contact_type: contactUsForm?.I18?.RequestForQuote || '',\r\n  });\r\n\r\n  if (redirect) {\r\n    redirect();\r\n  } else {\r\n    window.location.href = contactUsForm?.I18?.EnquiryTypeLink;\r\n  }\r\n};\r\n","import { useEffect } from \"react\";\r\n\r\nexport const useOutsideClick = (\r\n  ref: React.RefObject<any>,\r\n  handler: Function\r\n) => {\r\n  return useEffect(() => {\r\n    const handleClick = (e: any) => {\r\n      if (ref.current && !ref.current.contains(e.target)) {\r\n        handler(e);\r\n      }\r\n    };\r\n\r\n    document.addEventListener(\"mousedown\", handleClick);\r\n    document.addEventListener(\"touchstart\", handleClick);\r\n\r\n    return () => {\r\n      document.removeEventListener(\"mousedown\", handleClick);\r\n      document.removeEventListener(\"touchstart\", handleClick);\r\n    };\r\n  }, [ref, handler]);\r\n};\r\n","export const PageTypes = {\r\n  PageIndustry: 'PageIndustry',\r\n  PageProductConstruction: 'PageProductConstruction',\r\n  PageProductLine: 'PageProductLine',\r\n};\r\n\r\nexport enum RelatedTabsTypes {\r\n  RelatedProducts = 'RelatedProducts',\r\n  RelatedProductModel = 'RelatedProductModel',\r\n  RelatedIndustries = 'RelatedIndustries',\r\n  RelatedServices = 'RelatedServices',\r\n  RelatedDocuments = 'Documents',\r\n}\r\n\r\nexport const types = {\r\n  ALL: 'ALL',\r\n};\r\n\r\nexport type RelatedItemTag = {\r\n  id: number | string;\r\n  name: string;\r\n};\r\n\r\nexport type RelatedItem = {\r\n  Title: string;\r\n  Summary?: string;\r\n  PageUrl?: string;\r\n  ImageUrl: string;\r\n  ImageAlt: string;\r\n  USPList?: any[]; // Assuming USPList can be an array of any type\r\n  Tags?: RelatedItemTag[];\r\n  Meta?: any;\r\n};\r\n\r\nexport type RelatedDocumentItem = RelatedItem & {\r\n  FileName: string;\r\n  Description: string;\r\n  FileSize: string;\r\n  FileCategory: string;\r\n  MimeType: string;\r\n  Url: string;\r\n  Tags: RelatedItemTag;\r\n};\r\n\r\nexport type RelatedContent = {\r\n  id?: string;\r\n  Items: RelatedItem[] | null;\r\n  Name: string;\r\n  RenderedServiceContentArea: string | null;\r\n  HideRelatedTabs: boolean;\r\n  StandardPages: RelatedItem[] | null;\r\n};\r\n\r\nexport type RelatedServices = RelatedContent & {\r\n  HideServiceList?: boolean;\r\n};\r\n\r\nexport type RelatedDocuments = RelatedContent & {\r\n  id: 'Documents';\r\n  Items: RelatedDocumentItem[] | null;\r\n  CustomDocumentTabText: string;\r\n  CustomDocumentTabContentArea: string;\r\n};\r\n\r\nexport type ProductModelTopic = {\r\n  Name: string;\r\n  Content: string;\r\n  Order: number;\r\n};\r\n\r\nexport type ProductModelImages = {\r\n  ImageAltText: string;\r\n  IsMain: boolean;\r\n  Order: number;\r\n  Thumbnail: string;\r\n  WebpLarge: string;\r\n  WebpMedium: string;\r\n};\r\n\r\nexport type ProductModelItem = {\r\n  Images: ProductModelImages[];\r\n  LanguageCode: string;\r\n  ProductConstructionPageId: string;\r\n  ProductLinePageId: string;\r\n  ProductModelId: string;\r\n  ProductName: string;\r\n  ProductModelDisplayName: string;\r\n  ProductDescription?: string;\r\n  Topics: ProductModelTopic[];\r\n};\r\n\r\nexport type RelatedProductModelItem = RelatedItem & {\r\n  ProductId: string;\r\n  ProductDescription: string;\r\n  ProductTitle: string;\r\n  ProductImageUrl: string;\r\n  ProductImageAlt: string;\r\n  TechnicalDataViewModels?: ProductModelItem[];\r\n};\r\n\r\nexport interface RelatedProductModel extends RelatedContent {\r\n  Items: RelatedProductModelItem[];\r\n}\r\n\r\nexport type RelatedTabs = {\r\n  MyProperty: number;\r\n  RelatedProducts: RelatedContent | null;\r\n  RelatedProductModel: RelatedProductModel | null;\r\n  RelatedIndustries: RelatedContent | null;\r\n  RelatedServices: RelatedServices | null;\r\n  Documents: RelatedContent | null;\r\n  I18n: Record<string, string>;\r\n  Tags: RelatedItemTag[] | null;\r\n  OtherTabLocalizedName: string;\r\n};\r\n\r\nexport const isRelatedDocuments = (\r\n  tab: RelatedContent | RelatedDocuments\r\n): tab is RelatedDocuments => {\r\n  return tab.id === 'Documents';\r\n};\r\n","import React, { useState } from 'react';\r\nimport { manipulateNodes } from '@helpers/jqueryHelpers';\r\nimport { RelatedItemTag } from '@layouts/Related/Related.types';\r\n\r\ninterface RelatedFilterProps {\r\n  onTagClick: (tag: RelatedItemTag) => void;\r\n  contentType: string;\r\n  tags: RelatedItemTag[];\r\n  isBound: boolean;\r\n  i18n: Record<string, string>;\r\n  className: string;\r\n}\r\n\r\nexport const RelatedFilter = ({\r\n  onTagClick = () => {},\r\n  contentType,\r\n  tags = [],\r\n  isBound,\r\n  i18n,\r\n  className,\r\n}: RelatedFilterProps) => {\r\n  const [selectedTag, setSelectedTag] = useState<RelatedItemTag>({ id: 0, name: 'All' });\r\n\r\n  const onTagClickHandler = (tag: RelatedItemTag) => {\r\n    manipulateNodes(`.related-block-${contentType}`, (node) => node.classList.add('hidden'));\r\n\r\n    setSelectedTag(tag);\r\n    onTagClick(tag);\r\n  };\r\n\r\n  const renderTag = (tag: RelatedItemTag) => {\r\n    const isActive = tag.id === selectedTag.id ? 'c-filter-block-tag-is-active' : '';\r\n\r\n    return (\r\n      <span\r\n        key={tag.id}\r\n        onClick={() => onTagClickHandler(tag)}\r\n        className={`c-filter-block-tag ${isActive}`}\r\n      >\r\n        {tag.name}\r\n      </span>\r\n    );\r\n  };\r\n\r\n  return tags.length > 0 ? (\r\n    <div className={`c-filter-block ${className}`}>\r\n      <div className={isBound ? 'is-bound' : ''}>\r\n        {renderTag({ id: 0, name: i18n.All })}\r\n        {tags.map(renderTag)}\r\n      </div>\r\n    </div>\r\n  ) : null;\r\n};\r\n","import React, { useState } from 'react';\r\nimport { RelatedItem as RelatedItemType } from '../../Related.types';\r\n\r\ninterface RelatedItemProps {\r\n  item: RelatedItemType;\r\n  onClick?: (item: RelatedItemType) => void;\r\n  className: string;\r\n}\r\n\r\nexport const RelatedItem = ({ item, onClick, className }: RelatedItemProps) => {\r\n  const [bulletsVisible, setBulletsVisible] = useState(false);\r\n\r\n  const toggleBullets = () => {\r\n    setBulletsVisible(!bulletsVisible);\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <div\r\n        onClick={() => {\r\n          onClick(item);\r\n        }}\r\n        className={`c-related-card ${className}`}\r\n      >\r\n        <a href={item.PageUrl}>\r\n          <div className='c-related-card-container'>\r\n            <div\r\n              className='c-related-card-image'\r\n              style={{\r\n                backgroundSize: 'contain',\r\n                backgroundRepeat: 'no-repeat',\r\n                backgroundPosition: '50% 50%',\r\n              }}\r\n            >\r\n              <img\r\n                loading='lazy'\r\n                src={item.ImageUrl}\r\n                alt={item.ImageAlt}\r\n                height='360'\r\n                width='640'\r\n              />\r\n            </div>\r\n            {item.USPList && bulletsVisible && (\r\n              <div className='c-related-card-bullets-container'>\r\n                {className === 'is-style-1' && <h4>{item.Title}</h4>}\r\n                <div className='c-related-card-bullets-container-list'>\r\n                  <ul>\r\n                    {item.USPList.map((item, index) => (\r\n                      <li key={index}>{item}</li>\r\n                    ))}\r\n                  </ul>\r\n                </div>\r\n              </div>\r\n            )}\r\n          </div>\r\n          <div className='c-related-card-text'>\r\n            <h4>{item.Title}</h4>\r\n            {item.Summary && <p>{item.Summary}</p>}\r\n          </div>\r\n        </a>\r\n        {className === 'is-style-1' && item?.USPList?.length > 0 && (\r\n          <div className='c-related-card-more-btn' onClick={toggleBullets}>\r\n            <i className='icon-ellipsis-v' />\r\n          </div>\r\n        )}\r\n      </div>\r\n    </>\r\n  );\r\n};\r\n","import { RelatedItemTag, RelatedItem as RelatedItemType } from '@layouts/Related/Related.types';\r\nimport React, { useState, useEffect, useMemo } from 'react';\r\nimport { RelatedItem } from './RelatedItem';\r\n\r\n// Id used for showing all items\r\nconst offset = 4;\r\nconst defaultOffset = 4;\r\nconst perRow = 4;\r\n\r\ninterface RelatedListProps {\r\n  filterTag?: RelatedItemTag;\r\n  items?: RelatedItemType[];\r\n  onRelatedItemClick?: (item: RelatedItemType) => void;\r\n  styleType: string;\r\n  i18n: Record<string, string>;\r\n}\r\n\r\nexport const RelatedList = ({\r\n  filterTag = { id: 0, name: 'All' },\r\n  onRelatedItemClick,\r\n  items = [],\r\n  styleType,\r\n  i18n,\r\n}: RelatedListProps) => {\r\n  const [maxItemsVisible, setMaxItemsVisible] = useState(defaultOffset);\r\n\r\n  const filteredList = useMemo(() => {\r\n    if (filterTag.id === 0) {\r\n      return items || [];\r\n    }\r\n\r\n    return items.filter((item) => {\r\n      if (!item.Tags) return false;\r\n\r\n      const itemTags = item.Tags.map(tag => tag?.id) || [];\r\n      return itemTags?.includes(filterTag.id);\r\n    });\r\n  }, [filterTag.id]);\r\n  \r\n  useEffect(() => {\r\n    setMaxItemsVisible(defaultOffset);\r\n  }, [filterTag.id]);\r\n\r\n  const showMore = () => {\r\n    setMaxItemsVisible((value) => value + offset);\r\n  };\r\n\r\n  return filteredList.length > 0 ? (\r\n    <div className='is-bound'>\r\n      <div className='l-products-list-container'>\r\n        <div className='l-products-list'>\r\n          {filteredList\r\n            .filter((_item, index) => index < maxItemsVisible)\r\n            .map((item, index) => {\r\n              return (\r\n                <div\r\n                  key={index}\r\n                  className={`l-products-list-item  ${perRow ? `is-${perRow}` : ''}`}\r\n                >\r\n                  <RelatedItem onClick={onRelatedItemClick} className={styleType} item={item} />\r\n                </div>\r\n              );\r\n            })}\r\n        </div>\r\n      </div>\r\n      {maxItemsVisible < filteredList.length && (\r\n        <div className='l-show-more-btn'>\r\n          <button className='c-button is-primary is-medium is-upper-case' onClick={showMore}>\r\n            {i18n.ShowMore || 'Show more'}\r\n          </button>\r\n        </div>\r\n      )}\r\n    </div>\r\n  ) : null;\r\n};\r\n","export const mathCal = (n: number, multiply: number) => {\r\n  const FloatVal: string = multiply.toFixed(1);\r\n\r\n  if (n > 0) return Math.ceil(n / Number(FloatVal)) * multiply;\r\n  else if (n < 0) return Math.floor(n / Number(FloatVal)) * multiply;\r\n  else return multiply;\r\n};\r\n\r\nexport const clampNumber = (number: number, min: number, max: number) => {\r\n  return Math.min(Math.max(number, min), max);\r\n};\r\n\r\nexport const sortAsc = (a, b) => {\r\n  if (!a?.name || !b?.name) return 0;\r\n  if (a?.name < b?.name) return -1;\r\n  if (a?.name > b?.name) return 1;\r\n  return 0;\r\n};\r\n","import React, { useState, useMemo } from 'react';\r\nimport { RelatedItem, RelatedList, RelatedFilter } from '../common';\r\nimport { sortAsc } from '@helpers/numHelpers';\r\nimport { RelatedItem as RelatedItemType, RelatedItemTag } from '@layouts/Related/Related.types';\r\n\r\ninterface RelatedContainerProps {\r\n  styleType: string;\r\n  content: RelatedItemType[];\r\n  blockContent?: string;\r\n  I18n: Record<string, string>;\r\n  contentType: string;\r\n}\r\n\r\nexport const RelatedContainer = ({\r\n  styleType,\r\n  content,\r\n  blockContent,\r\n  I18n,\r\n  contentType,\r\n}: RelatedContainerProps) => {\r\n  const [filterTag, setFilterTag] = useState<RelatedItemTag>({ id: 0, name: 'All' });\r\n\r\n  const updateFilterTag = (aFilterTag: RelatedItemTag) => {\r\n    if (filterTag.id != aFilterTag.id) {\r\n      setFilterTag(aFilterTag);\r\n    }\r\n  };\r\n\r\n  const tags = useMemo(() => {\r\n    let filters: RelatedItemTag[] = [];\r\n    let tags: RelatedItemType[] = [];\r\n\r\n    if (content) {\r\n      tags = content.filter((item) => item.Tags);\r\n    }\r\n    \r\n    /* Iterate all tags */\r\n      tags.forEach(function (items) {\r\n        items.Tags?.forEach(function (item) {\r\n          item && filters.push(item);\r\n        });\r\n      });\r\n    \r\n    \r\n    if (filters.length > 0) {\r\n      const stringFilters = filters.map((item) => JSON.stringify(item));\r\n      const uniqueStringFilters = new Set(stringFilters);\r\n      filters = [];\r\n      uniqueStringFilters.forEach((item) => filters.push(JSON.parse(item)));\r\n      filters.sort(sortAsc);\r\n    }\r\n    return filters;\r\n  }, [content]);\r\n\r\n  return !(content || blockContent) ? null : (\r\n    <div className='l-section l-section-100'>\r\n      {blockContent && (\r\n        <div className='l-page' dangerouslySetInnerHTML={{ __html: blockContent }} />\r\n      )}\r\n\r\n      <RelatedFilter\r\n        tags={tags}\r\n        i18n={I18n}\r\n        isBound={true}\r\n        className={'is-related'}\r\n        onTagClick={updateFilterTag}\r\n        contentType={contentType}\r\n      />\r\n\r\n      <RelatedList styleType={styleType} items={content} i18n={I18n} filterTag={filterTag} />\r\n    </div>\r\n  );\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport { DocumentSectionSlider } from '@layouts/utils/DocumentSectionSlider';\r\nimport { manipulateNodes } from '@helpers/jqueryHelpers';\r\nimport { RelatedItemTag } from '@layouts/Related/Related.types';\r\nimport './RelatedDocFilter.scss';\r\n\r\ninterface RelatedDocFilterProps {\r\n  onTagClick: (tag: RelatedItemTag) => void;\r\n  i18n: Record<string, string>;\r\n  tags: RelatedItemTag[];\r\n  isBound: boolean;\r\n}\r\n\r\nexport const RelatedDocFilter = ({\r\n  onTagClick = () => {},\r\n  i18n,\r\n  tags = [],\r\n  isBound,\r\n}: RelatedDocFilterProps) => {\r\n  const [selectedTag, setSelectedTag] = useState<RelatedItemTag>({ id: 0, name: 'All' });\r\n\r\n  useEffect(() => {\r\n    DocumentSectionSlider.init();\r\n  }, []);\r\n\r\n  const handleTagClick = (tag: RelatedItemTag) => {\r\n    manipulateNodes('.related-document-block', (node) => node.classList.add('hidden'));\r\n    setSelectedTag(tag);\r\n    onTagClick(tag);\r\n  };\r\n\r\n  const renderTag = (tag: RelatedItemTag) => {\r\n    return (\r\n      <li\r\n        key={tag.id}\r\n        onClick={() => handleTagClick(tag)}\r\n        className='c-document-section-list-item swiper-slide'\r\n      >\r\n        <a className={tag.id == selectedTag.id ? 'selected' : ''}>{tag.name}</a>\r\n      </li>\r\n    );\r\n  };\r\n\r\n  return tags.length > 0 ? (\r\n    <div className={`c-document-section ${isBound ? 'is-bound' : ''}`}>\r\n      <div className='c-document-section-swiper swiper-container'>\r\n        <ul className='c-document-section-list swiper-wrapper'>\r\n          {renderTag({ id: 0, name: i18n.All })}\r\n          {tags.map(renderTag)}\r\n        </ul>\r\n      </div>\r\n      <div className='c-document-section-button is-next is-hidden' />\r\n      <div className='c-document-section-button is-prev is-hidden' />\r\n    </div>\r\n  ) : null;\r\n};\r\n","import React, { useState, useEffect, useMemo } from 'react';\r\n\r\ninterface DocListShowMoreBtnProps {\r\n  selectedTag: boolean;\r\n  updateSelectedTag: (val: boolean) => void;\r\n  text: string;\r\n  listLength: number;\r\n}\r\n\r\nexport const DocListShowMoreBtn = ({\r\n  selectedTag,\r\n  updateSelectedTag,\r\n  text,\r\n  listLength,\r\n}: DocListShowMoreBtnProps) => {\r\n  const [isVisible, setIsVisible] = useState(0);\r\n  const [showMoreClick, setShowMoreClick] = useState(false);\r\n  const offset = 8;\r\n  const defaultOffset = 4;\r\n\r\n  useEffect(() => {\r\n    if (selectedTag) {\r\n      setIsVisible(0);\r\n      setShowMoreClick(false);\r\n    }\r\n  }, [selectedTag]);\r\n\r\n  const handleShowMore = () => {\r\n    const offsetNew = isVisible + offset;\r\n    const blocks = document.querySelectorAll(\r\n      '[data-related-block=\"documentlist' + offsetNew + '\"]'\r\n    );\r\n    blocks?.forEach((element) => {\r\n      element.classList.remove('hidden');\r\n    });\r\n    setIsVisible((oldVal) => oldVal + offset);\r\n\r\n    if (selectedTag) updateSelectedTag(false);\r\n    setShowMoreClick(true);\r\n  };\r\n\r\n  const canShowMore = useMemo(() => {\r\n    let show = false;\r\n    if (defaultOffset < listLength) {\r\n      if (showMoreClick) {\r\n        if (offset < listLength && (isVisible == 0 || isVisible + defaultOffset < listLength))\r\n          show = true;\r\n      } else if (isVisible == 0 || isVisible + defaultOffset < listLength) {\r\n        show = true;\r\n      }\r\n    }\r\n    return show;\r\n  }, [isVisible, listLength]);\r\n\r\n  return canShowMore ? (\r\n    <div className='l-show-more-btn'>\r\n      <button className='c-button is-primary is-medium is-upper-case' onClick={handleShowMore}>\r\n        {text}\r\n      </button>\r\n    </div>\r\n  ) : null;\r\n};\r\n","import React, { useMemo, ReactNode } from 'react';\r\nimport { mathCal } from '@helpers/numHelpers';\r\nimport { RelatedDocumentItem } from '@layouts/Related/Related.types';\r\n\r\nexport const useItemsToRender = ({\r\n  renderItem,\r\n  filteredList,\r\n}: {\r\n  renderItem: (item: RelatedDocumentItem) => ReactNode;\r\n  filteredList: RelatedDocumentItem[];\r\n}) => {\r\n  const offset = 8;\r\n  const defaultOffset = 4;\r\n\r\n  const items = useMemo(() => {\r\n    let itemsToRender: ReactNode[] = [];\r\n\r\n    if (!filteredList) return null;\r\n\r\n    if (filteredList.length < defaultOffset) {\r\n      itemsToRender = filteredList.map((item) => <div key={item.Url}>{renderItem(item)}</div>);\r\n    } else {\r\n      let lastValue = 0;\r\n      const defaultList = filteredList.slice(0, defaultOffset);\r\n      itemsToRender = defaultList.map((item) => <div key={item.Url}>{renderItem(item)}</div>);\r\n      const total = filteredList.length;\r\n      const nextList = filteredList.slice(defaultOffset, total);\r\n      const roundedTotal = mathCal(nextList.length, offset);\r\n\r\n      for (let i = 1; i <= roundedTotal; i++) {\r\n        if (i % offset == 0) {\r\n          const listIterationObj = nextList ? nextList.slice(lastValue, i) : null;\r\n          if (listIterationObj) {\r\n            listIterationObj.map((item, index) => {\r\n              const Data = (\r\n                <div\r\n                  key={`${index}_${i}`}\r\n                  className={`hidden related-document-block`}\r\n                  id={`${index}related-document-block${i}`}\r\n                  data-related-block={'documentlist' + i}\r\n                >\r\n                  {renderItem(item)}\r\n                </div>\r\n              );\r\n              itemsToRender.push(Data);\r\n              return itemsToRender;\r\n            });\r\n          }\r\n\r\n          lastValue = i;\r\n        }\r\n      }\r\n    }\r\n    return itemsToRender;\r\n  }, [renderItem, filteredList]);\r\n  return items;\r\n};\r\n","import { RelatedDocumentItem } from '@layouts/Related/Related.types';\r\nimport React from 'react';\r\n\r\ninterface ThumbnailProps {\r\n  item: RelatedDocumentItem;\r\n}\r\n\r\nexport const Thumbnail = ({ item }: ThumbnailProps) => {\r\n  let iconClass = 'icon-file-empty';\r\n  if (item && item.FileCategory && item.FileCategory === 'bimobject') {\r\n    iconClass = 'icon-link-ext';\r\n  } else if (item && item.MimeType) {\r\n    const mimeType = item.MimeType.toLowerCase();\r\n    switch (true) {\r\n      case mimeType === 'pdf':\r\n        iconClass = 'icon-pdf';\r\n        break;\r\n      case mimeType === 'xlsx' || mimeType === 'xls':\r\n        iconClass = 'icon-file-excel';\r\n        break;\r\n      case mimeType === 'docx' || mimeType === 'doc':\r\n        iconClass = 'icon-file-word';\r\n        break;\r\n      case mimeType === 'pptx' || mimeType === 'ppt':\r\n        iconClass = 'icon-file-ppt';\r\n        break;\r\n      case mimeType === 'zip' || mimeType === 'tar' || mimeType === '7z':\r\n        iconClass = 'icon-file-archive';\r\n        break;\r\n      default:\r\n        iconClass = 'icon-file-empty';\r\n    }\r\n  }\r\n\r\n  return (\r\n    <div className='c-document-list-item-thumbnail'>\r\n      <i\r\n        className={`c-document-list-item-thumbnail svg-icon pr-8 ${iconClass} icon-related-document`}\r\n      />\r\n    </div>\r\n  );\r\n};\r\n","import React from 'react';\r\nimport dataLayer from '@helpers/dataLayer';\r\nimport { RelatedDocumentItem } from '@layouts/Related/Related.types';\r\nimport { Thumbnail } from './Thumbnail';\r\nimport { getURLFileData } from '@helpers/URLHelpers';\r\n\r\ninterface RelatedDocItemProps {\r\n  item: RelatedDocumentItem;\r\n}\r\n\r\nexport const RelatedDocItem = ({ item }: RelatedDocItemProps) => {\r\n  const onDownloadItem = () => {\r\n    const { fileName } = getURLFileData(item.Url);\r\n    dataLayer.push('file_download', {\r\n      file_name: fileName,\r\n      file_extension: item.MimeType,\r\n      file_category: item.FileCategory,\r\n      file_context: item.Tags.name,\r\n      link_text: item.FileName,\r\n      link_url: item.Url,\r\n    });\r\n  };\r\n\r\n  return (\r\n    <a\r\n      download\r\n      onClick={onDownloadItem}\r\n      href={item.Url}\r\n      className='c-document-list-item is-bound has-line-under'\r\n      target='_blank'\r\n      rel='noreferrer'\r\n    >\r\n      <div className='c-document-list-item-icon-container'>\r\n        <i className='icon-download'></i>\r\n      </div>\r\n      <Thumbnail item={item} />\r\n      <div className='c-document-list-item-tail'>\r\n        <div className='c-document-list-item-tail-container'>\r\n          <span className='c-document-list-item-main-text'>{item.FileName}</span>\r\n          <span className='c-document-list-item-secondary-text'>\r\n            {item.Description} {item.FileSize}\r\n          </span>\r\n        </div>\r\n      </div>\r\n    </a>\r\n  );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { DocListShowMoreBtn } from './DocListShowMoreBtn';\r\nimport { useItemsToRender } from './RelatedDocList.hooks';\r\nimport { RelatedDocItem } from '../RelatedDocItem';\r\nimport { RelatedDocumentItem, RelatedItemTag } from '@layouts/Related/Related.types';\r\n\r\ninterface RelatedDocListProps {\r\n  items: RelatedDocumentItem[];\r\n  filterTag: RelatedItemTag;\r\n  selectedTag: boolean;\r\n  updateSelectedTag: (val: boolean) => void;\r\n  i18n: Record<string, string>;\r\n  renderCustomContent: string;\r\n}\r\n\r\n// Id used for showing all items\r\nconst SHOW_ALL_ID = 0;\r\n\r\nexport const RelatedDocList = ({\r\n  items = [],\r\n  filterTag,\r\n  selectedTag,\r\n  updateSelectedTag,\r\n  i18n,\r\n  renderCustomContent,\r\n}: RelatedDocListProps) => {\r\n  const [filteredList, setFilteredList] = useState(items);\r\n  const itemsToRender = useItemsToRender({\r\n    renderItem: (item: RelatedDocumentItem) => <RelatedDocItem item={item} />,\r\n    filteredList,\r\n  });\r\n\r\n  useEffect(() => {\r\n    setFilteredList(getFilteredList(filterTag));\r\n  }, [filterTag]);\r\n\r\n  const getFilteredList = (filterTag: RelatedItemTag) => {\r\n    if (filterTag === null || filterTag.id == SHOW_ALL_ID) {\r\n      return items;\r\n    }\r\n\r\n    return items.filter((item) => {\r\n      if (!item.Tags) return false;\r\n\r\n      const tagItems = Array.isArray(item.Tags) ? item.Tags : [item.Tags];\r\n\r\n      const itemTags = tagItems.map(({ id }) => id);\r\n      if (filterTag.id == 'Other') {\r\n        return itemTags?.includes(null);\r\n      }\r\n      return itemTags?.includes(filterTag.id);\r\n    });\r\n  };\r\n\r\n  return (\r\n    <>\r\n      {itemsToRender}\r\n      {filterTag.id == '001' && (\r\n        <div dangerouslySetInnerHTML={{ __html: renderCustomContent }}></div>\r\n      )}\r\n      <DocListShowMoreBtn\r\n        selectedTag={selectedTag}\r\n        updateSelectedTag={updateSelectedTag}\r\n        text={i18n.ShowMore || 'Show more'}\r\n        listLength={filteredList.length}\r\n      />\r\n    </>\r\n  );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { RelatedDocFilter } from './components/RelatedDocFilter/RelatedDocFilter';\r\nimport { RelatedDocList } from './components/RelatedDocList';\r\nimport { useRelatedDocFilterItems } from './RelatedDocContainer.hooks';\r\nimport { RelatedItemTag, RelatedDocumentItem } from '@layouts/Related/Related.types';\r\n\r\ninterface RelatedDocContainerProps {\r\n  styleType: string;\r\n  content: RelatedDocumentItem[];\r\n  othersLabel: string;\r\n  customTabText: string;\r\n  customTabContent: string;\r\n  I18n: Record<string, string>;\r\n}\r\n\r\nexport const RelatedDocContainer = ({\r\n  styleType,\r\n  content,\r\n  othersLabel,\r\n  customTabText,\r\n  customTabContent,\r\n  I18n,\r\n}: RelatedDocContainerProps) => {\r\n  const [selectedTag, setSelectedTag] = useState(false);\r\n  const [filterTag, setFilterTag] = useState<RelatedItemTag>({\r\n    id: 0,\r\n    name: 'All',\r\n  });\r\n  const filters = useRelatedDocFilterItems({\r\n    content,\r\n    othersLabel,\r\n    customTabText,\r\n  });\r\n\r\n  const updateSelectedTag = (val: boolean) => {\r\n    setSelectedTag(val);\r\n  };\r\n\r\n  const updateFilterTag = (newFilterTag: RelatedItemTag) => {\r\n    if (filterTag.id != newFilterTag.id) {\r\n      setSelectedTag(true);\r\n      setFilterTag(newFilterTag);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <div className='l-section l-section-100'>\r\n      <RelatedDocFilter tags={filters} i18n={I18n} isBound={true} onTagClick={updateFilterTag} />\r\n\r\n      <RelatedDocList\r\n        renderCustomContent={customTabContent}\r\n        items={content}\r\n        i18n={I18n}\r\n        filterTag={filterTag}\r\n        selectedTag={selectedTag}\r\n        updateSelectedTag={updateSelectedTag}\r\n      />\r\n    </div>\r\n  );\r\n};\r\n","import { useMemo } from 'react';\r\nimport { sortAsc } from '@helpers/numHelpers';\r\nimport { RelatedItem, RelatedItemTag } from '@layouts/Related/Related.types';\r\n\r\ninterface UseRelatedDocFilterItemsProps {\r\n  content: RelatedItem[];\r\n  othersLabel: string;\r\n  customTabText: string;\r\n}\r\n\r\nexport const useRelatedDocFilterItems = ({\r\n  content,\r\n  othersLabel,\r\n  customTabText,\r\n}: UseRelatedDocFilterItemsProps) => {\r\n  const filterItems = useMemo(() => {\r\n    let filters: RelatedItemTag[] = [];\r\n    let tags: RelatedItem[] = [];\r\n\r\n    if (content) {\r\n      tags = content.filter((item) => item.Tags);\r\n    }\r\n\r\n    /* Iterate all tags */\r\n    tags.forEach(function (tag) {\r\n      if (!tag.Tags) return;\r\n\r\n      const docTags = Array.isArray(tag.Tags) ? tag.Tags : [tag.Tags];\r\n      docTags?.forEach((item) => {\r\n        if (item.id == null || item.name == null) {\r\n          filters.push({ id: 'Other', name: othersLabel });\r\n        } else {\r\n          filters.push(item);\r\n        }\r\n      });\r\n    });\r\n\r\n    if (filters.length > 0) {\r\n      const stringFilters = filters.map((item) => JSON.stringify(item));\r\n      const uniqueStringFilters = new Set(stringFilters);\r\n      filters = [];\r\n      uniqueStringFilters.forEach((item) => filters.push(JSON.parse(item)));\r\n      filters.sort(sortAsc);\r\n      const index = filters.findIndex((x) => x.id === 'Other');\r\n      filters.push(filters.splice(index, 1)[0]);\r\n    }\r\n\r\n    if (customTabText != null) {\r\n      filters.push({ id: '001', name: customTabText });\r\n    }\r\n    return filters;\r\n  }, [content, customTabText, othersLabel]);\r\n\r\n  return filterItems;\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport { RelatedItem, RelatedList, RelatedFilter } from '../common';\r\nimport { sortAsc } from '@helpers/numHelpers';\r\nimport { RelatedItemTag, RelatedItem as RelatedItemType } from '@layouts/Related/Related.types';\r\n\r\ninterface RelatedServiceContainerProps {\r\n  content: RelatedItemType[];\r\n  blockContent: string;\r\n  contentStandard: RelatedItemType[];\r\n  styleType: string;\r\n  contentType: string;\r\n  I18n: Record<string, string>;\r\n  hideServiceList: boolean;\r\n}\r\n\r\nexport const RelatedServiceContainer = ({\r\n  content,\r\n  blockContent,\r\n  contentStandard,\r\n  styleType,\r\n  contentType,\r\n  I18n,\r\n  hideServiceList,\r\n}: RelatedServiceContainerProps) => {\r\n  const [filterTag, setFilterTag] = useState<RelatedItemTag>({ id: 0, name: 'All' });\r\n  const [filterTagStandard, setFilterTagStandard] = useState<RelatedItemTag>({\r\n    id: 0,\r\n    name: 'All',\r\n  });\r\n  const [filters, setFilters] = useState<RelatedItemTag[]>([]);\r\n  const [filtersStandard, setFiltersStandard] = useState<RelatedItemTag[]>([]);\r\n\r\n  useEffect(() => {\r\n    let initfilters: RelatedItemTag[] = [];\r\n    let initfiltersStandard: RelatedItemTag[] = [];\r\n    let inittags: RelatedItemType[] = [];\r\n    let inittagsStandard: RelatedItemType[] = [];\r\n\r\n    if (content) {\r\n      inittags = content.filter((item) => item.Tags);\r\n    }\r\n\r\n    if (contentStandard) {\r\n      inittagsStandard = contentStandard.filter((item) => item.Tags);\r\n    }\r\n\r\n    /* Iterate all tags */\r\n   \r\n      inittags.forEach(function (items) {\r\n        items.Tags?.forEach(function (item) {\r\n          initfilters.push(item);\r\n        });\r\n      });\r\n    \r\n      inittagsStandard.forEach(function (items) {\r\n        items.Tags?.forEach(function (item) {\r\n          initfiltersStandard.push(item);\r\n        });\r\n      });\r\n    \r\n\r\n    if (initfilters.length > 0) {\r\n      const stringFilters = initfilters.map((item) => JSON.stringify(item));\r\n      const uniqueStringFilters = new Set(stringFilters);\r\n      initfilters = [];\r\n      uniqueStringFilters.forEach((item) => initfilters.push(JSON.parse(item)));\r\n      initfilters.sort(sortAsc);\r\n      setFilters(initfilters);\r\n    }\r\n\r\n    if (initfiltersStandard.length > 0) {\r\n      const stringFiltersStandard = initfiltersStandard.map((item) => JSON.stringify(item));\r\n      const uniqueStringFiltersStandard = new Set(stringFiltersStandard);\r\n      initfiltersStandard = [];\r\n      uniqueStringFiltersStandard.forEach((item) => initfiltersStandard.push(JSON.parse(item)));\r\n      initfiltersStandard.sort(sortAsc);\r\n      setFiltersStandard(initfiltersStandard);\r\n    }\r\n  }, []);\r\n\r\n  const updateFilterTag = (filterTag: RelatedItemTag) => {\r\n    setFilterTag(filterTag);\r\n  };\r\n\r\n  const updateFilterTagStandard = (filterTagStandard: RelatedItemTag) => {\r\n    setFilterTagStandard(filterTagStandard);\r\n  };\r\n\r\n  return (\r\n    <>\r\n      {!content && !blockContent ? null : !contentStandard && !blockContent ? null : (\r\n        <div className='l-section l-section-100'>\r\n          {blockContent && (\r\n            <div className='l-page' dangerouslySetInnerHTML={{ __html: blockContent }} />\r\n          )}\r\n          {!hideServiceList && (\r\n            <>\r\n              <RelatedFilter\r\n                tags={filters}\r\n                i18n={I18n}\r\n                isBound\r\n                className='is-related'\r\n                contentType={contentType}\r\n                onTagClick={updateFilterTag}\r\n              />\r\n              <RelatedList\r\n                styleType={styleType}\r\n                items={content}\r\n                i18n={I18n}\r\n                filterTag={filterTag}\r\n              />\r\n            </>\r\n          )}\r\n\r\n          <RelatedFilter\r\n            tags={filtersStandard}\r\n            i18n={I18n}\r\n            isBound\r\n            className='is-related'\r\n            contentType={contentType}\r\n            onTagClick={updateFilterTagStandard}\r\n          />\r\n          <RelatedList\r\n            styleType={styleType}\r\n            items={contentStandard}\r\n            i18n={I18n}\r\n            filterTag={filterTagStandard}\r\n          />\r\n        </div>\r\n      )}\r\n    </>\r\n  );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport classNames from 'classnames';\r\nimport { disableScroll, enableScroll } from '@helpers/noScroll';\r\nimport './Modal.scss';\r\n\r\ninterface ModalProps {\r\n  header?: React.ReactNode;\r\n  subHeader?: React.ReactNode;\r\n  onClose: () => void;\r\n  className?: string;\r\n  children: React.ReactNode;\r\n  isOuterModal?: boolean;\r\n}\r\n\r\nexport const Modal = ({ children, header, subHeader, onClose, className, isOuterModal }: ModalProps) => {\r\n  useEffect(() => {\r\n    disableScroll();\r\n    return () => {\r\n      isOuterModal && enableScroll();\r\n    };\r\n  }, []);\r\n\r\n  return (\r\n    <>\r\n      <div className='modal-overlay' />\r\n      <div className={classNames('modal', className)}>\r\n        <div className='modal-header'>\r\n          <div className='modal-header-main'>{header}</div>\r\n          <div className='modal-header__close'>\r\n            <i onClick={onClose} className='icon-symbol-close' />\r\n          </div>\r\n        </div>\r\n        {subHeader && <div className='modal-sub-header'>{subHeader}</div>}\r\n        <div className='modal-content'>{children}</div>\r\n      </div>\r\n    </>\r\n  );\r\n};\r\n","import React from 'react';\r\nimport { Button } from '@components/Button';\r\nimport classNames from 'classnames';\r\nimport './IconButton.scss';\r\n\r\nexport const IconButton = ({ children, onClick, className }) => {\r\n  return (\r\n    <Button\r\n      text=''\r\n      color='default'\r\n      size='small'\r\n      className={classNames('c-icon-button', className)}\r\n      onClick={onClick}\r\n    >\r\n      {children}\r\n    </Button>\r\n  );\r\n};\r\n","import React, { useRef, useState, UIEvent } from 'react';\r\nimport { Arrow } from '@icons/common';\r\nimport { IconButton } from '@components/IconButton';\r\nimport classNames from 'classnames';\r\nimport './ScrollableContainer.scss';\r\n\r\ninterface ScrollableContainerProps {\r\n  className?: string;\r\n  children: React.ReactNode;\r\n}\r\n\r\nexport const ScrollableContainer = ({ children, className }: ScrollableContainerProps) => {\r\n  const topicsRef = useRef<HTMLDivElement>(null);\r\n  const topicsContainerRef = useRef<HTMLDivElement>(null);\r\n  const [visibleScrollBtns, setVisibleScrollBtns] = useState<Array<'left' | 'right'>>(['right']);\r\n\r\n  const onClickScrollBtn = (direction: 'left' | 'right') => {\r\n    topicsRef.current.scrollBy({\r\n      left: direction === 'left' ? -300 : 300,\r\n      behavior: 'smooth',\r\n    });\r\n  };\r\n\r\n  const onScrollContent = (e: UIEvent<HTMLDivElement>) => {\r\n    const target = e.target as HTMLDivElement;\r\n    const { scrollLeft, scrollWidth, clientWidth } = target;\r\n    const scrollRight = scrollWidth - scrollLeft - clientWidth;\r\n    const newShowBtn = [];\r\n    if (scrollRight > 5) {\r\n      newShowBtn.push('right');\r\n    }\r\n    if (scrollLeft > 5) {\r\n      newShowBtn.push('left');\r\n    }\r\n    setVisibleScrollBtns(newShowBtn);\r\n  };\r\n\r\n  return (\r\n    <div\r\n      ref={topicsContainerRef}\r\n      className={classNames('scrollable-container', className, {\r\n        [`scrollable-container--${visibleScrollBtns.sort().join('_')}`]:\r\n          visibleScrollBtns.length > 0,\r\n      })}\r\n    >\r\n      {visibleScrollBtns.includes('left') && (\r\n        <IconButton\r\n          className='scrollable-container__scroll-left'\r\n          onClick={() => {\r\n            onClickScrollBtn('left');\r\n          }}\r\n        >\r\n          <Arrow rotate={180} />\r\n        </IconButton>\r\n      )}\r\n      {visibleScrollBtns.includes('right') && (\r\n        <IconButton\r\n          className='scrollable-container__scroll-right'\r\n          onClick={() => {\r\n            onClickScrollBtn('right');\r\n          }}\r\n        >\r\n          <Arrow rotate={0} />\r\n        </IconButton>\r\n      )}\r\n      <div ref={topicsRef} className='scrollable-container-content' onScroll={onScrollContent}>\r\n        {children}\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n","export const extractTitle = (content: string) => {\r\n  const titleRegex = /<h1>(.*?)<\\/h1>/;\r\n  const match = content.replace('\\n', ' ').match(titleRegex);\r\n\r\n  if (match) {\r\n    const parser = new DOMParser();\r\n    const title = parser.parseFromString(match[1], 'text/html');\r\n    return title.body.textContent || '';\r\n  }\r\n\r\n  return '';\r\n};\r\n\r\nexport const getIdFromContent = (content: string, index: number) => {\r\n  return (\r\n    extractTitle(content)\r\n      .replace(/[^a-zA-Z]/g, '')\r\n      .toLowerCase() + `_${index}`\r\n  );\r\n};\r\n","import React from 'react';\r\nimport classNames from 'classnames';\r\nimport { ProductModelTopic } from '@layouts/Related/Related.types';\r\nimport { useSelectedTopic } from './TechnicalDetailsTopics.hooks';\r\nimport { ScrollableContainer } from '@components/ScrollableContainer';\r\nimport { extractTitle, getIdFromContent } from '../../TechnicalDetailsContainer.utils';\r\nimport './TechnicalDetailsTopics.scss';\r\n\r\ninterface TechnicalDetailsTagsProps {\r\n  topics: ProductModelTopic[];\r\n  contentRef: React.RefObject<HTMLDivElement>;\r\n}\r\n\r\nexport const TechnicalDetailsTopics = ({ topics, contentRef }: TechnicalDetailsTagsProps) => {\r\n  const topicIds = topics.map((topic, i) => getIdFromContent(topic.Content, i));\r\n  const { selectedTopicId, onTopicClick } = useSelectedTopic(topicIds, contentRef);\r\n\r\n  return (\r\n    <ScrollableContainer className='technical-details-topics-container'>\r\n      <div className='technical-details-topics'>\r\n        {topics.map((topic, index) => {\r\n          const topicId = getIdFromContent(topic.Content, index);\r\n          const topicTitle = extractTitle(topic.Content);\r\n          return (\r\n            <span\r\n              key={index}\r\n              id={`topic-${topicId}`}\r\n              onClick={() => onTopicClick(topicId)}\r\n              className={classNames('technical-details-topics__tag', {\r\n                'technical-details-topics__tag--active': selectedTopicId === topicId,\r\n              })}\r\n            >\r\n              {topicTitle}\r\n            </span>\r\n          );\r\n        })}\r\n      </div>\r\n    </ScrollableContainer>\r\n  );\r\n};\r\n","import { RefObject, useEffect, useState } from 'react';\r\n\r\nexport const useSelectedTopic = (topics: string[], contentRef: RefObject<HTMLDivElement>) => {\r\n  const [selectedTopicId, setSelectedTopicId] = useState<string>(topics[0]);\r\n\r\n  const onTopicClick = (id: string) => {\r\n    const target = document.getElementById(id);\r\n    target?.scrollIntoView({\r\n      block: 'start',\r\n    });\r\n    setSelectedTopicId(id);\r\n  };\r\n\r\n  useEffect(() => {\r\n    // scroll toolbar to selected topic\r\n    document\r\n      .getElementById(`topic-${selectedTopicId}`)\r\n      ?.scrollIntoView({ block: 'start', inline: 'center' });\r\n  }, [selectedTopicId]);\r\n\r\n  useEffect(() => {\r\n    if (!contentRef.current) return;\r\n\r\n    const headerElements = document.querySelectorAll(topics.map((id) => `#${id} > h1`).join(', '));\r\n    const technicalDetailsElements = Array.from(headerElements);\r\n\r\n    const selectFirstTopic = (viewportTop: number, viewportHeight: number) => {\r\n      const viewportBottom = viewportTop + viewportHeight;\r\n\r\n      /* Filters out all the element that are not in viewport */\r\n      const visibleElements = technicalDetailsElements.filter((el) => {\r\n        const element = el as HTMLElement;\r\n        const top = element.offsetTop;\r\n        const titleHeight = element.offsetHeight;\r\n        const bottom = top + titleHeight;\r\n\r\n        /* More then half of the title is visible */\r\n        const isVisibleTop = top >= viewportTop - titleHeight / 2;\r\n        const isVisibleBottom = bottom <= viewportBottom + titleHeight / 2;\r\n\r\n        return isVisibleTop && isVisibleBottom;\r\n      });\r\n\r\n      const topElementWrapperId = visibleElements[0]?.parentElement?.id;\r\n      /* Picks the top element */\r\n      if (visibleElements && visibleElements.length && topElementWrapperId) {\r\n        setSelectedTopicId(topElementWrapperId);\r\n      }\r\n    };\r\n\r\n    const onScroll = (e: Event) => {\r\n      const target = e.target as HTMLDivElement;\r\n      const viewportTop = target.scrollTop;\r\n      const viewportHeight = target.clientHeight;\r\n\r\n      selectFirstTopic(viewportTop, viewportHeight);\r\n    };\r\n\r\n    selectFirstTopic(contentRef.current.scrollTop, contentRef.current.clientHeight);\r\n\r\n    contentRef.current?.addEventListener('scroll', onScroll);\r\n\r\n    return () => {\r\n      contentRef.current?.removeEventListener('scroll', onScroll);\r\n    };\r\n  }, [contentRef, topics]);\r\n\r\n  return {\r\n    selectedTopicId,\r\n    onTopicClick,\r\n  };\r\n};\r\n","import React, { forwardRef } from 'react';\r\nimport classNames from 'classnames';\r\nimport './Dropdown.scss';\r\n\r\ninterface DropdownProps {\r\n  children: React.ReactNode;\r\n  className?: string;\r\n}\r\n\r\nexport const Dropdown = forwardRef<HTMLDivElement, DropdownProps>(\r\n  ({ children, className }, ref) => {\r\n    return (\r\n      <div ref={ref} className={classNames('c-dropdown', className)}>\r\n        {children}\r\n      </div>\r\n    );\r\n  }\r\n);\r\n","import React from 'react';\r\nimport classNames from 'classnames';\r\nimport './ListItem.scss';\r\n\r\ntype ListItemProps = {\r\n  title?: string;\r\n  text?: string;\r\n  action?: () => void;\r\n  active?: boolean;\r\n};\r\n\r\nexport const ListItem = ({ title, text, action, active }: ListItemProps) => {\r\n  return (\r\n    <div\r\n      className={classNames('c-list-item-container', {\r\n        'c-list-item-container--active': active,\r\n      })}\r\n      onClick={action}\r\n    >\r\n      <p className='c-list-item-title'>{title}</p>\r\n      {text && <p className='c-list-item-text'>{text}</p>}\r\n    </div>\r\n  );\r\n};\r\n","import React from 'react';\r\nimport { useDropdown } from '@hooks/useDropdown';\r\nimport { Arrow } from '@icons/common';\r\nimport { ListItem } from '@components/ListItem';\r\nimport { ProductModelItem } from '@layouts/Related/Related.types';\r\nimport './ProductSelector.scss';\r\n\r\ninterface ProductSelectorProps {\r\n  selectedProduct: string;\r\n  onSelectProduct: (product: ProductModelItem) => void;\r\n  products: ProductModelItem[];\r\n}\r\n\r\nexport const ProductSelector = ({\r\n  selectedProduct,\r\n  products,\r\n  onSelectProduct,\r\n}: ProductSelectorProps) => {\r\n  const { isOpen, DropdownWrapper, onOpen } = useDropdown(\r\n    products.map((product) => (\r\n      <ListItem\r\n        key={product.ProductModelId}\r\n        title={product.ProductModelDisplayName}\r\n        active={selectedProduct === product.ProductModelDisplayName}\r\n        action={() => onSelectProduct(product)}\r\n      />\r\n    ))\r\n  );\r\n\r\n  if (!products || products.length < 2) {\r\n    return (\r\n      <div className='technical-details-title technical-details-title--no-selection'>\r\n        <h2>{selectedProduct}</h2>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <DropdownWrapper>\r\n      <div className='technical-details-title' onClick={onOpen}>\r\n        <h2>{selectedProduct}</h2>\r\n        <Arrow rotate={isOpen ? 90 : 270} />\r\n      </div>\r\n    </DropdownWrapper>\r\n  );\r\n};\r\n","import React, { useState, MouseEvent } from 'react';\r\nimport classNames from 'classnames';\r\nimport { useOutsideClick } from '@hooks/useOutsideClick';\r\nimport { Dropdown } from '@components/Dropdown';\r\n\r\nexport const useDropdown = (content: React.ReactNode) => {\r\n  const dropdownContainerRef = React.useRef<HTMLDivElement>(null);\r\n  const dropdownRef = React.useRef<HTMLDivElement>(null);\r\n  const [isOpen, setIsOpen] = useState(false);\r\n\r\n  const handleClick = (e: MouseEvent<HTMLDivElement>) => {\r\n    setIsOpen(!isOpen);\r\n  };\r\n\r\n  useOutsideClick(dropdownContainerRef, () => {\r\n    setIsOpen(false);\r\n  });\r\n\r\n  return {\r\n    isOpen,\r\n    onOpen: handleClick,\r\n    DropdownWrapper: ({ children }: { children: React.ReactNode }) => (\r\n      <div\r\n        ref={dropdownContainerRef}\r\n        className={classNames('c-dropdown-button-container')}\r\n        style={{\r\n          position: 'relative',\r\n        }}\r\n      >\r\n        {children}\r\n        {isOpen && <Dropdown ref={dropdownRef}>{content}</Dropdown>}\r\n      </div>\r\n    ),\r\n  };\r\n};\r\n","import React, { useState } from 'react';\r\nimport {\r\n  ProductModelItem,\r\n  ProductModelTopic,\r\n  RelatedProductModelItem,\r\n} from '../../../Related.types';\r\nimport { Button } from '@components/Button';\r\nimport { Modal } from '@components/Modal';\r\nimport { TechnicalDetailsTopics } from './components/TechnicalDetailsTopics';\r\nimport { ProductSelector } from './components/ProductSelector';\r\nimport { useFetchContactUsFormQuery } from '@pages/ContactUs/ContactUs.service';\r\nimport { QuoteItem } from '@components/QuoteItem';\r\nimport { quoteClickHelper } from '@helpers/quoteClickHelper';\r\nimport { getIdFromContent } from './TechnicalDetailsContainer.utils';\r\nimport './TechnicalDetailsContainer.scss';\r\n\r\ninterface TechnicalDetailsContainerProps {\r\n  products: ProductModelItem[];\r\n  productLine: RelatedProductModelItem;\r\n  defaultSelectedItem: ProductModelItem;\r\n  i18n: Record<string, string>;\r\n  handleClose: () => void;\r\n}\r\n\r\nexport const TechnicalDetailsContainer = ({\r\n  products,\r\n  productLine,\r\n  defaultSelectedItem,\r\n  handleClose,\r\n  i18n,\r\n}: TechnicalDetailsContainerProps) => {\r\n  const contentRef = React.useRef<HTMLDivElement>(null);\r\n  const [selectedItem, setSelectedItem] = useState<ProductModelItem>(defaultSelectedItem);\r\n  const [quoteModalOpen, setQuoteModalOpen] = useState<boolean>(false);\r\n  const [selectedQuoteItem, setSelectedQuoteItem] = useState<ProductModelItem>(null);\r\n\r\n  const { data: contactUsForm } = useFetchContactUsFormQuery();\r\n  const requestForQuoteText = contactUsForm?.I18?.RequestForQuote;\r\n\r\n  // Logic to remove page breaks. In future we can have more.\r\n  const filteredTopics = selectedItem.Topics.filter(\r\n    (topic: ProductModelTopic) => topic.Name.toLowerCase() !== 'page break'\r\n  );\r\n\r\n  const onSelectProduct = (product: ProductModelItem) => {\r\n    setSelectedItem(product);\r\n  };\r\n\r\n  const onSelectQuoteItem = (product: ProductModelItem) => {\r\n    setSelectedQuoteItem(product);\r\n  };\r\n\r\n  const openQuoteModal = () => {\r\n    setQuoteModalOpen(true);\r\n  };\r\n\r\n  const closeQuoteModal = () => {\r\n    setQuoteModalOpen(false);\r\n    setSelectedQuoteItem(null);\r\n  };\r\n\r\n  const onRequestAQuote = () => {\r\n    quoteClickHelper(contactUsForm, () => {\r\n      window.history.scrollRestoration = 'manual';\r\n      const isProductLine = selectedQuoteItem.ProductModelId === window.pageId;\r\n      const queryParameter = isProductLine ? '?productLine=' : '?productModel=';\r\n      const productLinePageId = !isProductLine ? '&productLinePageId=' + window.pageId : '';\r\n\r\n      window.history.pushState(\r\n        {\r\n          product: {\r\n            isProductLine,\r\n            name: selectedQuoteItem.ProductModelDisplayName,\r\n            id: selectedQuoteItem.ProductModelId,\r\n            imageSrc: selectedQuoteItem.Images[0]?.Thumbnail,\r\n            description: selectedQuoteItem.ProductDescription,\r\n          },\r\n        },\r\n        '',\r\n\r\n        contactUsForm.I18.EnquiryTypeLink +\r\n          queryParameter +\r\n          selectedQuoteItem.ProductModelId +\r\n          productLinePageId\r\n      );\r\n\r\n      window.history.go();\r\n    });\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <Modal\r\n        header={\r\n          <div className='modal-header-content'>\r\n            <ProductSelector\r\n              products={products}\r\n              selectedProduct={selectedItem.ProductModelDisplayName}\r\n              onSelectProduct={onSelectProduct}\r\n            />\r\n            <Button\r\n              size='small'\r\n              color='primary'\r\n              text={requestForQuoteText}\r\n              onClick={openQuoteModal}\r\n            />\r\n          </div>\r\n        }\r\n        subHeader={<TechnicalDetailsTopics topics={filteredTopics} contentRef={contentRef} />}\r\n        onClose={handleClose}\r\n        className='technical-details-modal'\r\n        isOuterModal={true}\r\n      >\r\n        <div ref={contentRef} className='technical-details-content'>\r\n          {filteredTopics.map((topic: ProductModelTopic, index: number) => (\r\n            <div\r\n              id={getIdFromContent(topic.Content, index)}\r\n              key={index}\r\n              className={`content-topic ${topic.Name}`}\r\n              dangerouslySetInnerHTML={{ __html: topic.Content }}\r\n            />\r\n          ))}\r\n        </div>\r\n      </Modal>\r\n\r\n      {quoteModalOpen && (\r\n        <Modal\r\n          header={\r\n            <div className='modal-header-content'>\r\n              <h3 className='m-0 font-light-xx-lg-lh-150'>{i18n.RequestAQuoteTitle}</h3>\r\n            </div>\r\n          }\r\n          onClose={closeQuoteModal}\r\n          className='quote-modal'\r\n        >\r\n          <div className='quote-items'>\r\n            {productLine && (\r\n              <QuoteItem\r\n                key={productLine.ProductId}\r\n                itemImage={productLine.ProductImageUrl}\r\n                itemName={productLine.ProductTitle}\r\n                buttonType='radio'\r\n                className='modal-product'\r\n                onSelect={() =>\r\n                  onSelectQuoteItem({\r\n                    ProductName: productLine.ProductTitle,\r\n                    ProductModelDisplayName: productLine.ProductTitle,\r\n                    ProductModelId: window.pageId,\r\n                    Images: [\r\n                      {\r\n                        ImageAltText: productLine.ProductTitle,\r\n                        Thumbnail: productLine.ProductImageUrl,\r\n                        IsMain: true,\r\n                        Order: 0,\r\n                        WebpLarge: productLine.ProductImageUrl,\r\n                        WebpMedium: productLine.ProductImageUrl,\r\n                      },\r\n                    ],\r\n                    Topics: [],\r\n                    ProductDescription: productLine.ProductDescription,\r\n                    ProductConstructionPageId: window.pageId,\r\n                    ProductLinePageId: window.pageId,\r\n                    LanguageCode: '',\r\n                  })\r\n                }\r\n              />\r\n            )}\r\n            {products.map((product: ProductModelItem) => (\r\n              <QuoteItem\r\n                key={product.ProductModelDisplayName}\r\n                itemImage={product.Images[0]?.Thumbnail}\r\n                itemName={product.ProductModelDisplayName}\r\n                buttonType='radio'\r\n                className='modal-product'\r\n                onSelect={() =>\r\n                  onSelectQuoteItem({\r\n                    ...product,\r\n                    ProductDescription: contentRef.current?.querySelector('p')?.textContent,\r\n                  })\r\n                }\r\n              />\r\n            ))}\r\n          </div>\r\n          <div className='modal-footer'>\r\n            <Button\r\n              size='medium'\r\n              color='primary'\r\n              text={i18n.Next}\r\n              onClick={onRequestAQuote}\r\n              disabled={!selectedQuoteItem}\r\n            />\r\n          </div>\r\n        </Modal>\r\n      )}\r\n    </>\r\n  );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { ProductModelItem, RelatedProductModelItem } from '../../Related.types';\r\nimport { TechnicalDetailsContainer } from './TechnicalDetailsContainer';\r\nimport { RelatedList } from '../common/RelatedList';\r\nimport dataLayer from '@helpers/dataLayer';\r\nimport './RelatedProductModelContainer.scss';\r\n\r\ninterface RelatedProductModelContainerProps {\r\n  content: ProductModelItem[];\r\n  productLine: RelatedProductModelItem;\r\n  I18n: Record<string, string>;\r\n  styleType: string;\r\n  hideProductModels: boolean;\r\n}\r\n\r\nexport const RelatedProductModelContainer = ({\r\n  content,\r\n  I18n,\r\n  styleType,\r\n  productLine,\r\n  hideProductModels,\r\n}: RelatedProductModelContainerProps) => {\r\n  const [selectedItem, setSelectedItem] = useState<ProductModelItem>(null);\r\n  const isTechnicalDetailsOpen = !!selectedItem;\r\n\r\n  const closeTechnicalDetails = () => {\r\n    setSelectedItem(null);\r\n  };\r\n\r\n  useEffect(() => {\r\n    const searchParams = new URLSearchParams(window.location.search);\r\n    const productModel = searchParams.get('model');\r\n\r\n    if (productModel) {\r\n      const product = content.find((item) => item.ProductModelId === productModel);\r\n      setSelectedItem(product);\r\n    }\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (selectedItem) {\r\n      dataLayer.push('view_item', {\r\n        ecommerce: {\r\n          items: [\r\n            {\r\n              item_name: selectedItem?.ProductModelDisplayName,\r\n              product_line: productLine ? productLine.ProductTitle : undefined,\r\n            },\r\n          ],\r\n        },\r\n      });\r\n    }\r\n  }, [selectedItem]);\r\n\r\n  // TODO: move to service\r\n  const productModelMapper = (item: ProductModelItem) => {\r\n    return {\r\n      Title: item.ProductModelDisplayName,\r\n      ImageUrl: item.Images[0]?.Thumbnail,\r\n      ImageAlt: item.ProductModelDisplayName,\r\n      Meta: item,\r\n    };\r\n  };\r\n  return (\r\n    <>\r\n      {!hideProductModels && (\r\n        <RelatedList\r\n          styleType={styleType}\r\n          onRelatedItemClick={(item) => {\r\n            setSelectedItem(item.Meta);\r\n          }}\r\n          items={content.map(productModelMapper)}\r\n          i18n={I18n}\r\n        />\r\n      )}\r\n      {isTechnicalDetailsOpen && (\r\n        <TechnicalDetailsContainer\r\n          defaultSelectedItem={selectedItem}\r\n          productLine={productLine}\r\n          products={content}\r\n          i18n={I18n}\r\n          handleClose={closeTechnicalDetails}\r\n        />\r\n      )}\r\n    </>\r\n  );\r\n};\r\n","import { apiSlice } from '@services/apiSlice';\r\nimport { RelatedTabs as endpoints } from '@services/endpoints';\r\nimport { RelatedTabs } from './Related.types';\r\n\r\nconst requestedUrl = new URLSearchParams(window.location.search);\r\nconst hasQueryString = requestedUrl.get('model');\r\n\r\nconst relatedTabApi = apiSlice.injectEndpoints({\r\n  endpoints: (build) => ({\r\n    fetchRelatedTabs: build.query<RelatedTabs, void>({\r\n      query: () => ({\r\n        url: endpoints.fetchRelatedTabs,\r\n        params: {\r\n          language: window.lang,\r\n          pageId: window.pageId,\r\n          isProductModelRequested: !!hasQueryString,\r\n        },\r\n      }),\r\n    }),\r\n  }),\r\n  overrideExisting: false,\r\n});\r\n\r\nexport const { useFetchRelatedTabsQuery } = relatedTabApi;\r\n","import React, { Fragment, useMemo, useState } from 'react';\r\nimport { Accordion } from '@components/Accordion';\r\nimport {\r\n  RelatedTabsTypes,\r\n  PageTypes,\r\n  RelatedContent,\r\n  RelatedDocuments,\r\n  isRelatedDocuments,\r\n} from './Related.types';\r\nimport {\r\n  RelatedContainer,\r\n  RelatedDocContainer,\r\n  RelatedServiceContainer,\r\n  RelatedProductModelContainer,\r\n} from './components';\r\nimport { useFetchRelatedTabsQuery } from './Related.service';\r\nimport './Related.scss';\r\n\r\nconst Related = () => {\r\n  const { data: relatedTabs } = useFetchRelatedTabsQuery();\r\n  const getTabWithId = (id: string): RelatedContent => {\r\n    return {\r\n      id,\r\n      ...relatedTabs[id],\r\n    };\r\n  };\r\n\r\n  const filteredList = useMemo(() => {\r\n    if (!relatedTabs) return [];\r\n\r\n    const sortedList: RelatedContent[] = [];\r\n    switch (window.pageType) {\r\n      case PageTypes.PageIndustry:\r\n      case PageTypes.PageProductConstruction: {\r\n        if (!relatedTabs.RelatedProducts.HideRelatedTabs) {\r\n          sortedList.push(getTabWithId(RelatedTabsTypes.RelatedProducts));\r\n        }\r\n\r\n        if (!relatedTabs.RelatedIndustries.HideRelatedTabs) {\r\n          sortedList.push(getTabWithId(RelatedTabsTypes.RelatedIndustries));\r\n        }\r\n\r\n        if (!relatedTabs.RelatedServices.HideRelatedTabs) {\r\n          sortedList.push(getTabWithId(RelatedTabsTypes.RelatedServices));\r\n        }\r\n        break;\r\n      }\r\n\r\n      case PageTypes.PageProductLine: {\r\n        sortedList.push(getTabWithId(RelatedTabsTypes.RelatedDocuments));\r\n        if (!relatedTabs.RelatedServices.HideRelatedTabs) {\r\n          sortedList.push(getTabWithId(RelatedTabsTypes.RelatedServices));\r\n        }\r\n\r\n        sortedList.push({\r\n          ...getTabWithId(RelatedTabsTypes.RelatedProductModel),\r\n          /* Name is set to null to avoid accordion render */\r\n          Name: relatedTabs.RelatedProductModel.HideRelatedTabs\r\n            ? null\r\n            : relatedTabs.RelatedProductModel.Name,\r\n        });\r\n\r\n        if (!relatedTabs.RelatedIndustries.HideRelatedTabs) {\r\n          sortedList.push(getTabWithId(RelatedTabsTypes.RelatedIndustries));\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    return sortedList.filter(\r\n      ({ Items, RenderedServiceContentArea }) =>\r\n        (Items && Items.length > 0) || RenderedServiceContentArea\r\n    );\r\n  }, [relatedTabs]);\r\n\r\n  const renderContainer = (tab: RelatedContent | RelatedDocuments) => {\r\n    let styleType: string;\r\n\r\n    switch (tab.id) {\r\n      case RelatedTabsTypes.RelatedProducts:\r\n        styleType = 'is-style-1';\r\n        break;\r\n      case RelatedTabsTypes.RelatedProductModel:\r\n        styleType = 'is-style-1';\r\n        break;\r\n      case RelatedTabsTypes.RelatedIndustries:\r\n        styleType = 'is-style-2';\r\n        break;\r\n      case RelatedTabsTypes.RelatedServices:\r\n        styleType = 'is-style-3';\r\n        break;\r\n      default:\r\n        styleType = 'is-style-3';\r\n    }\r\n    if (isRelatedDocuments(tab)) {\r\n      return (\r\n        <RelatedDocContainer\r\n          styleType={styleType}\r\n          content={tab.Items}\r\n          customTabText={tab.CustomDocumentTabText}\r\n          customTabContent={tab.CustomDocumentTabContentArea}\r\n          I18n={relatedTabs.I18n}\r\n          othersLabel={relatedTabs.OtherTabLocalizedName}\r\n        />\r\n      );\r\n    } else if (tab.id === RelatedTabsTypes.RelatedServices) {\r\n      const key = {\r\n        '<iframe': '<iframe loading=\"lazy\"',\r\n        '<img': '<img loading=\"lazy\"',\r\n      };\r\n\r\n      return (\r\n        <RelatedServiceContainer\r\n          styleType={styleType}\r\n          content={tab.Items}\r\n          contentStandard={tab.StandardPages}\r\n          blockContent={tab.RenderedServiceContentArea?.replaceAll(\r\n            /(<iframe|<img)/g,\r\n            (char: string) => key[char] || ''\r\n          )}\r\n          I18n={relatedTabs.I18n}\r\n          hideServiceList={relatedTabs.RelatedServices.HideServiceList}\r\n          contentType={tab.id}\r\n        />\r\n      );\r\n    } else if (tab.id === RelatedTabsTypes.RelatedProductModel) {\r\n      return (\r\n        <RelatedProductModelContainer\r\n          content={relatedTabs.RelatedProductModel.Items.flatMap(\r\n            (item) => item.TechnicalDataViewModels\r\n          )}\r\n          productLine={relatedTabs.RelatedProductModel.Items[0]}\r\n          I18n={relatedTabs.I18n}\r\n          styleType={styleType}\r\n          hideProductModels={relatedTabs.RelatedProductModel.HideRelatedTabs}\r\n        />\r\n      );\r\n    } else {\r\n      return (\r\n        <RelatedContainer\r\n          styleType={styleType}\r\n          content={tab.Items}\r\n          blockContent={tab.RenderedServiceContentArea}\r\n          I18n={relatedTabs.I18n}\r\n          contentType={tab.id}\r\n        />\r\n      );\r\n    }\r\n  };\r\n\r\n  return (\r\n    <>\r\n      {filteredList.map((tab, key) => {\r\n        if (!tab.Name) return renderContainer(tab);\r\n\r\n        return (\r\n          <Fragment key={key}>\r\n            <span id={`Nav-${tab.id}`} />\r\n            <div id={tab.id}>\r\n              <div className='c-new-related'>\r\n                <Accordion.Container className='is-related'>\r\n                  <Accordion.Section index={key} tab={{ name: tab.Name, id: tab.id }} url={null}>\r\n                    {renderContainer(tab)}\r\n                  </Accordion.Section>\r\n                </Accordion.Container>\r\n              </div>\r\n            </div>\r\n          </Fragment>\r\n        );\r\n      })}\r\n    </>\r\n  );\r\n};\r\n\r\nexport default Related;\r\n","import Related from './Related';\r\nexport default Related;\r\n","import { apiSlice } from '@services/apiSlice';\r\nimport { ContactUs as endpoints } from '@services/endpoints';\r\nimport { FindContactData, ContactUsForm } from './ContactUs.types';\r\n\r\ninterface FindOfficeQueryParams {\r\n  countryId?: number;\r\n  officeTypeId?: number;\r\n}\r\n\r\ninterface ContactUsFormQueryParams {\r\n  countryId?: number;\r\n  type?: string;\r\n}\r\n\r\nconst contactUsApi = apiSlice.injectEndpoints({\r\n  endpoints: (build) => ({\r\n    fetchFindOfficeData: build.query<FindContactData, FindOfficeQueryParams>({\r\n      query: ({ countryId, officeTypeId }) => ({\r\n        url: endpoints.fetchFindOfficeData,\r\n        params: {\r\n          lang: window.lang,\r\n          countryId: countryId || 2000,\r\n          officeTypeId: officeTypeId || 0,\r\n        },\r\n      }),\r\n    }),\r\n    fetchContactUsForm: build.query<ContactUsForm, ContactUsFormQueryParams | void>({\r\n      query: (params) => ({\r\n        url: endpoints.fetchContactUsForm,\r\n        params: {\r\n          lang: window.lang,\r\n          pageId: window.pageId,\r\n          type: params ? params.type : 'RequestAQuote',\r\n          countryId: params && params.countryId ? params.countryId : 0,\r\n        },\r\n      }),\r\n    }),\r\n  }),\r\n  overrideExisting: false,\r\n});\r\n\r\nexport const { useFetchContactUsFormQuery, useLazyFetchFindOfficeDataQuery } = contactUsApi;\r\n","export const Breadcrumb = {\r\n  fetchBreadcrumb: '/webapi/Breadcrumb/Get',\r\n};\r\n\r\nexport const Footer = {\r\n  fetchFooter: '/api/footer',\r\n};\r\n\r\nexport const CountrySelector = {\r\n  fetchCountrySelectList: '/webapi/CountrySelector/Get',\r\n};\r\n\r\nexport const RelatedTabs = {\r\n  fetchRelatedTabs: '/webapi/RelatedTabs/Get',\r\n  relatedTabs: '/webapi/RelatedTabs/GetTabs', // NOT IN USE\r\n};\r\n\r\nexport const Search = {\r\n  doSearch: '/webapi/SearchApi/SearchFor',\r\n  doSearchAutocomplete: '/webapi/SearchApi/GetAutocomplete',\r\n};\r\n\r\nexport const NewsAndStories = {\r\n  fetchNewsAndStoriesData: '/webapi/NewsListingApi/GetNewsListItems',\r\n  fetchNews: '/webapi/NewsListingApi/GetNewsList',\r\n  fetchStories: '/webapi/StoriesList/Get',\r\n};\r\n\r\nexport const Webinars = {\r\n  fetchWebinarBanner: '/webapi/WebinarLandingPage/Get',\r\n  fetchWebinarList: '/webapi/WebinarPage/Get',\r\n};\r\n\r\nexport const Header = {\r\n  fetchHeader: '/webapi/Header/Get', //NOT IN USE\r\n  fetchSubNavigation: '/webapi/SubNavigation/Get',\r\n  fetchMegaMenuNavigation: '/api/mainmenu',\r\n  fetchGeolocation: '/api/Geolocation',\r\n  fetchTopMenu: '/api/TopNavigation/',\r\n  fetchMegaMenuColumn: '/webapi/menuitems/columns',\r\n};\r\n\r\nexport const Stories = {\r\n  fetchStories: '/webapi/StoriesList/Get',\r\n};\r\n\r\nexport const News = {\r\n  fetchNews: '/webapi/NewsListPage/Get',\r\n};\r\n\r\nexport const Vacancies = {\r\n  fetchVacancies: '/webapi/Vacancy/Get', // NOT IN USE\r\n};\r\n\r\nexport const Webshop = {\r\n  fetchWebshop: '/webapi/WebShop/Get', // NOT IN USE\r\n};\r\n\r\nexport const ContactUs = {\r\n  fetchContactUsForm: '/webapi/ContactUsForm/GetForm',\r\n  fetchFindOfficeData: '/webapi/CountriesCategories/Get',\r\n  fetchEnquiryForm: '/webapi/contactus/getenquiryform',\r\n  fetchEnquirySerialLinkData: '/webapi/contactus/GetModalPopUp',\r\n  submitEnquiryForm: '/Quote/ProcessForm',\r\n  fetchEnquiryApplicationList: '/webapi/contactus/GetIndustryApplication',\r\n};\r\n\r\nexport const InvestorRelations = {\r\n  fetchPressReleaseFilterData: '/api/v1/ir/pressrelease',\r\n  fetchInvestorRelationsNews: '/api/v1/ir/news',\r\n  fetchInvestorRelationsPage: '/api/v1/ir/page2',\r\n  fetchInvestorRelationsMenu: '/api/v1/ir/menu2',\r\n  makeSubscription: '//publish.ne.cision.com/Subscription/SubscribeWithCaptcha',\r\n};\r\n\r\nexport const CoolCalc = {\r\n  getCoolCalc: '/webapi/CoolCalc/Get', // NOT IN USE\r\n  shareCoolCalc: '/webapi/CoolCalc/Save',\r\n};\r\n\r\nexport const Hexpert = {\r\n  fetchHexpertPage: '/api/v1/hex/page',\r\n  getAntiForgeryToken: '/api/v1/hex/GetAntiForgery',\r\n  submitHexpertForm: '/EPiServer.Forms/DataSubmit/Submit',\r\n  createHexpertPdf: '/api/v1/hex/CreatePdf',\r\n  getIsMatchingProducts: '/api/v1/hex/IsMatchingProduct',\r\n  getHexpertResult: '/api/v1/hex/GetResult',\r\n  mailResult: '/api/v1/hex/SendMail',\r\n};\r\n\r\nexport const SafetyDatasheet = {\r\n  fetchSafetyDatasheet: '/webapi/SafetyDataSheet/GetSafetyDataSheetResult',\r\n};\r\n"],"names":["hasOwn","hasOwnProperty","classNames","classes","i","arguments","length","arg","argType","push","Array","isArray","inner","apply","toString","Object","prototype","includes","key","call","join","module","exports","default","define","window","Profile","xmlns","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","cx","cy","r","d","IconContainer","icon","className","Facebook","Twitter","x","y","ExternalLink","id","Arrow","rotate","style","transformBox","transformOrigin","transform","Cross","Delete","EmailSvg","PhoneSvg","fillRule","clipRule","Accordion","Section","isOpen","index","onClick","accordionBlockSelector","children","tab","url","iconUrl","isLight","hasIcon","tabHead","tabBody","firstAccordionStyle","isOpened","setIsOpened","useState","isDesktop","isMobile","useEffect","openFirstAccordion","addEventListener","removeEventListener","accordionHead","document","querySelector","accordionBody","innerWidth","classList","add","closeFirstAccordion","remove","itemheading","contains","handleClick","background","href","event","stopPropagation","name","Container","Button","text","size","disabled","color","border","type","props","tag","createElement","target","QuoteItem","itemImage","itemName","itemDescription","buttonType","onSelect","onButtonClick","loading","src","alt","RadioButton","renderButtonComponent","forwardRef","title","onChange","checked","value","ref","defaultChecked","disableScroll","body","enableScroll","quoteClickHelper","contactUsForm","redirect","localStorage","setItem","I18","CategoryID","pageId","location","contact_type","RequestForQuote","EnquiryTypeLink","useOutsideClick","handler","e","current","PageTypes","RelatedTabsTypes","RelatedFilter","onTagClick","contentType","tags","isBound","i18n","selectedTag","setSelectedTag","renderTag","isActive","node","onTagClickHandler","All","map","RelatedItem","item","bulletsVisible","setBulletsVisible","PageUrl","backgroundSize","backgroundRepeat","backgroundPosition","ImageUrl","ImageAlt","USPList","Title","Summary","RelatedList","filterTag","onRelatedItemClick","items","styleType","maxItemsVisible","setMaxItemsVisible","filteredList","useMemo","filter","Tags","_item","ShowMore","sortAsc","a","b","RelatedContainer","content","blockContent","I18n","setFilterTag","filters","forEach","stringFilters","JSON","stringify","uniqueStringFilters","Set","parse","sort","dangerouslySetInnerHTML","__html","aFilterTag","RelatedDocFilter","DocumentSectionSlider","handleTagClick","DocListShowMoreBtn","updateSelectedTag","listLength","isVisible","setIsVisible","showMoreClick","setShowMoreClick","show","offsetNew","querySelectorAll","element","oldVal","useItemsToRender","renderItem","itemsToRender","Url","lastValue","defaultList","slice","total","nextList","roundedTotal","n","multiply","FloatVal","toFixed","Math","ceil","Number","floor","mathCal","listIterationObj","Data","Thumbnail","iconClass","FileCategory","MimeType","mimeType","toLowerCase","RelatedDocItem","download","fileName","dataLayer","file_name","file_extension","file_category","file_context","link_text","FileName","link_url","rel","Description","FileSize","RelatedDocList","renderCustomContent","setFilteredList","getFilteredList","itemTags","RelatedDocContainer","othersLabel","customTabText","customTabContent","findIndex","splice","useRelatedDocFilterItems","newFilterTag","val","RelatedServiceContainer","contentStandard","hideServiceList","filterTagStandard","setFilterTagStandard","setFilters","filtersStandard","setFiltersStandard","initfilters","initfiltersStandard","inittags","inittagsStandard","stringFiltersStandard","uniqueStringFiltersStandard","Modal","header","subHeader","onClose","isOuterModal","IconButton","ScrollableContainer","topicsRef","useRef","topicsContainerRef","visibleScrollBtns","setVisibleScrollBtns","onClickScrollBtn","direction","scrollBy","left","behavior","onScroll","scrollLeft","scrollWidth","clientWidth","newShowBtn","extractTitle","match","replace","DOMParser","parseFromString","textContent","getIdFromContent","TechnicalDetailsTopics","topics","contentRef","topicIds","topic","Content","selectedTopicId","onTopicClick","setSelectedTopicId","getElementById","scrollIntoView","block","inline","headerElements","technicalDetailsElements","from","selectFirstTopic","viewportTop","viewportHeight","viewportBottom","visibleElements","el","top","offsetTop","titleHeight","offsetHeight","topElementWrapperId","parentElement","scrollTop","clientHeight","useSelectedTopic","topicId","topicTitle","Dropdown","ListItem","action","active","ProductSelector","selectedProduct","products","onSelectProduct","DropdownWrapper","onOpen","dropdownContainerRef","dropdownRef","setIsOpen","position","useDropdown","product","ProductModelId","ProductModelDisplayName","TechnicalDetailsContainer","productLine","defaultSelectedItem","handleClose","selectedItem","setSelectedItem","quoteModalOpen","setQuoteModalOpen","selectedQuoteItem","setSelectedQuoteItem","data","requestForQuoteText","filteredTopics","Topics","Name","onSelectQuoteItem","RequestAQuoteTitle","ProductId","ProductImageUrl","ProductTitle","ProductName","Images","ImageAltText","IsMain","Order","WebpLarge","WebpMedium","ProductDescription","ProductConstructionPageId","ProductLinePageId","LanguageCode","Next","history","scrollRestoration","isProductLine","queryParameter","productLinePageId","pushState","imageSrc","description","go","RelatedProductModelContainer","hideProductModels","isTechnicalDetailsOpen","productModel","URLSearchParams","search","get","find","ecommerce","item_name","product_line","undefined","Meta","hasQueryString","relatedTabApi","apiSlice","endpoints","build","fetchRelatedTabs","query","params","language","lang","isProductModelRequested","overrideExisting","useFetchRelatedTabsQuery","relatedTabs","getTabWithId","sortedList","pageType","RelatedProducts","HideRelatedTabs","RelatedIndustries","RelatedServices","RelatedDocuments","RelatedProductModel","Items","RenderedServiceContentArea","renderContainer","isRelatedDocuments","CustomDocumentTabText","CustomDocumentTabContentArea","OtherTabLocalizedName","StandardPages","replaceAll","char","HideServiceList","flatMap","TechnicalDataViewModels","Fragment","contactUsApi","fetchFindOfficeData","countryId","officeTypeId","fetchContactUsForm","useFetchContactUsFormQuery","useLazyFetchFindOfficeDataQuery","Breadcrumb","fetchBreadcrumb","Footer","fetchFooter","CountrySelector","fetchCountrySelectList","RelatedTabs","Search","doSearch","doSearchAutocomplete","NewsAndStories","fetchNewsAndStoriesData","fetchNews","fetchStories","Webinars","fetchWebinarBanner","fetchWebinarList","Header","fetchHeader","fetchSubNavigation","fetchMegaMenuNavigation","fetchGeolocation","fetchTopMenu","fetchMegaMenuColumn","Stories","News","ContactUs","fetchEnquiryForm","fetchEnquirySerialLinkData","submitEnquiryForm","fetchEnquiryApplicationList","InvestorRelations","fetchPressReleaseFilterData","fetchInvestorRelationsNews","fetchInvestorRelationsPage","fetchInvestorRelationsMenu","makeSubscription","CoolCalc","getCoolCalc","shareCoolCalc","Hexpert","fetchHexpertPage","getAntiForgeryToken","submitHexpertForm","createHexpertPdf","getIsMatchingProducts","getHexpertResult","mailResult","SafetyDatasheet","fetchSafetyDatasheet"],"sourceRoot":""}