{"version":3,"file":"6e7bf659af87cd95e08cd0f25db26c9ffa07e6df-325da9437925f1d212ca.js","mappings":"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AAc,CAACC,UAAWjQ,EAAMiP,QAAUb,IAC3C5J,EAAAA,cAAC0L,EAA0B,CACzBzL,MAAOsJ,EAAE,kBAAmB,YAC5BK,SAAUyB,EACVlB,KAAM,CAEJ,aACA,eACA,eACA,yBACA,oBACA,2BAEA,oCACA,QACA,gBACA,4BACA,uBACA,wBACA,8BACA,wBAEA,mCACA,yBACA,oBACA,sBAEA,uCACA,uCACA,mDACA,mDACA,0BACA,0BACA,0BACA,0BACA,QACA,yBACA,yBACA,yBACA,sBACA,yBACA,oCACA,sBAEA,YACA,aACA,cACA,iBACA,aACA,cACA,iBACA,iBACA,eACA,6BACA,2BACA,0BACA,kBAEA,qBACA,qBACA,qCACA,aACA,iBACA,wBACA,qBACA,wBACA,8BACA,0BACA,iBACA,yBACA,gCACA,4BACA,4BACA,yBACA,qBACA,oBAEA,2BACA,+BACA,+BAGJnK,EAAAA,cAAC0L,EAA0B,CACzBzL,MAAOsJ,EAAE,oBAAqB,cAC9BK,SAAUyB,EACVlB,KAAM,CACJ,iBACA,gBACA,gBACA,sBACA,sBACA,oBACA,mBACA,mBACA,uBACA,cACA,2BAEA,mBACA,oBACA,mBACA,oBACA,oBACA,qBACA,sBACA,4BAGJnK,EAAAA,cAAC0L,EAA0B,CACzBzL,MAAOsJ,EAAE,iBAAkB,WAC3BK,SAAUyB,EACVlB,KAAM,CAAC,aAAc,uBAAwB,oBAAqB,eAAgB,4BAGpFnK,EAAAA,cAAC0L,EAA0B,CACzBzL,MAAOsJ,EAAE,mBAAoB,uBAC7BK,SAAUyB,EACVlB,KAAM,CACJ,wBACA,mDACA,uBACA,kDACA,yBACA,oDACA,mDACA,uDACA,kDACA,sDACA,0BACA,4BACA,4BACA,0BACA,8BACA,6BACA,6BACA,4BACA,sBACA,kBACA,kBACA,qBAIJnK,EAAAA,cAAC0L,EAA0B,CACzBzL,MAAOsJ,EAAE,oBAAqB,cAC9BK,SAAUyB,EACVlB,KAAM,CACJ,cACA,qBACA,uBACA,2BACA,2BACA,2BACA,0BACA,+BACA,+BACA,qCACA,0BACA,0BACA,0BACA,2BACA,6BACA,6BACA,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","sources":["webpack://@nitro/gatsby-harvia.com/../node_modules/react-swipeable/es/index.js","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/atoms/VideoEmbed.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/atoms/VideoEmbed.module.scss","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/molecules/Accordion.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/molecules/BreadCrumbs.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/molecules/BreadCrumbs.module.scss","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/molecules/TabContent.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/molecules/TabContent.module.scss","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/hooks/useProductLandingPagePath.ts","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/molecules/ExpandingText.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/molecules/ExpandingText.module.scss","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/organisms/product/ProductAttribute.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/organisms/product/ProductAttribute.module.scss","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/organisms/product/ProductFileLink.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/organisms/product/ProductFileLink.module.scss","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/atoms/AbbrBox.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/atoms/AbbrBox.module.scss","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/organisms/product/ProductMarketAreas.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/pages/productPage/ProductLeadDescription.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/pages/productPage/ProductLeadDescription.module.scss","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/organisms/product/ProductDataTable.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/organisms/product/ProductComparisonAccordion.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/organisms/product/ProductComparison.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/pages/productPage/ProductPageComparison.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/pages/productPage/ProductPageImages.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/pages/productPage/ProductPageImages.module.scss","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/pages/productPage/ProductVideoEmbed.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/pages/productPage/ProductPageContent.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/pages/productPage/ProductPageContent.module.scss","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/components/pages/ProductPage.tsx","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/hooks/useProductCategoryPath.ts","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/hooks/useProductCategoryStructure.ts","webpack://@nitro/gatsby-harvia.com/../gatsby-theme-harvia/src/hooks/useRouteTree.ts"],"sourcesContent":["import * as React from 'react';\nconst LEFT = \"Left\";\nconst RIGHT = \"Right\";\nconst UP = \"Up\";\nconst DOWN = \"Down\";\n\n/* global document */\nconst defaultProps = {\n delta: 10,\n preventScrollOnSwipe: false,\n rotationAngle: 0,\n trackMouse: false,\n trackTouch: true,\n swipeDuration: Infinity,\n touchEventOptions: {\n passive: true\n }\n};\nconst initialState = {\n first: true,\n initial: [0, 0],\n start: 0,\n swiping: false,\n xy: [0, 0]\n};\nconst mouseMove = \"mousemove\";\nconst mouseUp = \"mouseup\";\nconst touchEnd = \"touchend\";\nconst touchMove = \"touchmove\";\nconst touchStart = \"touchstart\";\nfunction getDirection(absX, absY, deltaX, deltaY) {\n if (absX > absY) {\n if (deltaX > 0) {\n return RIGHT;\n }\n return LEFT;\n } else if (deltaY > 0) {\n return DOWN;\n }\n return UP;\n}\nfunction rotateXYByAngle(pos, angle) {\n if (angle === 0) return pos;\n const angleInRadians = Math.PI / 180 * angle;\n const x = pos[0] * Math.cos(angleInRadians) + pos[1] * Math.sin(angleInRadians);\n const y = pos[1] * Math.cos(angleInRadians) - pos[0] * Math.sin(angleInRadians);\n return [x, y];\n}\nfunction getHandlers(set, handlerProps) {\n const onStart = event => {\n const isTouch = (\"touches\" in event);\n // if more than a single touch don't track, for now...\n if (isTouch && event.touches.length > 1) return;\n set((state, props) => {\n // setup mouse listeners on document to track swipe since swipe can leave container\n if (props.trackMouse && !isTouch) {\n document.addEventListener(mouseMove, onMove);\n document.addEventListener(mouseUp, onUp);\n }\n const {\n clientX,\n clientY\n } = isTouch ? event.touches[0] : event;\n const xy = rotateXYByAngle([clientX, clientY], props.rotationAngle);\n props.onTouchStartOrOnMouseDown && props.onTouchStartOrOnMouseDown({\n event\n });\n return Object.assign(Object.assign(Object.assign({}, state), initialState), {\n initial: xy.slice(),\n xy,\n start: event.timeStamp || 0\n });\n });\n };\n const onMove = event => {\n set((state, props) => {\n const isTouch = (\"touches\" in event);\n // Discount a swipe if additional touches are present after\n // a swipe has started.\n if (isTouch && event.touches.length > 1) {\n return state;\n }\n // if swipe has exceeded duration stop tracking\n if (event.timeStamp - state.start > props.swipeDuration) {\n return state.swiping ? Object.assign(Object.assign({}, state), {\n swiping: false\n }) : state;\n }\n const {\n clientX,\n clientY\n } = isTouch ? event.touches[0] : event;\n const [x, y] = rotateXYByAngle([clientX, clientY], props.rotationAngle);\n const deltaX = x - state.xy[0];\n const deltaY = y - state.xy[1];\n const absX = Math.abs(deltaX);\n const absY = Math.abs(deltaY);\n const time = (event.timeStamp || 0) - state.start;\n const velocity = Math.sqrt(absX * absX + absY * absY) / (time || 1);\n const vxvy = [deltaX / (time || 1), deltaY / (time || 1)];\n const dir = getDirection(absX, absY, deltaX, deltaY);\n // if swipe is under delta and we have not started to track a swipe: skip update\n const delta = typeof props.delta === \"number\" ? props.delta : props.delta[dir.toLowerCase()] || defaultProps.delta;\n if (absX < delta && absY < delta && !state.swiping) return state;\n const eventData = {\n absX,\n absY,\n deltaX,\n deltaY,\n dir,\n event,\n first: state.first,\n initial: state.initial,\n velocity,\n vxvy\n };\n // call onSwipeStart if present and is first swipe event\n eventData.first && props.onSwipeStart && props.onSwipeStart(eventData);\n // call onSwiping if present\n props.onSwiping && props.onSwiping(eventData);\n // track if a swipe is cancelable (handler for swiping or swiped(dir) exists)\n // so we can call preventDefault if needed\n let cancelablePageSwipe = false;\n if (props.onSwiping || props.onSwiped || props[`onSwiped${dir}`]) {\n cancelablePageSwipe = true;\n }\n if (cancelablePageSwipe && props.preventScrollOnSwipe && props.trackTouch && event.cancelable) {\n event.preventDefault();\n }\n return Object.assign(Object.assign({}, state), {\n // first is now always false\n first: false,\n eventData,\n swiping: true\n });\n });\n };\n const onEnd = event => {\n set((state, props) => {\n let eventData;\n if (state.swiping && state.eventData) {\n // if swipe is less than duration fire swiped callbacks\n if (event.timeStamp - state.start < props.swipeDuration) {\n eventData = Object.assign(Object.assign({}, state.eventData), {\n event\n });\n props.onSwiped && props.onSwiped(eventData);\n const onSwipedDir = props[`onSwiped${eventData.dir}`];\n onSwipedDir && onSwipedDir(eventData);\n }\n } else {\n props.onTap && props.onTap({\n event\n });\n }\n props.onTouchEndOrOnMouseUp && props.onTouchEndOrOnMouseUp({\n event\n });\n return Object.assign(Object.assign(Object.assign({}, state), initialState), {\n eventData\n });\n });\n };\n const cleanUpMouse = () => {\n // safe to just call removeEventListener\n document.removeEventListener(mouseMove, onMove);\n document.removeEventListener(mouseUp, onUp);\n };\n const onUp = e => {\n cleanUpMouse();\n onEnd(e);\n };\n /**\n * The value of passive on touchMove depends on `preventScrollOnSwipe`:\n * - true => { passive: false }\n * - false => { passive: true } // Default\n *\n * NOTE: When preventScrollOnSwipe is true, we attempt to call preventDefault to prevent scroll.\n *\n * props.touchEventOptions can also be set for all touch event listeners,\n * but for `touchmove` specifically when `preventScrollOnSwipe` it will\n * supersede and force passive to false.\n *\n */\n const attachTouch = (el, props) => {\n let cleanup = () => {};\n if (el && el.addEventListener) {\n const baseOptions = Object.assign(Object.assign({}, defaultProps.touchEventOptions), props.touchEventOptions);\n // attach touch event listeners and handlers\n const tls = [[touchStart, onStart, baseOptions],\n // preventScrollOnSwipe option supersedes touchEventOptions.passive\n [touchMove, onMove, Object.assign(Object.assign({}, baseOptions), props.preventScrollOnSwipe ? {\n passive: false\n } : {})], [touchEnd, onEnd, baseOptions]];\n tls.forEach(_ref => {\n let [e, h, o] = _ref;\n return el.addEventListener(e, h, o);\n });\n // return properly scoped cleanup method for removing listeners, options not required\n cleanup = () => tls.forEach(_ref2 => {\n let [e, h] = _ref2;\n return el.removeEventListener(e, h);\n });\n }\n return cleanup;\n };\n const onRef = el => {\n // \"inline\" ref functions are called twice on render, once with null then again with DOM element\n // ignore null here\n if (el === null) return;\n set((state, props) => {\n // if the same DOM el as previous just return state\n if (state.el === el) return state;\n const addState = {};\n // if new DOM el clean up old DOM and reset cleanUpTouch\n if (state.el && state.el !== el && state.cleanUpTouch) {\n state.cleanUpTouch();\n addState.cleanUpTouch = void 0;\n }\n // only attach if we want to track touch\n if (props.trackTouch && el) {\n addState.cleanUpTouch = attachTouch(el, props);\n }\n // store event attached DOM el for comparison, clean up, and re-attachment\n return Object.assign(Object.assign(Object.assign({}, state), {\n el\n }), addState);\n });\n };\n // set ref callback to attach touch event listeners\n const output = {\n ref: onRef\n };\n // if track mouse attach mouse down listener\n if (handlerProps.trackMouse) {\n output.onMouseDown = onStart;\n }\n return [output, attachTouch];\n}\nfunction updateTransientState(state, props, previousProps, attachTouch) {\n // if trackTouch is off or there is no el, then remove handlers if necessary and exit\n if (!props.trackTouch || !state.el) {\n if (state.cleanUpTouch) {\n state.cleanUpTouch();\n }\n return Object.assign(Object.assign({}, state), {\n cleanUpTouch: undefined\n });\n }\n // trackTouch is on, so if there are no handlers attached, attach them and exit\n if (!state.cleanUpTouch) {\n return Object.assign(Object.assign({}, state), {\n cleanUpTouch: attachTouch(state.el, props)\n });\n }\n // trackTouch is on and handlers are already attached, so if preventScrollOnSwipe changes value,\n // remove and reattach handlers (this is required to update the passive option when attaching\n // the handlers)\n if (props.preventScrollOnSwipe !== previousProps.preventScrollOnSwipe || props.touchEventOptions.passive !== previousProps.touchEventOptions.passive) {\n state.cleanUpTouch();\n return Object.assign(Object.assign({}, state), {\n cleanUpTouch: attachTouch(state.el, props)\n });\n }\n return state;\n}\nfunction useSwipeable(options) {\n const {\n trackMouse\n } = options;\n const transientState = React.useRef(Object.assign({}, initialState));\n const transientProps = React.useRef(Object.assign({}, defaultProps));\n // track previous rendered props\n const previousProps = React.useRef(Object.assign({}, transientProps.current));\n previousProps.current = Object.assign({}, transientProps.current);\n // update current render props & defaults\n transientProps.current = Object.assign(Object.assign({}, defaultProps), options);\n // Force defaults for config properties\n let defaultKey;\n for (defaultKey in defaultProps) {\n if (transientProps.current[defaultKey] === void 0) {\n transientProps.current[defaultKey] = defaultProps[defaultKey];\n }\n }\n const [handlers, attachTouch] = React.useMemo(() => getHandlers(stateSetter => transientState.current = stateSetter(transientState.current, transientProps.current), {\n trackMouse\n }), [trackMouse]);\n transientState.current = updateTransientState(transientState.current, transientProps.current, previousProps.current, attachTouch);\n return handlers;\n}\nexport { DOWN, LEFT, RIGHT, UP, useSwipeable };","import React from \"react\"\nimport * as styles from \"./VideoEmbed.module.scss\"\n\nexport type VideoEmbedProps = {\n url?: string\n title?: string\n provider: \"youtube\" | \"vimeo\" | \"facebook\" // ei varmuutta onko \"vimeo\" ja \"facebook\" oikein\n providerUid: string\n thumbnailUrl?: string\n width?: number\n height?: number\n}\n\nconst VideoEmbed = (props: VideoEmbedProps) => {\n let video: JSX.Element | null = null\n\n //console.log(\"Video: \", props)\n const w = props.width || 640\n const h = props.height || 360\n const ar = w / h\n\n let arClass = styles.ar16x9\n if (ar < 1.7) arClass = styles.ar4x3\n if (ar < 1.3) arClass = styles.ar1x1\n if (ar < 1) arClass = styles.ar9x16\n\n switch (props.provider) {\n case \"youtube\":\n video = (\n \n )\n break\n case \"vimeo\":\n video = (\n \n )\n break\n default:\n console.warn(`Unhandled VideoEmbed provider: ${props.provider}`)\n }\n\n return (\n
\n
{video}
\n
\n )\n}\n\nexport default VideoEmbed\n","// extracted by mini-css-extract-plugin\nexport var ar16x9 = \"VideoEmbed-module--ar16x9--acf75\";\nexport var ar1x1 = \"VideoEmbed-module--ar1x1--c2766\";\nexport var ar4x3 = \"VideoEmbed-module--ar4x3--5d3e2\";\nexport var ar9x16 = \"VideoEmbed-module--ar9x16--24fcc\";\nexport var container = \"VideoEmbed-module--container--30d26\";\nexport var videoContainer = \"VideoEmbed-module--videoContainer--7ad85\";","import React from \"react\"\nimport { CSSTransition } from \"react-transition-group\"\nimport * as styles from \"./Accordion.module.scss\"\n\nexport type AccordionProps = {\n title: string\n category?: string\n\n /** Enable ssr rendering of content to make visible it for page crawlers. */\n ssrContent?: boolean\n\n /** Initially open */\n open?: boolean\n\n /** Title field props */\n titleProps?: React.DetailedHTMLProps, HTMLHeadingElement>\n children: React.ReactNode\n}\n\nconst Accordion = (props: AccordionProps) => {\n const initiallyOpen = typeof props.open !== \"undefined\" && props.open\n\n const [inited, setInited] = React.useState(!props.ssrContent)\n const [open, setOpen] = React.useState(initiallyOpen || !inited)\n\n React.useEffect(() => {\n if (!inited && !initiallyOpen) {\n setOpen(false)\n setTimeout(() => setInited(true), 0)\n }\n }, [])\n\n const toggle = (): void => {\n setOpen(!open)\n }\n\n return (\n <>\n
\n
\n
\n {props.category &&
{props.category}
}\n

