{"version":3,"names":["fadingImageCss","FadingImageStyle0","FadingImage","componentWillLoad","this","watchImageFading","prevSrc","currentSrc","prevImageElement","currentImageElement","src","Image","imageOnLoad","imageOnError","alt","onload","appendImage","onerror","host","append","classList","add","setTimeout","imageToBeRemoved","remove","THEME","BRAND","ImageLoadingStatus","ImageType","RotationImage","constructor","url","SliderImageInfo","carouselImage","cssClasses","width","height","Set","type","interior","exterior","cssClassObject","_a","forEach","value","imageSliderCss","MccImageSliderStyle0","ImageSlider","slides","showFooter","isDragging","startPos","currentTranslate","prevTranslate","animationID","currentIndex","loadedImages","imageInfos","filter","imageInfo","loadingStatus","success","goodImages","error","watchCarouselImagesHandler","carouselImages","componentDidRender","slider","shadowRoot","querySelector","Array","from","querySelectorAll","currentSlideWidth","clientWidth","sliderWindow","slidesResizeObserver","ResizeObserver","entries","resizeSlides","observe","addEventListener","e","preventDefault","event","stopPropagation","touchStart","passive","touchEnd","touchMove","root","disconnectedCallback","disconnect","watchThemeHandler","newCarouselImages","length","i","loading","originalIndex","push","entry","slide","target","style","setPositionByIndex","getPositionX","includes","pageX","touches","clientX","requestAnimationFrame","animation","currentPosition","cancelAnimationFrame","movedBy","setSliderPosition","transform","prevSlide","nextSlide","onImageLoad","_index","imageCompleteCallback","onImageError","loadErrorCount","image","loadIndex","allImagesLoaded","imageLoadError","emit","every","info","render","h","Host","key","id","class","theme","map","onLoad","onError","getAssetPath","Fragment","onClick","getIconForCurrentTheme","iconName","className","LNF22","VW22","rotationViewCss","MccRotationViewStyle0","RotationView","eventActive","watchRotationImagesHandler","rotationImages","assetTheme","htmlImageContainer","onSwipe","onDrag","when","checkNewCoordinates","changedTouches","pageY","clientY","coord","swipeCoord","showCircle","timeToWait","timeStamp","lastEvent","direction","Math","abs","changeSlide","ignoreError","imageIndex","computedRotationImages","index","findIndex","img","allImagesFailed","rotationImage","checkIndex","newRotationImageList","computeRotationImages","rotationImageList","CtaTarget","MccConfigurationStep","MccError","Error","message","super","name","MccLoadError","status","MccConfigError","BREAKPOINT","BreakpointMap","xs","sm","md","lg","xl","xxl","xxxl","values","Map","XS","SM","MD","LG","XL","XXL","XXXL","getValue","breakpoint","get","BreakpointConfig","breakpointValue","getThemeForBrand","brand","subBrand","VW","LNF","AUDI","AUDI23","SEAT","CUPRA24","SEAT24","SKODA","SKODA23","getCountryCodeFromLocale","locale","localeArray","split","MccTranslationService","load","qa","translations$","state","console","debug","fetch","toLowerCase","then","response","json","translations","warn","undefined","TranslationService","marketingCcCss","PhsMarketingCcStyle0","MarketingCC","translationService","DATA_TYPE_WHEEL","DATA_TYPE_EXTERIOR","DATA_TYPE_VARIANT","loadDataBeforeRender","ccParams","dataLayer","window","currentTiles","maxWheelWidth","maxExteriorWidth","fallbackWidth","maxWidth","lastBreakpoints","DESIGN","EXTERIOR","document","variantsDropdownOpen","hostWidth","innerWidth","componentWillUpdate","componentWillRender","modelCodeParam","modelGroupCodeParam","msg","exteriorInclude","exteriorExclude","wheelExclude","wheelInclude","variantExclude","variantInclude","translationsCall","loadFonts","dataCall","loadData","catch","notifyAdminZone","Promise","all","resizeElement","resizeObserver","elementWidth","contentRect","setBreakpointClasses","_b","_c","imageSlider","_d","rotationView","activeBreakpoints","_e","floor","_f","_g","images","responsiveImages","computeImageList","carouselImageList","responsiveImage","displayInterior","watchPropertyChange","watchModelGroupCodeHandler","availableVariants","filteredVariants","selectedVariant","handleMccImageLoadError","request","source","URL","location","href","encodeURIComponent","origin","pathname","ccAdminUrl","ok","statusText","reason","fontsCssUrl","stylesheet","createElement","setAttribute","head","appendChild","modelGroupDetail","buildModelGroupDetailUrl","checkForError","variants","filterVariants","some","v","code","modelCode","cheapestModelCode","modelDetail","getModelDetail","setDataFromModelDetail","reloadData","availableExteriors","ext","selectedExterior","color","availableWheels","wheel","selectedWheel","setWheelInEquipments","modelGroupCode","carModelGroup","modelGroupName","carModelGroupId","getImages","getRotationImages","filterCodes","equipments","equipmentCode","modelOnly","buildModelDetailUrl","headers","stageImages","list","imageList","sort","a","b","calculatedImage","find","responsiveRotationImages","base","params","Object","keys","join","getExteriorName","bezf","bezv","availableCodes","excludes","item","trim","excl","incl","removeWheelFromEquipments","currentWheel","extractWheelFromEquipments","removeString","array","str","indexOf","splice","wheelCode","filteredWheels","selectVariant","variantCode","variant","pushSelectEvent","selectedContainer","nav","showPrevIcon","showNextIcon","selectedExteriorCode","exteriorIndex","unshift","isExteriorActive","isWheelActive","wheelIndex","transition","selectExterior","F0","F","selectWheel","A","title","filterWheels","filterExterior","available","addTranslate","inputType","inputValue","openCC","open","buildCCUrl","log","extraPart","ctaTarget","MODEL_SELECTION","EQUIPMENT","DETAIL","filteredExterior","ref","el","selected","useFallbackImage","ctaText","element","reverse","breakpointSize","toggle","toString"],"sources":["src/components/image-slider/fading-image.scss?tag=fading-image","src/components/image-slider/fading-image.tsx","src/globals/typings.ts","src/components/image-slider/image-slider.scss?tag=mcc-image-slider&encapsulation=shadow","src/components/image-slider/image-slider.tsx","src/components/rotation-view/rotation-view.scss?tag=mcc-rotation-view&encapsulation=shadow","src/components/rotation-view/rotation-view.tsx","src/components/marketing-cc/typings.ts","src/utils/utils.ts","src/services/translation-service.ts","src/components/marketing-cc/marketing-cc.scss?tag=phs-marketing-cc&encapsulation=shadow","src/components/marketing-cc/marketing-cc.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n height: 100%;\n\n @mixin fade-in($time: 1) {\n animation: imageFadeIn #{$time}s ease-in 0s 1 forwards;\n @keyframes imageFadeIn {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n }\n }\n\n @mixin fade-out($time: 1) {\n animation: imageFadeOut #{$time}s ease-in 0s 1 forwards;\n @keyframes imageFadeOut {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n }\n }\n }\n\n img {\n opacity: 1;\n\n &.fade-in {\n @include fade-in(0.6);\n }\n\n &.fade-out {\n @include fade-out(0.6);\n\n z-index: -1;\n }\n }\n}\n","import {Component, Element, Prop, Watch} from '@stencil/core';\n\n@Component({\n tag: 'fading-image',\n styleUrl: 'fading-image.scss',\n shadow: false,\n assetsDirs: [],\n})\nexport class FadingImage {\n\n @Prop()\n alt: string;\n\n @Prop()\n src: string;\n\n @Element()\n host: HTMLElement;\n\n currentImageElement: HTMLImageElement;\n\n prevImageElement: HTMLImageElement;\n\n currentSrc: string;\n prevSrc: string;\n\n componentWillLoad() {\n this.watchImageFading();\n }\n\n @Watch('src')\n watchImageFading() {\n this.prevSrc = this.currentSrc;\n this.prevImageElement = this.currentImageElement;\n this.currentSrc = this.src;\n\n this.currentImageElement = new Image();\n this.imageOnLoad();\n this.imageOnError();\n this.currentImageElement.src = this.currentSrc;\n this.currentImageElement.alt = this.alt;\n }\n\n private imageOnLoad() {\n this.currentImageElement.onload = () => {\n this.appendImage();\n }\n }\n\n private imageOnError() {\n this.currentImageElement.onerror = () => {\n this.appendImage();\n }\n }\n\n private appendImage() {\n this.host.append(this.currentImageElement);\n this.currentImageElement.classList.add('fade-in');\n setTimeout(() => {\n if (this.prevImageElement) {\n const imageToBeRemoved = this.prevImageElement;\n this.currentImageElement.classList.add('fade-in');\n this.prevImageElement.classList.add('fade-out');\n setTimeout(() => {\n imageToBeRemoved.remove();\n }, 2000);\n }\n }, 300);\n }\n}\n\n\n","import {CarouselImage} from '../components/marketing-cc/ConfigData';\n\nexport enum THEME {\n VW22 = 'VW22',\n LNF22 = 'LNF22',\n AUDI23 = 'AUDI23',\n SKODA23 = 'SKODA23',\n CUPRA24 = 'CUPRA24',\n SEAT24 = 'SEAT24',\n}\n\nexport enum BRAND {\n VW = \"V\",\n SEAT = \"S\",\n LNF = \"L\",\n AUDI = \"A\",\n SKODA = \"C\",\n}\n\nexport enum ImageLoadingStatus {\n loading,\n success,\n error\n}\n\nexport enum ImageType {\n exterior = 'exterior',\n interior = 'interior',\n}\n\nexport interface SliderImageInfoOptions {\n alt?: string;\n cssClasses?: Set;\n imgType?: ImageType;\n}\n\nexport class RotationImage {\n public url: string;\n public loadingStatus: ImageLoadingStatus;\n public loadIndex: number;\n\n constructor(url: string) {\n this.url = url;\n }\n}\n\nexport class SliderImageInfo {\n public src: string;\n public width: number;\n public height: number;\n\n public originalIndex: number;\n public loadIndex: number;\n public loadingStatus: ImageLoadingStatus;\n\n public cssClasses?: Set;\n public alt?: string;\n public type?: ImageType;\n\n\n constructor(carouselImage?: CarouselImage, cssClasses?: Set) {\n this.src = carouselImage?.url;\n this.width = carouselImage?.width;\n this.height = carouselImage?.height;\n\n this.cssClasses = cssClasses || new Set();\n\n this.type = null;\n\n if (carouselImage?.interior) {\n this.type = ImageType.interior;\n }\n if (carouselImage?.interior === false) {\n this.type = ImageType.exterior;\n }\n\n if (this.type){\n this.cssClasses.add(this.type);\n }\n }\n\n get classList() {\n const cssClassObject: Record = {};\n this.cssClasses?.forEach((value) => cssClassObject[value] = true);\n return cssClassObject;\n }\n}\n","@use \"~@nwi/style-core/variables/color\" as *;\n\n@use \"styles/themes\" as *;\n\n* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\n:host {\n .slider-window {\n position: relative;\n width: 100%;\n margin-top: -16px;\n overflow: hidden;\n }\n\n .slides-container {\n display: flex;\n overflow: hidden;\n transition: transform 0.3s ease-out;\n will-change: transform;\n\n &:not(.no-grab) {\n cursor: grab;\n }\n }\n\n .prev,\n .next {\n position: absolute;\n top: 50%;\n width: auto;\n height: auto;\n font-weight: bold;\n transform: translateY(-50%);\n cursor: pointer;\n user-select: none;\n padding: 40px;\n }\n\n .next {\n position: absolute;\n right: 0;\n }\n\n .slide-wrapper {\n overflow: hidden;\n }\n\n .slide {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 0;\n padding-bottom: 56.26%;\n\n fading-image.slider-image >img,\n img.slider-image {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n object-fit: cover;\n transition: transform 0.3s ease-in-out;\n user-select: none;\n }\n\n img.fallback {\n width: 100%;\n padding: 10%;\n }\n }\n\n #nwi-root.no-footer {\n .slide-wrapper {\n padding-bottom: 0;\n }\n }\n\n .slider-footer {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--footer-height);\n }\n\n .no-transition {\n -webkit-transition: none !important;\n -moz-transition: none !important;\n -o-transition: none !important;\n transition: none !important;\n }\n\n .grabbing {\n cursor: grabbing;\n }\n\n /* .grabbing .slide img {\n transform: scale(0.9);\n } */\n\n #nwi-root {\n &:not(.MD) {\n --footer-height: 20px;\n\n .prev,\n .next {\n display: none;\n }\n }\n }\n}\n","import {Component, Element, Event, EventEmitter, getAssetPath, h, Host, Fragment, Prop, State, Watch} from '@stencil/core';\nimport {ImageLoadingStatus, SliderImageInfo, THEME} from '../../globals/typings';\nimport {CarouselImage} from '../marketing-cc/ConfigData';\n\n@Component({\n tag: 'mcc-image-slider',\n styleUrl: 'image-slider.scss',\n shadow: true,\n assetsDirs: ['assets/AUDI23', 'assets/CUPRA24', 'assets/SEAT24', 'assets/SKODA23', 'assets/VW22', 'assets/default'],\n})\nexport class ImageSlider {\n\n @Event({\n eventName: 'mccImageLoadError',\n composed: true,\n cancelable: true,\n bubbles: true,\n }) imageLoadError: EventEmitter;\n\n /**\n * An array of CarouselImages to fill the slider with.\n */\n @Prop() carouselImages: CarouselImage[];\n @Prop() theme: THEME;\n\n @Element()\n private host: HTMLElement;\n\n private slider: HTMLDivElement;\n private slides: HTMLDivElement[] = [];\n\n private showFooter: boolean = true;\n\n @State()\n private imageInfos: SliderImageInfo[];\n get loadedImages() {\n return this.imageInfos.filter(imageInfo => imageInfo.loadingStatus === ImageLoadingStatus.success);\n }\n get goodImages() {\n return this.imageInfos.filter(imageInfo => imageInfo.loadingStatus !== ImageLoadingStatus.error);\n }\n\n private slidesResizeObserver: ResizeObserver;\n private currentSlideWidth;\n private isDragging = false;\n private startPos = 0;\n private currentTranslate = 0;\n private prevTranslate = 0;\n private animationID = 0;\n private currentIndex = 0;\n\n componentWillLoad() {\n this.watchCarouselImagesHandler(this.carouselImages);\n }\n\n componentDidRender() {\n // get references to necessary HTML elements of the slider\n this.slider = this.host.shadowRoot.querySelector('.slides-container');\n this.slides = Array.from(this.host.shadowRoot.querySelectorAll('.slide'));\n\n // set initial slide width\n this.currentSlideWidth = this.slides[0] ? this.slides[0].clientWidth : null;\n\n // creating an observer that adjusts the slide width whenever the sliderWindow size changes\n const sliderWindow = this.host.shadowRoot.querySelector('.slider-window');\n this.slidesResizeObserver = new ResizeObserver((entries) => this.resizeSlides(entries));\n this.slidesResizeObserver.observe(sliderWindow);\n\n // disable some default behavior\n this.slider.addEventListener('dragstart', (e) => e.preventDefault());\n this.slider.addEventListener('contextmenu', (event) => {\n event.preventDefault();\n event.stopPropagation();\n return false;\n });\n\n // Touch Events\n this.slider.addEventListener('touchstart', (e) => this.touchStart(e), {passive: true});\n this.slider.addEventListener('touchend', () => this.touchEnd());\n this.slider.addEventListener('touchmove', (e) => this.touchMove(e), {passive: true});\n\n // Mouse Events\n this.slider.addEventListener('mousedown', (e) => this.touchStart(e));\n this.slider.addEventListener('mouseup', () => this.touchEnd());\n this.slider.addEventListener('mouseleave', () => this.touchEnd());\n this.slider.addEventListener('mousemove', (e) => this.touchMove(e));\n\n const root = this.host.shadowRoot.querySelector('#nwi-root');\n if (!this.showFooter) {\n root.classList.add('no-footer');\n } else {\n root.classList.remove('no-footer');\n }\n }\n\n disconnectedCallback() {\n this.slidesResizeObserver.disconnect();\n }\n\n @Watch('theme')\n watchThemeHandler() {\n this.currentIndex = 0;\n }\n\n @Watch('carouselImages')\n watchCarouselImagesHandler(newCarouselImages: CarouselImage[]) {\n if (this.currentIndex > newCarouselImages.length) {\n this.currentIndex = 0;\n }\n\n this.imageInfos = new Array();\n let i = 0;\n for (let carouselImage of newCarouselImages) {\n const imageInfo = new SliderImageInfo(carouselImage);\n imageInfo.loadingStatus = ImageLoadingStatus.loading;\n imageInfo.originalIndex = i;\n imageInfo.cssClasses.add('slider-image');\n this.imageInfos.push(imageInfo);\n i++;\n }\n }\n\n resizeSlides(entries: ResizeObserverEntry[]) {\n for (let entry of entries) {\n for (let slide of this.slides) {\n this.slider.classList.add('no-transition');\n // this must come after no-transition class is set in order to trigger a reflow\n this.currentSlideWidth = entry.target.clientWidth;\n slide.style.width = `${this.currentSlideWidth}px`;\n this.setPositionByIndex();\n this.slider.classList.remove('no-transition');\n }\n this.slider.style.width = this.currentSlideWidth ? `${this.currentSlideWidth * (this.imageInfos.length || 1)}px` : '';\n }\n }\n\n getPositionX(event) {\n return event.type.includes('mouse') ? event.pageX : event.touches[0].clientX;\n }\n\n touchStart(event: any) {\n if (this.goodImages.length <= 1) {\n return;\n }\n this.startPos = this.getPositionX(event);\n this.isDragging = true;\n this.animationID = requestAnimationFrame(() => this.animation());\n this.slider.classList.add('grabbing');\n }\n\n touchMove(event: any) {\n if (this.goodImages.length <= 1) {\n return;\n }\n if (this.isDragging) {\n const currentPosition = this.getPositionX(event);\n this.currentTranslate = this.prevTranslate + currentPosition - this.startPos;\n }\n }\n\n touchEnd() {\n if (this.goodImages.length <= 1) {\n return;\n }\n cancelAnimationFrame(this.animationID);\n this.isDragging = false;\n const movedBy = this.currentTranslate - this.prevTranslate;\n\n // if moved enough negative then snap to next slide if there is one\n if (movedBy < -100 && this.currentIndex < this.goodImages.length - 1) {\n this.currentIndex += 1;\n }\n\n // if moved enough positive then snap to previous slide if there is one\n if (movedBy > 100 && this.currentIndex > 0) {\n this.currentIndex -= 1;\n }\n\n this.setPositionByIndex();\n\n this.slider.classList.remove('grabbing');\n }\n\n animation() {\n this.setSliderPosition();\n if (this.isDragging) {\n requestAnimationFrame(() => this.animation());\n }\n }\n\n setPositionByIndex() {\n this.currentTranslate = this.currentIndex * -this.currentSlideWidth;\n this.prevTranslate = this.currentTranslate;\n this.setSliderPosition();\n }\n\n setSliderPosition() {\n this.slider.style.transform = `translateX(${this.currentTranslate}px)`;\n }\n\n prevSlide() {\n if (this.currentIndex >= 0) {\n this.currentIndex--;\n if (this.currentIndex < 0) this.currentIndex = this.goodImages.length - 1;\n this.setPositionByIndex();\n }\n }\n\n nextSlide() {\n if (this.currentIndex <= this.goodImages.length - 1) {\n this.currentIndex++;\n if (this.currentIndex >= this.goodImages.length) this.currentIndex = 0;\n this.setPositionByIndex();\n }\n }\n\n onImageLoad(imageInfo: SliderImageInfo, _index: number) {\n // console.log(`image \"${imageInfo.src}\" (index: ${_index}) loaded!`)\n imageInfo.loadingStatus = ImageLoadingStatus.success;\n\n this.imageCompleteCallback();\n }\n\n onImageError(imageInfo: SliderImageInfo, _index: number) {\n // console.error(`image \"${imageInfo.src}\" (index: ${_index}) failed to load...`)\n imageInfo.loadingStatus = ImageLoadingStatus.error;\n\n this.imageCompleteCallback();\n }\n\n imageCompleteCallback() {\n let loadErrorCount = 0;\n this.imageInfos.forEach((image) => {\n if (image.loadingStatus === ImageLoadingStatus.error) {\n loadErrorCount++;\n image.loadIndex = -1;\n } else {\n image.loadIndex = image.originalIndex - loadErrorCount;\n }\n });\n if (this.allImagesLoaded() && loadErrorCount === this.imageInfos.length) {\n this.imageLoadError.emit();\n }\n this.showFooter = this.goodImages.length > 1;\n this.imageInfos = [...this.imageInfos];\n }\n\n allImagesLoaded() {\n return this.imageInfos.every(info => info.loadingStatus !== ImageLoadingStatus.loading);\n }\n\n render() {\n return (\n \n
\n
\n
\n {this.goodImages.map((imageInfo, i) =>\n
\n
\n this.onImageLoad(imageInfo, i)}\n onError={() => this.onImageError(imageInfo, i)}/>\n
\n
\n )}\n {this.goodImages.length === 0 &&\n
\n
\n \"car\n
\n
\n }\n
\n {this.goodImages.length > 1 && <>\n
this.prevSlide()}>\n {this.getIconForCurrentTheme('button-backward', 'prev-icon')}\n
\n
this.nextSlide()}>\n {this.getIconForCurrentTheme('button-forward', 'next-icon')}\n
\n }\n
\n
\n
\n )\n }\n\n getIconForCurrentTheme(iconName: string, className: string) {\n const theme = this.theme === THEME.LNF22 ? THEME.VW22 : this.theme;\n return \n }\n}\n","@use \"~@nwi/style-core/variables/color\" as *;\n\n* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\n:host {\n position: relative;\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n\n .rotation-wrapper {\n margin-top: -8%;\n justify-content: center;\n display: flex;\n }\n\n .images-container {\n position: relative;\n display: block;\n width: 100%;\n height: 100%;\n min-height: 120px;\n padding-bottom: 56%;\n cursor: grab;\n\n &:active:hover {\n cursor: grabbing;\n }\n\n .image-wrapper {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n opacity: 0;\n\n &.active {\n z-index: 3;\n opacity: 1;\n }\n\n > img,\n > fading-image > img {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n }\n }\n\n .circle-container {\n position: absolute;\n bottom: 50%;\n z-index: 3;\n pointer-events: none;\n display: flex;\n width: 150px;\n height: 62px;\n background: white;\n border-radius: 31px;\n align-items: center;\n opacity: 1;\n transition: opacity 0.6s ease-in;\n\n &.hidden {\n opacity: 0;\n }\n\n .circle {\n width: 100%;\n height: 100%;\n }\n\n .prev-icon,\n .next-icon {\n padding: 10px;\n user-select: none;\n position: absolute;\n }\n\n .prev-icon {\n left: 10px;\n }\n\n .next-icon {\n right: 10px;\n }\n\n .drag-btn-anim {\n animation: drag-btn-anim 1.3s ease-in-out infinite;\n }\n\n @keyframes drag-btn-anim {\n 0% {\n transform: translateX(25%);\n opacity: 1;\n }\n 50% {\n transform: translateX(-0%);\n opacity: 1;\n }\n 100% {\n transform: translateX(-0%);\n opacity: 0;\n }\n }\n\n .drag-btn-anim-inverted {\n animation: drag-btn-anim-inverted 1.3s ease-in-out infinite;\n }\n\n @keyframes drag-btn-anim-inverted {\n 0% {\n transform: translateX(-25%);\n opacity: 1;\n }\n 50% {\n transform: translateX(0%);\n opacity: 1;\n }\n 100% {\n transform: translateX(0%);\n opacity: 0;\n }\n }\n }\n\n .fallback {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n\n .fallback-image {\n width: 100%;\n height: 100%;\n }\n }\n\n #nwi-root {\n &.SM {\n .rotation-wrapper {\n margin-top: -11%;\n }\n }\n\n &.VW19 {\n .rotation-wrapper {\n margin-bottom: -10%;\n }\n &.SM {\n .rotation-wrapper {\n margin-top: -9%;\n }\n }\n }\n &.LNF19 {\n .rotation-wrapper {\n margin-top: -7%;\n }\n &.SM {\n .rotation-wrapper {\n margin-top: -5%;\n }\n }\n }\n }\n}\n","import {Component, Element, Event, EventEmitter, getAssetPath, h, Host, Prop, State, Watch} from '@stencil/core';\nimport {ImageLoadingStatus, RotationImage, THEME} from '../../globals/typings';\nimport {CarouselImage} from '../marketing-cc/ConfigData';\n\n@Component({\n tag: 'mcc-rotation-view',\n styleUrl: 'rotation-view.scss',\n shadow: true,\n assetsDirs: ['assets'],\n})\nexport class RotationView {\n @Event({\n eventName: 'mccRotationViewError',\n composed: true,\n cancelable: true,\n bubbles: true,\n }) rotationViewError: EventEmitter;\n\n @Prop() rotationImages: CarouselImage[];\n @Prop() theme: THEME;\n\n @State() private imageIndex = 0;\n @State() private computedRotationImages: RotationImage[];\n @State() private allImagesFailed = false;\n @State() showCircle: boolean = true;\n\n @Element() private host: HTMLElement;\n\n private eventActive = false;\n private swipeCoord?: [number, number];\n private lastEvent: number;\n private assetTheme: THEME;\n\n private htmlImageContainer: HTMLDivElement;\n\n componentWillLoad() {\n this.watchRotationImagesHandler(this.rotationImages);\n this.assetTheme = this.theme === THEME.LNF22 ? THEME.VW22 : this.theme;\n }\n\n componentDidRender() {\n this.htmlImageContainer = this.host.shadowRoot.querySelector('.images-container');\n\n this.htmlImageContainer.addEventListener('dragstart', (e) => e.preventDefault());\n\n // touch events\n this.htmlImageContainer.addEventListener('touchstart', (e) => this.onSwipe(e, 'start'), {passive: true});\n this.htmlImageContainer.addEventListener('touchend', () => this.onSwipe(null, 'end'));\n this.htmlImageContainer.addEventListener('touchmove', (e) => this.onSwipe(e, 'move'), {passive: true});\n\n // mouse events\n this.htmlImageContainer.addEventListener('mousedown', (e) => this.onDrag(e, 'start'));\n this.htmlImageContainer.addEventListener('mouseup', () => this.onDrag(null, 'end'));\n this.htmlImageContainer.addEventListener('mouseleave', () => this.onDrag(null, 'end'));\n this.htmlImageContainer.addEventListener('mousemove', (e) => this.onDrag(e, 'move'));\n }\n\n onSwipe(event: TouchEvent, when: string) {\n if (!event) {\n this.eventActive = false;\n return;\n }\n\n this.checkNewCoordinates(event, [event.changedTouches[0].pageX, event.changedTouches[0].pageY], when);\n }\n\n onDrag(event: MouseEvent, when: string) {\n if (!event) {\n this.eventActive = false;\n return;\n }\n\n event.preventDefault();\n this.checkNewCoordinates(event, [event.clientX, event.clientY], when);\n }\n\n private checkNewCoordinates(event: UIEvent, coord: [number, number], when: string) {\n if (when === 'start') {\n this.eventActive = true;\n\n this.swipeCoord = coord;\n } else if (when === 'move') {\n if (this.eventActive) {\n this.showCircle = false;\n // Set timer between 30 or 100ms based on number of images\n const timeToWait = this.rotationImages.length > 15 ? 30 : 100;\n // Only Trigger events every 30-100ms discard others\n if ((event?.timeStamp - this.lastEvent) < timeToWait) {\n return;\n }\n this.lastEvent = event?.timeStamp;\n\n const direction = [coord[0] - this.swipeCoord[0], coord[1] - this.swipeCoord[1]];\n this.swipeCoord = coord;\n\n // Check for horizontal change\n if (Math.abs(direction[0]) > Math.abs(direction[1] * 3)) {\n this.changeSlide(direction[0] < 0 ? 'PREV' : 'NEXT');\n }\n }\n }\n }\n\n private changeSlide(direction: 'NEXT' | 'PREV', ignoreError = false) {\n if (direction === 'PREV') {\n this.imageIndex = this.imageIndex - 1;\n } else {\n this.imageIndex = this.imageIndex + 1;\n }\n\n if (this.imageIndex < 0) {\n this.imageIndex = this.rotationImages.length - 1;\n } else if (this.computedRotationImages.length <= this.imageIndex) {\n this.imageIndex = 0;\n }\n\n if (!ignoreError && this.computedRotationImages[this.imageIndex].loadingStatus === ImageLoadingStatus.error) {\n this.changeSlide(direction);\n }\n }\n\n onImageLoad(imageInfo: RotationImage, _index: number) {\n imageInfo.loadingStatus = ImageLoadingStatus.success;\n const index = this.computedRotationImages.findIndex(img => img.url === imageInfo.url);\n if (index !== -1) {\n this.computedRotationImages[index].loadingStatus = ImageLoadingStatus.success;\n }\n }\n\n onImageError(imageInfo: RotationImage, _index: number) {\n imageInfo.loadingStatus = ImageLoadingStatus.error;\n const index = this.computedRotationImages.findIndex(img => img.url === imageInfo.url);\n if (index !== -1) {\n this.computedRotationImages[index].loadingStatus = ImageLoadingStatus.error;\n }\n this.allImagesFailed = this.computedRotationImages.every(rotationImage => rotationImage.loadingStatus === ImageLoadingStatus.error);\n }\n\n @Watch('imageIndex')\n checkIndex(index: number) {\n return this.imageIndex === index ? ' active' : '';\n }\n\n @Watch('rotationImages')\n watchRotationImagesHandler(newRotationImageList: CarouselImage[]) {\n this.computeRotationImages(newRotationImageList);\n }\n\n computeRotationImages(rotationImageList: CarouselImage[]) {\n this.computedRotationImages = new Array();\n\n rotationImageList.forEach(rotationImage => {\n const imageInfo = new RotationImage(rotationImage.url);\n imageInfo.loadingStatus = ImageLoadingStatus.loading;\n this.computedRotationImages.push(imageInfo);\n });\n }\n\n render() {\n return (\n \n
\n
\n
\n {!this.allImagesFailed && this.computedRotationImages.map((image, i) =>\n
\n this.onImageLoad(image, i)}\n onError={() => this.onImageError(image, i)}/>\n
\n )}\n
\n {!this.allImagesFailed &&\n
\n \n \n
\n }\n {this.allImagesFailed &&\n
\n \"car\n
\n }\n
\n
\n
\n )\n }\n}\n","export {THEME, BRAND} from '../../globals/typings';\n\nexport enum CtaTarget {\n DESIGN = 'design',\n MODEL_SELECTION = 'model-selection',\n EQUIPMENT = 'equipment',\n DETAIL = 'detail',\n}\n\nexport enum MccConfigurationStep {\n EXTERIOR,\n WHEELS,\n}\n\nexport class MccError extends Error {\n constructor(message) {\n super(message);\n this.name = \"MccError\";\n }\n}\n\nexport class MccLoadError extends MccError {\n status: number;\n url: string;\n constructor(message: string, status: number, url: string) {\n super(message);\n this.status = status;\n this.name = \"MccLoadError\";\n this.url = url;\n }\n}\n\nexport class MccConfigError extends MccError {\n constructor(message) {\n super(message);\n this.name = \"MccConfigError\";\n }\n}\n\nexport enum BREAKPOINT {\n XS = 1,\n SM = 2,\n MD = 3,\n LG = 4,\n XL = 5,\n XXL = 6,\n XXXL = 7\n}\n\nclass BreakpointMap {\n values: Map;\n\n constructor(xs: number, sm: number, md: number, lg: number, xl: number, xxl: number, xxxl: number) {\n this.values = new Map([\n [BREAKPOINT.XS, xs],\n [BREAKPOINT.SM, sm],\n [BREAKPOINT.MD, md],\n [BREAKPOINT.LG, lg],\n [BREAKPOINT.XL, xl],\n [BREAKPOINT.XXL, xxl],\n [BREAKPOINT.XXXL, xxxl]\n ]);\n }\n\n getValue(breakpoint: BREAKPOINT) {\n return this.values.get(breakpoint);\n }\n}\n\nexport class BreakpointConfig {\n static breakpointValue(breakpoint: BREAKPOINT) {\n return new BreakpointMap(0, 414, 768, 1024, 1440, 1920, 2560).getValue(breakpoint);\n }\n}\n","import { BRAND, THEME } from '../globals/typings';\n\nexport function getThemeForBrand(brand: string, subBrand?: string): THEME {\n switch (brand) {\n case BRAND.VW:\n return THEME.VW22;\n case BRAND.LNF:\n return THEME.LNF22;\n case BRAND.AUDI:\n return THEME.AUDI23;\n case BRAND.SEAT:\n if (subBrand === 'SC')\n return THEME.CUPRA24;\n return THEME.SEAT24;\n case BRAND.SKODA:\n return THEME.SKODA23;\n }\n}\n\nexport function getCountryCodeFromLocale(locale: string): string {\n if (!locale) {\n throw new Error(`Invalid locale set! (\"${locale}\")`);\n }\n const localeArray = locale.split('_');\n if (localeArray.length !== 2) {\n throw new Error(`Invalid locale set! (\"${locale}\")`);\n }\n return localeArray[1];\n}\n","import {THEME} from '../globals/typings';\nimport {getCountryCodeFromLocale} from '../utils/utils';\n\ninterface State {\n locale: string;\n theme: THEME;\n qa: boolean;\n}\n\nclass MccTranslationService {\n private translations$: Promise;\n private translations: any;\n private state: State;\n\n async load(locale: string, theme: THEME, qa: boolean = false) {\n if (!this.translations$ || this.state.locale !== locale || this.state.theme !== theme || this.state.qa !== qa) {\n console.debug('Loading translations from CC... ');\n this.state = {locale: locale, theme: theme, qa: qa};\n this.translations$ = fetch(`https://${qa ? 'qa-' : ''}cc.porscheinformatik.com/cc-${getCountryCodeFromLocale(locale).toLowerCase()}/${locale}_${theme}/mcc-messages`)\n .then(response => response.json())\n .then(translations => {\n this.translations = translations;\n return this.translations;\n });\n }\n return this.translations$;\n }\n\n get(key: string) {\n if (!(key in this.translations)) {\n console.warn(`Translation for '${key}' not found.`)\n return key;\n }\n if (this.translations[key] === undefined || this.translations[key] === null) {\n return '';\n }\n return this.translations[key];\n }\n}\n\nexport const TranslationService = new MccTranslationService();\n","@use \"~@nwi/style-core/variables/color\" as *;\n\n@use \"styles/themes\" as *;\n\n* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n align-self: center;\n}\n\n:host {\n display: block;\n font-size: 16px;\n font-family: Calibri, sans-serif;\n justify-content: center;\n align-items: center;\n\n .variants-dropdown-wrapper {\n margin-bottom: 10px;\n user-select: none;\n\n .variants-dropdown {\n position: absolute;\n width: 25%;\n top: 0;\n left: 0;\n z-index: 10;\n padding: 20px 40px;\n\n .dropdown-head {\n display: flex;\n justify-content: space-between;\n padding: 10px;\n border-bottom: solid black 1px;\n cursor: pointer;\n background: white;\n\n img {\n width: 15px;\n transition: transform 0.3s ease-in;\n\n &.open {\n transform: rotate(180deg);\n }\n }\n }\n\n .options-container {\n z-index: 4;\n width: 100%;\n background-color: $white;\n border-top: none;\n max-height: 0;\n transition: max-height 0.6s;\n overflow: hidden;\n\n &.open {\n max-height: 500px;\n }\n\n .option {\n padding: 6px 3px 6px;\n border-bottom: solid black 1px;\n cursor: pointer;\n\n &:hover {\n background-color: #d9d9d9;\n }\n }\n }\n }\n }\n\n .content {\n position: absolute;\n bottom: 0;\n left: 0;\n padding: 20px 40px;\n display: flex;\n flex-direction: row;\n }\n\n .exterior-selection-wrapper,\n .wheel-selection-wrapper {\n display: flex;\n }\n\n .exterior-selection,\n .wheel-selection {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n flex: 1 0 auto;\n overflow: visible;\n scroll-behavior: smooth;\n margin-bottom: 0;\n padding: 4px;\n transition: transform 0.6s ease-in-out;\n gap: 10px 5px;\n }\n\n .wheel-container,\n .exterior-container {\n position: relative;\n padding: 2px;\n\n &:hover {\n cursor: pointer;\n }\n }\n\n .exterior,\n .wheel {\n z-index: 2;\n display: block;\n border-radius: 100%;\n }\n\n .checkmark {\n position: absolute;\n }\n\n .selection-container {\n border-radius: 42px;\n background: white;\n align-self: center;\n padding: 4px;\n position: relative;\n width: 84px;\n transition: width 0.6s ease-in-out;\n\n &.selected {\n width: 445px;\n height: fit-content;\n border-radius: 40px;\n overflow: hidden;\n\n .nav-prev {\n left: 0;\n }\n\n .nav-next {\n right: 0;\n }\n }\n\n .nav-prev,\n .nav-next {\n z-index: 20;\n position: absolute;\n width: 0;\n background: white;\n border-radius: 50%;\n justify-content: center;\n cursor: pointer;\n display: flex;\n visibility: hidden;\n opacity: 0;\n\n &.open {\n transition: opacity 0.3s ease-in-out;\n visibility: visible;\n opacity: 1;\n width: 74px;\n height: 74px;\n }\n }\n\n .edit-icon {\n position: absolute;\n z-index: 50;\n background: white;\n border-radius: 100%;\n width: 25px;\n bottom: 10%;\n right: 15%;\n opacity: 1;\n transition: opacity 0.1s ease-in-out 0.5s;\n\n &.hidden {\n opacity: 0;\n transition: none;\n }\n }\n }\n\n .cta-section {\n position: absolute;\n display: flex;\n flex-direction: column;\n bottom: 0;\n padding: 20px 40px;\n right: 0;\n\n .cta-wrapper {\n display: flex;\n flex-direction: column;\n row-gap: 10px;\n\n button {\n padding: 1em;\n color: white;\n white-space: nowrap;\n background-color: #222;\n border: none;\n transition: 0.3s ease;\n align-self: flex-end;\n\n &:hover {\n background-color: #444;\n cursor: pointer;\n }\n }\n }\n }\n\n #nwi-root {\n &.XS {\n .variants-dropdown {\n position: relative;\n }\n\n .content {\n position: relative;\n column-gap: 5px;\n background: $grey-medium;\n padding: 10px 10px;\n }\n }\n\n &.SM {\n .variants-dropdown {\n position: absolute;\n }\n\n .content {\n position: absolute;\n bottom: 70px;\n left: 50%;\n transform: translate(-50%, 0);\n background: unset;\n padding: 20px 30px;\n column-gap: 5px;\n }\n }\n\n &.XS,\n &.SM {\n .cta-section {\n position: relative;\n }\n\n .variants-dropdown {\n width: 260px;\n padding: 20px 30px;\n }\n\n .selection-container {\n width: 64px;\n\n &.selected {\n border-radius: 32px;\n width: 274px;\n\n .nav-prev,\n .nav-next {\n width: 54px;\n height: 54px;\n }\n }\n }\n\n .exterior,\n .wheel {\n width: 42px;\n height: 42px;\n }\n }\n\n &.MD {\n .variants-dropdown {\n position: absolute;\n width: 260px;\n padding: 20px 40px;\n }\n\n .content {\n bottom: 0;\n left: 0;\n transform: none;\n padding: 20px 40px;\n column-gap: 10px;\n }\n\n .cta-section {\n position: absolute;\n }\n\n .exterior,\n .wheel {\n width: 52px;\n height: 52px;\n }\n\n .selection-container {\n width: 74px;\n\n &.selected {\n width: 385px;\n border-radius: 37px;\n\n .nav-prev,\n .nav-next {\n width: 64px;\n height: 64px;\n }\n }\n }\n }\n\n &.LG,\n &.XL,\n &.XXL,\n &.XXXL {\n .content {\n bottom: 0;\n left: 0;\n transform: none;\n padding: 20px 40px;\n column-gap: 20px;\n }\n\n .cta-section {\n position: absolute;\n }\n .variants-dropdown {\n position: absolute;\n width: 25%;\n padding: 20px 40px;\n }\n\n .exterior,\n .wheel {\n width: 62px;\n height: 62px;\n }\n\n .selection-container {\n width: 84px;\n\n &.selected {\n width: 445px;\n border-radius: 42px;\n\n .nav-prev,\n .nav-next {\n width: 74px;\n height: 74px;\n }\n }\n }\n }\n\n &:not(.MD) {\n .variants-dropdown-wrapper {\n display: flex;\n justify-content: center;\n }\n }\n }\n}\n","import { Component, Element, Fragment, getAssetPath, h, Host, Listen, Prop, State, Watch } from '@stencil/core';\nimport {\n CarouselImage,\n CarouselImageList,\n CCParams,\n ConfigItem,\n Exterior,\n ModelDetail,\n ModelGroupDetail,\n Variant,\n Wheel,\n} from './ConfigData';\nimport {\n BRAND,\n BREAKPOINT,\n BreakpointConfig,\n CtaTarget,\n MccConfigError,\n MccConfigurationStep,\n MccError,\n MccLoadError,\n THEME,\n} from './typings';\nimport { getCountryCodeFromLocale, getThemeForBrand } from '../../utils/utils';\nimport { TranslationService } from '../../services/translation-service';\n\n@Component({\n tag: 'phs-marketing-cc',\n styleUrl: 'marketing-cc.scss',\n shadow: true,\n assetsDirs: ['assets/AUDI23', 'assets/CUPRA24', 'assets/SEAT24', 'assets/SKODA23', 'assets/VW22', 'assets/default'],\n})\nexport class MarketingCC {\n\n private translationService = TranslationService;\n private DATA_TYPE_WHEEL = \"Rim\";\n private DATA_TYPE_EXTERIOR = \"Color\";\n private DATA_TYPE_VARIANT = \"Model Variant\";\n\n @Element() host: HTMLPhsMarketingCcElement;\n\n /**\n * Holds the current locale used for CC calls.\n */\n @Prop() locale: string;\n\n /**\n * Holds the 1 character brand code of the brand of the vehicle.\n */\n @Prop({mutable: true}) brand: BRAND;\n\n /**\n * Holds the 8 character model code of the vehicle. Only this specific model will be configurable (cannot be set in conjunction with \"modelgroupcode\").\n */\n @Prop({attribute: 'modelcode'}) modelCodeParam: string;\n\n /**\n * Holds a 3 character modelGroup code. The user can select a variant within the given modelGroup to configure (cannot be set in conjunction with \"modelcode\").\n */\n @Prop({attribute: 'modelgroupcode'}) modelGroupCodeParam: string;\n\n /**\n * (optional) Exteriors that will be excluded from the selection.\n */\n @Prop({attribute: 'exclude-exterior'}) exteriorExclude: string;\n\n /**\n * (optional) The only exteriors that should be included in the selection.\n */\n @Prop({attribute: 'include-exterior'}) exteriorInclude: string;\n\n /**\n * (optional) Wheels that will be excluded from the selection.\n */\n @Prop({attribute: 'exclude-wheel'}) wheelExclude: string;\n\n /**\n * (optional) The only wheels that should be included in the selection.\n */\n @Prop({attribute: 'include-wheel'}) wheelInclude: string;\n\n /**\n * (optional) Variants that will be excluded from the selection.\n */\n @Prop({attribute: 'exclude-variant'}) variantExclude: string;\n\n /**\n * (optional) The only variants that should be included in the selection.\n */\n @Prop({attribute: 'include-variant'}) variantInclude: string;\n\n /**\n * (optional) Specifies whether interior images should be displayed in the image slider as well.\n */\n @Prop({attribute: 'display-interior'}) displayInterior: boolean = false;\n\n /**\n * (optional) An optional override field for the text in the CTA button.\n */\n @Prop({attribute: 'cta-text'}) ctaText: string;\n\n /**\n * (optional) The CC target page of the CTA Button\n */\n @Prop({attribute: 'cta-target'}) ctaTarget: CtaTarget = CtaTarget.DESIGN;\n\n /**\n * (optional) Default selection for the color of the vehicle.\n */\n @Prop({\n reflect: true,\n mutable: true\n }) color: string = \"@\";\n\n /**\n * (optional) Default selection for the interior of the vehicle.\n */\n @Prop({\n reflect: true,\n mutable: true\n }) interior: string = \"@\";\n\n /**\n * (optional) Default selection for the wheels of the vehicle.\n */\n @Prop({\n reflect: true,\n mutable: true\n }) equipments: string = \"@\";\n\n /**\n * (optional) indicates if the qa urls should be used instead of the prod urls.\n */\n @Prop() qa: boolean = false;\n\n @State() configurationStep: MccConfigurationStep = MccConfigurationStep.EXTERIOR;\n @State() selectedVariant: Variant;\n @State() variantsDropdownOpen: boolean = false;\n @State() activeBreakpoints: BREAKPOINT[];\n @State() isExteriorActive: boolean = true;\n @State() isWheelActive: boolean = false;\n @State() showPrevIcon: boolean = false;\n @State() showNextIcon: boolean = true;\n @State() navChange = false;\n private loadDataBeforeRender: boolean = true;\n private ccParams: CCParams = {};\n\n private rotationImageList: CarouselImageList[];\n private carouselImageList: CarouselImageList[];\n private error: MccError = null;\n private carouselImages: CarouselImage[] = [];\n private rotationImages: CarouselImage[] = [];\n private dataLayer = window.dataLayer || [];\n private availableExteriors: Exterior[];\n private availableWheels: Wheel[];\n private availableVariants: Variant[];\n private filteredVariants: Variant[];\n\n private selectedExterior: Exterior;\n private selectedWheel: Wheel;\n private currentIndex = 6;\n private currentTranslate = 0;\n private currentSlideWidth = 68;\n private currentTiles = 6;\n\n private subBrand: string;\n private theme: THEME;\n private modelGroupCode: string;\n private modelCode: string;\n private resizeObserver: ResizeObserver;\n private imageSlider: HTMLMccImageSliderElement;\n private rotationView: HTMLMccRotationViewElement;\n private hostWidth: number;\n private maxWheelWidth: string = '';\n private maxExteriorWidth: string = '';\n private fallbackWidth: string = '';\n private maxWidth: number = 0;\n private lastBreakpoints: BREAKPOINT[] = [];\n\n componentWillLoad() {\n document.addEventListener('click', () => this.variantsDropdownOpen = false);\n this.hostWidth = window.innerWidth;\n }\n\n componentWillUpdate() {\n this.error = null;\n }\n\n componentWillRender() {\n if (!this.locale || (!this.modelCodeParam && !this.modelGroupCodeParam) || !this.brand) {\n const msg = `locale, brand and modelcode (or modelgroupcode) must be set: ${this.locale}, ${this.brand}, ${this.modelCodeParam}, ${this.modelGroupCodeParam}`;\n this.error = new MccConfigError(msg);\n throw this.error;\n }\n if ((this.exteriorInclude && this.exteriorExclude)\n || (this.wheelExclude && this.wheelInclude)\n || (this.variantExclude && this.variantInclude)) {\n const msg = 'includes and excludes of one type cannot be set simultaneously.';\n this.error = new MccConfigError(msg);\n throw this.error;\n }\n if (this.brand as string === 'R') {\n this.subBrand = 'SC';\n this.brand = BRAND.SEAT;\n }\n this.theme = getThemeForBrand(this.brand, this.subBrand);\n const translationsCall = this.translationService.load(this.locale, this.theme, this.qa);\n this.loadFonts();\n if (this.loadDataBeforeRender) {\n this.loadDataBeforeRender = false;\n const dataCall = this.loadData().catch(error => {\n console.error('Some error occurred during data loading...', error, error.url);\n this.notifyAdminZone('Data', error.url);\n });\n return Promise.all([dataCall, translationsCall]);\n }\n return translationsCall;\n }\n\n componentDidRender() {\n const resizeElement = this.host.shadowRoot.querySelector('#nwi-root');\n this.resizeObserver = new ResizeObserver(event => {\n const elementWidth = event ? event[0]?.contentRect.width : 0;\n this.hostWidth = elementWidth;\n this.setBreakpointClasses(elementWidth, event[0]?.target);\n this.setBreakpointClasses(elementWidth, this.imageSlider?.shadowRoot.querySelector('#nwi-root'));\n this.setBreakpointClasses(elementWidth, this.rotationView?.shadowRoot.querySelector('#nwi-root'));\n\n if (this.activeBreakpoints !== this.lastBreakpoints) {\n if (this.activeBreakpoints?.length <= 2) {\n this.maxWidth = 48;\n this.currentTiles = Math.floor((elementWidth - 49 - this.maxWidth) / this.maxWidth);\n if (this.currentTiles > 5) {\n this.currentTiles = 5;\n }\n this.fallbackWidth = this.maxWidth * this.currentTiles + (5 * this.currentTiles) + 8 + 'px';\n } else {\n this.currentTiles = 6;\n }\n\n this.currentIndex = this.currentTiles;\n\n if (this.activeBreakpoints?.length === 3) {\n this.maxWidth = 58;\n }\n\n if (this.activeBreakpoints?.length >= 4) {\n this.maxWidth = 68;\n }\n this.lastBreakpoints = this.activeBreakpoints;\n }\n\n if (!!this.rotationImages && !!this.rotationImageList) {\n const images = [];\n for (let responsiveImages of this.rotationImageList) {\n images.push(...this.computeImageList(responsiveImages));\n }\n this.rotationImages = images;\n }\n\n if (!!this.carouselImages && !!this.carouselImageList) {\n const images = [];\n for (let responsiveImage of this.carouselImageList) {\n if (this.displayInterior || responsiveImage.type === 'EXTERIOR') {\n images.push(...this.computeImageList(responsiveImage));\n }\n }\n this.carouselImages = images;\n }\n });\n this.resizeObserver.observe(resizeElement);\n }\n\n disconnectedCallback() {\n this.resizeObserver.disconnect();\n }\n\n @Watch('modelCodeParam')\n @Watch('modelGroupCodeParam')\n @Watch('selectedVariant')\n @Watch('color')\n @Watch('equipments')\n @Watch('exteriorExclude')\n @Watch('exteriorInclude')\n @Watch('wheelExclude')\n @Watch('wheelInclude')\n @Watch('variantExclude')\n @Watch('variantInclude')\n @Watch('qa')\n @Watch('displayInterior')\n watchPropertyChange() {\n this.loadDataBeforeRender = true;\n }\n\n @Watch('modelGroupCodeParam')\n watchModelGroupCodeHandler() {\n this.availableVariants = null;\n this.filteredVariants = null;\n this.selectedVariant = null;\n }\n\n @Listen('mccImageLoadError')\n handleMccImageLoadError() {\n this.notifyAdminZone('Image');\n }\n\n notifyAdminZone(type: 'Image' | 'Data', request?: string) {\n const source = (() => {\n const url = new URL(window.location.href);\n return encodeURIComponent(`${url.origin}${url.pathname}`);\n })();\n request = request ? encodeURIComponent(request) : request;\n\n const ccAdminUrl = `https://${this.qa ? 'qa-' : ''}cc-admin.porscheinformatik.com/cc-admin-at/open/api/admin/mccError/${this.brand}?country=${getCountryCodeFromLocale(this.locale)}&type=${type}&source=${source}&request=${request}`;\n fetch(ccAdminUrl).then(response => {\n if (!response.ok) console.error('AdminZone call failed.', response.status, response.statusText);\n }).catch(reason => console.error(reason));\n }\n\n loadFonts() {\n const theme = this.theme === THEME.LNF22 ? THEME.VW22 : this.theme;\n const fontsCssUrl = getAssetPath(`./assets/${theme}/fonts.css`);\n\n // check if link tag already exists\n if (document.querySelectorAll('head link[href=\"' + fontsCssUrl + '\"]').length > 0) {\n return;\n }\n\n // load fonts for theme\n const stylesheet = document.createElement('link');\n stylesheet.setAttribute('rel', 'stylesheet');\n stylesheet.setAttribute('href', fontsCssUrl);\n stylesheet.setAttribute('type', 'text/css');\n stylesheet.onload = () => console.debug('Fonts loaded!');\n document.head.appendChild(stylesheet);\n }\n\n async loadData(): Promise {\n console.debug('Loading data from CC...');\n\n if (this.modelGroupCodeParam && !this.modelCodeParam) {\n if (!this.availableVariants) {\n const modelGroupDetail: ModelGroupDetail = await fetch(this.buildModelGroupDetailUrl()).then((response) => {\n this.checkForError(response);\n return response.json();\n });\n this.availableVariants = modelGroupDetail.variants;\n }\n this.filteredVariants = this.filterVariants(this.availableVariants, this.variantExclude, this.variantInclude);\n if (!this.selectedVariant || !this.filteredVariants.some(v => this.selectedVariant.code === v.code)) {\n this.selectedVariant = this.filteredVariants[0];\n }\n this.modelCode = this.selectedVariant.cheapestModelCode;\n }\n if (this.modelCodeParam) {\n this.modelCode = this.modelCodeParam;\n }\n\n let modelDetail: ModelDetail = await this.getModelDetail();\n\n this.setDataFromModelDetail(modelDetail);\n\n // reset selectedItems to default if the currently selected are not available\n let reloadData = false;\n if (!this.availableExteriors.some(ext => ext.code === this.selectedExterior?.code)) {\n this.selectedExterior = this.availableExteriors[0];\n this.color = this.selectedExterior.code;\n reloadData = true;\n }\n\n if (!this.availableWheels.some(wheel => wheel.code === this.selectedWheel?.code)) {\n this.selectedWheel = this.availableWheels[0];\n this.setWheelInEquipments(this.selectedWheel.code);\n reloadData = true;\n }\n if (reloadData) {\n modelDetail = await this.getModelDetail();\n this.setDataFromModelDetail(modelDetail);\n }\n\n this.subBrand = modelDetail.subBrand;\n if (this.modelGroupCode !== modelDetail.modelGroupCode) {\n this.modelGroupCode = modelDetail.modelGroupCode;\n this.dataLayer.push({\n event: 'marketingcc-view',\n carModelGroup: modelDetail.modelGroupName,\n carModelGroupId: this.modelGroupCode,\n });\n }\n\n this.maxExteriorWidth = this.maxWidth * this.availableExteriors.length + (5 * this.maxExteriorWidth.length) + 8 + 'px'; // 5 gap 4 padding\n this.maxWheelWidth = this.maxWidth * this.availableWheels.length + (5 * this.maxWheelWidth.length) + 8 + 'px'; // 5 gap 4 padding\n }\n\n private setDataFromModelDetail(modelDetail: ModelDetail) {\n // set images\n this.carouselImages = this.getImages(modelDetail);\n this.rotationImages = this.getRotationImages(modelDetail);\n\n // filter exteriors and wheels according to rules\n this.availableExteriors = this.filterCodes(modelDetail.availableExteriors, this.exteriorExclude, this.exteriorInclude) as Exterior[];\n this.availableWheels = this.filterCodes(modelDetail.availableWheels, this.wheelExclude, this.wheelInclude) as Wheel[];\n\n // initially set the values to the selected properties from the modelDetail call\n this.selectedExterior = modelDetail.selectedExterior;\n this.selectedWheel = modelDetail.selectedWheel;\n\n this.equipments = modelDetail.equipmentCode;\n this.color = modelDetail.exterior;\n this.interior = modelDetail.interior;\n }\n\n private getModelDetail(modelOnly: boolean = false): Promise {\n return fetch(this.buildModelDetailUrl(modelOnly)).then(response => {\n this.checkForError(response);\n return response.json();\n });\n }\n\n private checkForError(response: Response) {\n if (!response.ok) {\n const msg = `Call to '${response.url}' failed with status code: ${response.status}.`;\n this.error = new MccLoadError(msg, response.status, response.url);\n throw this.error;\n }\n if (response.headers.get('content-length') === '0') {\n const msg = 'Got an empty response.';\n this.error = new MccLoadError(msg, response.status, response.url);\n throw this.error;\n }\n }\n\n private getImages(modelDetail: ModelDetail): CarouselImage[] {\n const images = new Array();\n for (let carouselImages of modelDetail.stageImages.carouselImages) {\n this.carouselImageList = modelDetail.stageImages.carouselImages;\n if (this.displayInterior || carouselImages.type === 'EXTERIOR') {\n if (THEME.AUDI23) {\n images.forEach(img => {\n if (!img.url.includes('&background=full')) {\n img.url = img.url + '&background=full';\n }\n });\n }\n images.push(...this.computeImageList(carouselImages));\n }\n }\n return images;\n }\n\n private computeImageList(carouselImages: CarouselImageList) {\n const images = new Array();\n const list = carouselImages.imageList;\n list.sort((a, b) => a.width - b.width);\n const calculatedImage = list.find(image => image.width >= this.hostWidth)\n || list[list.length - 1];\n if (THEME.AUDI23) {\n calculatedImage.url = calculatedImage.url + '&background=full';\n }\n images.push(calculatedImage);\n return images;\n }\n\n private getRotationImages(modelDetail: ModelDetail): CarouselImage[] {\n const images = new Array();\n if (modelDetail.stageImages.responsiveRotationImages) {\n this.rotationImageList = modelDetail.stageImages.responsiveRotationImages;\n for (let responsiveImages of modelDetail.stageImages.responsiveRotationImages) {\n if (THEME.VW22 || THEME.LNF22) {\n images.forEach(img => img.url = img.url + '&background=full');\n }\n images.push(...this.computeImageList(responsiveImages));\n }\n }\n return images;\n }\n\n private buildModelGroupDetailUrl() {\n return `https://${this.qa ? 'qa-' : ''}cc.porscheinformatik.com/cc-${getCountryCodeFromLocale(this.locale).toLowerCase()}/be`\n + `/${this.locale}_${getThemeForBrand(this.brand, this.subBrand)}/api/v2/modelgroupDetail`\n + `?code=${this.modelGroupCodeParam}&brand=${this.brand}&mcc=true`;\n }\n\n private buildModelDetailUrl(modelOnly: boolean) {\n const base = `https://${this.qa ? 'qa-' : ''}cc.porscheinformatik.com/cc-${getCountryCodeFromLocale(this.locale).toLowerCase()}/be`\n + `/${this.locale}_${getThemeForBrand(this.brand, this.subBrand)}/api/v2/modeldetail/`\n + `${this.brand}/${this.modelCode}`;\n if (modelOnly) {\n return base + '/@/@/@/@?mcc=true';\n } else {\n const params = [];\n Object.keys(this.ccParams).forEach(key => params.push(key + '=' + this.ccParams[key]));\n return base + `/${this.color || '@'}/${this.interior || '@'}/${this.equipments || '@'}/@?mcc=true&${params.join('&')}`;\n }\n }\n\n getExteriorName(exterior: Exterior) {\n if (!exterior) {\n return '';\n }\n return exterior.bezf + (exterior.bezv ? ' ' + exterior.bezv : '');\n }\n\n filterCodes(availableCodes: ConfigItem[], excludes: string, includes: string) {\n if (excludes) {\n return availableCodes.filter(item => !excludes.split(',').map(code => code.trim()).includes(item.code));\n }\n if (includes) {\n return availableCodes.filter(item => includes.split(',').map(code => code.trim()).includes(item.code));\n }\n return availableCodes;\n }\n\n filterVariants(availableVariants: Variant[], excludes: string, includes: string) {\n if (excludes) {\n const excl = excludes.split(',').map(code => code.trim().toLowerCase());\n return availableVariants.filter(item => !excl.includes(item.code.toLowerCase()) && !excl.includes(item.name.toLowerCase()));\n }\n if (includes) {\n const incl = includes.split(',').map(code => code.trim().toLowerCase());\n return availableVariants.filter(item => incl.includes(item.code.toLowerCase()) || incl.includes(item.name.toLowerCase()));\n }\n return availableVariants;\n }\n\n removeWheelFromEquipments() {\n const currentWheel = this.extractWheelFromEquipments();\n if (currentWheel) {\n this.equipments = MarketingCC.removeString(this.equipments.split('@'), currentWheel.code).join('@');\n }\n }\n\n /**\n * Removes a certain string from an array of strings.\n * @param array Array that will be altered.\n * @param str String that should be removed from the array.\n */\n private static removeString(array: string[], str: string) {\n if (!array || array.length === 0) {\n return;\n }\n const index = array.indexOf(str);\n array.splice(index, 1);\n return array;\n }\n\n setWheelInEquipments(wheelCode: string) {\n this.removeWheelFromEquipments();\n this.equipments = this.equipments && this.equipments !== '@' ? this.equipments + `@${wheelCode}` : wheelCode;\n }\n\n extractWheelFromEquipments(): Wheel {\n const filteredWheels = this.availableWheels.filter(wheel => this.equipments.split('@').some(equipmentCode => wheel.code === equipmentCode));\n if (filteredWheels.length === 0) {\n return null;\n }\n if (filteredWheels.length !== 1) {\n throw Error('More than one Wheel in equipment codes!');\n }\n return filteredWheels[0];\n }\n\n selectVariant(variantCode: string) {\n this.selectedVariant = this.filteredVariants.find(variant => variant.code === variantCode);\n this.variantsDropdownOpen = false;\n this.pushSelectEvent(this.DATA_TYPE_VARIANT, this.selectedVariant.name);\n }\n\n selectedContainer(nav: string) {\n this.showPrevIcon = false;\n this.showNextIcon = true;\n\n let slider: HTMLDivElement;\n if (nav === 'WHEEL') {\n const selectedExteriorCode = this.selectedExterior.code;\n const exteriorIndex = this.availableExteriors.findIndex(exterior => exterior.code === selectedExteriorCode);\n\n if (exteriorIndex > -1) {\n const [selectedExterior] = this.availableExteriors.splice(exteriorIndex, 1);\n this.availableExteriors.unshift(selectedExterior);\n }\n slider = this.host.shadowRoot.querySelector('.exterior-selection');\n this.isExteriorActive = false;\n this.isWheelActive = true;\n }\n\n if (nav === 'EXTERIOR') {\n const wheelIndex = this.availableWheels.findIndex(wheel => wheel.code === this.selectedWheel.code);\n\n if (wheelIndex > -1) {\n const [selectedWheel] = this.availableWheels.splice(wheelIndex, 1);\n this.availableWheels.unshift(selectedWheel);\n }\n slider = this.host.shadowRoot.querySelector('.wheel-selection');\n this.isExteriorActive = true;\n this.isWheelActive = false;\n }\n this.currentTranslate = 0;\n slider.style.transition = `transform 0.0s ease-in-out`;\n this.setSliderPosition(slider);\n }\n\n selectExterior(color: string) {\n this.ccParams = {\n F0: this.color,\n F: color\n };\n this.color = color;\n this.selectedExterior = this.availableExteriors.find(ext => ext.code === this.color);\n this.pushSelectEvent(this.DATA_TYPE_EXTERIOR, this.selectedExterior.bezf);\n }\n\n selectWheel(wheel: string) {\n this.ccParams = {\n A: wheel\n };\n this.setWheelInEquipments(wheel);\n this.selectedWheel = this.availableWheels.find(ext => ext.code === wheel);\n this.pushSelectEvent(this.DATA_TYPE_WHEEL, this.selectedWheel.title);\n }\n\n filterWheels() {\n if (this.isExteriorActive && this.selectedWheel) {\n return [this.selectedWheel];\n }\n return this.availableWheels;\n }\n\n filterExterior() {\n if (this.isWheelActive && this.selectedExterior) {\n return [this.selectedExterior];\n }\n return this.availableExteriors;\n }\n\n prevSlide(slider: HTMLDivElement) {\n this.currentIndex = this.currentIndex - this.currentTiles;\n this.showNextIcon = true;\n if (this.currentIndex < this.currentTiles) {\n this.currentIndex = this.currentTiles;\n this.showPrevIcon = false;\n this.showNextIcon = true;\n }\n this.setPositionByIndex(slider);\n }\n\n nextSlide(available: number, slider: HTMLDivElement) {\n let addTranslate = 0;\n this.showPrevIcon = true;\n this.currentIndex = this.currentIndex + this.currentTiles - 2; // exclude prev and next button\n if (this.currentIndex > available) {\n this.currentIndex = available;\n this.showPrevIcon = true;\n this.showNextIcon = false;\n addTranslate = 5; // position of the next button\n }\n this.setPositionByIndex(slider, addTranslate);\n }\n\n setPositionByIndex(slider: HTMLDivElement, addTranslate: number = 0) {\n this.currentSlideWidth = this.maxWidth + 5; // gap\n this.currentTranslate = (this.currentIndex - this.currentTiles) * -this.currentSlideWidth;\n this.currentTranslate = this.currentTranslate - addTranslate;\n slider.style.transition = `transform 0.6s ease-in-out`;\n this.setSliderPosition(slider);\n }\n\n setSliderPosition(slider: HTMLDivElement) {\n slider.style.transform = `translateX(${this.currentTranslate}px)`;\n }\n\n pushSelectEvent(inputType: string, inputValue: string) {\n this.dataLayer.push({\n event: 'marketingcc-select',\n inputType: inputType,\n inputValue: inputValue\n });\n }\n\n openCC() {\n window.open(this.buildCCUrl());\n this.dataLayer.push({\n event: 'marketingcc-config-continue'\n });\n }\n\n buildCCUrl() {\n console.log('building cc-url')\n let url = `https://${this.qa ? 'qa-' : ''}cc.porscheinformatik.com/cc-${getCountryCodeFromLocale(this.locale).toLowerCase()}/${this.locale}_${this.theme}/${this.brand}`;\n let extraPart = '';\n switch (this.ctaTarget) {\n case CtaTarget.MODEL_SELECTION:\n if (this.brand === BRAND.SEAT && this.theme !== THEME.CUPRA24) {\n url += `/auv`;\n extraPart = '/drive-select';\n } else {\n url += `/model-selection`;\n }\n break;\n case CtaTarget.EQUIPMENT:\n url += `/equipment`;\n break;\n case CtaTarget.DETAIL:\n url += `/detail`;\n break;\n default:\n url += `/design`;\n extraPart = '/exterior';\n break;\n }\n url += `/${this.modelGroupCode}/${this.modelCode}/${this.color || '@'}/${this.interior || '@'}/${this.equipments || '@'}/@${extraPart}?funnelSource=MarketingCC`;\n if (this.selectedVariant) {\n url += `&variant=${this.selectedVariant.code}`;\n }\n console.log('MCC opens: ', url);\n return url;\n }\n\n render() {\n const filteredWheels = this.filterWheels();\n const filteredExterior = this.filterExterior();\n\n if (this.availableWheels.length <= this.currentTiles && this.isWheelActive) {\n this.showNextIcon = false;\n }\n\n if (this.availableExteriors.length <= this.currentTiles && this.isExteriorActive) {\n this.showNextIcon = false;\n }\n return (\n \n
\n {\n this.error ?\n
\n
:\n <>\n {(this.modelGroupCodeParam && !this.modelCodeParam) && <>\n {
\n
e.stopPropagation()}>\n
this.variantsDropdownOpen = !this.variantsDropdownOpen}>\n {this.selectedVariant?.name}\n {this.filteredVariants?.length > 1 && this.getIconForCurrentTheme('chevron', 'chevron')}\n
\n
\n {this.filteredVariants?.filter((variant) => variant.code !== this.selectedVariant.code).map((variant) => {\n return this.selectVariant(variant.code)}>{variant.name}
;\n })}\n
\n
\n
}\n }\n {[THEME.VW22, THEME.LNF22].includes(this.theme) && this.rotationImages ?\n this.rotationView = el} theme={this.theme}\n rotationImages={this.rotationImages} /> : null}\n {this.carouselImages && ![THEME.VW22, THEME.LNF22].includes(this.theme) ?\n this.imageSlider = el} theme={this.theme}\n carouselImages={this.carouselImages} /> : null}\n
\n
{\n if (!this.isExteriorActive && this.availableExteriors.length > 1) {\n this.selectedContainer('EXTERIOR');\n }\n }}\n class={'selection-container' + (this.isExteriorActive ? ' selected' : '')}\n style={{ width: this.isExteriorActive && this.availableExteriors.length < this.currentTiles ? this.maxExteriorWidth : this.fallbackWidth && this.isExteriorActive ? this.fallbackWidth : undefined }}\n key={'exterior-selection-container'}>\n 1 ? '' : ' hidden')}/>\n
\n
this.prevSlide(this.host.shadowRoot.querySelector('.exterior-selection'))}>{this.getIconForCurrentTheme('button-backward', 'prev-icon')}
\n
\n {filteredExterior.map((ext) =>\n
{\n if (this.isExteriorActive) {\n this.selectExterior(ext.code);\n }\n }\n } class={{\n 'exterior-container': true,\n selected: ext.code === this.selectedExterior?.code,\n }} key={ext.code}>\n \"exterior\n {(ext.code === this.selectedExterior?.code && [THEME.VW22, THEME.LNF22].includes(this.theme))\n && this.getIconForCurrentTheme('select-check', 'checkmark')}\n
,\n )}\n
\n
this.nextSlide(this.availableExteriors.length, this.host.shadowRoot.querySelector('.exterior-selection'))}>{this.getIconForCurrentTheme('button-forward', 'next-icon')}
\n
\n
\n\n
{\n if (!this.isWheelActive && this.availableWheels.length > 1) {\n this.selectedContainer('WHEEL');\n }\n }} class={'selection-container' + (this.isWheelActive ? ' selected' : '')}\n style={{ width: this.isWheelActive && this.availableWheels.length < this.currentTiles ? this.maxWheelWidth : this.fallbackWidth && this.isWheelActive ? this.fallbackWidth : undefined }}\n key={'wheel-selection-container'}>\n 1 ? '' : ' hidden')} />\n
\n
this.prevSlide(this.host.shadowRoot.querySelector('.wheel-selection'))}>{this.getIconForCurrentTheme('button-backward', 'prev-icon')}
\n
\n {filteredWheels.map((wheel) =>\n
{\n if (this.isWheelActive) {\n this.selectWheel(wheel.code);\n }\n }\n }\n class={{\n 'wheel-container': true,\n selected: wheel.code === this.selectedWheel?.code,\n }}\n key={wheel.code}>\n \"wheel\n {(wheel.code === this.selectedWheel?.code && [THEME.VW22, THEME.LNF22].includes(this.theme))\n && this.getIconForCurrentTheme('select-check', 'checkmark')}\n
,\n )}\n
\n
this.nextSlide(this.availableWheels.length, this.host.shadowRoot.querySelector('.wheel-selection'))}>{this.getIconForCurrentTheme('button-forward', 'next-icon')}
\n
\n
\n
\n
\n
\n
}\n \n
\n \n \n }\n \n
\n );\n }\n\n useFallbackImage(e: Event) {\n const image = e.target as HTMLImageElement;\n image.onerror = null;\n image.src = getAssetPath(`./assets/default/image-not-found.svg`);\n }\n\n getIconForCurrentTheme(iconName: string, className: string) {\n const theme = this.theme === THEME.LNF22 ? THEME.VW22 : this.theme;\n return ;\n }\n\n setBreakpointClasses(elementWidth: number, element: Element) {\n if (element) {\n const activeBreakpoints = [];\n for (const key of Object.keys(BREAKPOINT).reverse()) {\n const breakpointSize = BreakpointConfig.breakpointValue(BREAKPOINT[key]);\n if (breakpointSize <= elementWidth) {\n activeBreakpoints.push(key);\n }\n\n element.classList.toggle(key, breakpointSize <= elementWidth);\n }\n\n if (this.activeBreakpoints?.toString() !== activeBreakpoints?.toString()) {\n this.activeBreakpoints = activeBreakpoints;\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}