{"version":3,"sources":["webpack:///./node_modules/@charlietango/use-window-size/lib/useWindowSize.esm.js","webpack:///./src/components/CarouselCard/CarouselCard.tsx","webpack:///./src/components/CarouselDesktop/CarouselDesktop.tsx","webpack:///./src/modules/Karrusel/Karrusel.tsx","webpack:///./src/modules/Karrusel/index.ts","webpack:///./src/utils/gtag.ts","webpack:///./src/utils/dom.ts","webpack:///./src/utils/image-utils.ts","webpack:///./node_modules/@charlietango/use-client-hydrated/lib/useClientHydrated.esm.js","webpack:///./node_modules/@charlietango/use-media/lib/useMedia.esm.js"],"names":["clientHydrated","_useState","width","window","innerWidth","height","innerHeight","windowSize","setWindowSize","handleSize","prevState","addEventListener","removeEventListener","CarouselCard","_React$Component","_classCallCheck","_callSuper","arguments","_inherits","_createClass","key","value","_this$props","this","props","item","cardIndex","className","useAsHeader","React","styles","mainSliderCard","image","stylesDesktop","carouselCard","link","aria-hidden","tabIndex","href","target","imgLink","Image","Object","assign","cardImage","placeholder","innerCardText","title","Heading","level","tag","text","Paragraph","weight","CtaButton","version","eventMeta","event","eventData","_defineProperty","CarouselDesktop","_ref","items","autoplay","autoplaySpeed","_React$useState","_React$useState2","_slicedToArray","eventIsSaved","saveEvent","isDesktop","useMedia","minWidth","useWindowSize","imageSlider","mainSlider","lockRef","useLockScroll","trackArrowClickOnce","site_section","trackEvent","mainSliderSettings","dots","arrows","speed","infinite","pauseOnHover","pauseOnFocus","adaptiveHeight","draggable","imageSliderSettings","cx","slickContainer","imageSlickContainer","Slider","ref","swipe","map","i","concat","slideImage","src","style","paddingBottom","mainSlickContainer","padding","innerCard","length","singleCard","navHolder","aria-label","navBtn","onClick","_imageSlider$current2","_mainSlider$current2","current","slickPrev","_imageSlider$current","_mainSlider$current","slickNext","Karrusel","hasDivider","karrusel","DividerComp","showOnDesktop","ONLY_SERVER","global","eventLabel","gtmEvent","dataLayer","push","truncateString","string","substring","Error","DIMENSION_NAMES","aspectRatios","mobile","desktop","defaultBreakpoints","hd","breakpoints","xs","sm","md","lg","generateSizes","imageBreaks","undefined","maxWidth","queries","reduce","acc","breakpoint","index","breakpointSize","getMediaQuery","query","matchMedia","defaultMatches","initialQuery","matches","setMatches","mediaQuery","listener","addListener","removeListener"],"mappings":"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","file":"static/scripts/44-966c108a5c547e784753.js","sourcesContent":["import { useState, useEffect } from 'react';\nimport useClientHydrated from '@charlietango/use-client-hydrated';\n\nfunction useWindowSize() {\n var clientHydrated = useClientHydrated();\n\n var _useState = useState(clientHydrated ? {\n width: window.innerWidth,\n height: window.innerHeight\n } : {\n width: 0,\n height: 0\n }),\n windowSize = _useState[0],\n setWindowSize = _useState[1];\n\n useEffect(function () {\n function handleSize() {\n setWindowSize(function (prevState) {\n // Don't create a new state object if the size didn't change (e.g. after initial render)\n return prevState.height !== window.innerHeight || prevState.width !== window.innerWidth ? {\n width: window.innerWidth,\n height: window.innerHeight\n } : prevState;\n });\n }\n\n handleSize();\n window.addEventListener('resize', handleSize);\n return function () {\n window.removeEventListener('resize', handleSize);\n };\n }, []);\n return windowSize;\n}\n\nexport default useWindowSize;\n","import * as React from 'react'\n\nimport type { CarouselCardViewModel } from '../../view-models/CarouselCardViewModel'\nimport CtaButton from '../CtaButton/CtaButton'\nimport Heading from '../Heading/Heading'\nimport Image from '../Image/Image'\nimport Paragraph from '../Paragraph/Paragraph'\nimport styles from './carouselCard-style.css'\nimport stylesDesktop from '../CarouselDesktop/carouselDesktop-style.css'\nimport { ButtonTypes } from '@/view-models/ButtonTypes'\n\ntype Props = {\n item: CarouselCardViewModel\n width?: number\n isActive?: boolean\n cardIndex?: number\n activeIndex?: number\n className?: string\n useAsHeader?: boolean\n}\n\nclass CarouselCard extends React.Component {\n static displayName = 'CarouselCard'\n static defaultProps = {}\n\n render() {\n const { item, width, cardIndex, className, useAsHeader } = this.props\n const eventMeta = {\n event: 'karrusel',\n eventData: 'link-click',\n }\n\n return !item ? null : (\n
\n
\n
\n {width && width < 992 && item.image ? (\n
\n {item.link ? (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n \n ) : null}\n \n
\n ) : (\n
\n )}\n
\n {item.title && (\n \n {item.title}\n \n )}\n {item.text && (\n \n {item.text}\n \n )}\n {item.link && (\n
\n \n
\n )}\n
\n
\n
\n
\n )\n }\n}\n\nexport default CarouselCard\n","import useMedia from '@charlietango/use-media'\nimport useWindowSize from '@charlietango/use-window-size'\nimport cx from 'classnames'\nimport * as React from 'react'\nimport Slider from 'react-slick'\n\nimport type { CarouselCardViewModel } from '../../view-models/CarouselCardViewModel'\nimport { trackEvent } from '../../utils/gtag'\nimport useLockScroll from '../Carousel/useLockScroll'\nimport CarouselCard from '../CarouselCard/CarouselCard'\nimport Image from '../Image/Image'\nimport styles from './carouselDesktop-style.css'\n\ntype Props = {\n items: Array\n useAsHeader?: boolean\n autoplay?: boolean\n autoplaySpeed?: number\n}\n\nconst CarouselDesktop = ({ items, useAsHeader, autoplay, autoplaySpeed }: Props) => {\n const [eventIsSaved, saveEvent] = React.useState(false)\n const isDesktop = useMedia({\n minWidth: 992,\n })\n const { width } = useWindowSize()\n const imageSlider: React.MutableRefObject = React.useRef()\n const mainSlider: React.MutableRefObject = React.useRef()\n const lockRef: React.MutableRefObject = useLockScroll()\n\n const trackArrowClickOnce = () => {\n if (!eventIsSaved) {\n const event = window.site_section === 'pension' ? 'karrusel' : 'modules-interaction'\n const eventData = window.site_section === 'pension' ? 'arrow-click' : 'karrusel'\n trackEvent({\n event,\n eventData,\n })\n saveEvent(true)\n }\n }\n\n const handleNext = () => {\n imageSlider?.current?.slickNext()\n mainSlider?.current?.slickNext()\n trackArrowClickOnce()\n }\n\n const handlePrevious = () => {\n imageSlider?.current?.slickPrev()\n mainSlider?.current?.slickPrev()\n trackArrowClickOnce()\n }\n\n const mainSliderSettings = {\n dots: true,\n arrows: false,\n speed: 500,\n infinite: true,\n autoplay: autoplay,\n autoplaySpeed: autoplaySpeed || 3000,\n pauseOnHover: false,\n pauseOnFocus: false,\n adaptiveHeight: false,\n draggable: false,\n }\n const imageSliderSettings = {\n arrows: false,\n speed: 500,\n infinite: true,\n autoplay: autoplay,\n autoplaySpeed: autoplaySpeed || 3000,\n pauseOnHover: false,\n pauseOnFocus: false,\n draggable: false,\n }\n\n if (!items) return null\n\n return (\n <>\n {isDesktop ? (\n
\n \n {items.map((item, i) => {\n return item.image ? (\n
\n
\n {item.link ? (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n \n ) : null}\n \n
\n
\n ) : (\n \n )\n })}\n
\n
\n ) : (\n
\n )}\n
\n \n {items.map((item, i) => (\n \n ))}\n \n\n {items.length > 1 && (\n
\n \n \n
\n )}\n
\n \n )\n}\n\nexport default CarouselDesktop\n","import cx from 'classnames'\nimport * as React from 'react'\n\nimport CarouselDesktop from '../../components/CarouselDesktop/CarouselDesktop'\nimport DividerComp from '../../components/DividerComp/DividerComp'\nimport type { CarouselCardViewModel } from '../../view-models/CarouselCardViewModel'\nimport styles from './karrusel-style.css'\n\ntype Props = {\n items: Array\n useAsHeader?: boolean\n autoplay?: boolean\n hasDivider?: boolean\n autoplaySpeed?: number\n}\ntype State = {}\n\nclass Karrusel extends React.Component {\n static displayName = 'Karrusel'\n static defaultProps = {}\n\n render() {\n const { items, useAsHeader, autoplay, autoplaySpeed, hasDivider } = this.props\n\n return (\n
\n \n { hasDivider ? : null }\n
\n )\n }\n}\n\nexport default Karrusel","export { default } from './Karrusel'\n\n/**\n * Should the component only render server side?\n * You can set this to true if the component is a pure static component.\n */\nexport const ONLY_SERVER = false","global.dataLayer = global.dataLayer || []\nexport type GtagEvent = {\n event?: string\n eventData?: string\n eventLabel?: string\n}\n\n/**\n * Track an event\n * Supply a callback, that gets triggered after the event is tracked\n */\nexport function trackEvent({ event, eventData, eventLabel }: GtagEvent) {\n if (typeof window === 'undefined') return\n const eventName = event ? `${window.site_section || 'pensam'}-${event}` : ''\n const gtmEvent = {\n event: eventName,\n 'event-data': eventData || '',\n 'event-label': eventLabel || '',\n }\n\n if (global.dataLayer && gtmEvent.event) {\n global.dataLayer.push(gtmEvent)\n } //\n // if (\n // process.env.NODE_ENV === 'development' &&\n // global.dataLayer &&\n // gtmEvent.event\n // ) {\n // console.log('dataLayer', global.dataLayer)\n // }\n}\n","export function scrollOffset(element, offset = 0, alignment = 'top') {\n const body = document.body\n const html = document.documentElement\n const elemRect = element.getBoundingClientRect()\n const clientHeight = html.clientHeight\n const documentHeight = Math.max(\n body.scrollHeight,\n body.offsetHeight,\n html.clientHeight,\n html.scrollHeight,\n html.offsetHeight,\n )\n let scrollPosition\n\n if (alignment === 'bottom') {\n scrollPosition = elemRect.bottom - clientHeight\n } else if (alignment === 'middle') {\n scrollPosition = elemRect.bottom - clientHeight / 2 - elemRect.height / 2\n } else {\n // top and default\n scrollPosition = elemRect.top\n }\n\n const maxScrollPosition = documentHeight - clientHeight\n return Math.min(scrollPosition + offset + window.pageYOffset, maxScrollPosition)\n}\n\n/**\n * Return true if child is contained in parent\n * @param parent {HTMLElement}\n * @param child {HTMLElement}\n * @returns {boolean}\n */\nexport function isDescendant(parent, child) {\n if (!child || !child.parentNode) return false\n let node = child.parentNode\n\n while (node != null) {\n if (node === parent) {\n return true\n }\n\n node = node.parentNode\n }\n\n return false\n}\nlet matchesFn\n\n/**\n * Find the closest element that matches the selector\n * @param el {HTMLElement}\n * @param selector {string}\n * @returns {HTMLElement}\n */\nexport function closest(el, selector) {\n if (!matchesFn) {\n // find vendor prefix\n ;[\n 'matches',\n 'webkitMatchesSelector',\n 'mozMatchesSelector',\n 'msMatchesSelector',\n 'oMatchesSelector',\n ].some((fn) => {\n if (typeof document.body[fn] === 'function') {\n matchesFn = fn\n return true\n }\n\n return false\n })\n }\n\n // traverse parents\n let parent\n let element = el\n\n while (element !== null) {\n parent = element.parentElement\n\n if (parent !== null && parent[matchesFn](selector)) {\n return parent\n }\n\n element = parent\n }\n\n return null\n}\n\n/**\n * Get the previous sibling DOM node to an element\n * @param node {HTMLElement}\n * @returns {HTMLElement}\n */\nexport function previousSibling(node) {\n if (!node) return null\n let element = node\n\n do {\n element = element.previousSibling\n if (!isIgnorable(element)) return element\n } while (element)\n\n return null\n}\n\n/**\n * Get the next sibling DOM node to an element\n * @param node {HTMLElement}\n * @returns {HTMLElement}\n */\nexport function nextSibling(node) {\n if (!node) return null\n let element = node\n\n do {\n element = element.nextSibling\n if (element && !isIgnorable(element)) return element\n } while (element)\n\n return null\n}\n\n/**\n * Ignore commment and text nodes.\n * @param node\n * @returns {*}\n */\nfunction isIgnorable(node) {\n if (!node) return null\n return node.nodeType === 8 || (node.nodeType === 3 && isAllWs(node))\n}\n\n/**\n * Ignore all whitespace nodes\n * @param node\n * @returns {*}\n */\nfunction isAllWs(node) {\n if (!node) return null\n // Use ECMA-262 Edition 3 String and RegExp features\n return !/[^\\t\\n\\r ]/.test(node.textContent)\n}\n\nexport function getNodePath(node) {\n if (!node) return null\n let currentNode = node\n let path\n\n while (currentNode.parentNode) {\n const tag = currentNode.tagName.toLowerCase()\n const classes = currentNode.getAttribute('class')\n const className = classes ? `.${classes.trim().split(' ').join('.')}` : ''\n\n if (path) {\n path = `${tag}${className} > ${path}`\n } else {\n path = `${tag}${className}`\n }\n\n // Move up in the tree\n currentNode = currentNode.parentNode\n }\n\n return path\n}\nexport function insertAfter(newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling)\n}\nexport function truncateString(string, length) {\n if (string.length > length) {\n if (typeof string === 'string' && typeof length === 'number') {\n return string.substring(0, length) + '\\u2026'\n } else {\n throw new Error('Function truncateString take args @string, @number')\n }\n } else return string\n}\nexport default {\n closest,\n isDescendant,\n previousSibling,\n nextSibling,\n scrollOffset,\n getNodePath,\n insertAfter,\n truncateString,\n}","export type ImageRatio = 'original' | 'dim16_9' | 'dim3_2'\nexport const DIMENSION_NAMES = ['xs', 'sm', 'md', 'lg', 'hd']\nexport const aspectRatios = {\n mobile: 10 / 23,\n desktop: 10 / 27,\n}\n\n/** Max image width at a given breakpoint. */\nexport type ImageBreakpoints = {\n xs?: string\n sm?: string\n md?: string\n lg?: string\n hd?: string\n}\nexport const IMAGE_WIDTHS = [150, 300, 560, 660, 750, 880, 1024, 1350, 1440, 1720, 1920, 2048, 2700]\nexport type ImageSizes = {\n breakpoints?: ImageBreakpoints\n maxWidth: string | number\n}\n// If image breaks are undefined, make sure the width tops out 100 viewport width\nconst defaultBreakpoints = {\n hd: '100vw',\n}\nconst breakpoints = {\n xs: 0,\n sm: 48,\n // 48*16 = 768px\n md: 64,\n // 64*16 = 1024px\n lg: 75,\n // 75*16 = 1200px\n hd: 90, // 88*16 = 1408px\n}\n\n/**\n * Converts a string number with a known unit type, to a unitless number in px size\n **/\nexport function sizeToNumber(size: string | number): number {\n if (!size) return 0\n if (typeof size === 'number') return size\n if (size.endsWith('px')) return parseInt(size.substr(0, size.length - 2), 10)\n if (size.endsWith('em')) return parseInt(size.substr(0, size.length - 2), 10) * 16\n if (size.endsWith('vw')) return (parseInt(size.substr(0, size.length - 2), 10) * 1440) / 100\n if (size.endsWith('rem')) return parseInt(size.substr(0, size.length - 3), 10) * 16\n return parseInt(size, 10)\n}\n\n/**\n * Generate the actual ratio for the the known Image ratios\n **/\nexport function calculateRatio(width: number = 16, height: number = 9, aspect: number) {\n return Math.min(aspect, height === 0 ? 1 : height / width === 0 ? 1 : width) // switch (aspect) {\n // case 'dim3_2':\n // return 2 / 3\n // case 'dim16_9':\n // return 9 / 16\n // default:\n // return height / width\n // }\n}\n\n/**\n * Generate sizes for images, while respecting Breakpoints\n **/\nexport function generateSizes(\n imageBreaks: ImageBreakpoints = defaultBreakpoints,\n maxWidth: string | number = '1440px',\n) {\n const queries = DIMENSION_NAMES.reduce((acc, breakpoint, index) => {\n // If the breakpoint is 0, or undefined, take the next dimension\n const maxWidth = breakpoints[breakpoint] || breakpoints[DIMENSION_NAMES[index + 1]]\n const breakpointSize = imageBreaks[breakpoint]\n\n if (breakpointSize) {\n return `${acc}(max-width: ${maxWidth}em) ${breakpointSize}, `\n }\n\n return acc\n }, '')\n return queries + (typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth)\n}","import { useEffect } from 'react';\n\nvar clientHydrated = false;\n/**\n * Returns false when serverside rendering and during the first render pass (hydration) in the client.\n * Use this to modify behavior of components when they can be certain they are running client side.\n * Like check a media query during the initial render.\n * */\n\nfunction useClientHydrated() {\n useEffect(function () {\n if (!clientHydrated) clientHydrated = true;\n }, []);\n return clientHydrated;\n}\n\nexport default useClientHydrated;\n","import { useState, useEffect } from 'react';\nimport useClientHydrated from '@charlietango/use-client-hydrated';\nimport json2mq from 'json2mq';\n\nfunction getMediaQuery(query) {\n return window.matchMedia(typeof query === 'string' ? query : json2mq(query));\n}\n\nfunction useMedia(query, defaultMatches) {\n if (defaultMatches === void 0) {\n defaultMatches = true;\n }\n\n var clientHydrated = useClientHydrated();\n\n var _useState = useState(function () {\n var initialQuery = clientHydrated ? getMediaQuery(query) : undefined;\n return initialQuery ? initialQuery.matches : defaultMatches;\n }),\n matches = _useState[0],\n setMatches = _useState[1];\n\n useEffect(function () {\n var mediaQuery = getMediaQuery(query);\n if (!mediaQuery) return undefined;\n setMatches(mediaQuery.matches);\n\n var listener = function listener() {\n return setMatches(mediaQuery.matches);\n };\n\n mediaQuery.addListener(listener);\n return function () {\n mediaQuery.removeListener(listener);\n };\n }, [query]);\n return matches;\n}\n\nexport default useMedia;\n"],"sourceRoot":""}