\n {props.title}\n

\n
\n \n
\n \n
\n
{props.children}
\n
\n
\n
\n \n )\n}\n\nexport default Accordion\n","import { Link } from \"gatsby\"\nimport React from \"react\"\nimport { IoIosArrowForward } from \"react-icons/io\"\nimport { RoutePathNode } from \"../../hooks/useRouteTree\"\nimport * as styles from \"./BreadCrumbs.module.scss\"\n\ntype BreadCrumbsProps = { nodes: (RoutePathNode | null)[] }\n\nconst BreadCrumbs = (props: BreadCrumbsProps) => {\n //console.log('Rendering BreadCrumbs', props)\n return (\n
\n {props.nodes.reverse().map((node, i) => {\n if (!node) return null\n return (\n \n {!!i && }\n {node.path ? {node.label} : {node.label}}\n \n )\n })}\n
\n )\n}\n\nexport default BreadCrumbs\n","// extracted by mini-css-extract-plugin\nexport var container = \"BreadCrumbs-module--container--8b470\";\nexport var delim = \"BreadCrumbs-module--delim--b0e33\";","import React, { ReactNode, useEffect } from \"react\"\nimport { isBrowser } from \"../../utils\"\nimport * as styles from \"./TabContent.module.scss\"\n\ntype Tab = { title: string | null; slug?: string; content: ReactNode }\n\nfunction isTab(tab: Tab | null | undefined): tab is Tab {\n return tab !== null\n}\n\nexport type TabContentProps = { tabs: (Tab | undefined)[] }\n\nconst TabContent = (props: TabContentProps) => {\n //console.log('Rendering TabContent', props)\n\n // check location.hash, to see if we should open a tab initially\n const hash = isBrowser && location.hash\n const initTab = hash && ~props.tabs.findIndex(tab => \"#\" + tab?.slug === hash)\n const [curTab, setCurTab] = React.useState(initTab ? -initTab - 1 : 0)\n\n const container = React.useRef(null)\n // if (props.tabs) setCurTab(0)\n const tabs = props.tabs.filter(isTab)\n\n useEffect(() => {\n const hashChange = () => {\n const hash = location.hash\n const tab = hash && ~props.tabs.findIndex(tab => \"#\" + tab?.slug === hash)\n if (tab) {\n setCurTab(-tab - 1)\n container.current && container.current.scrollIntoView({ behavior: \"smooth\" })\n }\n }\n\n window.addEventListener(\"hashchange\", hashChange)\n\n return () => {\n window.removeEventListener(\"hashchange\", hashChange)\n }\n }, [])\n\n return (\n
\n
\n {/* tabs */}\n {tabs.map((tab, i) => {\n return (\n setCurTab(i)}\n key={`tabs-${i}`}>\n {tab.title}\n \n )\n })}\n
\n
\n {!isBrowser\n ? /* ssr-available Content, render all */\n tabs.map((tab, i) => {\n return (\n
\n {tab.content}\n
\n )\n })\n : /* browser Content */\n tabs[curTab] &&
{tabs[curTab].content}
}\n
\n
\n )\n}\n\nexport default TabContent\n","// extracted by mini-css-extract-plugin\nexport var active = \"TabContent-module--active--395d3\";\nexport var container = \"TabContent-module--container--b4ce5\";\nexport var content = \"TabContent-module--content--34fbe\";\nexport var tab = \"TabContent-module--tab--01fbc\";\nexport var tabs = \"TabContent-module--tabs--d1833\";","import { graphql, useStaticQuery } from \"gatsby\"\nimport useRoutePath from \"./useRoutePath\"\n\ntype Route = NonNullable[\"rootRoute\"]\n\nconst useProductLandingPagePath = () => {\n function findProductLandingPagePath(landingPageId: string, map: Record) {\n // console.debug(\"Finding Product Landing Page URL path for landing page ID\", landingPageId, map)\n\n const routeOriginalId = map[landingPageId]\n\n return getRoutePath(routeOriginalId)\n }\n\n function addToMap(route: Route) {\n if (!route) {\n return\n }\n if (route.page?.[\"originalId\"]) {\n map[route.page[\"originalId\"]] = route.originalId\n }\n if (route.treeChildren) {\n route.treeChildren.map(addToMap)\n }\n }\n\n const getRoutePath = useRoutePath()\n\n const data = useStaticQuery(graphql`\n fragment DatoCmsRouteFragment on DatoCmsRoute {\n originalId\n page {\n ... on DatoCmsProductLandingPage {\n originalId\n }\n }\n }\n query DatoLandingPageRoutes {\n datoCmsWebsite(locale: \"en\") {\n rootRoute {\n ...DatoCmsRouteFragment\n treeChildren {\n ...DatoCmsRouteFragment\n treeChildren {\n ...DatoCmsRouteFragment\n treeChildren {\n ...DatoCmsRouteFragment\n treeChildren {\n ...DatoCmsRouteFragment\n treeChildren {\n ...DatoCmsRouteFragment\n }\n }\n }\n }\n }\n }\n }\n }\n `)\n\n const routeTree = data?.datoCmsWebsite?.rootRoute\n\n if (!routeTree) {\n console.error(\"Empty route tree in useProductLandingPagePath()\")\n return () => undefined\n }\n\n // create a map of productPageId => routeId\n const map: Record = {}\n addToMap(routeTree)\n\n return (landingPageId: string) => findProductLandingPagePath(landingPageId, map)\n}\nexport default useProductLandingPagePath\n","import React, { useId, useState } from \"react\"\nimport * as styles from \"./ExpandingText.module.scss\"\n\ntype ExpandingTextProps = {\n /** Text rendered as \"expanding text\". HTML is supported */\n text: string\n /** CSS length value for text container 'max-height'. Defaults to `8rem` */\n closedMaxHeight?: string\n /** Label for button hiding expanded text. Defaults to \"Show less\" */\n lessLabel?: string\n /** Label for button showing expanded text. Defaults to \"Show more\" */\n moreLabel?: string\n /** Parent background color as valid CSS color. Needed for text fade out effect. Defaults to `transparent`. */\n backgroundColor: string\n}\n\n/**\n * Custom extension to `React.CSSProperties` to allow specific CSS properties\n */\ninterface CustomCSSProps extends React.CSSProperties {\n \"--background-color\": string\n \"--closed-max-height\": string\n}\n\nconst ExpandingText = (props: ExpandingTextProps) => {\n // console.debug(\"Rendering ExpandingText\", props)\n\n const textId = useId() // generate unique ID for accessibility attributes\n const [isOpen, setIsOpen] = useState(false)\n\n if (!props.text) return null\n\n const containerStyles: CustomCSSProps = {\n // pass backgroundColor as CSS custom property so that we can set a pseudo element color using var()\n \"--background-color\": props.backgroundColor || \"transparent\", // NOTE \"inherit\" won't work here. This is used on a pseudo element background-image gradient\n \"--closed-max-height\": props.closedMaxHeight || \"8rem\",\n }\n\n return (\n <>\n \n setIsOpen(!isOpen)}\n aria-controls={textId}\n aria-expanded={isOpen}>\n {isOpen ? props.lessLabel || \"Show less\" : props.moreLabel || \"Show more\"}\n \n \n )\n}\n\nexport default ExpandingText\n","// extracted by mini-css-extract-plugin\nexport var closed = \"ExpandingText-module--closed--06513\";\nexport var moreButton = \"ExpandingText-module--moreButton--d1081\";\nexport var open = \"ExpandingText-module--open--69bdf\";\nexport var text = \"ExpandingText-module--text--60630\";","import { filteredValues, formatUnit } from \"@nitro/gatsby-source-harvia-pim/helpers/attribute\"\nimport { ProductAttributeValue } from \"@nitro/gatsby-source-harvia-pim/types/plugin\"\nimport React from \"react\"\nimport * as styles from \"./ProductAttribute.module.scss\"\nimport { parseJSON } from \"./utils\"\n\ntype ProductAttributeProps = {\n list?: ProductAttributeValue[]\n}\n\nconst ProductAttribute = (props: ProductAttributeProps) => {\n // console.debug(\"Rendering ProductAttribute\", props)\n const { list } = props\n if (!list) {\n return null\n }\n\n if (!Array.isArray(list)) {\n return null\n }\n\n let isList = false\n\n const values = list.map((attr, i) => {\n // console.debug(\"Rendering ProductAttribute attr\", attr)\n switch (attr.type) {\n case \"ProductMetric\": {\n const data = attr.metric\n if (isNaN(data.amount)) return  \n return (\n \n {!isNaN(data.amount) ? data.amount : \"-\"} {formatUnit(data.unit)}\n \n )\n }\n case \"ProductOption\":\n isList = true\n return (\n
  • \n {attr.text}\n
  • \n )\n case \"number\":\n return {attr.numeric}\n\n case \"boolean\":\n return {attr.data ? \"Yes\" : \"No\"}\n\n case \"string\": {\n const data = attr.text\n\n if (data === undefined) {\n return null\n }\n\n // Joidenkin kenttien arvo on json.\n const json = parseJSON(data) // JSON.parse(attr.data)\n\n if (typeof json !== \"undefined\" && json !== null) {\n //console.log(attr.attributeLabel, json, typeof json)\n\n // Taulukko, esim \"power_table\" = '[[\"6,8\",\"\",\"\",\"\"]]'\n if (json.length && json[0] && json[\"map\"]) {\n return (\n \n \n {json.map((row: string[] | string, j: number) => {\n // is array\n if (row.length && row[0]) {\n return (\n \n {(row as string[]).map((itm, k) => {\n return \n )\n } else {\n return (\n \n \n )\n }\n })}\n \n
    \n })}\n
    \n
    \n )\n }\n\n // boolean arvo, Todo käännökset...\n if (typeof json == \"boolean\") {\n return {json ? \"Yes\" : \"No\"}\n }\n }\n\n if (filteredValues.includes(data.toString())) {\n return  \n }\n\n return // eh.. Joidenkin kenttien arvo on html:ää.\n }\n case \"ProductPrice\": {\n const data = attr.prices\n return (\n \n {data.map((itm, i) => (\n \n {itm.amount} {formatUnit(itm.currency)}\n \n ))}\n \n )\n }\n\n default:\n console.warn(\"Unhandler attribute type:\", attr.type)\n return {attr.text}\n }\n })\n\n if (isList) return
      {values}
    \n return <>{values}\n}\n\nexport default ProductAttribute\n","// extracted by mini-css-extract-plugin\nexport var li = \"ProductAttribute-module--li--f1b39\";\nexport var ul = \"ProductAttribute-module--ul--c2ff5\";","import React from \"react\"\nimport * as styles from \"./ProductFileLink.module.scss\"\n\nexport type ProductFileLinkProps = {\n thumbnail: string\n link: string\n title: string\n children: React.ReactNode\n}\n\nconst ProductFileLink = (props: ProductFileLinkProps) => {\n // console.log(\"Rendering ProductFileLink\", props)\n return (\n \n
    \n \"\"\n\n
    \n

    {props.title}

    \n
    {props.children}
    \n
    \n
    \n
    \n )\n}\n\nexport default ProductFileLink\n","// extracted by mini-css-extract-plugin\nexport var container = \"ProductFileLink-module--container--e448a\";\nexport var details = \"ProductFileLink-module--details--555ac\";\nexport var text = \"ProductFileLink-module--text--764c5\";\nexport var thumb = \"ProductFileLink-module--thumb--5ce36\";\nexport var title = \"ProductFileLink-module--title--f5d04\";","import React from \"react\"\nimport * as styles from \"./AbbrBox.module.scss\"\n\ntype AbbrBoxProps = {\n /** Abbreviation or acronym */\n label: string\n /** If present, title must contain this full description and nothing else */\n title?: string\n}\n\n/**\n * HTML `` element. Represents an abbreviation or acronym. the optional title attribute can provide an expansion or description for the abbreviation.\n *\n * See {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/abbr|MDN docs: The Abbreviation element}\n */\nconst AbbrBox = (props: AbbrBoxProps) => {\n // console.debug('Rendering AbbrBox', props)\n if (!props.label) {\n console.warn(`Unlabeled AbbrBox: ${props.title}`)\n }\n\n return (\n \n {props.label || props.title}\n \n )\n}\n\nexport default AbbrBox\n","// extracted by mini-css-extract-plugin\nexport var abbr = \"AbbrBox-module--abbr--aa57a\";","import { getValue } from \"@nitro/gatsby-source-harvia-pim/helpers/attribute\"\nimport { Product } from \"@nitro/gatsby-source-harvia-pim/types/plugin\"\nimport React from \"react\"\nimport AbbrBox from \"../../atoms/AbbrBox\"\n\n//import * as styles from \"./ProductMarketAreas.module.scss\"\n\n// https://www.nationsonline.org/oneworld/country_code_list.htm\nexport const MarketAreaMap: Record = {\n arab_countries: \"ARAB\",\n asian_countries: \"ASIA\",\n china: \"CN\",\n cis_countries: \"CIS\",\n eu_countries: \"EU\",\n Europe: \"EUR\",\n europe_east: \"EEU\",\n europe_east_arabic: \"EEA\",\n finland: \"FI\",\n russia: \"RU\",\n germany: \"DE\",\n global: \"Global\",\n north_america: \"NA\",\n}\n\ntype ProductMarketAreasProps = { product: Product }\n\nconst ProductMarketAreas: React.FC = props => {\n //console.log('Rendering ProductMarketAreas', props)\n const marketAreas = getValue(props.product.values, \"market_areas\")\n\n if (!marketAreas) return null\n\n return (\n \n {marketAreas.value.map(itm => (\n \n ))}\n \n )\n}\n\nexport default ProductMarketAreas\n","import React, { ReactNode } from \"react\"\nimport * as styles from \"./ProductLeadDescription.module.scss\"\n\nexport type ProductLeadDescriptionProps = {\n term: ReactNode\n children?: React.ReactNode\n}\n\nconst ProductLeadDescription = (props: ProductLeadDescriptionProps) => {\n // console.log(\"Rendering ProductLeadDescription\", props)\n\n if (!React.Children.count(props.children)) {\n return null\n }\n\n return (\n \n
    \n {props.term}\n
    \n {React.Children.map(props.children, child => {\n return (\n
    \n {child}\n
    \n )\n })}\n \n )\n}\n\nexport default ProductLeadDescription\n","// extracted by mini-css-extract-plugin\nexport var container = \"ProductLeadDescription-module--container--f395e\";\nexport var detail = \"ProductLeadDescription-module--detail--64907\";\nexport var term = \"ProductLeadDescription-module--term--9e30c\";","import { ProductCompareValue } from \"@nitro/gatsby-source-harvia-pim/helpers/attribute\"\nimport { Product } from \"gatsby-source-harvia-pim/types/plugin\"\nimport React, { useContext } from \"react\"\nimport { PageContext } from \"../../../context/PageContext\"\nimport useDatoMicrocopy from \"../../../hooks/useDatoMicrocopy\"\nimport useProductPath from \"../../../hooks/useProductPath\"\nimport ProductAttribute from \"./ProductAttribute\"\nimport * as styles from \"./ProductDataTable.module.scss\"\n\ntype ProductDataTableProps = {\n values: ProductCompareValue[]\n products: Product[]\n} //{ products: Product[]; keys: string[] }\n\nconst ProductDataTable = (props: ProductDataTableProps) => {\n //console.log('Rendering ProductDataTable', props)\n const { locale } = useContext(PageContext)\n const t = useDatoMicrocopy(\"product\", locale)\n const getProductPath = useProductPath()\n\n const singleProduct = false // = props.products.length == 1\n\n //const values = getCompareValues(props.products, props.keys)\n\n const values = props.values\n\n if (!values || !values.length) return null\n\n return (\n
    \n \n {!singleProduct && (\n \n \n \n {props.products.map(product => {\n const path = getProductPath(product.identifier)\n return (\n \n )\n })}\n \n \n )}\n\n \n {values.map((itms, i) => {\n return (\n \n \n\n {itms.value.map((itm, j) => {\n return \n })}\n \n )\n })}\n \n
    {t(\"compareModel\", \"Model\").toUpperCase()}\n {product.identifier}\n
    {itms.label}{itm ? : <> }
    \n
    \n )\n}\n\nexport default ProductDataTable\n","import { getCompareValues } from \"@nitro/gatsby-source-harvia-pim/helpers/attribute\"\nimport { Product } from \"@nitro/gatsby-source-harvia-pim/types/plugin\"\nimport React from \"react\"\nimport Accordion from \"../../molecules/Accordion\"\nimport ProductDataTable from \"./ProductDataTable\"\n\ntype ProductComparisonAccordionProps = {\n products: Product[]\n keys: string[]\n title: string\n}\n\nconst ProductComparisonAccordion = (props: ProductComparisonAccordionProps) => {\n const values = getCompareValues(props.products, props.keys)\n\n if (!values.length) return null\n\n return (\n \n \n \n )\n}\nexport default ProductComparisonAccordion\n","import useOnlineProductQuery from \"@nitro/gatsby-source-harvia-pim/hooks/useOnlineProductQuery\"\nimport { Product } from \"@nitro/gatsby-source-harvia-pim/types/plugin\"\nimport React, { useContext } from \"react\"\nimport { PageContext } from \"../../../context/PageContext\"\nimport useDatoMicrocopy from \"../../../hooks/useDatoMicrocopy\"\nimport useSiteMetadata from \"../../../hooks/useSiteMetadata\"\nimport LoadingSpinner from \"../../atoms/LoadingSpinner\"\nimport ProductComparisonAccordion from \"./ProductComparisonAccordion\"\n\n//import * as styles from \"./ProductComparison.module.scss\"\n\ntype ProductComparisonProps = {\n product: Product\n otherProducts?: Product[]\n query?: string\n}\n\nconst ProductComparison = (props: ProductComparisonProps) => {\n const { locale, localePim } = useContext(PageContext)\n const t = useDatoMicrocopy(\"product\", locale)\n const { pim } = useSiteMetadata()\n //console.log('Rendering ProductComparison', props)\n\n const showDiscontinued = false\n\n const query =\n props.query &&\n (showDiscontinued\n ? [props.query, \"product_life_cycle_status:s5_discontinued\"].join()\n : [props.query, \"product_life_cycle_status:s3_maintenance\", \"product_life_cycle_status:s4_rampdown\"].join())\n\n const [products] =\n useOnlineProductQuery(\n query || null,\n {\n language: localePim,\n size: \"20\", // maksimi määrä verrattavia tuotteita\n sort: \"sku,asc\",\n includeDisabledProducts: true,\n },\n {\n baseQuery: pim.baseParams.join(\",\"),\n }\n ) || []\n\n const restProducts =\n props.otherProducts || products?.filter(itm => itm.identifier !== props.product?.identifier) || []\n\n const comparedProducts = [props.product, ...restProducts]\n\n return (\n <>\n \n \n \n \n\n \n\n \n\n \n\n

    \n \n {t(\"compareDisclaimer\", \"\")}\n \n

    \n \n )\n}\n\nexport default ProductComparison\n","import { getValue } from \"@nitro/gatsby-source-harvia-pim/helpers/attribute\"\n//import useProductCategoryStructure from \"@nitro/gatsby-source-harvia-pim/hooks/useProductCategoryStructure\"\nimport { Product } from \"@nitro/gatsby-source-harvia-pim/types/plugin\"\nimport React from \"react\"\nimport useProductCategoryStructure from \"../../../hooks/useProductCategoryStructure\"\nimport ProductComparison from \"../../organisms/product/ProductComparison\"\nimport { findDeepestCategory } from \"../../organisms/product/utils\"\n//import * as styles from \"./ProductPageComparison.module.scss\"\n\ntype ProductPageComparisonProps = {\n product: Product\n}\n\n/**\n * Kuin ProductComparison, mutta etsii kategoriapuusta tuotteen syvimmän kategorian\n * ja hakee vertailutuotteet siitä kategoriasta ja samasta tuoteperheestä\n * @param product Nykyinen tuote\n * @returns\n */\nconst ProductPageComparison = (props: ProductPageComparisonProps) => {\n // console.debug(\"Rendering ProductPageComparison\", props)\n const structure = useProductCategoryStructure()\n const familyData = getValue(props.product.values, \"product_family\")\n const family = familyData?.value[0].data || \"\"\n const category = findDeepestCategory(structure.subCategories, props.product.categories)?.code\n\n if (!category || !family) return \n\n return \n}\n\nexport default ProductPageComparison\n","import React from \"react\"\nimport { IoIosArrowBack, IoIosArrowForward } from \"react-icons/io\"\nimport { useSwipeable } from \"react-swipeable\"\nimport LoadingSpinner from \"../../atoms/LoadingSpinner\"\nimport PimImage from \"../../atoms/PimImage\"\nimport * as styles from \"./ProductPageImages.module.scss\"\n\nexport type ProductPageImage = {\n src: string\n thumbnail: string\n title?: string\n alt?: string\n fit?: \"cover\" | \"contain\"\n}\nexport type ProductPageImagesProps = { images: ProductPageImage[] }\n\nconst ProductImageFull = (props: {\n src: string\n alt?: string\n loading?: boolean\n onLoad: any\n fit: \"cover\" | \"contain\"\n}) => {\n return (\n
    \n \n \n
    \n )\n}\n\nconst ThumbImage = (props: { src: string; alt?: string; onClick: any; active?: boolean }) => {\n return (\n \n )\n}\n\nconst ProductPageImages = (props: ProductPageImagesProps) => {\n // console.debug(\"Rendering ProductPageImages\", props)\n\n const [currentImage, setCurrentImage] = React.useState(0)\n const [loading, setLoading] = React.useState(false)\n\n const load = (i: number) => {\n if (i !== currentImage) {\n setLoading(true)\n setCurrentImage(i)\n }\n }\n const loaded = (e: Event) => {\n setLoading(false)\n }\n\n const next = () => {\n if (currentImage < props.images.length - 1) setCurrentImage(currentImage + 1)\n }\n const prev = () => {\n if (currentImage > 0) setCurrentImage(currentImage - 1)\n }\n\n const swipeHandlers = useSwipeable({\n onSwipedLeft: next,\n onSwipedRight: prev,\n // preventDefaultTouchmoveEvent: true,\n trackMouse: true,\n })\n\n if (!props.images || !props.images.length) return null\n\n return (\n
    \n \n {props.images.length > 1 && (\n <>\n
      \n {props.images.map((img, i) => {\n return (\n
    • \n load(i)} active={currentImage == i} />\n
    • \n )\n })}\n
    \n\n
    \n \n \n
    \n \n )}\n
    \n )\n}\n\nexport default ProductPageImages\n","// extracted by mini-css-extract-plugin\nexport var active = \"ProductPageImages-module--active--352ee\";\nexport var container = \"ProductPageImages-module--container--c94da\";\nexport var controls = \"ProductPageImages-module--controls--65b58\";\nexport var full = \"ProductPageImages-module--full--c5424\";\nexport var thumb = \"ProductPageImages-module--thumb--e46ac\";\nexport var thumbs = \"ProductPageImages-module--thumbs--1371c\";","import React from \"react\"\nimport VideoEmbed from \"../../atoms/VideoEmbed\"\n// import * as s from \"./ProductVideoEmbed.module.scss\"\n\ntype ProductVideoEmbedProps = {\n /** Video embed URL */\n url: string\n}\n\n/**\n * Embed a PIM Product video. The 'url' props is typically from \"external_link_1_videos_etc\" or the like.\n */\nconst ProductVideoEmbed = (props: ProductVideoEmbedProps) => {\n const { url } = props\n const provider = url.includes(\"youtu\") ? \"youtube\" : url.includes(\"vimeo\") ? \"vimeo\" : null\n let providerUid // video id\n\n const urlEnd = url.slice(url.lastIndexOf(\"/\") + 1) // urlin loppuosa\n\n if (urlEnd.includes(\"watch?v=\")) {\n providerUid = url.slice(url.lastIndexOf(\"watch?v=\") + 1)\n } else {\n providerUid = urlEnd\n }\n\n // console.log(provider, providerUid)\n\n if (!provider || !urlEnd) {\n console.warn(\"Unknown video url\", url)\n return null\n }\n\n return \n}\n\nexport default ProductVideoEmbed\n","import { Link } from \"gatsby\"\nimport React, { useContext } from \"react\"\nimport { Helmet } from \"react-helmet\"\nimport { IoWifi } from \"react-icons/io5\"\nimport { getValue, stringValue } from \"../../../../../gatsby-source-harvia-pim/helpers/attribute\"\nimport { getExternalMedia } from \"../../../../../gatsby-source-harvia-pim/helpers/media\"\nimport { ExternalMedia, Product, ProductValue } from \"../../../../../gatsby-source-harvia-pim/types/plugin\"\nimport { RockonAssociationData } from \"../../../../../gatsby-source-harvia-pim/types/rockon\"\nimport { PageContext } from \"../../../context/PageContext\"\nimport { useUserPreferences } from \"../../../context/UserContext\"\nimport useDatoMicrocopy from \"../../../hooks/useDatoMicrocopy\"\nimport useProductLandingPagePath from \"../../../hooks/useProductLandingPagePath\"\nimport { RoutePathNode } from \"../../../hooks/useRouteTree\"\nimport { findAny, slugify } from \"../../../utils\"\nimport Button from \"../../atoms/Button\"\nimport TileLayout from \"../../layouts/TileLayout\"\nimport BackgroundMedia from \"../../molecules/BackgroundMedia\"\nimport BreadCrumbs from \"../../molecules/BreadCrumbs\"\nimport ExpandingText from \"../../molecules/ExpandingText\"\nimport TabContent, { TabContentProps } from \"../../molecules/TabContent\"\nimport MediaTextBlock from \"../../molecules/tileable-blocks/MediaTextBlock\"\nimport ProductAttribute from \"../../organisms/product/ProductAttribute\"\nimport ProductFileLink from \"../../organisms/product/ProductFileLink\"\nimport ProductFilter from \"../../organisms/product/ProductFilter\"\nimport ProductMarketAreas from \"../../organisms/product/ProductMarketAreas\"\nimport { getAssocQuantities, isAvailable, textFormat } from \"../../organisms/product/utils\"\nimport ProductLeadDescription from \"./ProductLeadDescription\"\nimport ProductPageComparison from \"./ProductPageComparison\"\nimport * as styles from \"./ProductPageContent.module.scss\"\nimport ProductPageImages, { ProductPageImage } from \"./ProductPageImages\"\nimport ProductVideoEmbed from \"./ProductVideoEmbed\"\n\nexport type ProductLandingPageCta = Queries.ProductLandingPageCtaFragment\n\nexport type ProductAssociation = {\n sku: string\n data?: RockonAssociationData\n product?: {\n identifier: string\n name: string\n media?: ExternalMedia[]\n values?: ProductValue[]\n }\n}\n\ntype ProductPageContentProps = {\n /** Product data */\n product: Product\n /** Landingpage cta:s */\n landingPages?: ProductLandingPageCta[]\n /** Using dynamic data vs built data */\n unBuiltProduct?: boolean\n /** URL path to Find Your Dealer page. No value implies not to link there. */\n findDealerPath?: string\n /** URL path to Sauna Planner page. No value implies not to link there. */\n saunaPlannerPath?: string\n /** URL path to Sauna Calculator page. No value implies not to link there. */\n saunaCalculatorPath?: string\n /** TODO Needed only for breadcrupbs. Remove when breadcrumbs can be calculated outside */\n productsPageRootPath?: string\n /** Meta title. To be removed: TODO move Helmet/SEO stuff to parent or layout or somewhere above this */\n siteTitle?: string | null\n /** TODO */\n breadcrumbBase: (RoutePathNode | null)[]\n categoryLabel: string\n}\n\nconst ProductPageContent = (props: ProductPageContentProps) => {\n // console.debug(\"Rendering ProductPage\", props)\n // React.useEffect(() => console.debug(\"Rendering ProductPage\", props), [])\n\n const findProductLandingPagePath = useProductLandingPagePath()\n\n const userPrefs = useUserPreferences()\n\n const { locale, localePim } = useContext(PageContext)\n const t = useDatoMicrocopy(\"product\", locale)\n\n const productData = props.product\n\n /** */\n const pValueStore = new Map()\n\n /** Whitelist of \"product value\" keys used in this component */\n const pValueKeys = [\n \"product_marketing_name_short\",\n \"product_marketing_name_long\",\n \"datasheet\",\n \"external_link_1_videos_etc\",\n \"external_link_2_videos_etc\",\n \"external_link_3_videos_etc\",\n \"product_life_cycle_status\",\n \"product_family\",\n \"electrical_number_stk\",\n \"control_panel_type\",\n \"marketing_slogan\",\n \"room_min_volume\",\n \"room_max_volume\",\n \"item_code_harvia_finland\",\n \"type_code\",\n \"electrical_number_seg\",\n \"market_areas\",\n \"product_family_text_maaritetaan_tuoteperheelle\",\n \"usp_1\",\n \"usp_2\",\n \"usp_3\",\n \"usp_4\",\n \"usp_5\",\n \"usp_6\",\n \"usp_7\",\n \"usp_8\",\n \"usp_9\",\n ]\n\n pValueKeys.forEach(pValKey => {\n pValueStore.set(pValKey, getValue(productData.values, pValKey))\n })\n\n function pValue(key: string): ProductValue | undefined {\n if (!pValueStore.has(key)) {\n console.warn(`Unkown product value key \"${key}\"`)\n }\n return pValueStore.get(key)\n }\n\n function pValues(keys: string[]): (ProductValue | undefined)[] {\n return keys.map(pValue)\n }\n\n function pValueLabel(key: string) {\n const v = pValue(key)\n if (v && v.value[0]) return v.value[0].label\n return \"\"\n }\n\n if (!props.product || !props.product.identifier) return null\n\n // muodostetaan muropolku\n const breadcrumbs = [\n { label: stringValue(pValue(\"product_marketing_name_short\")), path: \"\" },\n ...props.breadcrumbBase,\n ]\n\n /** Assosioidut tuotteet. Saatavilla ssr tilassa. */\n const getAssociatedProducts = (assocKey: string) =>\n (productData.associations[assocKey] as ProductAssociation[])?.map(itm => itm.product as Product).filter(Boolean)\n\n const dataSheet = pValue(\"datasheet\")?.value[0]\n const dataSheetUrl =\n dataSheet && `https://pim.harvia.com/media/download/${encodeURIComponent(encodeURIComponent(dataSheet.data))}`\n\n const showSaunaCalculator = !!findAny(productData.categories, [\n \"02_sauna_electric_heaters\",\n \"02_sauna_wood_heaters\",\n // \"02_steamandspa_steam_generators\",\n ])\n const showSaunaPlanner = !!findAny(productData.categories, [\"02_sauna_measure_made_benches\"])\n\n // USP\n const uspList = pValues([\"usp_1\", \"usp_2\", \"usp_3\", \"usp_4\", \"usp_5\", \"usp_6\", \"usp_7\", \"usp_8\", \"usp_9\"])\n\n // Downloadable files\n const mediaMauals = getExternalMedia(productData.media, \"User manual\")\n const mediaBrochures = getExternalMedia(productData.media, \"Brochure\")\n const mediaCertificates = getExternalMedia(productData.media, \"Certificate\")\n const mediaTechnicaImages = getExternalMedia(productData.media, \"Technical image\")\n const mediaTechnicaModels = [\n ...getExternalMedia(productData.media, \"3D CAD file\"),\n ...getExternalMedia(productData.media, \"2D CAD file\"),\n ...getExternalMedia(productData.media, \"BIM object\"),\n ]\n const safetyDataSheets = getExternalMedia(productData.media, \"Safety data sheet\")\n const getExternalMediaLabel = (itm: ExternalMedia) =>\n itm.labels?.find(lbl => lbl.locale === localePim)?.value || itm.name // jos omalla localella ei labelia, fallbackinä itm.name\n\n // Videos\n const videos = [\n stringValue(pValue(\"external_link_1_videos_etc\")),\n stringValue(pValue(\"external_link_2_videos_etc\")),\n stringValue(pValue(\"external_link_3_videos_etc\")),\n ].filter(Boolean)\n\n // Spare parts\n const sparePartsDisabled = !!findAny(productData.categories, [\n \"02_sauna_spare_parts\",\n \"02_infrared_spare_parts\",\n \"02_steamandspa_spare_parts\",\n ])\n //const spareParts = !sparePartsDisabled && getAssociatedProducts(\"Spare_parts\")\n\n // Cross sell\n const crossSellEnabled = !findAny(productData.categories, [\"02_accessories\"])\n\n const isDiscontinued =\n pValue(\"product_life_cycle_status\")?.value[0].data === \"s5_discontinued\" || productData.enabled === false\n\n const productFamily = pValue(\"product_family\")\n const electricalNumberStk = pValue(\"electrical_number_stk\")\n const controlPanelType = pValue(\"control_panel_type\")?.value[0]\n\n const pageTitle =\n stringValue(pValue(\"product_marketing_name_long\")) ||\n stringValue(pValue(\"product_marketing_name_short\")) ||\n productData.name // fallback nimi tuotteelle\n const description = stringValue(pValue(\"marketing_slogan\"))\n\n const masterImage =\n productData.media.find(img => img.masterImage) || getExternalMedia(productData.media, \"Product image\")[0]\n\n const productImages: ProductPageImage[] = [\n ...getExternalMedia(productData.media, \"Feeling image\").slice(0, 4),\n ...getExternalMedia(productData.media, \"Detail image\"),\n masterImage,\n ]\n .filter(Boolean)\n .map(img => ({\n src: img.link,\n thumbnail: img.thumbnail,\n alt: img.name,\n fit: img.type === \"Product image\" ? \"contain\" : \"cover\",\n }))\n\n const lessLabel = t(\"showLess\", \"Show less\", \"common\")\n const moreLabel = t(\"showMore\", \"Show more\", \"common\")\n\n const roomVolumeMin = pValue(\"room_min_volume\")\n const roomVolumeMax = pValue(\"room_max_volume\")\n\n // console.debug(\"room volume in ProductPageContent\", roomVolumeMin, roomVolumeMax)\n\n // whether to show \"Products you may also be interested in\" heading or not\n // used in Tabs section\n const showAssocHeading =\n (crossSellEnabled && !!productData.associations?.cross_sell?.length) ||\n //!!productData.associations?.accessories?.length ||\n !!productData.associations?.SUBSTITUTION?.length ||\n !!productData.associations?.UPSELL?.length ||\n !!productData.associations?.compatible_items?.length\n\n const showFilesTab =\n !!dataSheet ||\n !!mediaMauals.length ||\n !!mediaBrochures.length ||\n !!mediaCertificates.length ||\n !!safetyDataSheets.length ||\n !!mediaTechnicaImages.length\n\n return (\n
    \n \n {pageTitle}\n \n\n \n \n \n \n \n\n
    \n {/* \n \n Images \n \n */}\n\n
    \n
    \n \n
    \n
    \n\n {/* \n \n Basic product info \n \n */}\n\n
    \n
    \n \n\n {isAvailable(productData, userPrefs.localeArea) === false && (\n

    \n {/* {userPrefs.country.flag || \"\"} {userPrefs.country.name?.common} —{\" \"} */}\n {t(\"infoProductUnavailable\", \"Product is currently unavailable.\")}\n

    \n )}\n\n {/* {props.unBuiltProduct && (\n

    {t(\"infoProductUnavailable\", \"Product is currently unavailable.\")}

    \n )} */}\n\n

    \n {[stringValue(getValue(productData.values, \"product_group_2\")), stringValue(productFamily)]\n .filter(Boolean)\n .join(\" | \")}\n

    \n

    \n {textFormat(pageTitle)}\n

    \n
    \n\n
    \n \n
    \n
    \n\n
    \n \n \n \n\n \n \n \n\n \n {electricalNumberStk && (\n \n {stringValue(electricalNumberStk)}\n \n )}\n \n {pValue(\"electrical_number_seg\")?.value && (\n \n \n \n )}\n \n {[\n productData.categories.includes(\"certificates_ce\") && CE ,\n productData.categories.includes(\"certificates_eac\") && EAC ,\n productData.categories.includes(\"certificates_cULus\") && UL ,\n productData.categories.includes(\"certificates_cETLus\") && ETL ,\n productData.categories.includes(\"certificates_BIMSCh2\") && BIMSCh2 ,\n productData.categories.includes(\"certificates_BImSchV_2_listing\") && BImSchV 2 ,\n productData.categories.includes(\"certificates_BImSchV_1\") && BImSchV 1 ,\n productData.categories.includes(\"certificates_Avainlippu\") && Avainlippu ,\n ]}\n \n \n {pValue(\"market_areas\") && }\n \n\n {isDiscontinued && (\n \n {t(\"labelDiscontinued\", \"Discontinued\", \"productFinder\")}\n \n )}\n\n {roomVolumeMin && roomVolumeMax ? (\n \n - \n \n ) : (\n
     
    \n )}\n\n {controlPanelType?.data === \"xenio_wifi\" && (\n \n )}\n
    \n\n
    \n\n
    \n {!showSaunaPlanner && props.findDealerPath && (\n \n
    \n
    \n
    \n\n {/* \n \n TABS \n \n */}\n\n
    \n \n \n
    \n

    \n \n

    \n
      \n {uspList.map(itm =>\n itm ? (\n
    • \n \n
    • \n ) : null\n )}\n
    \n
    \n {props.landingPages?.map(data => {\n //const { path, data } = lander\n const path = findProductLandingPagePath(data.originalId)\n\n if (!path) return null\n\n return (\n }\n content={\n <>\n

    {data.ctaTitle}

    \n

    {data.ctaText}

    \n \n
    \n\n {/* \n \n VÄLIOTSIKKO \n \n */}\n\n {showAssocHeading && (\n
    \n

    {t(\"assocHeading\", \"Products you may also be interested in\")}

    \n
    \n )}\n\n {/* \n \n ASSOSIAATIOT \n \n */}\n\n
    \n \n\n \n\n \n\n {crossSellEnabled && (\n \n )}\n
    \n
    \n )\n}\n\nexport default ProductPageContent\n","// extracted by mini-css-extract-plugin\nexport var associationsHeading = \"ProductPageContent-module--associationsHeading--b0888\";\nexport var images = \"ProductPageContent-module--images--aaefc\";\nexport var info = \"ProductPageContent-module--info--eb4ff\";\nexport var leadLinks = \"ProductPageContent-module--leadLinks--7b08f\";\nexport var stickyImages = \"ProductPageContent-module--stickyImages--cacc5\";\nexport var topContainer = \"ProductPageContent-module--topContainer--0c88d\";\nexport var unavailable = \"ProductPageContent-module--unavailable--2bf58\";\nexport var uspList = \"ProductPageContent-module--uspList--6b19f\";","import { graphql } from \"gatsby\"\nimport React, { useContext } from \"react\"\nimport useOnlineProductQuery from \"../../../../gatsby-source-harvia-pim/hooks/useOnlineProductQuery\"\nimport { PageContext } from \"../../context/PageContext\"\nimport useProductCategoryPath from \"../../hooks/useProductCategoryPath\"\nimport useProductCategoryStructure from \"../../hooks/useProductCategoryStructure\"\nimport useRoutePath from \"../../hooks/useRoutePath\"\nimport { useRouteTree } from \"../../hooks/useRouteTree\"\nimport useWebsite from \"../../hooks/useWebsite\"\nimport LoadingSpinner from \"../atoms/LoadingSpinner\"\nimport { findDeepestCategory } from \"../organisms/product/utils\"\nimport ProductPageContent, { ProductLandingPageCta } from \"./productPage/ProductPageContent\"\n\ntype ProductPageProps = {\n /** Product identifier */\n sku: string\n /** Built product data */\n data?: Queries.ProductPageHarviaProductFragment\n /** Landingpage cta:s */\n landingPages?: ProductLandingPageCta[]\n}\n\nconst ProductPage = (props: ProductPageProps) => {\n const { localePim } = useContext(PageContext)\n const [onlineProducts, result] = useOnlineProductQuery(props.sku ? `sku:${props.sku}` : null, {\n language: localePim,\n // fullAssociations: true,\n includeDisabledProducts: true,\n })\n const website = useWebsite()\n const getRoutePath = useRoutePath()\n const routeTree = useRouteTree(website.productRootRoute?.originalId)\n const structure = useProductCategoryStructure()\n\n // Muodostetaan muropolku\n function isNonNullString(val: unknown): val is string {\n return typeof val === \"string\"\n }\n const p = onlineProducts?.[0] || props.data\n const pCategories = p?.categories || []\n const category = findDeepestCategory(structure.subCategories, pCategories.filter(isNonNullString))\n const pim_locales = [localePim.replace(\"-\", \"_\"), \"en_US\"] // TODO: kovakoodattu locale fallback muropolun kategoriassa\n const categoryLabel = category?.labels.find(itm => !!~pim_locales.indexOf(itm.name))?.value || category?.code || \"\"\n const categoryPath = useProductCategoryPath(category?.code)\n const breadcrumbBase = [\n {\n label: categoryLabel,\n path: categoryPath || `${routeTree?.[0]?.path}?search=category:${category?.code}`,\n },\n ...routeTree,\n ]\n\n if (!props.sku) return null\n\n // Ei buildattu tuote\n if (!props.data || !props.data.identifier) {\n if (!onlineProducts || !onlineProducts[0]) {\n // Tuotedataa ei vielä haettu\n return (\n
    \n {result?.empty ? (\n

    Product not found

    \n ) : (\n <>\n

    Loading product...

    \n \n \n )}\n
    \n )\n } else {\n // Online tuotesivu\n return (\n \n )\n }\n }\n\n // Näytetään aluksi buildattu tuote. Käytetään päivitettyjä tietoja kun ne on noudettu.\n return (\n \n )\n}\n\nexport default ProductPage\n\nexport const query = graphql`\n fragment ProductLandingPageCta on DatoCmsProductLandingPage {\n ctaImage {\n ...DatoImageDefault\n }\n ctaLinkText\n ctaText\n ctaTitle\n originalId\n }\n\n fragment HarviaProductAssociationFields on HarviaProduct {\n identifier\n media {\n name\n type\n link\n thumbnail\n id\n }\n values {\n ...HarviaProductValue\n }\n }\n\n fragment HarviaProductValue on HarviaProductValue {\n name\n value {\n label\n # channelConversionApplied\n # locale\n metric {\n amount\n baseAmount\n unit\n baseUnit\n }\n numeric\n # optionLabel\n prices {\n amount\n currency\n }\n # scope\n text\n type\n data\n }\n }\n\n fragment ProductPageHarviaProduct on HarviaProduct {\n identifier\n name\n categories\n product_family\n completeness {\n locale\n missingCount\n ratio\n requiredCount\n scope\n }\n created\n databaseId\n enabled\n family\n groups\n images\n options\n type\n updated\n locale\n media {\n name\n type\n link\n thumbnail\n id\n language\n }\n values {\n ...HarviaProductValue\n }\n\n # Haetaan assosiaatioiden sku ja name, niin saadaan luotua ssr linkit eri tuotteiden välille\n # varsinaiset tuotekorttien tiedot haetaan frontissa dynaamisesti.\n associations {\n accessories {\n sku\n data {\n QUANTITY\n }\n product {\n identifier\n name\n }\n }\n SUBSTITUTION {\n sku\n product {\n identifier\n name\n }\n }\n Spare_parts {\n sku\n data {\n QUANTITY\n }\n product {\n identifier\n name\n }\n }\n UPSELL {\n sku\n product {\n identifier\n name\n }\n }\n compatible_items {\n sku\n data {\n QUANTITY\n }\n product {\n identifier\n name\n }\n }\n cross_sell {\n sku\n product {\n identifier\n name\n }\n }\n }\n }\n`\n\n/*\n// ei haeta assosiaatioita buildissa, koska datan määrä on niin suuri\n\nassociations {\n Spare_parts {\n product {\n ...HarviaProductAssociationFields\n }\n data {\n QUANTITY\n }\n }\n UPSELL {\n product {\n ...HarviaProductAssociationFields\n }\n }\n accessories {\n product {\n ...HarviaProductAssociationFields\n }\n }\n compatible_items {\n product {\n ...HarviaProductAssociationFields\n }\n }\n cross_sell {\n product {\n ...HarviaProductAssociationFields\n }\n }\n SUBSTITUTION {\n product {\n ...HarviaProductAssociationFields\n }\n }\n }\n*/\n","import { graphql, useStaticQuery } from \"gatsby\"\nimport React from \"react\"\nimport { IPageContext, PageContext } from \"../context/PageContext\"\n\nlet _store: Record | null = null\n\ntype RoutePathMapData = {\n allSitePage: {\n nodes: Array<{\n path: string\n pageContext: IPageContext\n }>\n }\n}\n\n/**\n * Palauttaa polun tuotekategoriasivulle joka vastaa pyydettyä categoryn pimCodea\n */\nconst useProductCategoryPath = (pimCode?: string, newLocale?: string): string => {\n const { locale } = React.useContext(PageContext)\n const toLocale = newLocale || locale\n\n const data = useStaticQuery(\n graphql`\n query DatoCmsProductCategoryPathMap {\n allSitePage(\n filter: {\n componentChunkName: { eq: \"component---gatsby-theme-harvia-src-gatsby-templates-dato-product-category-tsx\" }\n }\n ) {\n nodes {\n path\n pageContext\n }\n }\n }\n `\n )\n\n if (_store === null) {\n const pathMap: Record = Object.create(null)\n data.allSitePage.nodes.forEach(n => {\n pathMap[`${n.pageContext.pimCode}--${n.pageContext.locale}`] = n.path\n })\n _store = pathMap\n }\n\n const path = _store[`${pimCode}--${toLocale}`]\n\n return path && `${path}?search=category:${pimCode}`\n}\n\nexport default useProductCategoryPath\n","import { graphql, useStaticQuery } from \"gatsby\"\n\nexport type ProductCategoryStructureNode = {\n /** Category name */\n code: string\n /** Category name translations */\n labels: {\n name: \"fi_FI\" | \"en_US\" | string\n value: string\n }[]\n subCategories: ProductCategoryStructureNode[]\n containsProductValues: {\n product_family: string[]\n color: string[]\n control_panel_type: string[]\n }\n}\n\nconst useProductCategoryStructure = (): ProductCategoryStructureNode => {\n const queryRes = useStaticQuery(\n graphql`\n fragment HarviaCategoryStructureFragment on HarviaCategoryStructure {\n code\n labels {\n name\n value\n }\n containsProductValues {\n product_family\n color\n control_panel_type\n }\n }\n\n query ProductStructureQuery {\n harviaCategoryStructure {\n ...HarviaCategoryStructureFragment\n subCategories {\n ...HarviaCategoryStructureFragment\n subCategories {\n ...HarviaCategoryStructureFragment\n subCategories {\n ...HarviaCategoryStructureFragment\n }\n }\n }\n }\n }\n `\n )\n\n return queryRes.harviaCategoryStructure\n}\n\nexport default useProductCategoryStructure\n","import { graphql, useStaticQuery } from \"gatsby\"\nimport { useContext } from \"react\"\nimport { PageContext } from \"../context/PageContext\"\nimport { localeValue } from \"../utils\"\nimport useRoutePath from \"./useRoutePath\"\nimport useWebsite from \"./useWebsite\"\n\n/**\n * Palauttaa yksittäisen routen hierarkia _ylöspäin_ juurisivuun (Etusivu/Hemsidan) asti.\n * Tälle ei pitäisi olla tarvetta. Tehokkaampaa on noutaa vain halutun routen hierarkia\n * jo GraphQL vaiheessa.\n */\n\nexport type RoutePathNode = {\n label: string\n path: string\n}\n\ntype TreeNode = Queries.DatoCmsRouteTreeQuery[\"allDatoCmsRoute\"][\"nodes\"][number]\n\nexport const useRouteTree = (routeId?: string) => {\n const { rootRoute } = useWebsite()\n const getRoutePath = useRoutePath()\n const { locale } = useContext(PageContext)\n\n // Kovakoodataan etusivun nimi.\n // const frontPageLabel = t(\"common\", \"front_page\", \"Front page\")\n // TODO!!! Väliaikainen käännös väärässä paikassa!\n const frontPageLabel = locale === \"fi\" ? \"Etusivu\" : \"Front page\"\n\n const data = useStaticQuery(\n graphql`\n fragment RouteTreeRouteFields on DatoCmsRoute {\n page {\n ... on DatoCmsPage {\n # alias to make JSON payload smaller (staticquery results end up in client bundles)\n t: _allTitleLocales {\n locale\n value\n }\n }\n ... on DatoCmsProductLandingPage {\n t: _allTitleLocales {\n locale\n value\n }\n }\n ... on DatoCmsProductSearchPage {\n t: _allTitleLocales {\n locale\n value\n }\n }\n }\n originalId\n #locales\n slug\n }\n\n query DatoCmsRouteTree {\n allDatoCmsRoute {\n nodes {\n ...RouteTreeRouteFields\n treeParent {\n ...RouteTreeRouteFields\n treeParent {\n ...RouteTreeRouteFields\n treeParent {\n ...RouteTreeRouteFields\n treeParent {\n ...RouteTreeRouteFields\n treeParent {\n ...RouteTreeRouteFields\n }\n }\n }\n }\n }\n }\n }\n }\n `\n )\n\n // console.debug(\"useRouteTree()\", data)\n\n // koska hookia ei voi käyttää konditionaalisesti ja aina käyttäjä ei voi olla varma sille annetuista arvoista\n if (!routeId) {\n return []\n }\n\n // route nodes\n const { nodes } = data.allDatoCmsRoute\n\n // find the correct root route node from all route trees (global, nordic, europe, america, etc)\n const route = nodes.find(rootNode => rootNode.originalId === routeId /*&& rootNode.locale === locale*/)\n\n const getRouteTreePaths = (routeTreeNode: TreeNode | null): (RoutePathNode | null)[] => {\n if (!routeTreeNode) return []\n\n const path = getRoutePath(routeTreeNode.originalId)\n\n if (!path) {\n return getRouteTreePaths(routeTreeNode.treeParent as TreeNode)\n }\n\n let label: string | null | undefined\n if (routeTreeNode.originalId === rootRoute?.originalId) {\n label = frontPageLabel\n } else {\n label = localeValue(locale, routeTreeNode.page?.t)\n }\n\n return [\n label\n ? {\n label,\n path,\n }\n : null,\n ...getRouteTreePaths(routeTreeNode.treeParent as TreeNode),\n ]\n }\n\n return getRouteTreePaths(route as TreeNode)\n}\n"],"names":["LEFT","RIGHT","UP","DOWN","defaultProps","delta","preventScrollOnSwipe","rotationAngle","trackMouse","trackTouch","swipeDuration","Infinity","touchEventOptions","passive","initialState","first","initial","start","swiping","xy","mouseMove","mouseUp","touchEnd","touchMove","touchStart","rotateXYByAngle","pos","angle","angleInRadians","Math","PI","cos","sin","getHandlers","set","handlerProps","onStart","event","isTouch","touches","length","state","props","document","addEventListener","onMove","onUp","clientX","clientY","onTouchStartOrOnMouseDown","Object","assign","slice","timeStamp","x","y","deltaX","deltaY","absX","abs","absY","time","velocity","sqrt","vxvy","dir","getDirection","toLowerCase","eventData","onSwipeStart","onSwiping","cancelablePageSwipe","onSwiped","cancelable","preventDefault","onEnd","onSwipedDir","onTap","onTouchEndOrOnMouseUp","e","removeEventListener","attachTouch","el","cleanup","baseOptions","tls","forEach","_ref","h","o","_ref2","output","ref","addState","cleanUpTouch","onMouseDown","useSwipeable","options","transientState","transientProps","previousProps","current","defaultKey","handlers","stateSetter","undefined","updateTransientState","video","w","width","height","ar","arClass","provider","React","title","src","providerUid","frameBorder","allow","allowFullScreen","className","initiallyOpen","open","inited","setInited","ssrContent","setOpen","setTimeout","toggle","styles","onClick","role","category","titleProps","toString","CSSTransition","in","classNames","timeout","unmountOnExit","exit","children","nodes","reverse","map","node","i","key","path","IoIosArrowForward","Link","to","label","isTab","tab","hash","isBrowser","location","initTab","tabs","findIndex","slug","curTab","setCurTab","container","filter","useEffect","hashChange","scrollIntoView","behavior","window","id","content","style","display","useProductLandingPagePath","_data$datoCmsWebsite","getRoutePath","useRoutePath","data","useStaticQuery","routeTree","datoCmsWebsite","rootRoute","console","error","addToMap","route","_route$page","page","originalId","treeChildren","landingPageId","routeOriginalId","findProductLandingPagePath","textId","useId","isOpen","setIsOpen","useState","text","containerStyles","backgroundColor","closedMaxHeight","dangerouslySetInnerHTML","__html","lessLabel","moreLabel","list","Array","isArray","isList","values","attr","type","metric","isNaN","amount","formatUnit","unit","numeric","json","parseJSON","row","j","itm","k","filteredValues","includes","prices","currency","href","link","download","thumbnail","alt","MarketAreaMap","arab_countries","asian_countries","china","cis_countries","eu_countries","Europe","europe_east","europe_east_arabic","finland","russia","germany","global","north_america","marketAreas","getValue","product","value","AbbrBox","count","itemProp","itemScope","itemType","term","child","locale","useContext","PageContext","t","useDatoMicrocopy","getProductPath","useProductPath","toUpperCase","products","identifier","itms","name","fontWeight","ProductAttribute","getCompareValues","keys","Accordion","ProductDataTable","localePim","pim","useSiteMetadata","query","join","useOnlineProductQuery","language","size","sort","includeDisabledProducts","baseQuery","baseParams","restProducts","otherProducts","_props$product","comparedProducts","concat","_toConsumableArray","LoadingSpinner","loading","ProductComparisonAccordion","_findDeepestCategory","structure","useProductCategoryStructure","familyData","family","findDeepestCategory","subCategories","categories","code","ProductComparison","ProductImageFull","PimImage","onLoad","objectFit","fit","opacity","overlay","ThumbImage","active","currentImage","setCurrentImage","setLoading","next","images","prev","swipeHandlers","onSwipedLeft","onSwipedRight","img","load","IoIosArrowBack","url","urlEnd","lastIndexOf","VideoEmbed","_pValue","_pValue2","_pValue3","_productData$associat2","_productData$associat3","_productData$associat4","_productData$associat5","_productData$associat6","_productData$associat7","_productData$associat8","_productData$associat9","_getValue","_getValue$value","_getValue$value$","_pValue4","_pValue5","_pValue6","_pValue7","_pValue8","_props$landingPages","_pValue9","_productData$associat10","_productData$associat11","userPrefs","useUserPreferences","productData","pValueStore","Map","pValue","has","get","pValueLabel","v","pValKey","breadcrumbs","stringValue","breadcrumbBase","getAssociatedProducts","assocKey","_productData$associat","associations","Boolean","dataSheet","dataSheetUrl","encodeURIComponent","showSaunaCalculator","findAny","showSaunaPlanner","uspList","mediaMauals","getExternalMedia","media","mediaBrochures","mediaCertificates","mediaTechnicaImages","mediaTechnicaModels","safetyDataSheets","getExternalMediaLabel","_itm$labels","_itm$labels$find","labels","find","lbl","videos","sparePartsDisabled","crossSellEnabled","isDiscontinued","enabled","productFamily","electricalNumberStk","controlPanelType","pageTitle","description","masterImage","productImages","roomVolumeMin","roomVolumeMax","showAssocHeading","cross_sell","SUBSTITUTION","UPSELL","compatible_items","showFilesTab","Helmet","titleTemplate","categoryLabel","siteTitle","ProductPageImages","BreadCrumbs","isAvailable","localeArea","marginBottom","marginTop","textFormat","paddingBottom","ExpandingText","ProductLeadDescription","target","rel","ProductMarketAreas","minWidth","IoWifi","fontSize","findDealerPath","Button","tabIndex","saunaCalculatorPath","saunaPlannerPath","priority","slugify","TabContent","TileLayout","columns","paddingRight","landingPages","MediaTextBlock","layout","contentBackground","BackgroundMedia","ctaImage","ctaTitle","ctaText","ctaLinkText","ProductPageComparison","ProductFilter","pageSize","ProductVideoEmbed","ProductFileLink","accessories","quantities","getAssocQuantities","Spare_parts","hideIfEmpty","lazyLoading","_website$productRootR","_category$labels$find","_routeTree$","_website$findDealerRo2","_website$saunaCalcula2","_website$saunaPlanner2","_routeTree$3","onlineProducts","result","sku","website","useWebsite","useRouteTree","productRootRoute","p","pCategories","val","pim_locales","replace","indexOf","useProductCategoryPath","ProductPageContent","findDealerRoute","saunaCalculatorRoute","saunaPlannerRoute","productsPageRootPath","unBuiltProduct","_website$findDealerRo","_website$saunaCalcula","_website$saunaPlanner","_routeTree$2","textAlign","padding","empty","_store","pimCode","newLocale","toLocale","pathMap","create","allSitePage","n","pageContext","harviaCategoryStructure","routeId","frontPageLabel","allDatoCmsRoute","rootNode","getRouteTreePaths","routeTreeNode","treeParent","_routeTreeNode$page","localeValue"],"sourceRoot":""}