{"version":3,"sources":["env.js","cssInJs/variables.js","lib/animation/animationUtils.js","lib/utils-core/text.js","lib/form/controls/FilePond.js","form/controls.js","form/index.js","lib/youtube/youtubeBanner--mobilePopup.js","lib/form/validators/required.js","site/warranty/useStep.js","lib/utils-core/url.js","lib/utils-core/form.js","lib/utils-core/array.js","lib/utils-core/date.js","lib/utils-core/css.js","lib/utils-core/ui.js","lib/utils-core/money.js","lib/utils-core/random.js","lib/utils-core/object.js","lib/utils-core/media.js","lib/utils-core/index.js","site/siteUtils.js","utils/index.js","lib/css-emotion/breakpoints.js","lib/css-emotion/mixin.js","cssInJs/index.js","lib/form/formRenderHelper.js","lib/form/validatorHelper.js","lib/form/formModelHelper.js","lib/form/formBuilder.js","lib/form/validators/email.js","lib/form/validators/date.js","lib/form/validators/length.js","lib/form/validators.js","lib/form/controls/TextInput.js","lib/form/controls/RadioListInput.js","lib/form/controls/TextareaInput.js","lib/form/controls/CheckboxListInput.js","lib/form/controls/DateSeparateInput.js","lib/form/controls/FileInput.js","lib/form/controls/index.js","lib/form/controls/CheckboxInput.js","lib/form/controls/SelectInput.js","lib/form/controls/HiddenInput.js","lib/form/controlRenderer.js","lib/form/formValidate.js","lib/form/useForm.js","lib/form/index.js","lib/store/reducers.js","lib/store/storeProvider.js","store/index.js","lib/form/components/ValidationAlert.js","layout/topHeader/searchBar2.js","components/notFound/notFound.js","lib/app-version/app-version-v2.js","components/form/buttons/button.js","lib/ui-error/errorMessage.js","lib/ui-error/errorPopup.js","lib/ui-loading/sectionLoading.js","lib/net-api/index.js","lib/dev-mediaQueryStatus/index.js","lib/seo/meta-tag.js","lib/seo/tracking--deprecated.js","lib/instagram-useInstagram/index.js","lib/ui-parallax/index.js","lib/router/useRouter.js","lib/router/useHistory.js","lib/router/useHistoryStore.js","lib/router/handleLink.js","lib/router/siteLink.js","lib/instagram-feed/feedStyle.js","lib/youtube/youtubeEmbedPopup.js","lib/youtube/youtubeEmbed.js","components/index.js","lib/tracking/gtm.js","lib/tracking/index.js","lib/polyfill-ie/index.js","cms/utils/cmsUtils.js","cms/items/bannerPanel/view.js","cms/items/bannerItem/view.js","cms/items/panel/view.js","site/embed/instagram.js","site/embed/index.js","cms/items/html/view.js","cms/items/testimonialPanel/view.js","cms/items/testimonialItem/view.js","cms/items/imagePanel/view.js","cms/items/pageTiles/view.js","cms/items/singleBanner/view.js","cms/items/accordionPanel/view.js","cms/items/contactForm/contactForm.js","cms/items/contactForm/contactFormModel.js","cms/items/contactForm/view.js","cms/items/youtubeBannerPanel/view.js","site/product/filterDropdown.js","site/product/sortHelper.js","site/product/productList.js","site/product/productTileDiscontinued.js","site/product/productListV2.js","site/wheretobuy/wheretobuyList.js","site/searchResult/searchResult.js","site/styleMatch/styleMatchStyles.js","site/styleMatch/styleData.js","lib/icons-svg/icons/NarrowLeft.js","lib/icons-svg/icons/NarrowRight.js","lib/icons-svg/icons/Loading--circle.js","site/styleMatch/styleMatch.js","site/styleMatch/styleMatchFormModel.js","components/InstagramFeedEmbed/InstagramFeedEmbed.js","components/TextWithJavaScript/view.js","site/warranty/warrantyLazy.js","site/joinus/joinStyle.js","site/joinus/joinForm.js","site/joinus/joinFormData.js","site/ambassador/ambassadorStyle.js","site/ambassador/ambassadorForm.js","site/ambassador/ambassadorFormData.js","cms/items/code/view.js","cms/items/blogPosts/view.js","cms/items/blogPostTitle/view.js","cms/items/videoHolder/view.js","cms/items/videoItem/view.js","cms/items/multiColumnPanel/view.js","cms/items/expandableHtml/view.js","cms/items/productTiles/view.js","cms/items/linkTiles/view.js","cms/items/linkTileItem/view.js","components/expandablePanel/style.js","components/expandablePanel/view.js","cms/items/wallToWallPanel/view.js","cms/items/wallToWallItem/view.js","cms/items/fullSizeBannerPanel/view.js","cms/items/fullSizeBannerItem/view.js","cms/items/item.js","cms/pages/viewPage/viewPage.js","cms/services/cms-radio-sender.js","cms/services/cms-radio-receiver.js","cms/services/cms-html-editor.js","cms/services/cms-page-controller.js","cms/pages/editPage/editPage.js","layout/topHeader/searchBar.js","layout/topHeader/navBar.js","layout/topHeader/searchBar3.js","layout/topHeader/navBarHori.js","layout/topHeader/topHeader2.js","layout/topHeaderQR/topHeaderQR.js","components/bottomDrawer/index.js","layout/bottomDock/bottomDock.js","site/product/productViewStyle.js","components/breadcrumb/breadcrumb.js","cms/pages/partials/viewPartial.js","cms/pages/partials/commonProductBottom.js","site/embed/youtube.js","site/embed/iframeApi.js","site/embed/tiktok.js","site/product/productView.js","site/discontinuedProduct/productViewStyle.js","site/discontinuedProduct/productTile.js","site/discontinuedProduct/productView.js","site/curlSecretV4/curlSecretLoadingV4.js","site/curlSecretV4NZ/curlSecretLoadingV4.js","site/curlSecretV4QRCode/curlSecretLoadingV4QR.js","site/frizzDefense/frizzDefenseLoading.js","site/keratin/keratinLoading.js","site/brillianceV2/brillianceLoading.js","site/brilliance2/brillianceLoading2.js","site/digitalSensor/digitalSensorLoading.js","site/unbound/unboundLoading.js","site/hydroSmooth/hydroSmoothLoading.js","site/hydroSmoothV2/hydroSmoothLoading.js","site/petite/petiteLoading.js","site/petiteNz/petiteLoadingNz.js","site/shineLustre/shineLustreLoading.js","layout/popup/commonVideoPopup.js","AppRouteChanged.js","site/digitalSensorLuxe/digitalSensorLuxeLoading.js","site/youtube-test/styles/common.js","site/youtube-test/digitalSensorLuxeStyle.js","site/youtube-test/youtubeBanner--mobilePopup.js","site/youtube-test/iframeApi.js","site/youtube-test/videoPanel.js","site/youtube-test/digitalSensorLuxe.js","App.js","serviceWorker.js","index.js","lib/youtube/iframeApi.js","site/bazzarVoice/useBV.js","lib/utils-core/debounce.js","lib/service-worker/swHelper.js","lib/net-loader/loadJs.js","lib/net-loader/index.js","site/product/productTile.js","config.js"],"names":["config","isProd","process","locale","getLocale","country","getCountry","siteName","siteCode","apiBase","resourceBase","baseOrigin","window","location","origin","GATSBY_BASEURL","getBaseUrl","cmsEndpoint","ver","updateDate","bvClientId","bvSiteId","bvEnv","bvLocale","FaceBookDomainVerifiAU","FaceBookDomainVerifiNZ","instagramClientAccessToken","instagramUseFirst","REACT_APP_COUNTRY_LOCALE","hostname","toLowerCase","indexOf","search","console","log","variables","familyBase","familyHeader","primaryColor","fontColor","bgColor","breakpointNames","breakpoints","MAX","MIN","getScrollProgress","el","scroll","scrollY","pageYOffset","progress","top","boundsTop","getBoundingClientRect","viewport","bottom","innerHeight","height","bounds","clientHeight","setClass","className","pr","range","utils","css","addClass","removeClass","prVal","min","max","transform","x","y","style","removeTransform","getScreenSize","width","screenWidth","screenHeight","isBlank","str","test","isEmpty","length","isNumeric","num","isNaN","capitalize","expression","charAt","toUpperCase","slice","toFieldName","replace","trim","toHtml","truncateWords","maxLen","separator","ellipsis","pos","lastIndexOf","substr","numberWithCommas","parts","toString","split","join","formatNumber","value","Math","round","toTelephoneNumber","like","RegExp","registerPlugin","FilePondPluginFileValidateSize","FilePondPluginFileValidateType","FilePondPluginImageResize","FilePondPluginImageTransform","FilePondUploader","control","handleChange","formOption","React","files","setFiles","name","errors","label","filePond","helpText","attrs","fieldId","random","shortId","fieldLabel","getLabel","ref","customValueFn","current","getFiles","map","serverId","htmlFor","allowMultiple","maxFileSize","maxFiles","server","serverProcess","site","resourcePath","fetch","revert","oninit","onupdatefiles","fileItems","newVal","persist","target","checked","fileItem","file","labelIdle","acceptedFileTypes","allowImageResize","imageResizeTargetWidth","imageResizeUpscale","dangerouslySetInnerHTML","__html","ValidationAlert","getSiteControl","type","YoutubeBannerMobilePopup","props","youtubeBannerRef","useRef","useState","playerStatus","setPlayerStatus","playerSize","setPlayerSize","ytPlayer","setYtPlayer","muted","setMuted","countPlayedRef","popupOpened","setPopupOpened","video","heightSet","videoLinkOrId","playerId","videoId","yt","posterImageUrl","mobileImageUrl","canPlayVideo","innerWidth","loadVideo","container","sizeCalculator","containerSize","w","offsetWidth","h","offsetHeight","size","left","getSize","loadJs","init","setTimeout","player","YT","Player","events","onStateChange","e","data","PlayerState","ENDED","countPlayed","playVideo","onReady","mute","onError","useEffect","resized","debounce","addEventListener","removeEventListener","canPlay","imageUrl","Fragment","classNames","backgroundImage","bgUrlStyle","id","title","src","url","toQueryString","enablejsapi","controls","loop","showinfo","rel","modestbranding","allowfullscreen","wmode","allow","frameBorder","onClick","preventDefault","stopPropagation","pauseVideo","unMute","channel","isOpen","onClose","Required","message","opt","createValidator","validateOpt","triggeredByChange","incomplete","getNameForValidator","val","Array","isArray","useStep","initialSteps","steps","setSteps","currentStep","setCurrentStep","lastStep","setLastStep","moveTo","index","canGo","filled","i","moveNext","movePrev","markAsFilled","canGoNext","canGoPrev","isExternalLink","link","getLinkFromElement","linkEl","closest","getAttribute","getLinkInfo","currentPath","pathname","linkFiltered","linkLower","isExternal","isHash","isTel","isMailTo","path","exts","isStaticFile","ext","getExtension","filename","pop","getFilename","getFolderPath","parentDepth","params","Object","keys","key","encodeURIComponent","getYoutubeId","undefined","getSlug","text","getWebUrl","schema","getErrors","result","forEach","err","push","errorMessage","getErrorMessage","convertToObject","array","reduce","obj","item","convertToKeyValues","moveItem","list","fromIndex","toIndex","splice","removed","removeItem","insertItem","find","fn","findIndex","contains","distinct","comparer","filtered","sum","total","equal","list1","list2","found","j","caseInsensitiveCompare","a","b","localeCompare","compareIgnoreEmpty","asc","addDays","date","days","Date","setDate","getDate","formatDate","dateObj","formatStr","toDate","format","formatYYYYMMDDToday","dd","mm","getMonth","yyyy","getFullYear","formatYYYYMMDD","formatDDMMYYYY","parseDate","parseISO","toDateTime","dateStr","parse","isValidDate","d","bgUrl","encodeURI","decodeURI","document","documentElement","clientWidth","body","outerWidth","outerHeight","hasClass","classList","match","add","remove","reg","toggleClass","status","scrollTo","selector","duration","delay","findElement","offset","elementOffset","gsap","to","ease","querySelectorOrNull","querySelector","rect","scrollLeft","pageXOffset","scrollTop","isElementInViewport","right","getCurrentBreakpoint","bpHolder","getComputedStyle","getPropertyValue","formatMoney","number","fraction","formatter","Intl","NumberFormat","currency","minimumFractionDigits","toMonthlyCost","amount","frequency","ScrollToPlugin","shortid","guid","uuid","toCamel","o","newO","origKey","newKey","hasOwnProperty","constructor","getImageSetPath","setId","info","getPathDetails","baseFolder","setIds","lastFolder","form","ui","money","object","media","isMobile","env","fullUrl","getAlternates","alternates","hreflang","href","callMCPoopu","getElementById","script","createElement","head","appendChild","isNZ","coreUtils","siteConfig","cssEmotion","mq","facepaint","bp","mqMin","mqMax","matches","mediaQuery","matchMedia","isMin","isMax","overlay","content","position","transition","requiredMark","hasRequiredValidator","getLabelAsString","findValidator","validate","disabled","defaultOpt","continueToValidate","getValidatorOptions","findControl","controlNameOrIndex","root","findControlTraverse","controlName","findControlById","findControlByIdTraverse","getValue","getValueTraverse","helperFns","getFilesTraverse","getKeyValueTraverse","keyValue","controlType","findIndexById","this","abstractControl","controlObject","validators","controlOptions","touched","group","controlArray","ctrl","disableValidators","formModelHelper","parent","isValidEmail","mail","isDate","isPast","now","getTime","isValidLength","validator","Email","PastDate","PastDateNullAllowed","Length","validateControl","error","TextInput","usePlaceholder","placeHolder","valueStr","prependText","onChange","onKeyDown","onBlur","autoComplete","placeholder","optionValue","RadioListInput","options","option","inline","TextareaInput","textAreaRef","textAreaHeight","setTextAreaHeight","parentHeight","setParentHeight","disableAutoHeight","scrollHeight","minHeight","rows","values","includes","DateSeparateInput","thisYear","year","setYear","month","setMonth","day","setDay","handleChangeInner","months","selectStyle","display","marginRight","fromYear","recentYear","handleChangeDay","handleChangeMonth","m","handleChangeYear","FileInput","Components","CheckboxInput","linkText","CheckboxListInput","SelectInput","HiddenInput","renderControlDirect","Component","getControl","renderControl","formRoot","nameOrIndex","validateTraverse","errorsFromControl","errorsFromSub","useForm","initialFormModel","formModel","setFormModel","template","onControlChanged","controlFromEvent","querySelectorAll","getControlValue","onBeforeUpdateValue","validateGroup","successHandler","errorHandler","formValidate","model","reset","controlRenderer","validateForm","initialState","page","menu","popup","history","reducer","state","action","payload","Error","StoreContext","createContext","StoreProvider","children","useReducer","dispatch","Provider","useStore","useContext","role","SearchBar2","keyword","setKeyword","navigate","useRouter","onSubmit","NotFound","debugInfo","marginTop","color","fontSize","pageUrl","loadFrom","AppVersion","checkStatus","setCheckStatus","enableForceUpdate","updateSW","then","disableForceUpdate","reload","button","AppVersionPage","margin","Button","btnStyle","buttonStyle","aria-hidden","ErrorMessage","summaryMessage","ErrorPopup","messages","padding","maxWidth","maxHeight","background","zIndex","inx","Loading","loaded","setLoaded","alt","useApi","response","setResponse","setErrors","setStatus","request","setRequest","apiNetJwt","res","ok","json","statusText","JSON","fetchData","hasErrors","containsErrorMessage","msg","finding","some","addErrors","errs","done","send","sendRaw","httpOptionFn","args","setResult","usePost","formDataFn","method","post","headers","stringify","loading","sending","sendFormData","useGet","get","MediaQueryStatus","MetaTag","seoData","assign","description","keywords","language","faceBookDomainVerifi","heroImageUrl","canonical","useInstagram","embedStatus","setEmbedStatus","loadEmbedJs","instgrm","Embeds","defaultSettings","cutoffPadding","speed","ParallaxData","settings","screenSize","panels","imageRatio","panelHeight","elements","timeoutId","useParallax","handleScroll","element","au","calculated","fromTop","toTop","backgroundPositionY","useLayoutEffect","cnt","panel","autoPanelHeight","parseFloat","shadowHeight","shadowWidth","baseHeight","backgroundSize","clearTimeout","useParams","useLocation","useHistory","useRouteMatch","useMemo","Redirect","hash","query","queryString","initHistory","historyItem","setHistory","nav","getLast","getPrevious","getPreviousPath","useHistoryStore","loc","last","handleElementLink","externalHandler","linkInfo","handled","SiteLink","other","goToLink","marginLeft","justifyContent","flexWrap","flexBasis","cursor","mixin","backgroundColor","YoutubeEmbedPopup","posterUrl","popupIndex","setPopupIndex","sources","YoutubeEmbed","allowFullScreen","hasGTM","dataLayer","pageView","pageTitle","pageOpt","event","sendEvent","eventName","sendGAEvent","category","Element","prototype","msMatchesSelector","webkitMatchesSelector","s","parentElement","parentNode","nodeType","defaultVal","payloads","BannerPanel","subItems","items","cmsOption","cmsUtils","slides","subItem","Item","itemId","dots","infinite","autoplaySpeed","fade","autoplay","slidesToShow","slidesToScroll","cssClass","anchorName","data-cms-item-id","isCmsEdit","BannerItem","captionTitle","linkUrl","titlePanel","linkOverlay","Panel","backgroundTile","bgTheme","subItemsElts","InstaEmbedByLink","instagramCode","defaultHolder","storeName","Embed","code","embedType","embedCode","linkOnly","hasScript","getEmbedType","recentlyAdded","parseInt","ts","filter","scripts","forceToReload","removingScripts","promises","holder_","holder","Promise","resolve","reject","networkLoaded","part","onload","onerror","getElementsByTagName","loadScript","all","loadPinterestJs","html","Html","htmlBlock","cmsViewMode","block","embedDataList","pageData","embed","ReactDOM","render","codeType","replaceEmbedCodes","buttons","restructureButton","iframes","resetYoutubeIframe","data-cms-html","processed","_href","setAttribute","handleClick","span","innerHTML","div","TestimonialPanel","itemElt","itemTypeCode","TestimonialItem","bottomText","ImagePanel","pageOptions","imagePath","data-pxh","PageTiles","useSlider","pageTileElts","pagesSerialized","getPages","Tile","disableLink","responsive","breakpoint","tileDesc","SingleBanner","alignV","AccordionPanel","selected","setSelected","mainEntity","toggle","Contact","emailReceiver","fb","modelNumber","phone","email","enquiry","sendingStatus","setSendingStatus","gtm","contactEmail","textAlign","fontWeight","ContactForm","YoutubeBannerPanel","videoCode","FilterDropdown","isMulti","currentSelection","_selectedItem","customStyles","provided","styles","isSearchable","theme","colors","primary25","primary","sort","sortBy","productName","price","ProductList","filters","setFilters","filtersHC","setFiltersHC","filtersHT","setFiltersHT","filtersPT","setFiltersPT","filtersSR","setFiltersSR","subCategory","setSortBy","showAll","setShowAll","useBV","showReview","searchParam","noFilters","results","searchResult","distinctFilters","getDistinctFilters","f","getFilterTitle","productFilterName","distinctFiltersHC","distinctFiltersHT","distinctFiltersPT","distinctFiltersSR","filterItems","filterItemsHC","filterItemsHT","filterItemsPT","filterItemsSR","sortItems","_items","every","filterCodes","fc","getFilteredItems","sortHelper","maxListing","showMoreButton","baseUrl","itemListStructuredData","product","productUrl","productThumbnail","totalCnt","clearText","rightAligned","GetRightFilter","filterTitle","filterId","marginBottom","GetRightSort","productCode","filterName","filterCode","filterValues","_value","pre","_new","check","TileDisc","data-bv-show","data-bv-seo","data-bv-product-id","priceText","ProductListV2","WhereToBuyList","Stores","stores","store","storeCode","storeUrl","buyOnline","iconPath","SearchResult","q","products","sortedProductsOn","productStatus","productsOff","sortedPages","arr","uniqueArray","uniqueItem","removeDuplicates","pages","PageList","DiscProductList","spin","keyframes","step","flex","opacity","paddingLeft","paddingRight","navs","navCurrent","navFilled","navClickable","tileSelected","animation","tiles","tile","tileImage","borderRadius","styleMatch","paddingBottom","overflow","stepsInner","textTransform","stepCurrent","stepPrev","stepNext","stepLast","arrow","arrowPrev","arrowNext","questions","answers","icon","subLabel","answer","SvgNarrowLeft","viewBox","fill","SvgNarrowRight","iconColors","StyleMatch","navEl","selection","setSelection","submitTrigger","setSubmitTrigger","unsubscribed","onMove","Step","question","locStyle","movingStyle","questionIndex","answerId","onSelected","hasValue","clickable","abortController","AbortController","choices","c","idx","maxScore","targets","String","resultIndex","floor","abort","Arrow","jump","LastStep","NarrowLeft","NarrowRight","InstagramFeedEmbed","existingScript","removeChild","data-ref","TextWithJavScript","javaScriptCode","substring","nonjavaScriptCode","javaScriptTopCode","javaScriptInsideCode","_src","async","defer","_functionName","functionName","Warranty","lazy","WarrantyLazy","fallback","joinForm","stepsWrapper","Join","model1","firstName","lastName","form1","model2","mobile","getFormDataStep2","form2","model3","stateList","dob","postcode","getFormDataStep3","form3","model5","interestList","bold","regular","interests","getFormDataStep5","form5","stepStyle","next","getSelection","stepView","Step1","Step2","Step3","Step5","Step6","SocialLinks","instaLink","youtubeLink","data-widget","AmbassadorForm","hairType","hairLength","hairConcerns","favouriteProduct","reason","website","websiteVisitor","instagram","instagramAuFollowers","instagramNzFollowers","facebook","facebookAuFollowers","facebookNzFollowers","youtube","youtubeAuFollowers","youtubeNzFollowers","tiktok","tiktokAuFollowers","tiktokNzFollowers","Code","codeJson","searchType","border","BlogPosts","posts","numOfPost","xs","sm","md","lg","xl","xxl","tilesToShow","setTilesToShow","displayingPosts","showMore","bottomImageUrl","blogTileTitle","BlogPostTitle","postDate","VideoHolder","VideoItem","youtubeCode","posterFrameUrl","captionTitleYoutube","shortDesc","MultiColumnPanel","reverse","columnWidths","mobileColumnWidths","countItem","countD","countM","col","ExpandableHtml","open","setOpen","buttonTitle","iconOpen","iconClosed","panelCollapsed","panelOpen","ProductTiles","productCodes","TilesFromCodes","LinkTiles","LinkTileItem","captionButton","exTextItem","ExpandablePanel","data-anchor-status","data-cms-item-anchor","data-cms-anchor","WallToWallPanel","WallToWallItem","alignH","buttonText","hoverTime","setHoverTime","timerRef","clearInterval","onMouseEnter","setInterval","prev","onMouseLeave","backgroundPositionX","FullSizeBannerPanel","timer","activeIndex","setActiveIndex","setProgress","sliderRef","AnimatePresence","animationFrameId","startTime","performance","requestAnimationFrame","updateProgress","timestamp","elapsed","newProgress","cancelAnimationFrame","arrows","beforeChange","_","customPaging","appendDots","gap","FullSizeBannerItem","itemIndex","bgUrlMobile","lockup","lockupAlign","lockupAlignM","setShouldAnimate","motion","img","initial","animate","exit","PageMemo","memo","datePublishedForBlog","sectionItems","sections","section","Section","sectionName","homeStructuredData","articleStructuredData","dateUpdated","getMetaTag","pageTypeCode","prevProps","nextProps","ViewPage","pageLoaded","setPageLoaded","setData","redirectTo","CmsRadioSender","controller","cloned","postMessage","htmlChanges","sendMessageToParent","returnTo","CmsRadioReceiver","self","selectItem","mediaSelectedCKEditor","getAllDirtyHtml","sender","returnAllDirtyHtml","getHtml","returnHtml","tools","callFunction","funcNum","selectedPath","selectItemFromController","CmsHtmlEditor","ckeditorConfig","startupFocus","filebrowserBrowseUrl","filebrowserImageBrowseUrl","extraPlugins","toolbar","groups","extraAllowedContent","ckeditorStylesSet","attributes","$editor","CKEDITOR","disableAutoInline","editor","stylesSet","on","evt","ed","markDirtyHtml","instances","cmsCurrentEditor","getData","destroy","CmsPageController","viewOnly","receiver","htmlEditor","$","initGlobalVars","prop","off","attr","is","ctrlKey","which","saveAllDirtyHtml","$item","fromController","doubleclicked","cke_top","closeEditingItem","findItem","removeAttr","depth","showHtmlEditor","selectControllerItem","openEdit","editableParent","parents","first","close","show","extend","htmleditor","getAnchors","anchors","each","htmlbody","$section","getCurrentHtml","ItemId","SectionId","Content","itemid","formvals","cms_replace_item_html","EditPage","publishVer","editVer","pageId","cmsPageController","catch","SearchBar","onCloseMenu","NavBar","currentLocation","openItemIndex","setOpenItemIndex","menuItemElts","MenuItem","itemNum","onItemClick","handleMenuItemClick","subMenuOpened","setSubMenuOpened","SubMenuItem","level","toggleSubmenu","childItem","childElts","setSearchOpened","autoFocus","NavBarHori","searchOpened","TopHeader","menuOpened","setMenuOpened","setCurrentLocation","anchor","goBack","backTop","behavior","routeChanged","aria-label","TopHeaderQR","BottomDrawer","defaults","slider","currentTranslateY","inititialised","tsEventHandled","hammer","Hammer","Manager","Pan","direction","DIRECTION_VERTICAL","threshold","switch","deltaY","moveDeltaTmp","initEvent","bar","delta","getBaseY","move","targetY","getTargetY","fromTo","links","barHeight","dy","BottomDock","toggleBottomMenu","isCurrent","linkElts","bottomMenu","instagrams","youtubes","tiktoks","qa","borderBottom","qaQuestion","qaAnswer","Breadcrumb","breadcrumb","ViewPartial","CommonProductBottom","YoutubeEmbedByLink","boxShadow","minWidth","Portal","mount","createPortal","TiktokEmbedByLink","setCode","openPopup","setOpenPopup","titok__embed__container","titok__embed__container__error","alignItems","titok__embed__watch__icon","titok__embed__watch__icon__text","titok__embed__watch__icon__text__error","portal__background","portal__close__btn","svg","portal__contents","tiktok__item__show","signal","TiktokItem","styleItem","thumbnail_url","setShow","vvv","abc","ProductView","slug","productSku","topBanner","canstar","Product","mainPhoto","productImages","allPhotos","packagePhotos","isPackage","popupImages","showReviews","showHowTo","showFaqs","setIsMobile","currentTab","setCurrentTab","heroImage","setHeroImage","toggler","setToggler","checkStart","setCheckStart","schemaImages","settingSchemaInterval","bvRatingSchema","bvRatingSchemaData","productStructuredData","intro","sku","brand","gtin13","barcode","image","aggregateRating","offers","priceCurrency","availability","productSchemaScript","checkBvReviewSchemaSI","bvReviewSchemaScript","bv","onShowReview","useCallback","showTab","openPopupImage","tab","forceToScroll","photo","lazyLoad","initialSlide","visibleTabs","tabView","WhereToBuyTab","visible","whereToBuySection","whereToBuys","BVReviewTab","DetailsTab","HowtoTab","SeeMoreTab","seeMoreSection","FaqTab","faqSection","tabPanels","_discoverMoreLinks","discoverMoreSection","itemValue","auNz","discoverMoreLinks","auNzCheck","barcodeCleaned","sourceIndex","itemScope","itemType","itemProp","RelatedProducts","relatedProducts","metaDesc","ItemList","filteredAndSortedProducts","howToSection","countryCode","_section","itemAuNZCheck","detailSection","hasWarranty","techSpecs","specSection","specs","splitLefts","splitRights","TechSpecs","hasTech","warranty","warrantyYear","warrantyDetails","useSparePartInstruction","SparePart","bookletLink","Booklet","bookletTitle","blogs","empty","hasInstaOrBlog","linkType","Empty","ItemView","desc","instagramEmbed","video_item","video_item_split","video_id","PageTile","spec","checkType","imageUrl2","DiscontinuedProductView","CurlSecret","CurlSecretLoadingV4","CurlSecretLoadingV4NZ","CurlSecretLoadingV4QR","FrizzDefense","FrizzDefenseLoading","Keratin","KeratinLoading","Brilliance","BrillianceLoading","DigitalSensorRange","DigitalSensorLoading","Unbound","UnboundLoading","HydroSmooth","HydroSmoothLoading","Petite","PetiteLoadingNz","ShineLustre","ShineLustreLoading","CommonVideoPopup","setSources","onOpen","AppRouteChanged","parallax","bvRatingSchemaScript","DigitalSensorLuxe","DigitalSensorLuxeLoading","breakpoints2","mqMin2","familyDin","gold","darkBlue","lightBrown","mqTransform","ret","remM","rem","px","baseSize","base","h1","fontFamily","h2","h3","lineHeight","textDecoration","darken","mobileOnly","small","desktopOnly","sc","pannelColor","header","subHeader","letterSpacing","pointerEvents","package","videoCommon","videoContainer","playIcon","backgroundRepeat","landingPage","container2","notes","testOpt","localStorage","getItem","onApiReady","tag","onYouTubeIframeAPIReady","firstScriptTag","insertBefore","VideoPanel","openVideo","ss","paddingTop","testOption","setItem","autoPlay","playsInline","bottomHeight","getBottomHeight","containerRatio","YoutubeTest","AppLayout","checkUpdate","useScrollPosition","prevPos","currPos","pathFiltered","toLocaleLowerCase","specialClassName","_pathName","App","isLocalhost","Boolean","serviceUpdateCheckerInterval","registerValidSW","swUrl","navigator","serviceWorker","register","updateViaCache","registration","scope","waiting","update","preventDevToolsReloadLoop","getRegistration","active","oldSw","ev","newSw","onupdatefound","installing","installingWorker","onstatechange","onUpdate","onSuccess","URL","contentType","ready","unregister","checkValidServiceWorker","forceUpdateFlagged","markUpdate","loadApi","thumbnailMax","getYoutubeCode","prd","loadedJs","reviewClicked","bvCallback","BV","swat_reviews","pixel","trackConversion","sendTransactionEvent","orderId","trackTransaction","ms","apply","arguments","unmarkUpdate","hasUpdate","existing"],"mappings":"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CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAAQ,IAAK3G,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9C,CAAE2G,OAA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","file":"static/js/main.6edb27fc.chunk.js","sourcesContent":["const config = {\n  isProd: process.env.NODE_ENV === \"production\",\n  locale: getLocale(),\n  country: getCountry(),\n  siteName: process.env.REACT_APP_SITENAME,\n  siteCode: process.env.REACT_APP_SITECODE,\n  apiBase: process.env.REACT_APP_API_ENDPOINT,\n  resourceBase: process.env.REACT_APP_RESOURCE_BASEURL,\n  baseOrigin: getBaseUrl(),\n  cmsEndpoint: process.env.REACT_APP_CMS_ENDPOINT,\n  ver: process.env.REACT_APP_VERSION,\n  updateDate: process.env.REACT_APP_UPDATED_AT,\n\n  bvClientId: process.env.REACT_APP_BAZZAR_CLIENT_ID,\n  bvSiteId: process.env.REACT_APP_BAZZAR_SITE_ID,\n  bvEnv: process.env.REACT_APP_BAZZAR_ENV,\n  bvLocale: getLocale() === \"nz\" ? \"en_NZ\" : \"en_AU\",\n\n  //facebook-domain-verification\n  FaceBookDomainVerifiAU: \"lpvr4yq2x5tpojjxq1nt4cgvutw4in\",\n  FaceBookDomainVerifiNZ: \"dzc9nhns3cd8tbbb0vxzdzspqs9buu\",\n\n  instagramClientAccessToken:\n    process.env.REACT_APP_INSTAGRAM_CLIENT_ACCESS_TOKEN,\n  instagramUseFirst: process.env.REACT_APP_INSTAGRAM_USE_FIRST || \"embed\",\n};\n\nfunction getLocale() {\n  return process.env.REACT_APP_COUNTRY_LOCALE || getCountry();\n}\n\nfunction getCountry() {\n  if (typeof window !== `undefined`) {\n    if (window.location.hostname.toLowerCase().indexOf(\".nz\") >= 0) return \"nz\";\n    if (window.location.hostname.toLowerCase().indexOf(\"-nz\") >= 0) return \"nz\";\n    if (window.location.search === \"?nz=true\") return \"nz\";\n  }\n  return \"au\";\n}\n\nfunction getBaseUrl() {\n  if (typeof window !== `undefined`) {\n    return window.location.origin;\n  }\n  return process.env.GATSBY_BASEURL;\n}\n\nconsole.log(process.env, config);\nexport default {\n  ...config,\n};\n","const overloading = {\n  breakpointNames: ['sm', 'md', 'lg', 'xl', 'xxl'],\n  breakpoints: [576, 768, 992, 1200, 1600]\n}\n\nconst variables = {\n  familyBase: '\"Gotham\",sans-serif',\n  familyHeader: '\"DIN Next LT Pro\",serif',\n\n  primaryColor: '#c20f2f',\n  fontColor: '#404040',\n  bgColor: '#ebebeb',\n\n  ...overloading\n}\n\nexport default variables;","import  utils from '../../utils';\r\n\r\nexport const MAX = 100000;\r\nexport const MIN = -100000;\r\n\r\nexport function getScrollProgress(el) {\r\n  if (typeof window !== `undefined`) {\r\n    const scroll = window.scrollY || window.pageYOffset\r\n    if (!el) {\r\n      console.log('not exists', el)\r\n      return {\r\n        progress: 0,\r\n        top: scroll\r\n      }\r\n    }\r\n    const boundsTop = el.getBoundingClientRect().top + scroll\r\n\r\n    const viewport = {\r\n      top: scroll,\r\n      bottom: scroll + window.innerHeight,\r\n      height: window.innerHeight\r\n    }\r\n\r\n    const bounds = {\r\n      top: boundsTop,\r\n      bottom: boundsTop + el.clientHeight,\r\n      height: el.clientHeight\r\n    }\r\n\r\n    //const scrollTop = window.scrollY || window.pageYOffset || document.documentElement.scrollTop;\r\n\r\n    // const status = {\r\n    //   viewport: viewport,\r\n    //   bound: bounds,\r\n    //   inViewport: (bounds.bottom >= viewport.top && bounds.bottom <= viewport.bottom)\r\n    //   || (bounds.top <= viewport.bottom && bounds.top >= viewport.top)\r\n    // }\r\n\r\n    //console.log((viewport.bottom - bounds.top) / (bounds.height + viewport.height))\r\n    return {\r\n      progress: (viewport.bottom - bounds.top) / (bounds.height + viewport.height),\r\n      top: (viewport.bottom - bounds.top) / (viewport.height)\r\n    }\r\n  } else {\r\n    return {\r\n      progress: 0,\r\n      top: 0\r\n    }\r\n  }\r\n}\r\n\r\n//au.setClass(section, 'animated', pr, [0.3, au.MAX])\r\nexport function setClass(el, className, pr, range)\r\n{\r\n  if (pr >= range[0] && pr <= range[1]) {\r\n    utils.css.addClass(el, className);\r\n  } else {\r\n    utils.css.removeClass(el, className);\r\n  }\r\n}\r\n\r\nexport function prVal(min, max, pr, range = [0, 1]) {\r\n  //console.log(min, max, typeof min, typeof to)\r\n  if (pr < range[0]) return min;\r\n  if (pr > range[1]) return max;\r\n  return min + (max - min) * ((pr - range[0])/(range[1] - range[0]));\r\n}\r\n\r\nexport function transform(el, x, y) {\r\n  el.style.transform = 'translate(' + x + ',' + y + ')';\r\n}\r\n\r\nexport function removeTransform(el) {\r\n\r\n}\r\n\r\n// requestAnimationFrame\r\n// const raf =\r\n//   (<any>window).requestAnimationFrame ||\r\n//   (<any>window).webkitRequestAnimationFrame ||\r\n//   (<any>window).mozRequestAnimationFrame ||\r\n//   function (callback) {\r\n//     (<any>window).setTimeout(callback, 1000 / 60)\r\n//   }\r\nexport function getScreenSize() {\r\n  const w = utils.css.screenWidth()\r\n  const h = utils.css.screenHeight()\r\n  return { width: w, height: h };\r\n}\r\n","export function isBlank(str) {\r\n  return (!str || /^\\s*$/.test(str))\r\n}\r\n\r\nexport function isEmpty(str) {\r\n  return (!str || str.length === 0)\r\n}\r\n\r\nexport function isNumeric(num){\r\n  return !isNaN(num)\r\n}\r\n\r\nexport function capitalize(expression) {\r\n  return expression.charAt(0).toUpperCase() + expression.slice(1);\r\n}\r\n\r\nexport function toFieldName(str) {\r\n  if (!str) return null;\r\n  return capitalize((str.replace(/([A-Z]+)/g, ' $1').replace(/([A-Z][a-z])/g, ' $1')).trim());\r\n}\r\n\r\nexport function toHtml(str) {\r\n  if (!str) return null;\r\n  return str.replace(/[\\n\\r]/g, '<br/>')\r\n}\r\n\r\n// Shorten a string to less than maxLen characters without truncating words.\r\nexport function truncateWords(str, maxLen, separator = ' ', ellipsis = '...') {\r\n  if (str.length <= maxLen) return str\r\n  var pos = str.lastIndexOf(separator, maxLen)\r\n  return str.substr(0, pos) + ellipsis\r\n}\r\n\r\nexport function numberWithCommas(x) {\r\n  var parts = x.toString().split(\".\");\r\n  parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n  return parts.join(\".\");\r\n}\r\n\r\nexport const formatNumber = (value) => {\r\n  if (value === 0) return '0';\r\n  if (!value) return '';\r\n  return Math.round(value * 100) / 100\r\n}\r\n\r\nexport const toTelephoneNumber = (str) => {\r\n  return (str || []).replace(/[^+\\d]+/g, \"\");\r\n\r\n}\r\n\r\n// utils.text.like('text here', '%keyword%')\r\nexport const like = (str, search) => {\r\n  if (typeof search !== 'string' || str === null) { return false; }\r\n  // Remove special chars\r\n  search = search.replace(new RegExp(\"([\\\\.\\\\\\\\\\\\+\\\\*\\\\?\\\\[\\\\^\\\\]\\\\$\\\\(\\\\)\\\\{\\\\}\\\\=\\\\!\\\\<\\\\>\\\\|\\\\:\\\\-])\", \"g\"), \"\\\\$1\");\r\n  // Replace % and _ with equivalent regex\r\n  search = search.replace(/%/g, '.*').replace(/_/g, '.');\r\n  // Check matches\r\n  return RegExp('^' + search + '$', 'gi').test(str);\r\n\r\n}","import * as React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nimport 'filepond-polyfill';\r\n\r\n// Import React FilePond\r\nimport { FilePond, registerPlugin } from \"react-filepond\";\r\n\r\n// Import FilePond styles\r\nimport \"filepond/dist/filepond.min.css\";\r\n\r\n// Import the plugin code\r\nimport FilePondPluginFileValidateSize from 'filepond-plugin-file-validate-size';\r\nimport FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type';\r\nimport FilePondPluginImageResize from 'filepond-plugin-image-resize';\r\nimport FilePondPluginImageTransform from 'filepond-plugin-image-transform';\r\n\r\n// Register the plugin\r\nregisterPlugin(FilePondPluginFileValidateSize);\r\nregisterPlugin(FilePondPluginFileValidateType);\r\nregisterPlugin(FilePondPluginImageResize);\r\nregisterPlugin(FilePondPluginImageTransform);\r\n\r\nfunction FilePondUploader({ control, handleChange, formOption }) {\r\n    const [files, setFiles] = React.useState([])\r\n    const { name, label, errors, style, filePond = {}, helpText, attrs } = control;\r\n    //console.log(filePond)\r\n    //const { template = 'bootstrap', usePlaceholder = false } = formOption;\r\n    const fieldId = utils.random.shortId();\r\n    const fieldLabel = getLabel(control, formOption);\r\n\r\n\r\n    const ref = React.useRef(null);\r\n    function handleInit() {\r\n        console.log(ref.current);\r\n    }\r\n\r\n    control.customValueFn = (control) => {\r\n        if (!ref.current) return [];\r\n        return ref.current.getFiles().map(x => x.serverId);\r\n    }\r\n\r\n    const onUpdated = fileItems => {\r\n        //console.log(fileItems, JSON.stringify(fileItems))\r\n        // Set currently active file objects to this.state\r\n        const newVal = fileItems.map(x => x.serverId)\r\n        //console.log(newVal)\r\n        handleChange({\r\n            persist: () => { },\r\n            target: { name: name, value: newVal, checked: false }\r\n        }, control)\r\n        setFiles(fileItems.map(fileItem => fileItem.file));\r\n    }\r\n\r\n    return (\r\n        <div className={`ff ff--file form-group ${style && style.className}`}>\r\n            {fieldLabel && <label htmlFor={fieldId} className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input\">\r\n\r\n                <FilePond\r\n                    ref={ref}\r\n                    files={files}\r\n                    allowMultiple={filePond.allowMultiple || true}\r\n                    maxFileSize={filePond.maxFileSize || '10MB'}\r\n                    maxFiles={filePond.maxFiles || 5}\r\n                    server={{\r\n                        process: filePond.serverProcess || utils.site.resourcePath('/api/filepond/upload'),\r\n                        fetch: null,\r\n                        revert: null\r\n                    }}\r\n                    oninit={() => handleInit()}\r\n                    onupdatefiles={onUpdated}\r\n                    labelIdle={filePond.labelIdle || `Drag & Drop your files or <span class=\"filepond--label-action\"> Browse </span>`}\r\n                    acceptedFileTypes={filePond.acceptedFileTypes || []}\r\n                    allowImageResize={filePond.allowImageResize || false}\r\n                    imageResizeTargetWidth={filePond.imageResizeTargetWidth || 2560}\r\n                    imageResizeUpscale={filePond.imageResizeUpscale || false}\r\n                    {...attrs}\r\n                />\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n\r\n    )\r\n}\r\n\r\nexport default FilePondUploader;","//import HtmlInput from 'lib/form/controls/HtmlInput--ckeditor';\nimport FilePondUploader from '../lib/form/controls/FilePond';\n\nexport function getSiteControl(control, formOption) {\n  // if (control.type === 'html')\n  //   return HtmlInput;\n  if (control.type === 'filePond')\n    return FilePondUploader;\n  return null;\n}\n\n","export { fb, validators, formModelHelper, validatorHelper, useForm, useStep } from '../lib/form';\nexport { getSiteControl } from './controls';","import React, { useState, useRef } from \"react\";\r\nimport utils from \"../../utils\";\r\nimport { debounce } from \"../utils-core/debounce\";\r\nimport * as yt from \"./iframeApi\";\r\nimport { FiVolumeX, FiVolume2 } from \"react-icons/fi\";\r\nimport { FaRegPlayCircle } from \"react-icons/fa\";\r\nimport ModalVideo from \"react-modal-video\";\r\n\r\nexport function YoutubeBannerMobilePopup(props) {\r\n  const youtubeBannerRef = React.useRef(null);\r\n\r\n  const [playerStatus, setPlayerStatus] = useState(\"loading\");\r\n  const [playerSize, setPlayerSize] = useState(null);\r\n  const [ytPlayer, setYtPlayer] = useState(null);\r\n  const [muted, setMuted] = useState(true);\r\n  const countPlayedRef = useRef(0);\r\n  const [popupOpened, setPopupOpened] = useState(false);\r\n  const { heightSet, videoLinkOrId, playerId } = props.video;\r\n  const videoId = yt.getYoutubeCode(videoLinkOrId);\r\n  //const posterImageUrl = yt.thumbnailMax(videoId);\r\n  const posterImageUrl = props.posterImageUrl && props.posterImageUrl !== \"\" ? props.posterImageUrl : yt.thumbnailMax(videoId);\r\n  const mobileImageUrl = props.mobileImageUrl;\r\n  //let countPlayed = 0;\r\n  const canPlayVideo = () =>\r\n    typeof window !== `undefined` && typeof props.canPlayVideo === `undefined`\r\n      ? window.innerWidth >= 1200\r\n      : !!(typeof props.canPlayVideo === \"function\" ? props.canPlayVideo() : props.canPlayVideo);\r\n\r\n  const playerVars = {\r\n    enablejsapi: 1,\r\n    //'autoplay': 1,\r\n    controls: 0,\r\n    loop: 1,\r\n    showinfo: 0,\r\n    rel: 0,\r\n    modestbranding: 1,\r\n    //'origin': typeof window !== `undefined` && window.location.origin,\r\n    allowfullscreen: true,\r\n    wmode: \"transparent\",\r\n  };\r\n\r\n  //console.log('videoId: ' + videoId)\r\n  //const canPlayVideo = () => window.innerWidth >= 1200\r\n  React.useEffect(() => {\r\n    const resized = debounce(() => {\r\n      loadVideo();\r\n    });\r\n    loadVideo();\r\n    if (typeof window !== `undefined`) window.addEventListener(\"resize\", resized);\r\n    return () => {\r\n      if (typeof window !== `undefined`) window.removeEventListener(\"resize\", resized);\r\n    };\r\n    // eslint-disable-next-line\r\n  }, []);\r\n\r\n  function loadVideo() {\r\n    if (youtubeBannerRef.current) setPlayerSize(getSize(youtubeBannerRef.current, props.sizeCalculator));\r\n    if (canPlayVideo()) {\r\n      yt.loadApi((loadJs) => {\r\n        loadJs ? init() : setTimeout(init, 100);\r\n      });\r\n    }\r\n  }\r\n\r\n  function init() {\r\n    let player = null;\r\n    if (typeof window !== `undefined`) {\r\n      player = new window.YT.Player(playerId, {\r\n        events: {\r\n          onStateChange: (e) => {\r\n            switch (e.data) {\r\n              // case window.YT.PlayerState.PLAYING:\r\n              //   break;\r\n              // case window.YT.PlayerState.PAUSED:\r\n              //   break;\r\n              case window.YT.PlayerState.ENDED:\r\n                const countPlayed = countPlayedRef.current;\r\n                if (countPlayed < 3 - 1) {\r\n                  console.log(\"ended\", countPlayed + 1);\r\n                  countPlayedRef.current = countPlayed + 1;\r\n                  if (player && player.playVideo) {\r\n                    player.playVideo();\r\n                  } else {\r\n                    setPlayerStatus(\"finished\");\r\n                  }\r\n                } else {\r\n                  setPlayerStatus(\"finished\");\r\n                }\r\n                break;\r\n              default:\r\n            }\r\n          },\r\n          onReady: (e) => {\r\n            //console.log('onReady');\r\n            if (player && player.mute && player.playVideo) {\r\n              player.mute();\r\n              player.playVideo();\r\n            }\r\n            setTimeout(() => setPlayerStatus(\"loaded\"), 1000);\r\n          },\r\n          onError: (e) => {\r\n            console.log(e);\r\n          },\r\n        },\r\n      });\r\n\r\n      setYtPlayer(player);\r\n    }\r\n  }\r\n\r\n  function soundToggle(e) {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    if (ytPlayer) {\r\n      if (muted) {\r\n        setMuted(false);\r\n        setTimeout(() => {\r\n          if (ytPlayer && ytPlayer.pauseVideo && ytPlayer.unMute && ytPlayer.playVideo) {\r\n            ytPlayer.pauseVideo();\r\n            ytPlayer.unMute();\r\n            ytPlayer.playVideo();\r\n          }\r\n        }, 100);\r\n      } else {\r\n        setMuted(true);\r\n        setTimeout(() => {\r\n          if (ytPlayer && ytPlayer.pauseVideo && ytPlayer.unMute && ytPlayer.playVideo) {\r\n            ytPlayer.pauseVideo();\r\n            ytPlayer.mute();\r\n            ytPlayer.playVideo();\r\n          }\r\n        }, 100);\r\n      }\r\n    }\r\n\r\n    //https://developers.google.com/web/updates/2017/09/autoplay-policy-changes\r\n  }\r\n\r\n  function playVideo() {\r\n    setPopupOpened(true);\r\n  }\r\n\r\n  function getSize(container, sizeCalculator) {\r\n    const containerSize = container ? { w: container.offsetWidth, h: container.offsetHeight } : { w: window.innerWidth, h: window.innerHeight };\r\n    if (sizeCalculator) {\r\n      const size = sizeCalculator(containerSize, canPlayVideo());\r\n      if (size) return size;\r\n    }\r\n\r\n    const overSize = 1;\r\n    const rate = 9 / 16;\r\n    const w = containerSize.w * overSize;\r\n    const h = containerSize.h * overSize;\r\n    const size = { width: w, height: w * rate, left: 0, top: 0 };\r\n    if (size.height < h) {\r\n      // stretch horizontally\r\n      size.height = h;\r\n      size.width = h / rate;\r\n    }\r\n\r\n    //console.log(size)\r\n    size.left = -(size.width - containerSize.w) / 2;\r\n    size.top = -(size.height - containerSize.h) / 2;\r\n    return size;\r\n  }\r\n\r\n  const canPlay = canPlayVideo();\r\n  const imageUrl = !canPlay && mobileImageUrl ? mobileImageUrl : posterImageUrl;\r\n  return (\r\n    <React.Fragment>\r\n      <div\r\n        className={utils.classNames(\r\n          \"youtubePlayer\",\r\n          `youtubePlayer--${canPlay ? \"canPlay\" : \"cannotPlay\"}`,\r\n          `youtubePlayer--${playerStatus}`,\r\n          `youtubePlayer--${heightSet}`\r\n        )}\r\n        ref={youtubeBannerRef}\r\n      >\r\n        <div className=\"youtubePlayer__mask\"></div>\r\n        <div className=\"youtubePlayer__poster\" style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}></div>\r\n        {canPlay && playerSize && (\r\n          <iframe\r\n            className=\"youtubePlayer__iframe\"\r\n            id={playerId}\r\n            width=\"640\"\r\n            height=\"390\"\r\n            title=\"Youtube video\"\r\n            style={{ width: `${playerSize.width}px`, height: `${playerSize.height}px`, top: `${playerSize.top}px`, left: `${playerSize.left}px` }}\r\n            src={`https://www.youtube.com/embed/${videoId}?${utils.url.toQueryString(playerVars)}`}\r\n            allow=\"autoplay; fullscreen\"\r\n            frameBorder=\"0\"\r\n          ></iframe>\r\n        )}\r\n        {canPlay && playerStatus === \"loaded\" && (\r\n          <div className=\"youtubePlayer__soundIcon\" title={muted ? \"Sound On\" : \"Sound Off\"} onClick={soundToggle}>\r\n            {muted ? <FiVolume2 /> : <FiVolumeX />}\r\n          </div>\r\n        )}\r\n\r\n        {!canPlay && !mobileImageUrl && (\r\n          <div className=\"youtubePlayer__playIcon\" title=\"Play\" onClick={playVideo}>\r\n            <FaRegPlayCircle />\r\n          </div>\r\n        )}\r\n      </div>\r\n      <ModalVideo channel=\"youtube\" isOpen={popupOpened} videoId={videoId} onClose={() => setPopupOpened(false)} />\r\n    </React.Fragment>\r\n  );\r\n}\r\n","import { createValidator, getNameForValidator } from '../validatorHelper';\r\n\r\nexport function Required(message = null, opt = null) {\r\n  return createValidator('required', message, opt, function(control, e, validateOpt) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    return isEmpty(control.value) ? (message || (getNameForValidator(control.label, control.name) + ' is required.')) : null\r\n  })\r\n}\r\n\r\nfunction isEmpty(val) {\r\n  if (Array.isArray(val))\r\n    return val.length === 0;\r\n  return !val && val !== 0;\r\n}\r\n","import React from 'react';\n\nexport function useStep(initialSteps){\n  const [steps, setSteps] = React.useState(initialSteps);\n  const [currentStep, setCurrentStep] = React.useState(0);\n  const [lastStep, setLastStep] = React.useState(0);\n\n  const moveNext = () => {\n    moveTo(currentStep < steps.length ? currentStep + 1 : currentStep)\n  }\n\n  const movePrev = () => {\n    moveTo(currentStep > 0 ? currentStep - 1 : 0)\n  }\n\n  const moveTo = (index) => {\n    if (!canGo(index)) return\n    \n    setLastStep(currentStep)\n    setCurrentStep(index)\n    // if (!utils.ui.isElementInViewport(navEl.current)) {\n    //   utils.ui.scrollTo(navEl.current)\n    // }\n  }\n\n  const markAsFilled = (index) => {\n    if (!steps[index]) return;\n    steps[index].filled = true;\n    setSteps(steps);\n  }\n  \n  function canGo(index) {\n    if (steps[index] && steps[index].filled) return true;\n    const maxIndexFilled = Math.max(...steps.map((x, i) => x.filled ? i : -1));\n    return index <= maxIndexFilled + 1\n  }\n\n  function canGoNext() {\n    return currentStep < steps.length && canGo(currentStep + 1)\n  }\n\n  function canGoPrev() {\n    return currentStep > 0 && canGo(currentStep - 1)\n  }\n\n  return { steps, setSteps, currentStep, lastStep, moveTo, moveNext, movePrev, markAsFilled, canGo, canGoNext, canGoPrev}\n}","export function isExternalLink(link){\r\n  return link && (link.indexOf('https://') === 0 || link.indexOf('http://') === 0 || link.indexOf('://') === 0);\r\n}\r\n\r\nexport function getLinkFromElement(el){\r\n  if (!el) return null;\r\n  const linkEl = el.closest('a');\r\n  //console.log(el, linkEl);\r\n  if (linkEl){\r\n    return linkEl.getAttribute('href');\r\n  }\r\n  return null;\r\n}\r\n\r\n\r\n// router utils\r\nexport function getLinkInfo(link) {\r\n  if (!link) return null;\r\n\r\n  const origin = typeof window !== `undefined` && window.location && window.location.origin;\r\n  const currentPath = typeof window !== `undefined` && window.location && window.location.pathname;\r\n  let linkFiltered = link.replace(origin, '').replace(currentPath + '#', '#');\r\n  let linkLower = link.toLowerCase();\r\n\r\n  //if (isStaticFile(linkLower)) return null;\r\n  const isExternal = isExternalLink(linkFiltered);\r\n  const isHash = linkFiltered.indexOf('#') === 0;\r\n  const isTel = linkFiltered.indexOf('tel:') === 0;\r\n  const isMailTo = linkFiltered.indexOf('mailto:') === 0;\r\n  const type = (isHash && 'hash') || (isTel && 'tel') || (isMailTo && 'mailto') || \r\n    (isStaticFile(linkLower) && 'static') || (isExternal && 'external') || 'internal';\r\n\r\n  return { url: linkFiltered, type: type, ext: getExtension(link) };\r\n}\r\n\r\nvar exts = ['.pdf', '.jpg', '.png', '.gif', '.docx', '.doc']\r\nfunction isStaticFile(path) {\r\n  for(let i = 0; i < exts.length; i++) {\r\n    if (path.indexOf(exts[i]) >= 0) return true;\r\n  }\r\n  return false;\r\n}\r\n\r\nexport function getExtension(filename) {\r\n  if (!filename || filename.indexOf('.') < 0) return null;\r\n  return filename.split('.').pop().toLowerCase();\r\n}\r\n\r\nexport function getFilename(url) {\r\n  return url.split('/').pop().split('?')[0];\r\n}\r\n\r\nexport function getFolderPath(url, parentDepth = -1) {\r\n  return url.split('/').slice(0, parentDepth).join('/');\r\n}\r\n\r\n//\r\nexport function toQueryString(params) {\r\n  var queryString = Object.keys(params).map((key) => {\r\n      return encodeURIComponent(key) + '=' + encodeURIComponent(params[key])\r\n  }).join('&');\r\n  return queryString;\r\n}\r\n\r\nexport function getYoutubeId(url){\r\n  url = url.split(/(vi\\/|v=|\\/v\\/|youtu\\.be\\/|\\/embed\\/)/);\r\n  return (url[2] !== undefined) ? url[2].split(/[^0-9a-z_-]/i)[0] : url[0];\r\n}\r\n\r\nexport function getSlug(text){\r\n  return text.toLowerCase().replace(/ /g,'-').replace(/[-]+/g, '-').replace(/[^\\w-]+/g,'');\r\n}\r\n\r\nexport function getWebUrl(url, schema = 'https://'){\r\n  if (!url) return null;\r\n  if (url.indexOf('https:') >= 0 || url.indexOf('http:') >= 0 || url.indexOf(':') >= 0) {\r\n    return url;\r\n  }\r\n  return schema + url;\r\n}","//#region error json parsing\r\nexport const getErrors = (result) => {\r\n  let errors = [];\r\n  if (result && result.errors && result.errors.length > 0) {\r\n    result.errors.forEach(err => {\r\n      errors.push(err.errorMessage);\r\n    });\r\n  }\r\n  return errors;\r\n}\r\n\r\nexport const getErrorMessage = (result) => {\r\n  let errors = getErrors(result);\r\n  return errors.join(\" \");\r\n}\r\n//#endregion","//#region conversion between array and object\r\nexport const convertToObject = (array, key) => {\r\n  const initialValue = {};\r\n  return array.reduce((obj, item) => {\r\n    return {\r\n      ...obj,\r\n      [item[key]]: item,\r\n    };\r\n  }, initialValue);\r\n};\r\n\r\nexport const convertToKeyValues = (array, key, value) => {\r\n  const initialValue = {};\r\n  return array.reduce((obj, item) => {\r\n    return {\r\n      ...obj,\r\n      [item[key]]: item[value],\r\n    };\r\n  }, initialValue);\r\n};\r\n//#endregion\r\n\r\n//#region array helper functions\r\nexport const moveItem = (list, fromIndex, toIndex) => {\r\n  //const list = Array.from(array);\r\n  const [removed] = list.splice(fromIndex, 1);\r\n  list.splice(toIndex, 0, removed);\r\n\r\n  return list;\r\n};\r\n\r\nexport const removeItem = (list, index) => {\r\n  //const list = Array.from(array);\r\n  list.splice(index, 1);\r\n\r\n  return list;\r\n};\r\n\r\nexport const insertItem = (list, index, item) => {\r\n  //const list = Array.from(array);\r\n  list.splice(index, 0, item);\r\n\r\n  return list;\r\n};\r\n\r\n\r\nexport const find = (list, fn) => {\r\n  if (!list) return null;\r\n  for (let i = 0; i < list.length; i++) {\r\n    if (fn(list[i])) {\r\n      return list[i];\r\n    }\r\n  }\r\n  return null;\r\n};\r\n\r\nexport const findIndex = (list, fn) => {\r\n  if (!list) return -1;\r\n  for (let i = 0; i < list.length; i++) {\r\n    if (fn(list[i])) {\r\n      return i;\r\n    }\r\n  }\r\n  return -1;\r\n};\r\n\r\nexport const contains = (list, fn) => {\r\n  return findIndex(list, fn) >= 0;\r\n}\r\n\r\n// utils.array.distinct(images, (x, y) => x.imageUrl === y.imageUrl)\r\nexport const distinct = (list, comparer) => {\r\n  const filtered = []\r\n  for (let i = 0; i < list.length; i++) {\r\n    if (!contains(filtered, (x) => comparer(x, list[i]))) {\r\n      filtered.push(list[i])\r\n    }\r\n  }\r\n  return filtered;\r\n}\r\n\r\nexport const sum = (list, fn) => {\r\n  if (!list) return 0;\r\n  let total = 0;\r\n  for (let i = 0; i < list.length; i++) {\r\n    total += fn(list[i]) || 0\r\n  }\r\n  return total\r\n}\r\n\r\nexport const equal = (list1, list2, fn) => {\r\n  if (!list1 && !list2) return true;\r\n  if (!list1 || !list2) return false;\r\n  if (list1.length !== list2.length) return false;\r\n  for (let i = 0; i < list1.length; i++) {\r\n    let found = false;\r\n    for (let j = 0; j < list2.length; j++) {\r\n      if(fn(list1[i], list2[i])) {\r\n        found = true;\r\n        break;\r\n      }\r\n    }\r\n    if (!found) return false;\r\n  }\r\n  return true;\r\n}\r\n//#endregion\r\n\r\n//#region sorting helpers\r\nexport const caseInsensitiveCompare = function (a, b) {\r\n  return a.toLowerCase().localeCompare(b.toLowerCase());\r\n}\r\n\r\n// put the null items at the end.\r\nexport const compareIgnoreEmpty = function (asc) {\r\n  return asc ?\r\n    function (a, b) {\r\n      return (a === null || isNaN(a)) - (b === null || isNaN(b)) || +(a > b) || -(a < b);\r\n    }\r\n    :\r\n    function (a, b) {\r\n      return (a === null || isNaN(a)) - (b === null || isNaN(b)) || -(a > b) || +(a < b);\r\n    }\r\n}\r\n//#endregion","import parse from \"date-fns/parse\";\r\nimport parseISO from \"date-fns/parseISO\";\r\nimport format from \"date-fns/format\";\r\n\r\n//#region manipulation\r\nexport const addDays = (date, days) => {\r\n  var result = new Date(date);\r\n  result.setDate(result.getDate() + days);\r\n  return result;\r\n};\r\n//#endregion\r\n\r\n//#region format\r\nexport function formatDate(dateObj, formatStr) {\r\n  const date = toDate(dateObj);\r\n  if (!date) return \"\";\r\n  return format(date, formatStr);\r\n}\r\n\r\nexport function formatYYYYMMDDToday() {\r\n  const date = new Date();\r\n  //console.log(dateObj, date)\r\n  if (!date) return '';\r\n  var dd = date.getDate();\r\n  var mm = date.getMonth() + 1; //January is 0!\r\n\r\n  var yyyy = date.getFullYear();\r\n  if (dd < 10) {\r\n    dd = '0' + dd;\r\n  } \r\n  if (mm < 10) {\r\n    mm = '0' + mm;\r\n  } \r\n  return (`${yyyy}-${mm}-${dd}`)\r\n}\r\n\r\nexport function formatYYYYMMDD(dateObj) {\r\n  const date = toDate(dateObj);\r\n  //console.log(dateObj, date)\r\n  if (!date) return \"\";\r\n  var dd = date.getDate();\r\n  var mm = date.getMonth() + 1; //January is 0!\r\n\r\n  var yyyy = date.getFullYear();\r\n  if (dd < 10) {\r\n    dd = \"0\" + dd;\r\n  }\r\n  if (mm < 10) {\r\n    mm = \"0\" + mm;\r\n  }\r\n  return `${yyyy}-${mm}-${dd}`;\r\n}\r\n\r\nexport function formatDDMMYYYY(dateObj) {\r\n  const date = toDate(dateObj);\r\n  //console.log(dateObj, date)\r\n  if (!date) return \"\";\r\n  var dd = date.getDate();\r\n  var mm = date.getMonth() + 1; //January is 0!\r\n\r\n  var yyyy = date.getFullYear();\r\n  if (dd < 10) {\r\n    dd = \"0\" + dd;\r\n  }\r\n  if (mm < 10) {\r\n    mm = \"0\" + mm;\r\n  }\r\n  return `${dd}-${mm}-${yyyy}`;\r\n}\r\n//#endregion\r\n\r\n//#region parse\r\nexport function toDate(dateObj) {\r\n  if (!dateObj) return null;\r\n  if (typeof dateObj === \"string\") {\r\n    return (\r\n      parseDate(dateObj, \"yyyy-MM-dd\") ||\r\n      parseDate(dateObj, \"yyyy-M-d\") ||\r\n      parseDate(dateObj, \"dd/MM/yyyy\") ||\r\n      parseDate(dateObj, \"d/M/yyyy\") ||\r\n      parseISO(dateObj)\r\n    );\r\n  } else {\r\n    return dateObj;\r\n  }\r\n}\r\n\r\nexport function toDateTime(dateObj) {\r\n  if (!dateObj) return null;\r\n  if (typeof dateObj === \"string\") {\r\n    return (\r\n      parseDate(dateObj, \"yyyy-MM-dd'T'HH:mm:ss.SSSxxx\") ||\r\n      parseDate(dateObj, \"yyyy-MM-dd HH:mm:ss.SSSxxx\") ||\r\n      parseDate(dateObj, \"yyyy-M-d HH:mm:ss.SSSxxx\") ||\r\n      parseDate(dateObj, \"dd/MM/yyyy HH:mm:ss.SSSxxx\") ||\r\n      parseDate(dateObj, \"d/M/yyyy HH:mm:ss.SSSxxx\") ||\r\n      parseISO(dateObj)\r\n    );\r\n  } else {\r\n    return dateObj;\r\n  }\r\n}\r\n\r\nexport function parseDate(dateStr, format) {\r\n  const date = parse(dateStr, format, new Date());\r\n  return date && isValidDate(date) ? date : null;\r\n}\r\n\r\nexport function isValidDate(d) {\r\n  return d instanceof Date && !isNaN(d);\r\n}\r\n//#endregion\r\n","//#region background images\r\nexport const bgUrl = (imageUrl) => {\r\n  return `background-image:url(\"` + encodeURI(decodeURI(imageUrl)) + `\")`\r\n}\r\n\r\nexport const bgUrlStyle = (imageUrl) => {\r\n  return `url(\"` + encodeURI(decodeURI(imageUrl)) + `\")`\r\n}\r\n//#endregion\r\n\r\n//#region screen/element size\r\nexport const screenWidth = () => {\r\n  if (typeof window !== `undefined`) { \r\n    return window.innerWidth ||\r\n      document.documentElement.clientWidth ||\r\n      document.body.clientWidth\r\n  } else {\r\n    return 0;\r\n  }\r\n}\r\n\r\nexport const screenHeight = () => {\r\n  if (typeof window !== `undefined`) { \r\n    return window.innerHeight ||\r\n      document.documentElement.clientHeight ||\r\n      document.body.clientHeight\r\n  } else {\r\n    return 0;\r\n  }\r\n}\r\n\r\nexport const outerWidth = el => el.offsetWidth\r\nexport const outerHeight = el => el.offsetHeight\r\n//#endregion\r\n\r\n//#region css class\r\n/**\r\n * Check if element has the css class on it.\r\n */\r\nexport const hasClass = (el, className) => {\r\n  if (el.classList) {\r\n    return el.classList.contains(className)\r\n  }\r\n\r\n  return !!el.className.match(new RegExp(`(\\\\s|^)${className}(\\\\s|$)`))\r\n}\r\n\r\n/**\r\n * Adds the provided css className to the element.\r\n */\r\nexport const addClass = (el, className) => {\r\n  if (el.classList) {\r\n    el.classList.add(className)\r\n    return\r\n  }\r\n\r\n  if (!hasClass(el, className)) {\r\n    el.className += ` ${className}`\r\n  }\r\n}\r\n\r\n/**\r\n * Remove the provided css className from the element.\r\n */\r\nexport const removeClass = (el, className) => {\r\n  if (el.classList) {\r\n    el.classList.remove(className)\r\n    return\r\n  }\r\n\r\n  if (hasClass(el, className)) {\r\n    const reg = new RegExp(`(\\\\s|^)${className}(\\\\s|$)`)\r\n    el.className = el.className.replace(reg, ' ')\r\n  }\r\n}\r\n\r\n/**\r\n * Adds or removes a class name on the input depending on the status flag.\r\n */\r\nexport const toggleClass = (el, className, status) => {\r\n  if (!el || !className) return\r\n\r\n  if (status) {\r\n    return addClass(el, className)\r\n  }\r\n\r\n  removeClass(el, className)\r\n}\r\n//#endregion","import { gsap } from 'gsap';\r\nimport { ScrollToPlugin } from 'gsap/ScrollToPlugin';\r\n\r\ngsap.registerPlugin(ScrollToPlugin);\r\n\r\nexport function scrollTo(selector, duration = 750, delay = 0) {\r\n  const el = findElement(selector);\r\n  if (el) {\r\n    setTimeout(() => {\r\n      //console.log(element);\r\n      const offset = elementOffset(el);\r\n      //console.log(offset)\r\n      //window.scrollTo(0, offset.top - 300);\r\n\r\n      gsap.to(window, {duration: (duration/1000), scrollTo: offset.top - 100, ease: 'power1'});\r\n\r\n    }, delay);\r\n      //el.scrollIntoView({ block: 'start', inline: 'nearest', behavior: 'smooth' }); }, timeout);\r\n    return true;\r\n  }\r\n  return false;\r\n}\r\n\r\nexport function findElement(selector) {\r\n  if (typeof selector !== 'string') return selector;\r\n\r\n  let found = querySelectorOrNull(selector)\r\n    || querySelectorOrNull('#' + selector)\r\n    || querySelectorOrNull('.' + selector)\r\n  \r\n  return found;\r\n}\r\n\r\nexport function querySelectorOrNull(selector) {\r\n  try {\r\n    return document.querySelector(selector);\r\n  } catch(e){\r\n    return null;\r\n  };\r\n}\r\n\r\nexport function elementOffset(el) {\r\n  var rect = el.getBoundingClientRect(),\r\n    scrollLeft = typeof window !== `undefined` ? (window.pageXOffset || document.documentElement.scrollLeft) : 0,\r\n    scrollTop = typeof window !== `undefined` ? (window.pageYOffset || document.documentElement.scrollTop) : 0;\r\n\r\n  return { top: rect.top + scrollTop, left: rect.left + scrollLeft, width: el.offsetWidth, height: el.offsetHeight }\r\n}\r\n\r\nexport function isElementInViewport (el) {\r\n  if (typeof window !== `undefined`) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n        rect.top >= 0 &&\r\n        rect.left >= 0 &&\r\n        rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /* or $(window).height() */\r\n        rect.right <= (window.innerWidth || document.documentElement.clientWidth) /* or $(window).width() */\r\n    );\r\n  } else {\r\n    return true;\r\n  }\r\n}\r\n\r\nexport function getCurrentBreakpoint() {\r\n  if (typeof window === `undefined`) return null;\r\n  \r\n  const bpHolder = document.querySelector('.devMediaQueryStatus__current');\r\n  if (!bpHolder) return null;\r\n  return window.getComputedStyle(bpHolder, ':before').getPropertyValue('content').replace(/[\"']/g, '');\r\n}\r\n\r\n","export function formatMoney(number, fraction = 0) {\r\n  var formatter = new Intl.NumberFormat('en-AU', {\r\n    style: 'currency',\r\n    currency: 'AUD',\r\n    minimumFractionDigits: fraction,\r\n  });\r\n\r\n  return formatter.format(number);\r\n}\r\n\r\nexport function toMonthlyCost(amount, frequency) {\r\n  if (!amount) return 0;\r\n  if (frequency === 'Week') {\r\n    return amount * 52.1429 / 12.0;\r\n  } else if (frequency === 'Fortnight') {\r\n    return amount * 52.1429 / 2.0 / 12.0;\r\n  } else if (frequency === 'Month') {\r\n    return amount;\r\n  } else if (frequency === 'Quarter') {\r\n    return amount * 4.0 / 12.0;\r\n  } else if (frequency === 'Year') {\r\n    return amount / 12.0;\r\n  } else {\r\n    return amount;\r\n  }\r\n}\r\n","import shortid from 'shortid';\r\nimport uuid from 'uuid/v4';\r\n\r\nexport function shortId() {\r\n  return shortid();\r\n}\r\n\r\nexport function guid() {\r\n  return uuid();\r\n}","export function toCamel(o) {\r\n  var newO, origKey, newKey, value\r\n  if (o instanceof Array) {\r\n    return o.map(function(value) {\r\n        if (typeof value === \"object\") {\r\n          value = toCamel(value)\r\n        }\r\n        return value\r\n    })\r\n  } else {\r\n    newO = {}\r\n    for (origKey in o) {\r\n      if (o.hasOwnProperty(origKey)) {\r\n        newKey = (origKey.charAt(0).toLowerCase() + origKey.slice(1) || origKey).toString()\r\n        value = o[origKey]\r\n        if (value instanceof Array || (value !== null && value.constructor === Object)) {\r\n          value = toCamel(value)\r\n        }\r\n        newO[newKey] = value\r\n      }\r\n    }\r\n  }\r\n  return newO\r\n}","import { getFilename } from './url';\r\nimport { contains } from './array';\r\nexport function getImageSetPath(url, setId) {\r\n  const info = getPathDetails(url)\r\n  if (!info) return url;\r\n  //console.log(url, info);\r\n  return info.baseFolder + \"/@\" + setId + '/' + info.filename\r\n}\r\n\r\nexport function getPathDetails(url, setIds) {\r\n  if (!url) return null;\r\n  const parts = url.split('/').slice(0, -1);\r\n  if (parts.length <= 1) return { baseFolder: '/', setId: null, filename: getFilename(url) };\r\n\r\n  const lastFolder = parts[parts.length - 1];\r\n  const hasSet = setIds && setIds.length > 0 ? contains(setIds, x => x === lastFolder) : lastFolder.indexOf('@') === 0;\r\n\r\n  return hasSet ?\r\n    { baseFolder: parts.slice(0, -1).join('/'), setId: lastFolder, filename: getFilename(url) } :\r\n    { baseFolder: parts.join('/'), setId: null, filename: getFilename(url) }\r\n}","import classNames from 'classnames';\r\nimport * as url from './url';\r\nimport * as form from './form';\r\nimport * as array from './array';\r\nimport * as date from './date';\r\nimport * as css from './css';\r\nimport * as ui from './ui';\r\nimport * as money from './money';\r\nimport * as text from './text';\r\nimport * as random from './random';\r\nimport * as object from './object';\r\nimport * as media from './media';\r\n\r\nexport default { classNames, url, form, array, date, css, ui, money, text, random, object, media};","import utils from \"../utils\";\nimport env from '../env';\n\nexport const isMobile = () => {\n  var width = utils.css.screenWidth()\n  return width < 768\n}\n\nexport function resourcePath(url) {\n  return utils.url.isExternalLink(url) ? url : env.resourceBase + url;\n}\n\nexport function fullUrl(url) {\n  return utils.url.isExternalLink(url) ? url : env.baseOrigin + url;\n}\n\nexport function getAlternates(path) {\n  const alternates = [];\n\n  alternates.push({ hreflang: \"en-au\", href: \"https://www.vssassoon.com.au\" + path })\n  alternates.push({ hreflang: \"en-nz\", href: \"https://www.vssassoon.co.nz\" + path })\n  alternates.push({ hreflang: \"x-default\", href: \"https://www.vssassoon.com.au\" + path })\n\n  return alternates;\n}\n\nexport function callMCPoopu() {\n  const existingScript = document.getElementById('mcjs');\n  if (!existingScript) {\n    // if (env.country == \"au\") { \n    // }\n    const script = document.createElement('script');\n    script.type = `text/javascript`;\n    script.text = `!function(c,h,i,m,p){m=c.createElement(h),p=c.getElementsByTagName(h)[0],m.async=1,m.src=i,p.parentNode.insertBefore(m,p)}(document,\"script\",\"https://chimpstatic.com/mcjs-connected/js/users/6c684a43947babf266fc13d82/719754c1d34fe6e8c82c8784b.js\");`;\n    script.id = 'mcjs';\n    document.head.appendChild(script);\n  }\n}\n\nexport const isNZ = env.locale === 'nz'","import coreUtils from '../lib/utils-core';\nimport * as site from '../site/siteUtils';\n\nexport default { ...coreUtils, site };","import facepaint from 'facepaint'\r\nimport siteConfig from '../../config';\r\n\r\nconst config = siteConfig.cssEmotion\r\nconst breakpointNames = (config && config.breakpointNames) || ['sm', 'md', 'lg', 'xl', 'xxl']\r\nconst breakpoints = (config && config.breakpoints) || [576, 768, 992, 1200, 1600]\r\n\r\nconst mq = facepaint(\r\n  breakpoints.map(bp => `@media (min-width: ${bp}px)`)\r\n)\r\n\r\nconst mqMin = {};\r\nbreakpointNames.forEach((bp, index) => mqMin[bp] = `@media (min-width: ${breakpoints[index]}px)`)\r\n\r\nconst mqMax = {};\r\nbreakpointNames.forEach((bp, index) => mqMax[bp] = `@media (max-width: ${breakpoints[index] - 1}px)`)\r\n//console.log(mqMin, mqMax)\r\n\r\nconst matches = (mediaQuery) => !!window.matchMedia(mediaQuery).matches\r\nconst isMin = {};\r\nbreakpointNames.forEach((bp, index) => isMin[bp] = () => matches(`(min-width: ${breakpoints[index]}px)`))\r\n\r\nconst isMax = {};\r\nbreakpointNames.forEach((bp, index) => isMax[bp] = () => matches(`(max-width: ${breakpoints[index] - 1}px)`))\r\n\r\nexport { mq, mqMin, mqMax, isMin, isMax }","export function overlay() {\r\n  return {\r\n    content: `''`,\r\n    position: 'absolute',\r\n    top:0,\r\n    bottom:0,\r\n    left: 0,\r\n    right: 0,\r\n    transition: 'all 0.5s'\r\n  }\r\n}","import variables from './variables'\nimport { mq, mqMin, mqMax, mixin } from '../lib/css-emotion'\n\nexport { variables, mixin, mq, mqMin, mqMax }","import utils from '../../utils';\r\nimport React from 'react';\r\nimport { hasRequiredValidator } from './validatorHelper';\r\n\r\nexport function getLabel(control, formOption) {\r\n  //console.log(label, label == null, label === null, name, label || name)\r\n  const { label, name } = control\r\n  const requiredMark = hasRequiredValidator(control) && (formOption.requiredMark || '*')\r\n  if (label === null) return \"\";\r\n  return <>\r\n    <span dangerouslySetInnerHTML={{ __html: label || utils.text.toFieldName(name) }}></span>\r\n    {requiredMark && <span className=\"req\">{requiredMark}</span>}\r\n  </>;\r\n}\r\n\r\nexport function getLabelAsString(control, formOption) {\r\n  //console.log(label, label == null, label === null, name, label || name)\r\n  const { label, name } = control\r\n  const requiredMark = hasRequiredValidator(control) && (formOption.requiredMark || '*')\r\n  if (label === null) return \"\";\r\n  \r\n  return (label || utils.text.toFieldName(name)) + (requiredMark ? requiredMark : '');\r\n}","import utils from '../../utils';\r\n\r\nexport function hasRequiredValidator(control) {\r\n  if (!control) return false;\r\n  return !!control.findValidator('required')\r\n}\r\n\r\nexport function getNameForValidator(label, name) {\r\n  return utils.text.toFieldName(label || name);\r\n}\r\n\r\nexport function getValidatorOptions(params) {\r\n  const defaultOpt = { continueToValidate: false }\r\n  return params ? { ...defaultOpt, ...params } : defaultOpt;\r\n}\r\n\r\nexport function createValidator(type, message, opt, validate) {\r\n  const validator =\r\n  {\r\n    type: type,\r\n    disabled: false,\r\n    ...getValidatorOptions(opt),\r\n    message: message,\r\n    validate: validate\r\n  }\r\n  return validator;\r\n}","export function findControl(controlNameOrIndex, root) {\r\n  if (typeof controlNameOrIndex === 'number' && root && root.controls.length > controlNameOrIndex) return root.controls[controlNameOrIndex];\r\n  return findControlTraverse(controlNameOrIndex, root);\r\n}\r\n\r\nfunction findControlTraverse(controlName, control) {\r\n  if (!control) return null;\r\n  if (control.name === controlName) return control;\r\n  if (control.controls && control.controls.length > 0) {\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      const found = findControlTraverse(controlName, control.controls[i]);\r\n      if (found) {\r\n        return found;\r\n      }\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\nexport function findControlById(id, root) {\r\n  return findControlByIdTraverse(id, root);\r\n}\r\n\r\nfunction findControlByIdTraverse(id, control) {\r\n  if (!control) return null;\r\n  if (control.id === id) return control;\r\n  if (control.controls && control.controls.length > 0) {\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      const found = findControlByIdTraverse(id, control.controls[i]);\r\n      if (found) {\r\n        return found;\r\n      }\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\nexport function getValue(root) {\r\n  //console.log(root)\r\n  return getValueTraverse(root);\r\n}\r\n\r\nconst helperFns = {\r\n  getValueTraverse: getValueTraverse,\r\n  getFilesTraverse: getFilesTraverse\r\n}\r\n\r\nfunction getKeyValueTraverse(control) {\r\n  let keyValue = {};\r\n  keyValue[control.name] = getValueTraverse(control);\r\n  return keyValue\r\n}\r\n\r\nfunction getValueTraverse(control) {\r\n  //console.log(control);\r\n  if (control.controlType === 'control') {\r\n    if (control.customValueFn)\r\n      return control.customValueFn(control, helperFns);\r\n\r\n    return control.value;\r\n  } else if (control.controlType === 'group') {\r\n    if (control.customValueFn)\r\n      return control.customValueFn(control, helperFns);\r\n\r\n    let value = {};\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      value = { ...value, ...getKeyValueTraverse(control.controls[i]) };\r\n    }\r\n    return value;\r\n  } else if (control.controlType === 'array') {\r\n    if (control.customValueFn)\r\n      return control.customValueFn(control, helperFns);\r\n\r\n    const array = [];\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      array.push(getValueTraverse(control.controls[i]))\r\n    }\r\n    return array;\r\n  }\r\n  return null;\r\n}\r\n\r\nexport function getFiles(root) {\r\n  //console.log(root)\r\n  return getFilesTraverse(root);\r\n}\r\n\r\nfunction getFilesTraverse(control) {\r\n  if (control.controlType === 'control') {\r\n    return control.files ? [{ name: control.name, files: control.files }] : [];\r\n  } else if (control.controlType === 'group') {\r\n    let files = [];\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      files.push(...getFilesTraverse(control.controls[i]));\r\n    }\r\n    return files;\r\n  } else if (control.controlType === 'array') {\r\n    let files = [];\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      files.push(...getFilesTraverse(control.controls[i]));\r\n    }\r\n    return files;\r\n  }\r\n  return [];\r\n}","//import uuid from 'uuid/v4';\r\nimport shortid from 'shortid';\r\nimport * as formModelHelper from './formModelHelper';\r\n\r\n//#region helpers\r\nfunction findIndexById(id) {\r\n  for (let i = 0; i < this.controls.length; i++) {\r\n    if (this.controls[i].id === id) return i;\r\n  }\r\n  return -1;\r\n}\r\n//#endregion\r\n\r\nconst group = (controls) => {\r\n  const controlArray = [];\r\n  //console.log('group', controls, typeof controls);\r\n  if (controls && typeof controls === 'object') {\r\n    Object.keys(controls).forEach(key => {\r\n      controlArray.push(abstractControl(key, controls[key]))\r\n    })\r\n  }\r\n\r\n  const ctrl = {\r\n    controlType: 'group',\r\n    id: shortid(),\r\n    controls: controlArray,\r\n    find: (name) => controlArray.find((x) => x.name === name),\r\n    customValueFn: null, // function\r\n    disableValidators: false\r\n  }\r\n  ctrl.getValue = () => formModelHelper.getValue(ctrl)\r\n  ctrl.controls.forEach(x => x.parent = ctrl)\r\n\r\n  return ctrl\r\n}\r\n\r\nconst array = (controls) => {\r\n  //console.log('array', controls);\r\n  const ctrl = {\r\n    controlType: 'array',\r\n    id: shortid(),\r\n    controls: controls,\r\n    findIndexById: findIndexById\r\n  }\r\n  ctrl.getValue = () => formModelHelper.getValue(ctrl)\r\n  ctrl.controls.forEach(x => x.parent = ctrl)\r\n\r\n  return ctrl\r\n}\r\n\r\nconst abstractControl = (name, controlObject) => {\r\n  //console.log('abstractControl', name, controlObject);\r\n  if (!controlObject) return null;\r\n  // array or group\r\n  if (controlObject.controlType) {\r\n    controlObject.name = name;\r\n    return controlObject;\r\n  } else {\r\n    return control(name, controlObject)\r\n  }\r\n}\r\n\r\nconst control = (name, [value, validators, controlOptions]) => {\r\n  //const { label, type, options, style } = controlOptions || {};\r\n  //console.log(value, validators, label, type, options)\r\n  return {...{\r\n    controlType: 'control',\r\n    id: shortid(),\r\n    name: name,\r\n    value: value,\r\n    validators: validators || [],\r\n    touched: false,\r\n    incomplete: false,\r\n    findValidator: (type) => (validators || []).find((x) => x.type === type),\r\n    // label: label,\r\n    // type: type,\r\n    // options: options,\r\n    // style: style\r\n  }, ...controlOptions};\r\n}\r\n\r\nexport default { group, array }","import { createValidator, getNameForValidator } from '../validatorHelper';\r\n\r\nexport function Email(message = null, opt = null) {\r\n  return createValidator('email', message, opt, function(control, e, validateOpt) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    // only validate for blur keydown tab\r\n    if (e && e.type === 'change') return null;\r\n    return !isEmpty(control.value) && !isValidEmail(control.value) ? (message || (getNameForValidator(control.label, control.name) + ' - Invalid email.')) : null\r\n  })\r\n}\r\n\r\n\r\nexport const isValidEmail = mail => {\r\n  const regex = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n  return regex.test(mail);\r\n}\r\n\r\nfunction isEmpty(val) {\r\n  if (Array.isArray(val))\r\n    return val.length === 0;\r\n  return !val && val !== 0;\r\n}\r\n","import { createValidator, getNameForValidator } from '../validatorHelper';\r\nimport utils from '../../../utils';\r\n\r\nexport function ValidateDate(message = null, opt = null) {\r\n  return createValidator('date', message, opt, function (control, e, validateOpt) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    return !isDate(control.value) ? message || getNameForValidator(control.label, control.name) + ' is invalid.' : null;\r\n  });\r\n}\r\n\r\nexport function PastDate(message = null, opt = null) {\r\n  return createValidator('past-date', message, opt, function (control, e, validateOpt) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    return !isPast(control.value) ? message || getNameForValidator(control.label, control.name) + ' is invalid.' : null;\r\n  });\r\n}\r\n\r\nexport function PastDateNullAllowed(message = null, opt = null) {\r\n  return createValidator('past-date', message, opt, function (control, e, validateOpt) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    return control.value && !isPast(control.value) ? message || getNameForValidator(control.label, control.name) + ' is invalid.' : null;\r\n  });\r\n}\r\n\r\nfunction isDate(val) {\r\n  if (val) {\r\n    const date = utils.date.toDate(val);\r\n    return !!date;\r\n  }\r\n  return false;\r\n}\r\n\r\nfunction isPast(val) {\r\n  if (val) {\r\n    const date = utils.date.toDate(val);\r\n    //console.log(date, typeof date)\r\n    if (date) {\r\n      const now = new Date();\r\n      return date.getTime() < now.getTime();\r\n    }\r\n  }\r\n  return false;\r\n}\r\n","import { createValidator, getNameForValidator } from '../validatorHelper';\r\n\r\nexport function Length(message = null, opt = null) {\r\n  return createValidator('email', message, opt, function(control, e, validateOpt, validator) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    return !isValidLength(control.value, validator) ? (message || (getNameForValidator(control.label, control.name) + ' - Invalid length.')) : null\r\n  })\r\n}\r\n\r\n\r\nexport const isValidLength = (text, validator) => {\r\n  const length = (text || '').length;\r\n  if (validator.min && length < validator.min) return false;\r\n  if (validator.max && length > validator.max) return false;\r\n  return true;\r\n}\r\n","import { Required } from './validators/required';\r\nimport { Email } from './validators/email';\r\nimport { ValidateDate, PastDate, PastDateNullAllowed } from './validators/date';\r\nimport { Length } from './validators/length';\r\n\r\nconst validateControl = (control, e, validateOpt) => {\r\n  const errors = [];\r\n  const validators = control.validators || [];\r\n  for (let i = 0; i < validators.length; i++) {\r\n    const validator = validators[i];\r\n    if (!validator.disabled) {\r\n      const error = validator.validate && validator.validate(control, e, validateOpt, validator);\r\n      if (error) {\r\n        errors.push(error);\r\n        //console.log(error, control, validator, e)\r\n\r\n        if (!validator.continueToValidate) break;\r\n      }\r\n    }\r\n  }\r\n  control.errors = errors;\r\n  return errors;\r\n};\r\n\r\nexport default {\r\n  Required,\r\n  Email,\r\n  Date: ValidateDate,\r\n  PastDate,\r\n  PastDateNullAllowed,\r\n  Length,\r\n  validateControl,\r\n};\r\n","import * as React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel, getLabelAsString } from '../formRenderHelper';\r\n\r\nfunction TextInput({ control, handleChange, formOption }) {\r\n    const { name, label, type, value, errors, style, helpText, attrs } = control;\r\n    //const { template = 'bootstrap', usePlaceholder = false } = formOption;\r\n    const fieldId = utils.random.shortId();\r\n    const { usePlaceholder = false } = formOption;\r\n    const fieldLabel = getLabel(control, formOption);\r\n    //console.log(control, formOption)\r\n    const placeHolder = usePlaceholder ? getLabelAsString(control, formOption) : null;\r\n    let valueStr = value === 0 ? 0 : (value || \"\");\r\n    if (type === 'date' && value) {\r\n        valueStr = utils.date.formatYYYYMMDD(value);\r\n    }\r\n\r\n    let prependText = null;\r\n    if (style && style.prependText) {\r\n        prependText = style.prependText\r\n    }\r\n    //console.log(name, !!(style && style.autoFocus))\r\n    //const autoFocus = !!(style && style.autoFocus)\r\n\r\n    function keyDown(e) {\r\n        //console.log(e.key)\r\n        if (e.key === \"Enter\" || e.key === 'Tab') {\r\n            handleChange(e, control)\r\n        }\r\n    }\r\n    function changed(e) {\r\n        //console.log('changed', name, e.target.value)\r\n        handleChange(e, control)\r\n    }\r\n    function blur(e) {\r\n        //console.log('blur', name, e.target.value)\r\n        handleChange(e, control)\r\n    }\r\n\r\n    // function focus(e) {\r\n    //     console.log('focus', name, e.target.value)\r\n    // }\r\n\r\n    return (\r\n        <div className={`ff ff--${type} form-group ${style && style.className}`}>\r\n            {!usePlaceholder && fieldLabel && <label htmlFor={fieldId} className=\"label\">{fieldLabel}</label>}\r\n            <div className={`ff__input ${prependText && 'input-group'}`}>\r\n                {prependText && <div className=\"input-group-prepend\">\r\n                    <div className=\"input-group-text\">{prependText}</div>\r\n                </div>\r\n                }\r\n\r\n                <input id={fieldId} name={name} type={type} value={valueStr} //onChange={(e) => handleChange(e, control)} \r\n                    // onBlur={(e) => handleChange(e, control, true)}\r\n                    onChange={changed}\r\n                    onKeyDown={keyDown}\r\n                    onBlur={blur}\r\n                    autoComplete=\"new-password\"\r\n                    //onFocus={focus}\r\n                    //autoFocus={autoFocus}\r\n                    placeholder={placeHolder}\r\n                    className={\"form-control\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs} />\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default TextInput;","import React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nfunction RadioListInput({ control, handleChange, formOption }) {\r\n    const { name, label, value, errors, style, options, helpText, attrs } = control;\r\n    const fieldId = utils.random.shortId();\r\n    const fieldLabel = getLabel(control, formOption);\r\n    return (\r\n        <div className={`ff ff--radiolist form-group ${style && style.className}`}>\r\n            {fieldLabel && <label className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input controlOptions\">\r\n                {options && options.map((option, index) =>\r\n                    <div className={`form-check ${style && style.inline && 'form-check-inline'}`} key={option.value}>\r\n                        <input className=\"form-check-input\" name={name} type=\"radio\"\r\n                            checked={checked(value, option.value)}\r\n                            onChange={(e) => handleChange(e, control)}\r\n                            value={option.value} id={fieldId + '_' + index} {...attrs} />\r\n                        <label className=\"form-check-label\" htmlFor={fieldId + '_' + index}>\r\n                            {option.name}\r\n                        </label>\r\n                        {\r\n                            (option.helpText && option.helpText !== '') &&\r\n                            <label className={`form-check-label help-text ${(option.id && option.id !== '') && option.id}`}>\r\n                                {option.helpText}\r\n                            </label>\r\n                        }\r\n                    </div>)}\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nfunction checked(value, optionValue) {\r\n    if (optionValue === null || typeof optionValue === 'undefined') return false;\r\n    return value === optionValue;\r\n}\r\n\r\nexport default RadioListInput;","import React from \"react\";\r\nimport ValidationAlert from \"../components/ValidationAlert\";\r\nimport utils from \"../../../utils\";\r\nimport { getLabel, getLabelAsString } from \"../formRenderHelper\";\r\n\r\nfunction TextareaInput({ control, handleChange, formOption }) {\r\n  const { name, label, type, value, errors, style, helpText, attrs } = control;\r\n  const fieldId = utils.random.shortId();\r\n  const fieldLabel = getLabel(control, formOption);\r\n  //const { template = 'bootstrap', usePlaceholder = false } = formOption;\r\n  const { usePlaceholder = false } = formOption;\r\n  const placeHolder = usePlaceholder\r\n    ? getLabelAsString(control, formOption)\r\n    : null;\r\n  const valueStr = value === 0 ? 0 : value || \"\";\r\n\r\n  const textAreaRef = React.useRef(null);\r\n  const [textAreaHeight, setTextAreaHeight] = React.useState(\"auto\");\r\n  const [parentHeight, setParentHeight] = React.useState(\"auto\");\r\n\r\n  React.useEffect(() => {\r\n    const disableAutoHeight = (style && style.disableAutoHeight) || false;\r\n    if (!disableAutoHeight) {\r\n      if (textAreaRef.current) {\r\n        const h =\r\n          textAreaRef.current.scrollHeight > 60\r\n            ? textAreaRef.current.scrollHeight\r\n            : 60;\r\n        setParentHeight(`${h}px`);\r\n        setTextAreaHeight(`${h}px`);\r\n      }\r\n    }\r\n  }, [valueStr, style]);\r\n\r\n  function onChangeInternal(e) {\r\n    const disableAutoHeight = (style && style.disableAutoHeight) || false;\r\n    if (!disableAutoHeight) {\r\n      setTextAreaHeight(\"auto\");\r\n      if (textAreaRef.current) {\r\n        const h =\r\n          textAreaRef.current.scrollHeight > 60\r\n            ? textAreaRef.current.scrollHeight\r\n            : 60;\r\n        setParentHeight(`${h}px`);\r\n      }\r\n    }\r\n    handleChange(e, control);\r\n  }\r\n\r\n  return (\r\n    <div className={`ff ff--textarea form-group ${style && style.className}`}>\r\n      {!usePlaceholder && fieldLabel && (\r\n        <label htmlFor={fieldId} className=\"label\">\r\n          {fieldLabel}\r\n        </label>\r\n      )}\r\n      <div className=\"ff__input\" style={{ minHeight: parentHeight }}>\r\n        <textarea\r\n          id={fieldId}\r\n          name={name}\r\n          value={valueStr}\r\n          type={type}\r\n          onChange={onChangeInternal}\r\n          placeholder={placeHolder}\r\n          rows={style && style.rows}\r\n          ref={textAreaRef}\r\n          style={{ height: textAreaHeight }}\r\n          className={\r\n            \"form-control\" + (errors && errors.length > 0 ? \" is-invalid\" : \"\")\r\n          }\r\n          {...attrs}\r\n        ></textarea>\r\n      </div>\r\n      {helpText && (\r\n        <div\r\n          className=\"ff__help\"\r\n          dangerouslySetInnerHTML={{ __html: helpText }}\r\n        ></div>\r\n      )}\r\n      <ValidationAlert errors={errors} />\r\n    </div>\r\n  );\r\n}\r\n\r\nexport default TextareaInput;\r\n","import React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nconst CheckboxListInput = ({ control, handleChange, formOption }) => {\r\n    const { name, label, value, errors, style, options, helpText, attrs } = control;\r\n    const fieldId = utils.random.shortId();\r\n    const fieldLabel = getLabel(control, formOption);\r\n    const values = value ? [...value] : [];\r\n    return (\r\n        <div className={`ff ff--checkbox form-group ${style && style.className}`}>\r\n            {fieldLabel && <label className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input\">\r\n                <div className=\"controlOptions\">\r\n                    {options && options.map((option, index) =>\r\n                        <div className={`form-check ${style && style.inline && 'form-check-inline'}`} key={option.value} >\r\n                            <input className=\"form-check-input\" name={name} type=\"checkbox\"\r\n                                checked={checked(values, option.value)}\r\n                                onChange={(e) => handleChange(e, control)}\r\n                                value={option.value} id={fieldId + '_' + index} {...attrs}/>\r\n                            <label className=\"form-check-label\" htmlFor={fieldId + '_' + index}>\r\n                                {option.name}\r\n                            </label>\r\n                        </div>)}\r\n\r\n                </div>\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nfunction checked(values, value) {\r\n    if (value === null || typeof value === 'undefined') return false;\r\n    return values.includes(value);\r\n}\r\n\r\nexport default CheckboxListInput;","import * as React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nfunction DateSeparateInput({ control, handleChange, formOption }) {\r\n    //const { name, label, value, errors, style } = control;\r\n    const { name, label, errors, style, helpText, attrs } = control;\r\n    const thisYear = (new Date()).getFullYear();\r\n    //console.log(name, value)\r\n    const [year, setYear] = React.useState('')\r\n    const [month, setMonth] = React.useState('')\r\n    const [day, setDay] = React.useState('')\r\n\r\n    //const { template = 'bootstrap', usePlaceholder = false } = formOption;\r\n    const fieldId = utils.random.shortId();\r\n    const { usePlaceholder = false } = formOption;\r\n    const fieldLabel = getLabel(control, formOption);\r\n    //console.log(label, name + '|'+ fieldLabel)\r\n    //const placeHolder = usePlaceholder ? fieldLabel : null;\r\n    // let valueStr = value === 0 ? 0 : (value || \"\");\r\n    // if (type === 'date' && value) {\r\n    //     valueStr = utils.date.formatYYYYMMDD(value);\r\n    // }\r\n\r\n    function handleChangeDay(e) {\r\n        setDay(e.target.value)\r\n        handleChangeInner(year, month, e.target.value)\r\n    }\r\n\r\n    function handleChangeMonth(e) {\r\n        setMonth(e.target.value)\r\n        handleChangeInner(year, e.target.value, day)\r\n    }\r\n\r\n    function handleChangeYear(e) {\r\n        setYear(e.target.value)\r\n        handleChangeInner(e.target.value, month, day)\r\n    }\r\n\r\n    function handleChangeInner(yyyy, mm, dd) {\r\n        control.incomplete = !(yyyy !== '' && mm !== '' && dd !== '')\r\n        const newVal = yyyy + '-' + mm + '-' + dd;\r\n        //console.log(newVal)\r\n        //mimic event\r\n        handleChange({\r\n            persist: () => { },\r\n            target: { name: name, value: newVal, checked: false }\r\n        }, control)\r\n    }\r\n\r\n    //const monthsFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\r\n    const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n    const selectStyle = { width: 'auto', display: 'inline-block', marginRight: '0.5em' };\r\n\r\n    const fromYear = style && style.recentYear ? thisYear : thisYear - 10;\r\n    const recentYear = style && style.recentYear ? style.recentYear : 100;\r\n    return (\r\n        <div className=\"ff ff--dateSeperate form-group\">\r\n            {!usePlaceholder && fieldLabel && <label htmlFor={fieldId} className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input\">\r\n                <select style={selectStyle} id={`day_${fieldId}`} value={day} onChange={(e) => handleChangeDay(e)}\r\n                    className={\"form-control\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs}>\r\n                    <option value=''>Day</option>\r\n                    {[...Array(31).keys()].map(i => i + 1).map(d => <option key={d} value={d}>{d}</option>)}\r\n                </select>\r\n                <select style={selectStyle} id={`month_${fieldId}`} value={month} onChange={(e) => handleChangeMonth(e)}\r\n                    className={\"form-control\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs}>\r\n                    <option value=''>Month</option>\r\n                    {[...Array(12).keys()].map(m => <option key={m} value={m + 1}>{months[m]}</option>)}\r\n                </select>\r\n                <select style={selectStyle} id={`year_${fieldId}`} value={year} onChange={(e) => handleChangeYear(e)}\r\n                    className={\"form-control\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs}>\r\n                    <option value=''>Year</option>\r\n                    {[...Array(recentYear).keys()].map(y => fromYear - y).map(y => <option key={y} value={y}>{y}</option>)}\r\n                </select>\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default DateSeparateInput;","import * as React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nfunction FileInput({ control, handleChange, formOption }) {\r\n    const { name, label, type, value, errors, style, helpText, attrs } = control;\r\n    //const { template = 'bootstrap', usePlaceholder = false } = formOption;\r\n    const fieldId = utils.random.shortId();\r\n    const { usePlaceholder = false } = formOption;\r\n    const fieldLabel = getLabel(control, formOption);\r\n    //console.log(label, control)\r\n    const placeHolder = usePlaceholder ? fieldLabel : null;\r\n    let valueStr = value === 0 ? 0 : (value || \"\");\r\n    if (type === 'date' && value) {\r\n        valueStr = utils.date.formatYYYYMMDD(value);\r\n    }\r\n    return (\r\n        <div className={`ff ff--file form-group ${style && style.className}`}>\r\n            {!usePlaceholder && fieldLabel && <label htmlFor={fieldId} className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input\">\r\n                <input style={{display: 'none'}} id={fieldId} name={name} type='file' value={valueStr} onChange={(e) => handleChange(e, control)} onBlur={(e) => handleChange(e, control)}\r\n                    placeholder={placeHolder}\r\n                    className={\"form-control-file\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs}/>\r\n                <div className='choose-file-container'>\r\n                    <label htmlFor={fieldId} className='choose-file-label'> CHOOSE FILE </label>\r\n                    <div className='file__attach__text'> \r\n                        { valueStr === '' ? 'No File Chosen' : valueStr.replace(/^.*\\\\/, \"\")}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default FileInput;","import TextInput from './TextInput';\r\nimport RadioListInput from './RadioListInput';\r\nimport TextareaInput from './TextareaInput';\r\nimport CheckboxInput from './CheckboxInput';\r\nimport CheckboxListInput from './CheckboxListInput';\r\nimport SelectInput from './SelectInput';\r\nimport HiddenInput from './HiddenInput';\r\n//import HtmlInput from './HtmlInput';\r\nimport DateSeparateInput from './DateSeparateInput';\r\nimport FileInput from './FileInput';\r\n\r\nconst Components = { TextInput, RadioListInput, TextareaInput, CheckboxInput, CheckboxListInput, SelectInput, HiddenInput, DateSeparateInput, FileInput };\r\n\r\nconst capitalize = expression => expression.charAt(0).toUpperCase() + expression.slice(1);\r\n\r\nexport function getControl(control, formOption) {\r\n  let Component = null;\r\n  if (control.type === 'number' || control.type === 'email' || control.type === 'date' || control.type === 'password' || control.type === 'tel')\r\n    Component = TextInput;\r\n  else if (control.type === \"dob\")\r\n    Component = DateSeparateInput;\r\n  else\r\n    Component = Components[capitalize(control.type || '') + 'Input'];\r\n\r\n  return Component;\r\n}\r\n\r\n","import React from \"react\";\r\nimport ValidationAlert from \"../components/ValidationAlert\";\r\nimport utils from \"../../../utils\";\r\nimport { getLabel } from \"../formRenderHelper\";\r\nimport { SiteLink } from \"../../../components\";\r\n\r\nconst CheckboxInput = ({ control, handleChange, formOption }) => {\r\n  const {\r\n    name,\r\n    label,\r\n    type,\r\n    value,\r\n    errors,\r\n    style,\r\n    helpText,\r\n    attrs,\r\n    link,\r\n    linkText,\r\n  } = control;\r\n  const fieldId = utils.random.shortId();\r\n  const fieldLabel = getLabel(control, formOption);\r\n  return (\r\n    <div className={`form-group form-check ${style && style.className}`}>\r\n      <input\r\n        id={fieldId}\r\n        name={name}\r\n        type={type}\r\n        value={value || \"\"}\r\n        checked={value || false}\r\n        onChange={(e) => handleChange(e, control)}\r\n        className={\"form-check-input\"}\r\n        {...attrs}\r\n      />\r\n      <label htmlFor={fieldId} className=\"form-check-label\">\r\n        {fieldLabel}\r\n        {link &&\r\n          link !== \"\" &&\r\n          linkText &&\r\n          linkText !== \"\" &&\r\n          (link.includes(\".pdf\") ? (\r\n            <a href={link} className=\"checkbox_link_text\">\r\n              {\" \"}\r\n              {linkText}{\" \"}\r\n            </a>\r\n          ) : (\r\n            <SiteLink to={link} className=\"checkbox_link_text\">\r\n              {\" \"}\r\n              {linkText}{\" \"}\r\n            </SiteLink>\r\n          ))}\r\n      </label>\r\n\r\n      {helpText && (\r\n        <div\r\n          className=\"ff__help\"\r\n          dangerouslySetInnerHTML={{ __html: helpText }}\r\n        ></div>\r\n      )}\r\n      <ValidationAlert errors={errors} />\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default CheckboxInput;\r\n","import React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nfunction SelectInput({ control, handleChange, formOption }) {\r\n    const { name, label, type, value, errors, style, options, helpText, attrs } = control;\r\n    const fieldId = utils.random.shortId();\r\n    const fieldLabel = getLabel(control, formOption);\r\n    //console.log(value, typeof value)\r\n    return (\r\n        <div className={`ff ff--select form-group ${style && style.className}`}>\r\n            {fieldLabel && <label htmlFor={fieldId} className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input\">\r\n                <select id={fieldId} name={name} type={type} value={value === null? '' : value } onChange={(e) => handleChange(e, control)}\r\n                    className={\"form-control\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs}>\r\n                    {options && options.map(option => <option key={option.value} value={option.value} disabled={!!option.disabled}>{option.name}</option>)}\r\n                </select>\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default SelectInput;\r\n\r\n","import * as React from 'react';\r\nimport utils from '../../../utils';\r\n\r\nfunction TextInput({ control, handleChange, formOption }) {\r\n    const { name, value } = control;\r\n    const fieldId = utils.random.shortId();\r\n    let valueStr = value === 0 ? 0 : (value || \"\");\r\n\r\n\r\n    return (\r\n        <input id={fieldId} name={name} type=\"hidden\" value={valueStr} />\r\n    )\r\n}\r\n\r\nexport default TextInput;","import React from 'react';\r\nimport * as formModelHelper from './formModelHelper';\r\nimport { getControl } from './controls';\r\nimport { getSiteControl } from '../../form';\r\n\r\nexport function renderControlDirect(control, handleChange, formOption) {\r\n  if (control === null) return null;\r\n  let Component = getSiteControl(control, formOption) || getControl(control, formOption);\r\n  if (!Component) return control.value;\r\n  return <Component key={control.name} control={control} handleChange={handleChange} formOption={formOption} />;\r\n}\r\n\r\n\r\nexport function renderControl(formRoot, nameOrIndex, handleChange, formOption) {\r\n  //console.log(formRoot, name);\r\n  const control = formModelHelper.findControl(nameOrIndex, formRoot);\r\n  //console.log(control, formRoot, name, handleChange, formOption)\r\n  if (control) {\r\n    return renderControlDirect(control, handleChange, formOption);\r\n  }\r\n}\r\n\r\nexport default { renderControl, renderControlDirect }","import validators from './validators';\r\n\r\nexport function validate(root, validateOpt = {}) {\r\n  //console.log({...{ triggeredByChange: false }, ...validateOpt})\r\n  //console.log(root, validateOpt)\r\n  const errors = validateTraverse(root, {...{ triggeredByChange: false }, ...validateOpt});\r\n  return errors;\r\n}\r\n\r\nfunction validateTraverse(control, validateOpt) {\r\n  if (!control) return [];\r\n  //console.log(!!control.disableValidators, control)\r\n  if (!!control.disableValidators) { control.errors =[]; return []; }\r\n  const errors = [];\r\n  const errorsFromControl = validators.validateControl(control, null, validateOpt);\r\n  errors.push(...errorsFromControl);\r\n  //console.log(errorsFromControl, errors)\r\n  if (control.controls && control.controls.length > 0) {\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      const errorsFromSub = validateTraverse(control.controls[i], validateOpt);\r\n      errors.push(...errorsFromSub);\r\n    }\r\n  }\r\n  control.errors = errors;\r\n  return errors;\r\n}\r\n\r\n","import { useState } from 'react';\r\nimport controlRenderer from './controlRenderer';\r\nimport * as formModelHelper from './formModelHelper';\r\nimport * as formValidate from './formValidate';\r\nimport validators from './validators';\r\n\r\nconst useForm = (initialFormModel, option) => {\r\n  const [formModel, setFormModel] = useState(initialFormModel);\r\n  const formOption = {\r\n    ...{\r\n      template: 'bootstrap',\r\n      usePlaceholder: false,\r\n      requiredMark: '*',\r\n      onControlChanged: null\r\n    }, ...option\r\n  };\r\n\r\n  const handleChange = (e, controlFromEvent) => {\r\n    e.persist();\r\n    const control = controlFromEvent || formModelHelper.findControl(e.target.name, formModel);\r\n    //console.log(control)\r\n    // const control = controlId? formModelHelper.findControlById(controlId, formModel)\r\n    //   : formModelHelper.findControl(e.target.name, formModel);\r\n    if (!control) return;\r\n\r\n    //console.log(control.value, e.target)\r\n    control.touched = true;\r\n    control.value = getControlValue(control, e.target);\r\n    if (control.type === 'file') {\r\n      control.files = e.target.files\r\n    }\r\n\r\n    // parseInput(control);\r\n    if (control.onBeforeUpdateValue) {\r\n      control.onBeforeUpdateValue(control, formModel)\r\n    }\r\n\r\n    validators.validateControl(control, e, { triggeredByChange: true });\r\n    setFormModel({ ...formModel });\r\n\r\n    if (formOption.onControlChanged) {\r\n      formOption.onControlChanged(e, control)\r\n    }\r\n  };\r\n\r\n  const validateForm = (e, successHandler, errorHandler) => {\r\n    validateGroup(formModel, e, successHandler, errorHandler)\r\n  };\r\n\r\n  const validateGroup = (control, e, successHandler, errorHandler) => {\r\n    e && e.preventDefault();\r\n    const errors = formValidate.validate(control);\r\n\r\n    if (errors.length === 0) successHandler && successHandler();\r\n    else {\r\n      setFormModel({ ...formModel });\r\n      errorHandler && errorHandler(errors)\r\n    }\r\n  };\r\n\r\n  const reset = (model) => setFormModel(model ? { ...model } : { ...formModel });\r\n\r\n  // const parseInput = input => input.value = input.parseFun ? input.parseFun(input.value) : input.value;\r\n\r\n  const renderControl = (name, formRoot) => controlRenderer.renderControl(formRoot || formModel, name, handleChange, formOption);\r\n  const renderControlDirect = (control) => controlRenderer.renderControlDirect(control, handleChange, formOption);\r\n\r\n  const getValue = (formRoot) => formModelHelper.getValue(formRoot || formModel);\r\n\r\n  const getFiles = (formRoot) => formModelHelper.getFiles(formRoot || formModel);\r\n\r\n  const findControl = (name, formRoot) => {\r\n    const control = formModelHelper.findControl(name, formRoot || formModel);\r\n    return control;\r\n  }\r\n  //return [controls, handleChange, handleSubmit, getValue]\r\n  return {\r\n    model: formModel,\r\n    errors: formModel.errors,\r\n    reset: reset,\r\n    renderControl: renderControl,\r\n    renderControlDirect: renderControlDirect,\r\n    findControl: findControl,\r\n    validateForm: validateForm,\r\n    validateGroup: validateGroup,\r\n    getValue: getValue,\r\n    getFiles: getFiles\r\n  }\r\n};\r\n\r\nfunction getControlValue(control, el) {\r\n  //console.log(control, el)\r\n  if (control.type === 'checkboxList') {\r\n    const options = el.closest('.controlOptions');\r\n    if (options) {\r\n      return [...options.querySelectorAll('input:checked')].map(x => x.value)\r\n    }\r\n    return [];\r\n  }\r\n  else if (control.type === 'radioList') {\r\n    const options = el.closest('.controlOptions');\r\n    if (options) {\r\n      const val = [...options.querySelectorAll('input:checked')].map(x => x.value)\r\n      return val && val.length > 0 ? val[0] : null\r\n    }\r\n    return null;\r\n  }\r\n  return control.type === 'checkbox' ? el.checked : el.value;\r\n}\r\n\r\nexport { useForm };","import fb from './formBuilder';\r\nimport validators from './validators';\r\nimport * as formModelHelper from './formModelHelper';\r\nimport * as formRenderHelper from './formRenderHelper';\r\nimport * as validatorHelper from './validatorHelper';\r\n\r\nexport { useForm } from './useForm';\r\nexport { useStep } from './useStep';\r\nexport { fb, validators, validatorHelper, formModelHelper, formRenderHelper }","const initialState = {\r\n  page: null,\r\n  menu: null,\r\n  popup: null,\r\n  history: null\r\n};\r\n\r\nconst reducer = (state = initialState, action) => {\r\n  //console.log('reducer', action)\r\n  switch (action.type) {\r\n    case 'SET_PAGE':\r\n      return {\r\n        ...state,\r\n        page: action.payload\r\n      };\r\n    case 'SET_MENU':\r\n      return {\r\n        ...state,\r\n        menu: action.payload\r\n      };\r\n    case 'SET_POPUP':\r\n      return {\r\n        ...state,\r\n        popup: action.payload\r\n      };\r\n    case 'SET_HISTORY':\r\n      return {\r\n        ...state,\r\n        history: action.payload\r\n      };\r\n    case 'SET_STATE':\r\n      return {\r\n        ...state,\r\n        ...action.payload\r\n      };\r\n    default:\r\n      throw new Error(\"Unexpected action\");\r\n  }\r\n};\r\n\r\nexport { initialState, reducer };","import React, { createContext, useReducer, useContext, useEffect } from 'react';\r\nimport { initialState, reducer } from '../../store';\r\n\r\nconst StoreContext = createContext(initialState);\r\n\r\nconst StoreProvider = ({ children }) => {\r\n  // Get state and dispatch from Reacts new API useReducer. \r\n  const [state, dispatch] = useReducer(reducer, initialState);\r\n  //console.log('StoreProvider')\r\n  // Log new state\r\n  useEffect(() => {\r\n    //console.log('-- new state', state);\r\n    //console.trace();\r\n  }, [state]);\r\n  // Render state, dispatch and special case actions\r\n  return (\r\n    <StoreContext.Provider value={{ state, dispatch }}>\r\n      {children}\r\n    </StoreContext.Provider>\r\n  );\r\n};\r\nexport { StoreContext, StoreProvider };\r\n\r\nexport const useStore = () => useContext(StoreContext);","export { initialState, reducer } from '../lib/store/reducers';\nexport { StoreContext, StoreProvider, useStore } from '../lib/store';","import React from 'react';\r\n\r\nconst ValidationAlert = ({ errors }) => {\r\n    if (!errors || errors.length === 0) return null;\r\n    return <div className=\"invalid\" role=\"alert\" dangerouslySetInnerHTML={{ __html: errors.join('<br/>') }}></div>\r\n}\r\n\r\nexport default ValidationAlert;","import React from \"react\";\nimport { useRouter } from \"../../components\";\n\nexport function SearchBar2() {\n  const [keyword, setKeyword] = React.useState(\"\");\n  const { navigate } = useRouter();\n  function search(e) {\n    e.preventDefault();\n    navigate(\"/search-results?q=\" + encodeURIComponent(keyword));\n  }\n  function onChange(e) {\n    setKeyword(e.target.value);\n  }\n  return (\n    <form className='searchBar searchBar2' onSubmit={(e) => search(e)}>\n      <input\n        type='text'\n        className='searchBar__input searchBar__input2'\n        placeholder='SEARCH'\n        value={keyword}\n        onChange={onChange}\n      ></input>\n    </form>\n  );\n}\n","import { SearchBar2 } from \"layout/topHeader/searchBar2\";\nimport React from \"react\";\n\nexport function NotFound(props) {\n  const debugInfo = props.debugInfo;\n\n  return (\n    <div className='error-panel'>\n      <div className='container'>\n        <h1>Oops!</h1>\n        <p>It looks like we couldn't find the page you're looking for!</p>\n        <p>\n          Try searching below, or head to our <a href='/'>homepage</a>.\n        </p>\n        <SearchBar2 />\n        {debugInfo && (\n          <pre\n            style={{\n              marginTop: \"3rem\",\n              color: \"chocolate\",\n              fontSize: \"0.7rem\",\n            }}\n          >\n            Error message: {debugInfo.pageUrl} - {debugInfo.loadFrom}{\" \"}\n          </pre>\n        )}\n      </div>\n    </div>\n  );\n}\n","import React from 'react';\r\nimport env from '../../env';\r\nimport { enableForceUpdate, disableForceUpdate } from '../service-worker/swHelper';\r\n\r\nexport function AppVersion(props) {\r\n\r\n  const [checkStatus, setCheckStatus] = React.useState('idle')\r\n  //const [secs, setSecs] = React.useState(10)\r\n  const ver = env.ver;\r\n  const updateDate = env.updateDate;\r\n\r\n  React.useEffect(() => {\r\n    console.log(checkStatus);\r\n    let timer = null;\r\n    if (checkStatus === 'checking') {\r\n      if (typeof window !== `undefined`) {\r\n        enableForceUpdate();\r\n        window.updateSW().then(function () {\r\n          console.log('sw update called');\r\n          setCheckStatus('checked')\r\n\r\n          setTimeout(() => {\r\n            console.log('timer called');\r\n            disableForceUpdate();\r\n            window.location.reload()\r\n          }, 4000)\r\n        })\r\n      }\r\n      // console.log('timer set');\r\n      // let timer = setTimeout(() => {\r\n      //   console.log('timer called');\r\n      //   if (typeof window !== `undefined`) {\r\n      //     window.location.reload()\r\n      //   }\r\n      // }, 5000)\r\n      return () => { console.log('timer clear', timer); if (timer) clearTimeout(timer) }\r\n    }\r\n  }, [checkStatus])\r\n\r\n  function checkUpdates(e) {\r\n    if (typeof window !== `undefined`) {\r\n      if (window.updateSW) {\r\n        setCheckStatus('checking')\r\n      } else {\r\n        window.location.reload();\r\n      }\r\n    }\r\n  }\r\n\r\n  function refreshApp(e) {\r\n    if (typeof window !== `undefined`) {\r\n      window.location.reload();\r\n    }\r\n  }\r\n\r\n  let button = null\r\n  if (checkStatus === 'checking') {\r\n    button = <button className=\"btn btn-primary\" type=\"button\">Checking App Version...</button>;\r\n  } else if (checkStatus === 'checked') {\r\n    button = <><button className=\"btn btn-primary\" type=\"button\" onClick={refreshApp}>Reloading App...</button> <div>(If this does't reload automatically, please click the above button)</div></>;\r\n  } else {\r\n    button = <button className=\"btn btn-primary\" type=\"button\" onClick={checkUpdates}>Update App (Refresh)</button>;\r\n  }\r\n\r\n  return (\r\n    <div className=\"appInfo htmlPanel\">\r\n      <div className=\"appInfo__ver\">\r\n        <b>Version</b>: {ver} ({updateDate})\r\n      </div>\r\n      <div style={{ marginTop: '1rem' }}>\r\n        {button}\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\nexport function AppVersionPage(props) {\r\n  return (\r\n    <div style={{ margin: '5rem auto', width: '900px' }}>\r\n      <AppVersion />\r\n    </div>);\r\n}","import React from 'react';\n\nexport function Button({onClick, status, children, btnStyle='primary', className}) {\n  let buttonStyle = 'btn-' + btnStyle;\n  return (\n    <button className={`btn ${buttonStyle} ${className}`} onClick={onClick} type=\"button\" disabled={status === 'pending'}>\n      {status === 'pending' && <span className=\"spinner-grow spinner-grow-sm\" role=\"status\" aria-hidden=\"true\"></span>}\n      {children}\n    </button>\n  );\n}","import React from 'react';\r\n\r\nexport const ErrorMessage = ({ errors, summaryMessage = null }) => {\r\n  if (!errors) return null;\r\n  if (typeof errors.length !== 'undefined' && errors.length === 0) return null;\r\n\r\n  if (summaryMessage)\r\n    return (\r\n      <div className='error' role='alert'>\r\n        {summaryMessage}\r\n      </div>\r\n    );\r\n  let message = errors;\r\n  if (Array.isArray(errors)) {\r\n    if (errors.length === 0) return null;\r\n    message = errors.map((error, index) => <div key={index}>{error}</div>);\r\n  }\r\n\r\n  return (\r\n    <div className='error' role='alert'>\r\n      {message}\r\n    </div>\r\n  );\r\n};\r\n","//import React from 'react';\r\n/** @jsx jsx */\r\nimport { css, jsx } from '@emotion/core'\r\n\r\nexport const ErrorPopup = (props) => {\r\n  const title = props.title || 'Errors';\r\n  const errors = props.errors;\r\n  let messages = [];\r\n  if (errors) {\r\n    if (Array.isArray(errors)) {\r\n      messages = errors;\r\n    } else {\r\n      messages.push(errors);\r\n    }\r\n  }\r\n\r\n  const style = css({\r\n    position: 'fixed',\r\n    padding: '3rem',\r\n    width: '800px',\r\n    maxWidth: '90vw',\r\n    maxHeight: '90vw',\r\n    background: 'white',\r\n    color: 'red',\r\n    top: '50%',\r\n    left: '50%',\r\n    transform: 'translate(-50%, -50%)',\r\n    zIndex: '1000'\r\n  })\r\n\r\n  return <div css={style}>\r\n    <h3>{title}</h3>\r\n    {props.children}\r\n    {messages.map((error, inx) => (\r\n      <div key={inx} dangerouslySetInnerHTML={{ __html: error }}></div>\r\n    ))}\r\n    \r\n  </div>\r\n}\r\n","import React from 'react';\r\n//import LoadingIcon from 'loading.svg';\r\n\r\nexport function Loading(props) {\r\n  const [loaded, setLoaded] = React.useState(false);\r\n  //console.log('loading', loaded)\r\n  React.useEffect(() => {\r\n    //console.log('loaded')\r\n    setLoaded(true);\r\n  }, [])\r\n  return <div className={`sectionLoading ${loaded ? 'loaded' : '' }`}>\r\n    <img src=\"/assets/loading.svg\" alt=\"Loading ...\" />\r\n    {/* <img src={LoadingIcon} alt=\"Loading ...\" /> */}\r\n  </div>\r\n}","import { useState, useEffect } from 'react';\r\nimport utils from '../../utils';\r\nimport siteConfig from '../../config';\r\n\r\nexport function useApi(fn) {\r\n  //console.log('useApi')\r\n  const [response, setResponse] = useState({});\r\n  const [errors, setErrors] = useState([]);\r\n  const [status, setStatus] = useState('ready');\r\n  const [request, setRequest] = useState(null);\r\n\r\n  useEffect(() => {\r\n    if (!request) return;\r\n\r\n    //console.log('fetch now')\r\n    setResponse(null);\r\n    setErrors([]);\r\n    setStatus('ready');\r\n\r\n    const fetchData = async () => {\r\n      setStatus('pending');\r\n      try {\r\n        //console.log(request);\r\n        const options = request.options || {}\r\n        siteConfig.apiNetJwt && await siteConfig.apiNetJwt(options);\r\n\r\n        const res = await fetch(request.url, options);\r\n        //console.log(res);\r\n\r\n        if (!res.ok) {\r\n          try {\r\n            const json = await res.json();\r\n            console.log(json);\r\n\r\n            if (json.message) {\r\n              setErrors([json.message]);\r\n              setStatus('error')\r\n              return;\r\n            }\r\n          } catch (e) { }\r\n\r\n          const statusText = res.status === 401 ? 'Permission denied. Please login first.' : res.statusText\r\n          setErrors(['Error - [' + res.status + ']' + (statusText && (' - ' + statusText))]);\r\n          setStatus('error')\r\n          return;\r\n        }\r\n\r\n        //const json = await res.json();\r\n        const text = await res.text();\r\n        const json = text && text.length ? JSON.parse(text) : null;\r\n        //console.log(json);\r\n\r\n        // check if ajax result from c#\r\n        if (json && json.errors && json.errors.length > 0) {\r\n          setErrors(utils.form.getErrors(json));\r\n          setStatus('error')\r\n          return;\r\n        }\r\n\r\n        setResponse(json);\r\n        setStatus('done')\r\n      } catch (err) {\r\n        //console.log(error, error.toString(), typeof error, JSON.stringify(error))\r\n        setErrors([err.toString()]);\r\n        setStatus('error')\r\n      }\r\n    };\r\n    fetchData();\r\n  }, [request]);\r\n\r\n  const containsErrorMessage = (msg) => {\r\n    const finding = (msg || '').toLowerCase()\r\n    return errors.some(x => (x || '').toLowerCase().indexOf(finding) >= 0)\r\n  }\r\n\r\n  //return [ response, error, status, (...args) => setRequest(fn(...args)) ];\r\n  return {\r\n    request: request,\r\n    response: response,\r\n    errors: errors,\r\n    status: status,\r\n    hasErrors: () => status === 'error',\r\n    containsErrorMessage: containsErrorMessage,\r\n    addErrors: (errs) => {\r\n      setErrors(...errors, ...errs)\r\n      setStatus('error')\r\n    },\r\n    done: () => status === 'done',\r\n    send: (...args) => { setStatus('ready'); setRequest(fn(...args)) },\r\n    sendRaw: (httpOptionFn, ...args) => { setStatus('ready'); setRequest(httpOptionFn(...args)) },\r\n    setResult: (json) => { setResponse(json); setStatus('done') },\r\n    reset: () => {\r\n      setStatus('ready');\r\n      setErrors([]);\r\n    }\r\n  };\r\n}\r\n\r\nexport function usePost() {\r\n  const formDataFn = (url, data, options = {}) =>\r\n    ({\r\n      url: url,\r\n      options: {\r\n        ...options,\r\n        method: 'POST',\r\n        body: data // FormData\r\n      }\r\n    });\r\n  const post = useApi((url, data, options = {}) =>\r\n    ({\r\n      url: url,\r\n      options: {\r\n        ...options,\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application/json' },\r\n        body: JSON.stringify(data)\r\n      }\r\n    })\r\n  );\r\n  return {\r\n    ...post,\r\n    loading: () => post.status === 'ready' || post.status === 'pending',\r\n    sending: () => post.status === 'pending',\r\n    sendFormData: (...args) => post.sendRaw(formDataFn, ...args)\r\n  }\r\n}\r\n\r\nexport function useGet() {\r\n  const get = useApi((url, options = {}) =>\r\n    ({\r\n      url: url,\r\n      options: {\r\n        ...options,\r\n        method: 'GET'\r\n      }\r\n    })\r\n  );\r\n  return {\r\n    ...get,\r\n    loading: () => get.status === 'ready' || get.status === 'pending'\r\n  }\r\n}\r\n\r\n//https://medium.com/@jaryd_34198/seamless-api-requests-with-react-hooks-part-2-3ab42ba6ad5c","import React from 'react';\r\nimport env from '../../env';\r\n\r\nexport function MediaQueryStatus(props) {\r\n  return (\r\n    <div className=\"devMediaQueryStatus\" style={{display: env.isProd ? 'none' : 'block'}}>\r\n      <div className=\"devMediaQueryStatus__current\"></div>\r\n    </div>\r\n  );\r\n}\r\n","import React from 'react';\r\nimport { Helmet } from 'react-helmet-async';\r\n\r\nexport function MetaTag({ data: seoData }) {\r\n  //console.log(seoData)\r\n  const data = Object.assign({}, {\r\n    title: ''\r\n  }, seoData)\r\n\r\n  return (<>\r\n    <Helmet>\r\n      <title>{data.title}</title>\r\n      {data.description && <meta name=\"description\" content={data.description} /> }\r\n      {data.keywords && <meta name=\"keywords\" content={data.keywords} /> }\r\n      {data.language && <meta name=\"language\" content={data.language} /> }\r\n      {data.country && <meta name=\"country\" content={data.country} /> }\r\n      {\r\n        (data.faceBookDomainVerifi && data.faceBookDomainVerifi !== '') &&\r\n        <meta name=\"facebook-domain-verification\" content={data.faceBookDomainVerifi} />\r\n      }\r\n      <meta name=\"twitter:card\" content={!data.heroImageUrl ? \"summary\" : \"summary_large_image\"} />\r\n      <meta name=\"twitter:site\" content={data.siteName} />\r\n      <meta name=\"twitter:title\" content={data.title} />\r\n      {data.description && <meta name=\"twitter:description\" content={data.description} /> }\r\n      {data.heroImageUrl && <meta name=\"twitter:image\" content={data.heroImageUrl} /> }\r\n\r\n      <meta name=\"og:title\" content={data.title} />\r\n      <meta name=\"og:site_name\" content={data.siteName} />\r\n      <meta name=\"og:url\" content={data.url} />\r\n      {data.description && <meta name=\"og:description\" content={data.description} /> }\r\n      {data.heroImageUrl && <meta name=\"og:image\" content={data.heroImageUrl} /> }\r\n\r\n\r\n      <link rel=\"canonical\" href={data.canonical || data.url} />\r\n\r\n      {(data.alternates || []).map((x, index) => <link rel=\"alternate\" key={index} hreflang={x.hreflang} href={x.href} />  )}\r\n\r\n    </Helmet>\r\n  </>)\r\n}\r\n\r\n\r\n// function MetaContent({ name, content }) {\r\n//   console.log(name, content)\r\n//   if (!content) return null;\r\n//   return <Helmet><meta name={name} content={content}></meta></Helmet>\r\n// }\r\n\r\n","import env from '../../env';\r\n\r\nexport const pageView = (url) => {\r\n  if (process.env.NODE_ENV === 'development') {\r\n    console.warn(`Tracking is deprecated.`, `Use seperate tracking helper instead`);\r\n  }\r\n  if (hasGTM()) gtmPageView(url)\r\n  if (hasGtag()) gaPageView(url)\r\n  if (hasFBPixel()) fbPageView(url)\r\n}\r\n\r\nexport const sendFormEvent = (formName, params) => {\r\n  if (process.env.NODE_ENV === 'development') {\r\n    console.warn(`Tracking is deprecated.`, `Use seperate tracking helper instead`);\r\n  }\r\n  const p = Object.assign({ 'gtm.elementId': formName }, params || {})\r\n\r\n  if (hasGTM()) gtmSendEvent('form', p)\r\n  if (hasGtag()) gaSendEvent('form', p)\r\n  if (hasFBPixel()) fbSendEvent('form', p)\r\n}\r\n\r\nexport const sendEvent = (eventName, params) => {\r\n  if (process.env.NODE_ENV === 'development') {\r\n    console.warn(`Tracking is deprecated.`, `Use seperate tracking helper instead`);\r\n  }\r\n  if (hasGTM()) gtmSendEvent(eventName, params)\r\n  if (hasGtag()) gaSendEvent(eventName, params)\r\n  if (hasFBPixel()) fbSendEvent(eventName, params)\r\n}\r\n\r\n//#region GTM\r\nexport const hasGTM = () => {\r\n  return !!(typeof window !== `undefined` && window.dataLayer);\r\n}\r\n\r\nexport const gtmPageView = (url) => {\r\n  if (typeof window !== `undefined`) {\r\n    window.dataLayer.push({\r\n      event: 'pageview',\r\n      page: {\r\n        path: url\r\n      }\r\n    })\r\n  }\r\n}\r\nexport const gtmSendEvent = (eventName, params) => {\r\n  if (typeof window !== `undefined`) {\r\n    window.dataLayer.push(Object.assign({ event: eventName }, params || {}))\r\n  }\r\n}\r\n//#endregion\r\n\r\n//#region Gtag / GA\r\nexport const hasGtag = () => {\r\n  return !!(typeof window !== `undefined` && window.gtag);\r\n}\r\n\r\nexport const gaPageView = (url) => {\r\n  if (typeof window !== `undefined`) {\r\n    if (env.gaAccounts) {\r\n      env.gaAccounts.forEach(id => {\r\n        window.gtag('config', id, { 'page_path': url });\r\n      })\r\n    }\r\n  }\r\n}\r\n\r\nexport const gaSendEvent = (eventName, params) => {\r\n  if (typeof window !== `undefined`) {\r\n    if (env.gaAccounts && env.gaAccounts.length > 0) {\r\n      window.gtag('event', eventName, params || {});\r\n    }\r\n  }\r\n}\r\n//#endregion\r\n\r\n//#region Facebook Pixel\r\nexport const hasFBPixel = () => {\r\n  return !!(typeof window !== `undefined` && window.fbq);\r\n}\r\n\r\nexport const fbPageView = (url) => {\r\n  if (typeof window !== `undefined`) {\r\n    window.fbq('track', 'PageView');\r\n  }\r\n}\r\n\r\nexport const fbSendEvent = (eventName, params) => {\r\n  if (typeof window !== `undefined`) {\r\n    window.fbq('track', eventName, params || {});\r\n  }\r\n}\r\n//#endregion\r\n\r\n\r\n\r\n","import React from 'react';\r\nimport { loadJs } from '../../lib/net-loader';\r\n\r\nexport function useInstagram() {\r\n  const [embedStatus, setEmbedStatus] = React.useState(null);\r\n\r\n  React.useEffect(() => {\r\n    loadEmbedJs()\r\n  })\r\n\r\n  function loadEmbedJs() {\r\n    if (typeof window !== `undefined`) {\r\n      //console.log('instgrm effect', embedStatus, window.instgrm);\r\n      if (window.instgrm) {\r\n        window.instgrm.Embeds.process();\r\n      }\r\n      else if (!embedStatus && embedStatus !== 'loading') {\r\n        setEmbedStatus('loading');\r\n        loadJs(\"https://www.instagram.com/embed.js\").then(data => {\r\n          //console.log('instgrm loaded', data);\r\n          if (window.instgrm) {\r\n            window.instgrm.Embeds.process();\r\n            setEmbedStatus('loaded');\r\n          }\r\n        })\r\n      }\r\n    }\r\n  }\r\n\r\n  return { loadEmbedJs: loadEmbedJs }\r\n}","import { useLayoutEffect } from 'react';\r\n//import useWindowScroll from '@react-hook/window-scroll';\r\nimport { au } from '../../components';\r\n\r\n/* background image height =\r\n  + cutoff padding = always hidden padding - usually 10 px\r\n    + panel height (desired parallax panel height)\r\n    + padding height = panel height * padding height ratio\r\n  + cutoff padding = always hidden padding - usually 10 px\r\n*/\r\n\r\nconst defaultSettings = {\r\n  cutoffPadding: 10,\r\n  speed: 15, // 5% of image/100px scroll\r\n  //paddingHeightRatio: 0.3\r\n  //screenSize\r\n}\r\n\r\nexport const ParallaxData = {\r\n  settings: {\r\n    screenSize: null\r\n  },\r\n  panels: [\r\n    { selector: '.parallax', imageRatio: 1080 / 1920, panelHeight: 'auto' },\r\n  ],\r\n  elements: [],\r\n  timeoutId: null\r\n}\r\n\r\nexport function useParallax() {\r\n  const handleScroll = () => {\r\n    //console.log('useParallax - scrolling')\r\n    onScroll(ParallaxData);\r\n  }\r\n\r\n  const reset = () => {\r\n    //console.log('useParallax - reset');\r\n    setTimeout(() => { init(ParallaxData); handleScroll(); }, 300)\r\n  }\r\n\r\n  useLayoutEffect(() => {\r\n    //console.log('useParallax - effect');\r\n    setTimeout(() => { init(ParallaxData); handleScroll(); }, 300)\r\n    if (typeof window !== `undefined`) {\r\n      window.addEventListener('scroll', handleScroll)\r\n      window.addEventListener('resize', reset)\r\n    }\r\n    return () => {\r\n      //console.log('useParallax - removed');\r\n      if (typeof window !== `undefined`) {\r\n        window.removeEventListener('scroll', handleScroll)\r\n        window.removeEventListener('resize', reset)\r\n      }\r\n    }\r\n\r\n    // eslint-disable-next-line \r\n  }, []);\r\n\r\n  return { reset };\r\n};\r\n\r\n// export function useParallax(opt) {\r\n//   // const settings = Object.assign({}, defaultSettings, opt);\r\n\r\n//   const [resetCounter, setResetCounter] = useState(0);\r\n//   const [parallaxData,] = useState(ParallaxData);\r\n\r\n//   //const scrollY = useWindowScroll(60 /*fps*/)\r\n//   const reset = () => {\r\n//     setResetCounter(resetCounter + 1);\r\n//   }\r\n\r\n//   const handleScroll = () => {\r\n//     onScroll(parallaxData);\r\n//   }\r\n\r\n//   useLayoutEffect(() => {\r\n//     console.log('useParallax - effect');\r\n\r\n//     setTimeout(() => { init(parallaxData); handleScroll(); }, 300)\r\n\r\n//     //const handleScroll = (): void => setThrottledScroll(getScrollY())\r\n//     window.addEventListener('scroll', handleScroll)\r\n//     window.addEventListener('resize', handleScroll)\r\n//     return (): void => {\r\n//       window.removeEventListener('scroll', handleScroll)\r\n//       window.removeEventListener('resize', handleScroll)\r\n//     }\r\n\r\n//     // eslint-disable-next-line \r\n//   }, [resetCounter]);\r\n//   //console.log(scrollY, resetCounter)\r\n\r\n//   return { reset };\r\n// };\r\n\r\nexport function init(data) {\r\n  //console.log('parallax init');\r\n  const screenSize = data.settings.screenSize = au.getScreenSize();\r\n  data.settings = Object.assign({}, defaultSettings, data.settings)\r\n  let cnt = 0;\r\n  data.panels.forEach(panel => {\r\n    const elements = document.querySelectorAll(panel.selector) || [];\r\n    for (let i = 0; i < elements.length; i++) {\r\n      cnt++;\r\n      const el = elements[i];\r\n      //const el = document.querySelector(panel.selector);\r\n      //console.log(panel.selector, el)\r\n      //if (!el) { panel.el = null; return; }\r\n      const autoPanelHeight = !panel.panelHeight || panel.panelHeight === 'auto';\r\n      const panelHeight = autoPanelHeight ? el.offsetHeight : parseFloat(panel.panelHeight);\r\n      //console.log(autoPanelHeight, panelHeight)\r\n\r\n      const calculated = { shadowHeight: 0, shadowWidth: 0, fromTop: 0, toTop: 0 };\r\n      // calculated.shadowHeight = panelHeight * (1 + data.settings.paddingHeightRatio) + 2 * data.settings.cutoffPadding;\r\n      // calculated.shadowWidth = calculated.shadowHeight / panel.imageRatio;\r\n      // if (calculated.shadowWidth < data.settings.screenSize.width) {\r\n      //   // magnifying the background image to fix the full width of the browser\r\n      //   calculated.shadowWidth = data.settings.screenSize.width;\r\n      //   calculated.shadowHeight = calculated.shadowWidth * panel.imageRatio;\r\n      // }\r\n\r\n      const speed = data.settings.speed * (screenSize.width > 1000 ? 1 : 2) \r\n      let baseHeight = data.settings.screenSize.width * panel.imageRatio > panelHeight ? data.settings.screenSize.width * panel.imageRatio : panelHeight\r\n      baseHeight = baseHeight + (data.settings.screenSize.height + panelHeight) * (speed * 0.01)\r\n      calculated.shadowHeight = baseHeight + 2 * data.settings.cutoffPadding;\r\n      calculated.shadowWidth = calculated.shadowHeight / panel.imageRatio;\r\n      if (calculated.shadowWidth < data.settings.screenSize.width) {\r\n        // magnifying the background image to fix the full width of the browser\r\n        calculated.shadowWidth = data.settings.screenSize.width;\r\n        calculated.shadowHeight = calculated.shadowWidth * panel.imageRatio;\r\n      }\r\n\r\n      calculated.fromTop = -data.settings.cutoffPadding;\r\n      calculated.toTop = -calculated.shadowHeight + panelHeight + data.settings.cutoffPadding;\r\n\r\n      if (!autoPanelHeight)\r\n        (el).style.height = panel.panelHeight + 'px';\r\n\r\n      (el).style.backgroundSize = calculated.shadowWidth + 'px ' + calculated.shadowHeight + 'px'\r\n\r\n      //panel.el = el;\r\n      panel.calculated = calculated;\r\n      data.elements.push({ el: el, calculated: calculated });\r\n      //console.log(panelHeight, baseHeight, calculated)\r\n    }\r\n  })\r\n\r\n  //console.log('parallax init - ' + cnt)\r\n  if (cnt === 0) {\r\n    if (data.timeoutId) {\r\n      try {\r\n        if (typeof window !== `undefined`) { \r\n          window.clearTimeout(data.timeoutId)\r\n        }\r\n      } catch(e){}\r\n    }\r\n    // reschedule\r\n    if (typeof window !== `undefined`) { \r\n      data.timeoutId = window.setTimeout(() => init(data), 500)\r\n    }\r\n  }\r\n}\r\n\r\n\r\nexport function onScroll(data) {\r\n  //console.log(data);\r\n  data.elements.forEach(element => {\r\n    if (!element.el) return;\r\n    const pr = au.getScrollProgress(element.el).progress;\r\n    //console.log(pr);\r\n\r\n    const min = element.calculated.fromTop;\r\n    const max = element.calculated.toTop;\r\n    const top = au.prVal(min, max, pr, [0, 1]);\r\n    //console.log(top);\r\n    (element.el).style.backgroundPositionY = top + 'px'\r\n  })\r\n\r\n}","import { useMemo } from 'react';\r\nimport { useParams, useLocation, useHistory, useRouteMatch, Redirect } from 'react-router-dom';\r\nimport queryString from 'query-string';\r\n\r\nexport function useRouter() {\r\n  const params = useParams();\r\n  const location = useLocation();\r\n  const history = useHistory();\r\n  const match = useRouteMatch();\r\n\r\n  // Return our custom router object\r\n  // Memoize so that a new object is only returned if something changes\r\n  return useMemo(() => {\r\n    return {\r\n      // For convenience add push(), replace(), pathname at top level\r\n      navigate: history.push,\r\n      push: history.push,\r\n      Redirect: Redirect,\r\n      replace: history.replace,\r\n      pathname: location.pathname,\r\n      path: location.pathname + location.hash + location.search,\r\n      // Merge params and parsed query string into single \"query\" object\r\n      // so that they can be used interchangeably.\r\n      // Example: /:topic?sort=popular -> { topic: \"react\", sort: \"popular\" }\r\n      query: {\r\n        ...queryString.parse(location.search), // Convert string to object\r\n        ...params\r\n      },\r\n      // Include match, location, history objects so we have\r\n      // access to extra React Router functionality if needed.\r\n      match,\r\n      location,\r\n      history\r\n    };\r\n  }, [params, match, location, history]);\r\n}","import { useState } from 'react';\r\n\r\nexport function useHistory(currentPath) {\r\n  const initHistory = currentPath ? [ historyItem(currentPath) ] : [];\r\n  const [history, setHistory] = useState(initHistory);\r\n\r\n  // useEffect(() => {\r\n  //   console.log('use history')\r\n  // });\r\n\r\n  const push = (url) => {\r\n//    console.log(url)\r\n    const nav = historyItem(url);\r\n    \r\n    const same = history.length > 0 \r\n      && (JSON.stringify(history[history.length - 1]) === JSON.stringify(nav))\r\n  //    console.log(same, history)\r\n    if (!same) {\r\n      setHistory([...history, nav]);\r\n    }\r\n  }\r\n\r\n  const getLast = () => {\r\n    if (history.length === 0) return null;\r\n    return history[history.length - 1];\r\n  }\r\n\r\n  const getPreviousPath = () => {\r\n    //console.log(history)\r\n    if (history.length < 2) return null;\r\n    return history[history.length - 2].url;\r\n  }\r\n\r\n  const getPrevious = () => {\r\n    if (history.length === 0) return null;\r\n    history.pop(); // remove the current first\r\n    const item = history.pop();\r\n    return item;\r\n  }\r\n\r\n  return { history, push, getLast, getPrevious, getPreviousPath };\r\n};\r\n\r\nfunction historyItem(url) {\r\n  return { url: url};\r\n}","import { useStore } from '../../store';\r\n\r\n// loc data: {path:'', title:''}\r\nexport function useHistoryStore() {\r\n  const { state, dispatch } = useStore();\r\n  const history = state.history || [];\r\n\r\n  function push(loc) {\r\n    const same = history.length > 0 \r\n      && (JSON.stringify(history[history.length - 1]) === JSON.stringify(loc))\r\n    if (!same) {\r\n      // console.log(JSON.stringify(history[history.length - 1]), JSON.stringify(loc))\r\n      setHistory([...history, loc]);\r\n    }\r\n  }\r\n\r\n  function setHistory(history){\r\n    // console.log('history set', history)\r\n    dispatch({ type: 'SET_HISTORY', payload: history })\r\n  }\r\n\r\n  const last = () => {\r\n    // console.log('last history', history)\r\n    if (history.length < 2) return null;\r\n    return history[history.length - 2].path;\r\n  }\r\n\r\n  const pop = () => {\r\n    if (history.length === 0) return null;\r\n    history.pop(); // remove the current first\r\n    const item = history.pop();\r\n    return item;\r\n  }\r\n\r\n  return { history, push, pop, last };\r\n};","import utils from '../../utils';\r\n\r\nexport function handleElementLink(el, externalHandler) {\r\n  // externalHandler = (url) => {\r\n  //   if (typeof window !== `undefined`) window.location.href = url;\r\n  // }\r\n\r\n  const link = utils.url.getLinkFromElement(el);\r\n  const linkInfo = utils.url.getLinkInfo(link);\r\n  //console.log(link, linkInfo)\r\n  if (!linkInfo) return { handled: false, linkInfo: linkInfo };\r\n\r\n  if (linkInfo.type === 'hash') {\r\n    utils.ui.scrollTo(linkInfo.url);\r\n  } else if (linkInfo.type === 'tel' || linkInfo.type === 'mailto') {\r\n\r\n  } else if (linkInfo.type === 'external' && externalHandler) {\r\n    // let the external handler process.\r\n    externalHandler(linkInfo.url);\r\n    return { handled: true, linkInfo: linkInfo };;\r\n  }\r\n  return { handled: false, linkInfo: linkInfo };\r\n}","import React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport utils from \"../../utils\";\r\nimport { handleElementLink } from \"./handleLink\";\r\n\r\nexport function SiteLink(props) {\r\n  const { children, to, target, onClick, ...other } = props;\r\n\r\n  function goToLink(e) {\r\n    try {\r\n      const isCmsEdit = document.querySelector(\"body\").classList.contains(\"cmsedit\");\r\n      if (isCmsEdit) {\r\n        e.preventDefault();\r\n        return;\r\n      }\r\n    } catch (e) {}\r\n\r\n    //console.log(e, e.target);\r\n    if (onClick) onClick(e);\r\n    const processed = handleElementLink(e.target);\r\n    //console.log(processed)\r\n    if (processed.handled) {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n    }\r\n  }\r\n\r\n  return utils.url.isExternalLink(to) ? (\r\n    <a href={to} target=\"_blank\" rel=\"noopener noreferrer\" onClick={(e) => goToLink(e)} {...other}>\r\n      {children}\r\n    </a>\r\n  ) : (\r\n    <Link to={to} onClick={(e) => goToLink(e)} {...other}>\r\n      {children}\r\n    </Link>\r\n  );\r\n}\r\n","import { css } from '@emotion/core'\r\nimport { mixin, mq } from '../../cssInJs'\r\n\r\nexport default {\r\n  tiles: css(mq({\r\n    marginLeft: [0, -5, null, -10],\r\n    marginRight: [0, -5, null, -10],\r\n    display: 'flex',\r\n    justifyContent: 'center',\r\n    flexWrap: 'wrap'\r\n  })),\r\n  tile: css(mq({\r\n    flexBasis: ['50%', '33.33%', '25%', '25%', '20%', '16.66%'],\r\n    padding: [0, 5, null, 10],\r\n    cursor: 'pointer'\r\n  })),\r\n  tileImage: css({\r\n    position: 'relative',\r\n    display: 'block',\r\n    ':after': { ...mixin.overlay() },\r\n    ':hover, :focus': {\r\n      ':after': {\r\n        backgroundColor: 'rgba(0, 0, 0, 0.2)'\r\n      }\r\n    }\r\n  }),\r\n  tileIcon: css({\r\n    position: 'absolute',\r\n    top: 10,\r\n    right: 10,\r\n    fontSize: 30,\r\n    color: 'white',\r\n    zIndex: 1\r\n  })\r\n}","import React from 'react';\r\nimport utils from '../../utils';\r\nimport * as yt from './iframeApi';\r\nimport { FaRegPlayCircle } from 'react-icons/fa';\r\nimport { useStore } from '../../store';\r\n\r\nexport function YoutubeEmbedPopup({ url, title, posterUrl }) {\r\n  const { dispatch } = useStore();\r\n\r\n  const videoId = yt.getYoutubeCode(url);\r\n  const posterImageUrl = utils.site.resourcePath(posterUrl || yt.thumbnailMax(videoId));\r\n  const [popupIndex, setPopupIndex] = React.useState(0);\r\n\r\n  function openVideo() {\r\n    setPopupIndex(popupIndex + 1);\r\n    dispatch({ type: 'SET_POPUP', payload: { sources: [\r\n      // <iframe width=\"560\" height=\"315\" src={`https://www.youtube.com/embed/${videoId}`} frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>\r\n      'https://www.youtube.com/watch?v=' + videoId\r\n    ], popupIndex: popupIndex + 1} });\r\n  }\r\n  return (\r\n    <div className=\"ytEmdPopup__poster\" style={{ backgroundImage: utils.css.bgUrlStyle(posterImageUrl) }} onClick={openVideo}>\r\n      <FaRegPlayCircle className=\"ytEmdPopup__playIcon\" />\r\n    </div>\r\n  );\r\n}\r\n","import React from 'react';\r\nimport utils from '../../utils';\r\nimport * as yt from './iframeApi';\r\n\r\nexport function YoutubeEmbed({ url, title }) {\r\n  const videoId = yt.getYoutubeCode(url);\r\n  //const posterImageUrl = yt.thumbnailMax(videoId);\r\n\r\n  const playerVars = {\r\n    'enablejsapi': 1,\r\n    //'autoplay': 1,\r\n    'controls': 1,\r\n    'loop': 0,\r\n    'showinfo': 0,\r\n    'rel': 0,\r\n    'modestbranding': 1,\r\n    //'origin': typeof window !== `undefined` && window.location.origin,\r\n    'allowfullscreen': true,\r\n    'wmode': 'transparent'\r\n  }\r\n\r\n  return (\r\n    <div className=\"youtubeEmbed ytvideo\">\r\n      <iframe className=\"youtubeEmbed__iframe\" width=\"640\" height=\"390\"\r\n        title={title || 'Youtube video'}\r\n        allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\r\n        src={`https://www.youtube.com/embed/${videoId}?${utils.url.toQueryString(playerVars)}`}\r\n        frameBorder=\"0\" allowFullScreen></iframe>\r\n    </div>\r\n  );\r\n}\r\n","\n// common section or pages\nexport { NotFound } from './notFound/notFound';\nexport { AppVersion, AppVersionPage } from '../lib/app-version/app-version-v2';\nexport { Button } from './form/buttons/button';\nexport { ErrorMessage, ErrorPopup } from '../lib/ui-error';\nexport { Loading } from '../lib/ui-loading';\n\n// common functions\nexport { usePost, useGet } from '../lib/net-api';\nexport { MediaQueryStatus } from '../lib/dev-mediaQueryStatus';\nexport { MetaTag } from '../lib/seo';\n\nexport { au } from '../lib/animation';\nexport { useInstagram } from '../lib/instagram-useInstagram';\nexport { useParallax } from '../lib/ui-parallax';\nexport { useRouter, useHistory, useHistoryStore, handleElementLink, SiteLink } from '../lib/router'\n\n\n// modules\nexport { InstagramFeed } from '../lib/instagram-feed';\n\nexport { YoutubeBanner, YoutubeEmbed, YoutubeEmbedPopup } from '../lib/youtube';","//#region GTM\r\nexport const hasGTM = () => {\r\n  return !!(typeof window !== `undefined` && window.dataLayer);\r\n}\r\n\r\nexport const pageView = (url, pageTitle = null) => {\r\n  if (!hasGTM()) return;\r\n\r\n  const pageOpt = pageTitle ? {\r\n    path: url,\r\n    title: pageTitle\r\n  } : { path: url }\r\n  //console.log(url, pageOpt)\r\n  window.dataLayer.push({\r\n    event: 'pageview',\r\n    page: pageOpt\r\n  })\r\n}\r\n\r\n// \r\nexport const sendEvent = (eventName, params) => {\r\n  if (!hasGTM()) return;\r\n  window.dataLayer.push(Object.assign({ event: eventName }, params || {}))\r\n}\r\n\r\nexport const sendGAEvent = (category, action, label, value) => {\r\n  if (!hasGTM()) return;\r\n  window.dataLayer.push(Object.assign({ event: 'gaEvent' }, { category: category || '', action: action || '', label: label || '', value: value || '' }))\r\n}\r\n//#endregion\r\n\r\n\r\n","import * as gtm from './gtm';\r\nexport { gtm };","// closest\r\n\r\nif (!Element.prototype.matches) {\r\n  Element.prototype.matches = Element.prototype.msMatchesSelector || \r\n                              Element.prototype.webkitMatchesSelector;\r\n}\r\n\r\nif (!Element.prototype.closest) {\r\n  Element.prototype.closest = function(s) {\r\n    var el = this;\r\n\r\n    do {\r\n      if (el.matches(s)) return el;\r\n      el = el.parentElement || el.parentNode;\r\n    } while (el !== null && el.nodeType === 1);\r\n    return null;\r\n  };\r\n}\r\n\r\n\r\n// getBoundingClientRect","function payload(item, key, defaultVal = '') {\n  const found = item.payloads.find(x => x.key === key);\n  return found ? found.value : defaultVal;\n}\n\nexport default { payload };","import React from 'react';\nimport { Item } from '../../items/item';\nimport cmsUtils from '../../utils/cmsUtils';\nimport  utils from '../../../utils';\nimport Slider from \"react-slick\";\n\nexport function BannerPanel(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, subItems);\n\n  const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n\n  const slides = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n\n  var settings = {\n    dots: false,\n    infinite: true,\n    speed: 1500,\n    autoplaySpeed: 3000,\n    fade: true,\n    autoplay: true,\n    slidesToShow: 1,\n    slidesToScroll: 1\n  };\n\n  const cssClass = utils.classNames('cms_item', 'bannerPanel', `bannerWrapperSize--${heightSet}`, item.cssClass || item.anchorName || '');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      <Slider {...settings} >\n        {slides}\n      </Slider>\n    </div>\n  );\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { SiteLink } from '../../../components';\n\nexport function BannerItem(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n\n  const bgUrl = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n\n  const captionTitle = cmsUtils.payload(item, 'CaptionTitle2') || cmsUtils.payload(item, 'CaptionTitle');\n  const linkUrl = cmsUtils.payload(item, 'LinkUrl2') || cmsUtils.payload(item, 'LinkUrl');\n\n  //console.log('item', linkUrl);\n  const titlePanel = captionTitle ? (\n    linkUrl ? (<div>\n      <div className=\"banner-item__title\" dangerouslySetInnerHTML={{ __html: captionTitle }}></div>\n      <SiteLink to={linkUrl} className=\"banner-item__link\">READ MORE</SiteLink>\n    </div>\n    ) : (<div className=\"banner-item__title\" dangerouslySetInnerHTML={{ __html: captionTitle }}></div>)\n  ) : null;\n\n  const linkOverlay = linkUrl && !captionTitle ? (\n    <SiteLink className=\"bannerItem__overlay\" to={linkUrl}></SiteLink>\n  ) : null;\n\n  const cssClass = utils.classNames('cms_item', 'banner-item', 'bannerSize', item.cssClass || item.anchorName || '', titlePanel && 'bannerHasTitlePanel');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n      style={{ backgroundImage: utils.css.bgUrlStyle(bgUrl) }}>\n      {titlePanel && <div className=\"banner_item__text\">{titlePanel}</div>}\n      {linkOverlay && linkOverlay}\n    </div>\n  );\n\n\n}\n","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport { Item } from '../../items/item';\nimport  utils from '../../../utils';\n\nexport function Panel(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  \n  const bgColor = cmsUtils.payload(item, 'BgColor');\n  //const textColorTheme = cmsUtils.payload(item, 'TextColorTheme');\n  const imageUrl = cmsUtils.payload(item, 'ImageUrl');\n  const backgroundTile = cmsUtils.payload(item, 'BackgroundTile');\n  const bgTheme = cmsUtils.payload(item, 'TextColorTheme') || 'white';\n  //console.log(bgTheme)\n\n\n  let bgUrl = null;\n  if (imageUrl)\n    bgUrl = utils.site.resourcePath(imageUrl);\n  else if (backgroundTile)\n    bgUrl = utils.site.resourcePath(`/dist/transparent-textures/textures/${backgroundTile}`);\n\n  const cssClass = utils.classNames('cms_item', 'contentPanel', 'contentPanel--' + bgTheme, item.cssClass || item.anchorName || '');\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n\n  console.log(\"It is working.\");\n\n  return (\n    <section className={cssClass} style={{\n      backgroundColor: `${bgColor}`,\n      backgroundImage: bgUrl && utils.css.bgUrlStyle(bgUrl)\n      }} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      <div className=\"contentPanel__bg\"></div>\n      <div className={`container mt-4r`}>\n        {subItemsElts}\n      </div>\n    </section>\n  );\n}\n","/** @jsx jsx */\nimport { jsx } from \"@emotion/core\";\n\nexport function InstaEmbedByLink({ className, url }) {\n  if (!url) return null;\n  // https://www.instagram.com/p/B4zJYkxHRMu/?utm_source=ig_web_copy_link\n  // https://www.instagram.com/reel/CdsPgIFDINY/\n\n  const type =\n    url.indexOf(\"/reel/\") > 0 ? \"reel\" : url.indexOf(\"/tv/\") > 0 ? \"tv\" : \"p\";\n  let parts = url.split(`instagram.com/${type}/`);\n  if (parts.length !== 2) return null;\n  parts = parts[1].split(\"/\");\n  if (parts.length === 0) return null;\n\n  const instagramCode = parts[0];\n  // console.log(instagramCode);\n  const template = `<blockquote class=\"instagram-media\" data-instgrm-permalink=\"https://www.instagram.com/${type}/${instagramCode}/?utm_source=ig_embed&amp;utm_campaign=loading\" data-instgrm-version=\"14\" style=\" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);\"><div style=\"padding:16px;\"> <a href=\"https://www.instagram.com/${type}/${instagramCode}/?utm_source=ig_embed&amp;utm_campaign=loading\" style=\" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;\" target=\"_blank\"> <div style=\" display: flex; flex-direction: row; align-items: center;\"> <div style=\"background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;\"></div> <div style=\"display: flex; flex-direction: column; flex-grow: 1; justify-content: center;\"> <div style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;\"></div> <div style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;\"></div></div></div><div style=\"padding: 19% 0;\"></div> <div style=\"display:block; height:50px; margin:0 auto 12px; width:50px;\"><svg width=\"50px\" height=\"50px\" viewBox=\"0 0 60 60\" version=\"1.1\" xmlns=\"https://www.w3.org/2000/svg\" xmlns:xlink=\"https://www.w3.org/1999/xlink\"><g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g transform=\"translate(-511.000000, -20.000000)\" fill=\"#000000\"><g><path d=\"M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631\"></path></g></g></g></svg></div><div style=\"padding-top: 8px;\"> <div style=\" color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;\">View this post on Instagram</div></div><div style=\"padding: 12.5% 0;\"></div> <div style=\"display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;\"><div> <div style=\"background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);\"></div> <div style=\"background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;\"></div> <div style=\"background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);\"></div></div><div style=\"margin-left: 8px;\"> <div style=\" background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;\"></div> <div style=\" width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)\"></div></div><div style=\"margin-left: auto;\"> <div style=\" width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);\"></div> <div style=\" background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);\"></div> <div style=\" width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);\"></div></div></div> <div style=\"display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;\"> <div style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;\"></div> <div style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;\"></div></div></a><p style=\" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;\"><a href=\"https://www.instagram.com/${type}/${instagramCode}/?utm_source=ig_embed&amp;utm_campaign=loading\" style=\" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;\" target=\"_blank\">A post shared by</a></p></div></blockquote> <script async src=\"//www.instagram.com/embed.js\"></script>`;\n\n  return (\n    <div\n      className={className}\n      dangerouslySetInnerHTML={{ __html: template }}\n    ></div>\n  );\n}\n","/** @jsx jsx */\nimport { jsx } from \"@emotion/core\";\nimport InnerHTML from \"dangerously-set-html-content\";\nimport { InstaEmbedByLink } from \"./instagram\";\n// import { loadScript } from \"../../lib/net-loader\";\nconst defaultHolder = typeof window !== `undefined` ? window : {};\nconst storeName = \"__j6_lazy_js\";\n\nexport function Embed({ code, type, classNames = [] }) {\n  const { embedType, embedCode } = getEmbedType({ code, type });\n\n  if (!embedCode) return null;\n  classNames.push(\"embedCodes\");\n  classNames.push(`embedCodes--${embedType}`);\n  if (embedType === \"pinterest\") loadPinterestJs();\n  if (embedType === \"instagramlink\") return <InstaEmbedByLink className={classNames.join(\" \")} url={embedCode} />;\n  else return <InnerHTML className={classNames.join(\" \")} html={embedCode} />;\n}\n\nfunction loadPinterestJs() {\n  if (typeof window !== `undefined`) {\n    const recentlyAdded = parseInt(window[\"jsPinRecent\"]) || 0;\n    const ts = ~~(new Date().getTime() / 500);\n    // console.log(recentlyAdded, ts);\n    if (recentlyAdded === ts) return;\n    window[\"jsPinRecent\"] = ts;\n    // console.log(\"loading..\");\n    Object.keys(window)\n      .filter((x) => x.indexOf(\"PIN_\") === 0)\n      .forEach((x) => delete window[x]);\n\n    loadJs([\"//assets.pinterest.com/js/pinit.js\"], true, [\"pinit.js\", \"pinit_main.js\"]).then((data) => {\n      console.log(\"pinterest loaded\", data);\n    });\n  }\n}\n\nfunction loadJs(scripts, forceToReload, removingScripts) {\n  const promises = [];\n  scripts.forEach((script) => {\n    return promises.push(loadScript(script, window, forceToReload, removingScripts));\n  });\n  return Promise.all(promises);\n}\n\n// var l = function (a, b, c) {\n//   var d, e, f;\n//   (d = \"PIN_\" + ~~(new Date().getTime() / 864e5)),\n//     a[d]\n//       ? (a[d] += 1)\n//       : ((a[d] = 1),\n//         a.setTimeout(function () {\n//           (e = b.getElementsByTagName(\"SCRIPT\")[0]),\n//             (f = b.createElement(\"SCRIPT\")),\n//             (f.type = \"text/javascript\"),\n//             (f.async = !0),\n//             (f.src = c.mainUrl + \"?\" + Math.random()),\n//             e.parentNode.insertBefore(f, e);\n//         }, 10));\n// };\n\nfunction loadScript(url, holder_, forceToReload = false, removingScripts) {\n  const holder = holder_ || defaultHolder;\n  if (!holder[storeName]) holder[storeName] = {};\n\n  return new Promise((resolve, reject) => {\n    //resolve if already loaded\n    if (!forceToReload && holder[storeName][url] && holder[storeName][url].loaded) {\n      resolve({ script: url, loaded: true, networkLoaded: false, status: \"Already Loaded\" });\n    } else {\n      // remove previous\n      const scripts = document.querySelectorAll(\"script[src]\");\n      [...scripts].forEach((x) => {\n        // console.log(x.src, url, removingScripts);\n        if (\n          x.src.replace(\"https://\", \"\").replace(\"http://\", \"\").replace(\"//\", \"\") === url.replace(\"https://\", \"\").replace(\"http://\", \"\").replace(\"//\", \"\") ||\n          removingScripts.some((part) => x.src.indexOf(part) >= 0)\n        ) {\n          console.log(x);\n          x.remove();\n        }\n      });\n\n      // load script\n      let script = document.createElement(\"script\");\n      script.type = \"text/javascript\";\n      script.src = url;\n      script.onload = () => {\n        holder[storeName][url] = { loaded: true };\n        resolve({ script: url, loaded: true, networkLoaded: true, status: \"Loaded\" });\n      };\n      script.onerror = (error) => resolve({ script: url, loaded: false, status: \"Load failed\" });\n      document.getElementsByTagName(\"head\")[0].appendChild(script);\n    }\n  });\n}\n\nexport function getEmbedType({ code, type }) {\n  const embedType = (type || \"auto\").toLowerCase();\n  const embedCode = (code || \"\").trim();\n  const linkOnly = embedCode.indexOf(\"http\") === 0;\n  const hasScript = embedCode.indexOf(\"<script\") >= 0;\n  if (embedType !== \"instagramlink\") {\n    if (embedCode.indexOf(\"instagram.com\") > 0 && linkOnly) return { embedType: \"instagramlink\", embedCode };\n    else if (embedCode.indexOf(\"instagram.com\") > 0 && hasScript) return { embedType: \"instagram\", embedCode };\n    else if (embedCode.indexOf(\"tiktok.com\") > 0) return { embedType: \"tiktok\", embedCode };\n    else if (embedCode.indexOf(\"giphy.com\") > 0) return { embedType: \"giphy\", embedCode };\n    else if (embedCode.indexOf(\"pinterest.com\") > 0) return { embedType: \"pinterest\", embedCode };\n  }\n  return { embedType, embedCode };\n}\n","import React, { useLayoutEffect, useRef } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport cmsUtils from \"../../utils/cmsUtils\";\nimport utils from \"../../../utils\";\n\nimport { useRouter } from \"../../../components\";\n\nimport { handleElementLink } from \"../../../components\";\nimport env from \"../../../env\";\nimport { Embed } from \"../../../site/embed\";\n\n//import { Document, Page } from 'react-pdf'\n//import { Document, Page } from 'react-pdf/dist/entry.webpack';\n\nexport function Html(props) {\n  const ver = env.ver;\n  const item = props.item;\n  //const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  const { history } = useRouter();\n  //const [ pdfViewPath, setPdfViewPath ] = React.useState(null)\n  //console.log('item', item, cmsOption);\n\n  const year = new Date().getFullYear();\n  let content = cmsOption.isCmsEdit\n    ? cmsUtils.payload(item, \"Content\")\n    : cmsUtils\n        .payload(item, \"Content\")\n        .replace(/__year__/g, year)\n        .replace(\n          \"__version__\",\n          \"<a href = '/app' class = 'app_version'> PWA \" + ver + \"</a>\"\n        );\n\n  content = content.replace(\n    /<h2>&#xA0;<\\/h2>/g,\n    `<h2 class='empty-line'>&nbsp;</h2>`\n  );\n\n  const cssClass = utils.classNames(\n    \"cms_item\",\n    \"htmlPanel\",\n    cmsOption.isCmsEdit && \"html\",\n    item.cssClass || item.anchorName || \"\"\n  );\n\n  //let itemElt = (<div dangerouslySetInnerHTML={{ __html: content }}></div>);\n\n  function handleClick(e) {\n    let target = \"\";\n    if (e.target.closest(\"a\")) {\n      target = e.target.closest(\"a\").getAttribute(\"target\");\n    }\n    const processed =\n      target === \"_blank\"\n        ? handleElementLink(e.target, null)\n        : handleElementLink(e.target);\n    //const link = utils.url.getLinkFromElement(e.target);\n    //console.log('clicked', e, e.target, processed);\n\n    if (processed.handled) {\n      e.preventDefault();\n      e.stopPropagation();\n    } else if (processed.linkInfo && processed.linkInfo.type === \"internal\") {\n      e.preventDefault();\n      e.stopPropagation();\n      history.push(processed.linkInfo.url);\n    } else {\n      // e.preventDefault();\n      // e.stopPropagation();\n      // setPdfViewPath(utils.site.resourcePath(link))\n\n      if (e.target.closest(\"a\")) {\n        let href = e.target.closest(\"a\").getAttribute(\"href\") + \"\";\n        if (href.indexOf(\"#\") !== -1) {\n          let _href = href.split(\"#\");\n          console.log(\"_href\", _href);\n          let el = document.querySelector(\n            'section[data-cms-item-anchor=\"' + _href[1] + '\"]'\n          );\n          let anchorStatus = el.getAttribute(\"data-anchor-status\");\n          if (anchorStatus === \"collapse\") {\n            el.setAttribute(\"data-anchor-status\", \"expand\");\n            el.classList.add(\"expand\");\n          } else {\n            el.setAttribute(\"data-anchor-status\", \"collapse\");\n            el.classList.remove(\"expand\");\n          }\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      }\n    }\n  }\n  //console.log(pdfViewPath)\n  const pdfView =\n    // pdfViewPath ?\n    // <Document file={pdfViewPath}><Page pageIndex={1}/></Document> :\n    null;\n\n  const htmlBlock = useRef(null);\n  // function iframeSizer() {\n  //   //console.log('iframesizer')\n  //   let iframesContainer = htmlBlock.current.querySelectorAll('iframe.youtube, .ytvideo iframe');\n  //   //console.log('iframesizer', iframesContainer)\n  //   if (iframesContainer && iframesContainer.length) {\n  //     iframesContainer.forEach(element => {\n  //       let height = (element.parentElement.offsetWidth * 9) / 16\n  //       //console.log(height, element.parentElement.offsetWidth)\n  //       element.style.height = height + 'px';\n  //     });\n  //   }\n  // }\n\n  useLayoutEffect(() => {\n    //console.log(cmsOption.isCmsEdit)\n    if (!cmsOption.isCmsEdit || cmsOption.cmsViewMode === \"viewonly\") {\n      replaceEmbedCodes(htmlBlock.current, cmsOption);\n    }\n\n    const buttons = htmlBlock.current.querySelectorAll(\".button\");\n    for (let i = 0; buttons && i < buttons.length; i++) {\n      restructureButton(buttons[i]);\n    }\n\n    const iframes = htmlBlock.current.querySelectorAll(\"iframe\");\n    for (let i = 0; iframes && i < iframes.length; i++) {\n      resetYoutubeIframe(iframes[i]);\n    }\n\n    // iframeSizer();\n    // window.addEventListener('resize', iframeSizer)\n    // return (): void => {\n    //   window.removeEventListener('resize', iframeSizer)\n    // }\n  }, [cmsOption]);\n\n  return (\n    <>\n      <div\n        ref={htmlBlock}\n        className={cssClass}\n        data-cms-html='true'\n        data-cms-item-id={cmsOption.isCmsEdit && item.itemId}\n        id={item.anchorName}\n        dangerouslySetInnerHTML={{ __html: content }}\n        onClick={(e) => handleClick(e)}\n      ></div>\n      {pdfView}\n    </>\n  );\n}\n\nfunction restructureButton(el) {\n  if (!el.querySelector(\"span\")) {\n    const span = document.createElement(\"span\");\n    span.innerHTML = el.innerHTML;\n    el.innerHTML = \"\";\n    el.appendChild(span);\n  }\n}\n\nfunction resetYoutubeIframe(el) {\n  if (el && el.parentElement) {\n    if (\n      !(\n        el.parentElement.getAttribute(\"class\") &&\n        el.parentElement.getAttribute(\"class\").indexOf(\"ytvideo\") >= 0\n      )\n    ) {\n      const div = document.createElement(\"div\");\n      div.setAttribute(\"class\", \"ytvideo\");\n      el.parentElement.appendChild(div);\n      div.appendChild(el);\n    }\n  }\n}\n\nfunction replaceEmbedCodes(block, cmsOption) {\n  const embedDataList = cmsOption?.pageData?.embedDataList;\n  const embedCodes = block.querySelectorAll(\"[data-embed-jaba]\");\n  embedCodes.forEach((embed) => {\n    const id = embed.getAttribute(\"data-embed-jaba\");\n    const found = utils.array.find(embedDataList, (x) => x.id === id);\n    if (found) {\n      //console.log(found)\n      // ReactDOM.render(<div className={`codeType_${found.codeType}`} dangerouslySetInnerHTML={{ __html: found.code }}></div>, embed);\n      ReactDOM.render(<Embed code={found.code} type={found.codeType} />, embed);\n    }\n  });\n  //console.log(embedCodes, embedDataList)\n}\n","import React from 'react';\nimport { Item } from '../../items/item';\n\nexport function TestimonialPanel(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, subItems);\n\n  let itemElt = (<div>{item.itemTypeCode}</div>);\n  \n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n  return (\n    <div className=\"testimonial-panel\">\n      {itemElt}\n      {subItemsElts}\n    </div>\n  );\n}\n","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport { Item } from '../../items/item';\n\nexport function TestimonialItem(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, subItems);\n\n  //const imageUrl = cmsUtils.payload(item, 'ImageUrl');\n  const title = cmsUtils.payload(item, 'Title');\n  //const desc = cmsUtils.payload(item, 'Desc');\n  const bottomText = cmsUtils.payload(item, 'BottomText');\n  //const ratingStar = cmsUtils.payload(item, 'RatingStar');\n  //const alt = cmsUtils.payload(item, 'Alt');\n\n  let itemElt = (<div>{item.itemTypeCode} {title} {bottomText}</div>);\n  \n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n  return (\n    <div className=\"testimonial-item\">\n      {itemElt}\n      {subItemsElts}\n    </div>\n  );\n}\n\n","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\n\nexport function ImagePanel(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n  //console.log(cmsOption)\n  //console.log('item', item);\n  const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n  \n  const cssClass = utils.classNames('cms_item', 'imagePanel', 'parallax', `bannerSize--${heightSet}`, item.cssClass || item.anchorName || '');\n  const bgUrl = cmsOption.pageOptions && cmsOption.pageOptions.imagePath ?\n    utils.site.resourcePath(cmsOption.pageOptions.imagePath):\n    utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName} data-pxh={heightSet}\n      style={{ backgroundImage: utils.css.bgUrlStyle(bgUrl) }}>\n    </div>\n  );\n  \n}\n","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { SiteLink } from '../../../components';\n\nimport Slider from \"react-slick\";\n\nexport function PageTiles(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  const useSlider = cmsUtils.payload(item, 'UseSlider') === 'slider';\n  const pages = getPages(cmsUtils.payload(item, 'PageObjects'));\n  const pageTileElts = pages.map((page, index) =>\n    <Tile page={page} key={index} disableLink={cmsOption.isCmsEdit}></Tile>\n  );\n\n  var settings = {\n    dots: false,\n    infinite: true,\n    speed: 500,\n    autoplaySpeed: 3000,\n    fade: false,\n    autoplay: true,\n    slidesToShow: 3,\n    slidesToScroll: 1,\n    responsive: [\n      {\n        breakpoint: 992,\n        settings: {\n          slidesToShow: 2,\n          slidesToScroll: 1\n        }\n      },\n      {\n        breakpoint: 576,\n        settings: {\n          slidesToShow: 1,\n          slidesToScroll: 1\n        }\n      }\n      // You can unslick at a given breakpoint now by adding:\n      // settings: \"unslick\"\n      // instead of a settings object\n    ]\n  };\n\n  const cssClass = utils.classNames('cms_item', 'pageTiles tiles', useSlider && 'useSlider', item.cssClass || item.anchorName || '');\n\n  if (useSlider){\n    return (\n      <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n        <Slider {...settings} >\n          {pageTileElts}\n        </Slider>\n      </div>\n    );\n  } else {\n    return (\n      <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n        {pageTileElts}\n      </div>\n    );   \n  }\n}\n\nfunction getPages(pagesSerialized) {\n  if (pagesSerialized) {\n    return JSON.parse(pagesSerialized);\n  }\n  return [];\n}\n\nfunction Tile(props) {\n  const page = props.page;\n  const imageUrl = (page.imageUrl !== '' && page.imageUrl === '/sites/vssassoon/media/canstar/tile-hair-dryer-2xcanstar.jpg') ? utils.site.resourcePath('/sites/vssassoon/media/tiles/tile-hair-dryer.jpg') : utils.site.resourcePath(page.imageUrl);\n  const disableLink = props.disableLink;\n  return (\n    <div className=\"pageTile tile\">\n      <SiteLink className=\"pageTile__content tile__content\" to={disableLink ? '' : page.pageUrl}>\n        <div className=\"tile__bg\" style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}></div>\n        <div className=\"pageTile_details tile__details\">\n          <div className=\"pageTile__title\">\n            {page.pageTitle}\n          </div>\n          <div className=\"pageTile_desc\">\n            {page.tileDesc || page.description}\n          </div>\n        </div>\n      </SiteLink>\n    </div>\n  )\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport  utils from '../../../utils';\nimport { SiteLink } from '../../../components';\n\nexport function SingleBanner(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n  const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n  const alignV = cmsUtils.payload(item, 'AlignV') || '50%';\n\n  const cssClass = utils.classNames('cms_item', 'single-banner', 'banner-item', `bannerSize--${heightSet}`, item.cssClass || item.anchorName || '');\n  const bgUrl = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n\n  const captionTitle = cmsUtils.payload(item, 'CaptionTitle2') || cmsUtils.payload(item, 'CaptionTitle');\n  const linkUrl = cmsUtils.payload(item, 'LinkUrl2') || cmsUtils.payload(item, 'LinkUrl');\n\n  const titlePanel = captionTitle ? (\n    linkUrl ? (<SiteLink to={linkUrl} className=\"banner-item__link\">\n      <div className=\"banner-item__title\" dangerouslySetInnerHTML={{ __html: captionTitle }}></div>\n    </SiteLink>) : (<div className=\"banner-item__title\" dangerouslySetInnerHTML={{ __html: captionTitle }}></div>)\n  ) : null;\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n      style={{ backgroundImage: utils.css.bgUrlStyle(bgUrl), backgroundPositionY:alignV }}>\n      {titlePanel && <div className=\"banner_item__text\">{titlePanel}</div>}\n    </div>\n  );\n\n\n}\n","import React, { useState } from \"react\";\nimport cmsUtils from \"../../utils/cmsUtils\";\nimport utils from \"../../../utils\";\nimport { Helmet } from \"react-helmet-async\";\n\nexport function AccordionPanel(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  const bgColor = cmsUtils.payload(item, \"BgColor\");\n  const imageUrl = cmsUtils.payload(item, \"ImageUrl\");\n  const backgroundTile = cmsUtils.payload(item, \"BackgroundTile\");\n  const bgTheme = cmsUtils.payload(item, \"TextColorTheme\") || \"white\";\n\n  const [selected, setSelected] = useState(null);\n  const toggle = (i) => {\n    if (selected === i) {\n      return setSelected(null);\n    }\n    setSelected(i);\n  };\n\n  let bgUrl = null;\n  if (imageUrl) bgUrl = utils.site.resourcePath(imageUrl);\n  else if (backgroundTile)\n    bgUrl = utils.site.resourcePath(\n      `/dist/transparent-textures/textures/${backgroundTile}`\n    );\n  const cssClass = utils.classNames(\n    \"cms_item\",\n    \"accordionPanel\",\n    \"contentPanel--\" + bgTheme,\n    item.cssClass || item.anchorName || \"\"\n  );\n\n  var mainEntity = [];\n  subItems.forEach((subItem) =>\n    mainEntity.push({\n      \"@type\": \"Question\",\n      \"name\": subItem.payloads[0].value,\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": subItem.payloads[1].value,\n      },\n    })\n  );\n  const schema = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"FAQPage\",\n    \"mainEntity\": mainEntity,\n  };\n\n  const subItemsElts = subItems.map((subItem, index) => (\n    <div className='wrapper' key={index}>\n      <div className={selected === index ? \"accordion show\" : \"accordion\"}>\n        <div className='item'>\n          <div\n            className={selected === index ? \"title show\" : \"title\"}\n            onClick={() => toggle(index)}\n          >\n            <h4>{subItem.payloads[0].value}</h4>\n            <span className='open_button'></span>\n          </div>\n          <div className={selected === index ? \"content show\" : \"content\"}>\n            <div\n              className='content_text'\n              dangerouslySetInnerHTML={{ __html: subItem.payloads[1].value }}\n            ></div>\n          </div>\n        </div>\n      </div>\n    </div>\n  ));\n\n  return (\n    <>\n      <Helmet>\n        <script type='application/ld+json'>{JSON.stringify(schema)}</script>\n      </Helmet>\n      <section\n        className={cssClass}\n        style={{\n          backgroundColor: `${bgColor}`,\n          backgroundImage: bgUrl && utils.css.bgUrlStyle(bgUrl),\n        }}\n        data-cms-item-id={cmsOption.isCmsEdit && item.itemId}\n        id={item.anchorName}\n      >\n        {/* <div className=\"contentPanel__bg\"></div> */}\n        <div className='container'>\n          <div className='accordion_container'>{subItemsElts}</div>\n        </div>\n      </section>\n    </>\n  );\n}\n","import React from \"react\";\nimport env from \"../../../env\";\nimport { usePost } from \"../../../components\";\nimport { useForm } from \"../../../form\";\nimport { Button, ErrorMessage } from \"../../../components\";\nimport { getContactModel } from \"./contactFormModel\";\nimport { gtm } from \"../../../lib/tracking\";\n\nexport function Contact(props) {\n  const emailReceiver = props.emailReceiver;\n  const model = getContactModel({});\n  const form = useForm(model, { usePlaceholder: true });\n  const [sendingStatus, setSendingStatus] = React.useState(null);\n  const post = usePost();\n\n  function onSubmit(e) {\n    form.validateForm(e, () => {\n      const value = { ...form.getValue(), emailReceiver: emailReceiver };\n      post.send(env.apiBase + \"/api/contact/send\", value);\n      setSendingStatus(\"pending\");\n    });\n\n    console.log(\"submitting\");\n  }\n\n  // if (status === 'done') {\n  //   //navigate(`/task/view/${taskId}`)\n  //   window.location.reload();\n  // }\n\n  if (post.done() && sendingStatus === \"pending\") {\n    var value = form.getValue();\n    gtm.sendEvent(\"contactFormSubmitted\", { contactEmail: value.email });\n    form.reset(model);\n    setSendingStatus(null);\n  }\n\n  const render = (name) => form.renderControl(name, null);\n\n  return (\n    <form className='contactForm'>\n      <div className='form-row'>\n        <div className='col-md-4 mb-2'>{render(\"name\")}</div>\n        <div className='col-md-4 mb-2'>{render(\"phone\")}</div>\n        <div className='col-md-4 mb-2'>{render(\"email\")}</div>\n      </div>\n      <div className='form-row'>\n        <div className='col-md-12 mb-2'>\n          {render(\"modelNumber\")}\n          <div\n            style={{\n              fontSize: \"0.8rem\",\n              marginTop: \"-0.7rem\",\n              marginLeft: \"0.5rem\",\n              marginRight: \"0.5rem\",\n              textAlign: \"left\",\n            }}\n          >\n            This starts with 'VS' and ends with 'A' and can be found on the\n            product packaging, instruction manual, or on the product itself.\n          </div>\n        </div>\n      </div>\n      <div className='form-row'>\n        <div className='col-md-12 mb-2'>{render(\"enquiry\")}</div>\n      </div>\n      {/* <div className='form-row unsubscribed'>\n        <div className='col-md-12 mb-2'>{render(\"unsubscribed\")}</div>\n      </div> */}\n      <div className='form-row'>\n        <div className='col-md-12 mb-2'>\n          <p>\n            By clicking 'Send Message' you accept the terms of our{\" \"}\n            <a href='/privacy' target='_blank' rel='noopener noreferrer'>\n              Privacy Policy\n            </a>\n            .\n          </p>\n          <div className='actions'>\n            <Button onClick={onSubmit} status={post.status}>\n              Send Message\n            </Button>\n            <ErrorMessage\n              errors={form.errors}\n              summaryMessage='Please review the errors.'\n            />\n            <ErrorMessage errors={post.errors} />\n            {post.done() && (\n              <span\n                style={{\n                  marginLeft: \"1.5rem\",\n                  color: \"red\",\n                  fontWeight: \"bold\",\n                }}\n              >\n                Successfully sent!\n              </span>\n            )}\n          </div>\n        </div>\n      </div>\n    </form>\n  );\n}\n","import { fb, validators } from \"../../../lib/form\";\n\nexport function getContactModel(data) {\n  const model = fb.group({\n    modelNumber: [\n      data.modelNumber || \"\",\n      [],\n      { label: \"Product Model Number\", type: \"text\" },\n    ],\n    name: [\n      data.name || \"\",\n      [validators.Required()],\n      { label: \"Name\", type: \"text\" },\n    ],\n    phone: [\n      data.phone || \"\",\n      [validators.Required()],\n      { label: \"Phone\", type: \"number\" },\n    ],\n    email: [\n      data.email || \"\",\n      [validators.Required(), validators.Email()],\n      { label: \"Email\", type: \"email\" },\n    ],\n    enquiry: [\n      data.enquiry || \"\",\n      [validators.Required()],\n      { label: \"Your Message\", type: \"textarea\" },\n    ],\n    // unsubscribed : [false, [], { label: `Subscribe to our newsletter`, type: 'checkbox' }],\n  });\n\n  return model;\n}\n","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport  utils from '../../../utils';\nimport { Contact } from './contactForm';\n\nexport function ContactForm(props) {\n  const item = props.item;\n  //const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, cmsOption);\n\n  const emailReceiver = cmsUtils.payload(item, 'EmailReceiver');\n\n  const cssClass = utils.classNames('cms_item', 'htmlPanel', cmsOption.isCmsEdit && 'html', item.cssClass || item.anchorName || '');\n\n  //let itemElt = (<div dangerouslySetInnerHTML={{ __html: content }}></div>);\n\n  return (\n    <div className={cssClass} data-cms-html=\"true\"\n      data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n\n      <div className=\"container contact-wrapper\" id=\"contactForm\">\n        <Contact emailReceiver={emailReceiver} />\n      </div>\n\n    </div>\n  )\n}","import React from 'react';\n// import { Item } from '../../items/item';\n// import { SiteLink } from 'shared/link/siteLink';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { YoutubeBannerMobilePopup } from '../../../lib/youtube/youtubeBanner--mobilePopup';\n//import env from '../../../env';\n//import Slider from 'modules/slider/slider';\n//import {BannerPanel} from '../bannerPanel/view';\n\nexport function YoutubeBannerPanel(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n\n  const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n  const videoCode = cmsUtils.payload(item, 'YoutubeCode');\n  const mobileImageUrl = cmsUtils.payload(item, 'ImageUrl');\n  const playerId = 'ytBanner-' + (item.itemId).substr(0, 8);\n\n  const video = {\n    heightSet: heightSet,\n    videoLinkOrId: videoCode,\n    playerId: playerId\n  }\n\n  //const enableYoutube = env.isProd;\n  //const canPlayVideo = () => utils.css.screenWidth() >= 1200\n  const cssClass = utils.classNames('cms_item', 'youtubePanel', item.cssClass || item.anchorName || '');\n\n  //console.log(window.innerWidth, canPlayVideo())\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      {/* {canPlayVideo() ? <YoutubeBanner video={video} /> : <BannerPanel item={item}></BannerPanel>} */}\n      <YoutubeBannerMobilePopup video={video} canPlayVideo={true} mobileImageUrl={mobileImageUrl} />\n    </div>\n  );\n}\n\n// function MobileSlider(props) {\n//   const item = props.item;\n//   const subItems = item.items || [];\n  \n//   const slides = subItems.map((subItem, index) =>\n//     <SlideItem item={subItem} key={subItem.itemId}></SlideItem>\n//   );\n\n//   useLayoutEffect(() => {\n//     setTimeout(() => {\n//       console.log(window.innerWidth);\n//     const slider = new Slider('.contSlider');\n//     slider.init();\n//     }, 100)\n//   }, [])\n\n//   return (\n//     <div className=\"contSlider bannerSize\">\n//       {slides}\n//     </div>\n//   );\n// }\n\n// function SlideItem(props){\n//   const item = props.item;\n//   const bgUrl = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n\n//   return (\n//     <div className=\"contSlide bannerSize\">\n//       <img className=\"contSlide__img\" src={bgUrl} alt=\"Banner\" />\n//     </div>\n//   );\n\n// }","import React from 'react';\nimport Select from 'react-select'\nimport utils from '../../utils'\n\nexport function FilterDropdown({ title, isMulti = false, items, value, onChange }) {\n  //const currentSelection = utils.array.find(items, x => x.value === value);\n  let currentSelection = null;\n\n  if(Array.isArray(value)){\n    //currentSelection = utils.array.find(items, x => x.value === value);\n    currentSelection = [];\n    value.forEach(el => {\n      const _selectedItem = utils.array.find(items, x => x.value === el);\n      currentSelection.push(_selectedItem);\n    });\n  }\n  else{\n    currentSelection = utils.array.find(items, x => x.value === value);\n    \n  }\n\n  const customStyles = {\n    option: (provided, state) => ({\n      ...provided,\n      textAlign: 'left'\n    })\n  }\n  const customTheme = theme => ({\n    ...theme,\n    colors: {\n      ...theme.colors,\n      primary25: '#eee',\n      primary: '#404040',\n    },\n  })\n\n  function onChange_(selected) {\n    //console.log(selected)\n    if (isMulti){\n      onChange(\n        (selected || []).map(x => x.value)\n      );\n    }\n    else\n      onChange(selected ? selected.value : '');\n  }\n\n  return (\n    <Select options={items}\n      styles={customStyles}\n      placeholder={title}\n      isMulti={isMulti}\n      value={currentSelection}\n      onChange={onChange_}\n      isSearchable={false}\n      theme={customTheme} />\n  )\n}\n","import utils from '../../utils';\n\nexport function sort(items, sortBy){\n  function compare(a, b) {\n    if (sortBy === 'az') return utils.array.caseInsensitiveCompare(a.productName, b.productName);\n    if (sortBy === 'za') return -utils.array.caseInsensitiveCompare(a.productName, b.productName);\n    if (sortBy === 'price-asc') return utils.array.compareIgnoreEmpty(true)(a.price, b.price);\n    if (sortBy === 'price-desc') return utils.array.compareIgnoreEmpty(false)(a.price, b.price);\n    return 0;\n  }\n  items.sort(compare);\n}\n\nexport function sortSelections() {\n  const sorts = [\n    // { name: 'Product name (A-Z)', value: 'az' },\n    // { name: 'Product name (Z-A)', value: 'za' },\n    { label: 'Price - Highest first', value: 'price-desc' },\n    { label: 'Price - Lowest first', value: 'price-asc' },\n  ]\n  return sorts;\n}\n","import React, { Fragment } from \"react\";\nimport env from \"../../env\";\nimport { usePost } from \"../../components\";\nimport { ErrorPopup, Loading } from \"../../components\";\nimport { FilterDropdown } from \"./filterDropdown\";\nimport * as sortHelper from \"./sortHelper\";\nimport { Tile } from \"./productTile\";\nimport { gtm } from \"../../lib/tracking\";\nimport { useBV } from \"../bazzarVoice/useBV\";\nimport { Helmet } from \"react-helmet-async\";\nimport utils from \"../../utils\";\n\nexport function ProductList(props) {\n  const post = usePost();\n  const [filters, setFilters] = React.useState([]);\n  const [filtersHC, setFiltersHC] = React.useState([]);\n  const [filtersHT, setFiltersHT] = React.useState([]);\n  const [filtersPT, setFiltersPT] = React.useState([]);\n  const [filtersSR, setFiltersSR] = React.useState([]);\n\n  const subCategory = props.subCategory;\n\n  const [sortBy, setSortBy] = React.useState(\"price-desc\");\n  const [showAll, setShowAll] = React.useState(false);\n  useBV(null, { showReview: null });\n  const searchParam = { ...props };\n\n  const noFilterPages = [\n    \"/style-bar/volume\",\n    \"/style-bar/straight\",\n    \"/style-bar/curls-and-waves\",\n    \"/style-bar/length\",\n    \"/style-bar/occasion\",\n  ];\n  const noFilters = noFilterPages.includes(window.location.pathname);\n\n  // console.log(\"searchParam.subCategory\", searchParam.subCategory);\n\n  // const categoryT =\n  //   searchParam.category === \"DRYERS\" ||\n  //   searchParam.category === \"STRAIGHTENERS\" ||\n  //   searchParam.category === \"CURLERS\" ||\n  //   searchParam.subCategory === \"travel\" ||\n  //   searchParam.subCategory === \"attachments\" ||\n  //   searchParam.subCategory === \"diffusers\" ||\n  //   searchParam.subCategory === \"straightening-irons\" ||\n  //   searchParam.subCategory === \"straightening-brushes\" ||\n  //   searchParam.subCategory === \"mini-hair-straighteners\"\n  //     ? \"\"\n  //     : \"none_dryers\";\n\n  const categoryT = \"\";\n\n  React.useEffect(() => {\n    post.send(env.apiBase + \"/api/product/getProducts\", searchParam);\n    // eslint-disable-next-line\n  }, []);\n\n  React.useEffect(() => {\n    if (\n      post.response &&\n      post.response.results &&\n      post.response.results.searchResult &&\n      filters.length > 0\n    ) {\n      const data = post.response.results.searchResult;\n      const distinctFilters = getDistinctFilters(data.filters);\n      const value = filters\n        .map((x) => getFilterTitle(distinctFilters, x))\n        .filter((x) => x)\n        .join(\",\");\n      //console.log(distinctFilters, filters, value)\n      //console.log('sdfsdfsdfsd', value)\n      //gtm.sendGAEvent('Product Filter', 'Filter By', value);\n      gtm.sendEvent(\"productFilterPush\", { productFilterName: value });\n    }\n\n    // eslint-disable-next-line\n  }, [filters]);\n\n  if (post.loading()) {\n    return <Loading />;\n  } else if (post.hasErrors()) {\n    return <ErrorPopup title='Loading Error' errors={post.errors} />;\n  }\n\n\n  const data = post.response.results.searchResult;\n\n  const distinctFilters = getDistinctFilters(data.filters);\n  const distinctFiltersHC = getDistinctFilters(data.filtersHC);\n  const distinctFiltersHT = getDistinctFilters(data.filtersHT);\n  const distinctFiltersPT = getDistinctFilters(data.filtersPT);\n  const distinctFiltersSR = getDistinctFilters(data.filtersSR);\n\n  const filterItems = [...distinctFilters];\n  const filterItemsHC = [...distinctFiltersHC];\n  const filterItemsHT = [...distinctFiltersHT];\n  const filterItemsPT = [...distinctFiltersPT];\n  const filterItemsSR = [...distinctFiltersSR];\n\n  const sortItems = sortHelper.sortSelections();\n\n  //origin\n  //let filtered = filters.length > 0 ? getFilteredItems(data.items, filters, filterItemsHC, filterItemsHT) : data.items;\n\n  //let filtered = getFilteredItems(data.items, filters, );\n  let filtered = getFilteredItems(\n    data.items,\n    filters,\n    filtersHC,\n    filtersHT,\n    filtersPT,\n    filtersSR\n  );\n\n  sortHelper.sort(filtered, sortBy);\n\n  const maxListing = utils.css.screenWidth() > 1600 ? 100 : 120;\n  const showMoreButton =\n    !showAll && filters.length > 0 && filtered.length > maxListing;\n  //console.log(maxListing, !filter, filtered.length, maxListing,  showMoreButton)\n  if (showMoreButton) {\n    filtered = filtered.splice(0, maxListing);\n  }\n\n  const baseUrl = utils.site.isNZ\n    ? \"https://www.vssassoon.co.nz\"\n    : \"https://www.vssassoon.com.au\";\n  const itemListStructuredData = {\n    \"@context\": \"https://schema.org/\",\n    \"@type\": \"ItemList\",\n    \"itemListElement\": data.items.map((product, index) => ({\n      \"@type\": \"ListItem\",\n      \"position\": index + 1,\n      \"url\": `${baseUrl}${product.productUrl}`,\n      \"image\": product.productThumbnail,\n      \"name\": product.productName,\n    })),\n  };\n\n  if (data.totalCnt === 0) return <div>No product found.</div>;\n  return (\n    <>\n      {data.items && (\n        <Helmet>\n          <script type='application/ld+json'>\n            {JSON.stringify(itemListStructuredData)}\n          </script>\n        </Helmet>\n      )}\n      <div className={`prdFilterSort ${categoryT}`}>\n        <div className='prdFilter'>\n          {!subCategory && (\n            <Fragment>\n              {categoryT !== \"none_dryers\" && (\n                <div className='filter__by'> FILTER BY </div>\n              )}\n\n              <div className='prdFilter_item'>\n                <FilterDropdown\n                  title={`${\n                    categoryT !== \"none_dryers\"\n                      ? \"PRODUCT FEATURE*\"\n                      : \"filter by*\"\n                  }`}\n                  isMulti={true}\n                  items={filterItems}\n                  value={filters}\n                  onChange={setFilters}\n                  clearText='Clear filters'\n                />\n              </div>\n\n              {categoryT !== \"none_dryers\" &&\n                (searchParam.category === \"CURLERS\" ||\n                  searchParam.category === \"STYLERS\" ||\n                  searchParam.subCategory === \"air-curlers\") && (\n                  <div className='prdFilter_item'>\n                    <FilterDropdown\n                      title='PRODUCT TYPE*'\n                      isMulti={true}\n                      items={filterItemsPT}\n                      value={filtersPT}\n                      onChange={setFiltersPT}\n                      clearText='Clear filters'\n                    />\n                  </div>\n                )}\n\n              {categoryT !== \"none_dryers\" && (\n                <div className='prdFilter_item'>\n                  <FilterDropdown\n                    title='HAIR CONCERN*'\n                    isMulti={true}\n                    items={filterItemsHC}\n                    value={filtersHC}\n                    onChange={setFiltersHC}\n                    clearText='Clear filters'\n                  />\n                </div>\n              )}\n\n              {categoryT !== \"none_dryers\" && (\n                <div className='prdFilter_item'>\n                  <FilterDropdown\n                    title='HAIR TYPE*'\n                    isMulti={true}\n                    items={filterItemsHT}\n                    value={filtersHT}\n                    onChange={setFiltersHT}\n                    clearText='Clear filters'\n                  />\n                </div>\n              )}\n\n              {categoryT !== \"none_dryers\" &&\n                (searchParam.category === \"CURLERS\" ||\n                  searchParam.category === \"STYLERS\" ||\n                  searchParam.subCategory === \"automatic-curler\" ||\n                  searchParam.subCategory === \"cordless\" ||\n                  searchParam.subCategory === \"curling-irons\" ||\n                  searchParam.subCategory === \"curling-wands\" ||\n                  searchParam.subCategory === \"rollers\" ||\n                  searchParam.subCategory === \"wavers\" ||\n                  searchParam.subCategory === \"air-curlers\" ||\n                  searchParam.subCategory === \"hot-air-stylers\") && (\n                  <div className='prdFilter_item'>\n                    <FilterDropdown\n                      title='STYLE RESULT*'\n                      isMulti={true}\n                      items={filterItemsSR}\n                      value={filtersSR}\n                      onChange={setFiltersSR}\n                      clearText='Clear filters'\n                    />\n                  </div>\n                )}\n            </Fragment>\n          )}\n        </div>\n\n        <div className='productSort'>\n          {categoryT !== \"none_dryers\" && (\n            <div className='filter__by' style={{ marginTop: \"0.5rem\" }}>\n              SORT\n            </div>\n          )}\n\n          <FilterDropdown\n            items={sortItems}\n            value={sortBy}\n            onChange={setSortBy}\n            rightAligned={true}\n          />\n        </div>\n      </div>\n\n      <div className='productList__warpper'>\n        {!noFilters && (\n          <div className={`${categoryT} p__filter__warpper`}>\n            <div className='filter__by'> FILTER BY </div>\n\n            {searchParam.subCategory !== \"rollers\" && (\n              <GetRightFilter\n                filterTitle='PRODUCT FEATURE'\n                filterId='filters'\n                items={filterItems}\n                value={filters}\n                onChange={setFilters}\n              />\n            )}\n\n            {(searchParam.category === \"CURLERS\" ||\n              searchParam.category === \"STYLERS\" ||\n              searchParam.subCategory === \"air-curlers\") && (\n              <GetRightFilter\n                filterTitle='PRODUCT TYPE'\n                filterId='filtersPT'\n                items={filterItemsPT}\n                value={filtersPT}\n                onChange={setFiltersPT}\n              />\n            )}\n\n            <GetRightFilter\n              filterTitle='HAIR CONCERN'\n              filterId='filtersHC'\n              items={filterItemsHC}\n              value={filtersHC}\n              onChange={setFiltersHC}\n            />\n\n            <GetRightFilter\n              filterTitle='HAIR TYPE'\n              filterId='filtersHT'\n              items={filterItemsHT}\n              value={filtersHT}\n              onChange={setFiltersHT}\n            />\n\n            {(searchParam.category === \"CURLERS\" ||\n              searchParam.category === \"STYLERS\" ||\n              searchParam.subCategory === \"automatic-curler\" ||\n              searchParam.subCategory === \"cordless\" ||\n              searchParam.subCategory === \"curling-irons\" ||\n              searchParam.subCategory === \"curling-wands\" ||\n              searchParam.subCategory === \"rollers\" ||\n              searchParam.subCategory === \"wavers\" ||\n              searchParam.subCategory === \"air-curlers\" ||\n              searchParam.subCategory === \"hot-air-stylers\") && (\n              <GetRightFilter\n                filterTitle='STYLE RESULT'\n                filterId='filtersSR'\n                items={filterItemsSR}\n                value={filtersSR}\n                onChange={setFiltersSR}\n              />\n            )}\n\n            <div className='filter__by' style={{ marginBottom: \"0.3rem\" }}>\n              SORT\n            </div>\n            <GetRightSort\n              items={sortItems}\n              value={sortBy}\n              onChange={setSortBy}\n            />\n          </div>\n        )}\n\n        <div className={`productList__container ${categoryT}`}>\n          <div className={`productList ${categoryT}`}>\n            {filtered.length === 0 ? (\n              <div className='no_products'>\n                Oops! Looks like there’s no product that matches this criteria.\n                <br />\n                Keep filtering, the perfect match awaits!\n              </div>\n            ) : (\n              filtered.map((product, index) => (\n                <Tile product={product} key={product.productCode}></Tile>\n              ))\n            )}\n          </div>\n          <div\n            style={{\n              fontSize: \"0.75rem\",\n              color: \"#777\",\n              textAlign: \"left\",\n              marginLeft: \"10px\",\n            }}\n          >\n            *Results depend on individual hair type & styling habits. Always\n            read the product instructions before use.\n          </div>\n        </div>\n      </div>\n\n      {showMoreButton && (\n        <div style={{ textAlign: \"center\" }}>\n          <button\n            className='btn btn-primary'\n            onClick={(e) => {\n              setShowAll(true);\n            }}\n          >\n            Show All\n          </button>\n        </div>\n      )}\n      {/* <div style={{ fontSize: \"0.75rem\", color: \"#777\", textAlign: \"left\" }}>\n        *Results depend on individual hair type & styling habits. Always read\n        the product instructions before use.\n      </div> */}\n    </>\n  );\n}\n\nfunction getFilteredItems(\n  items,\n  filters,\n  filtersHC,\n  filtersHT,\n  filtersPT,\n  filtersSR\n) {\n  let _items = items;\n\n  if (filters.length > 0) {\n    _items = _items.filter((x) =>\n      filters.every((filter) =>\n        x.filterCodes.some((fc) => {\n          return filter.indexOf(fc) >= 0;\n        })\n      )\n    );\n  }\n\n  if (filtersPT.length > 0) {\n    _items = _items.filter((x) =>\n      filtersPT.every((filter) =>\n        x.filterCodes.some((fc) => {\n          return filter.indexOf(fc) >= 0;\n        })\n      )\n    );\n  }\n\n  if (filtersHC.length > 0) {\n    _items = _items.filter((x) =>\n      filtersHC.every((filter) =>\n        x.filterCodes.some((fc) => {\n          return filter.indexOf(fc) >= 0;\n        })\n      )\n    );\n  }\n\n  if (filtersHT.length > 0) {\n    _items = _items.filter((x) =>\n      filtersHT.every((filter) =>\n        x.filterCodes.some((fc) => {\n          return filter.indexOf(fc) >= 0;\n        })\n      )\n    );\n  }\n\n  if (filtersSR.length > 0) {\n    _items = _items.filter((x) =>\n      filtersSR.every((filter) =>\n        x.filterCodes.some((fc) => {\n          return filter.indexOf(fc) >= 0;\n        })\n      )\n    );\n  }\n\n  return _items;\n\n  // Origin\n  // return items.filter(x => filters.every(filter => x.filterCodes.some(fc => {\n  //   //console.log(filter, fc, filter.indexOf(fc) >= 0)\n  //   return filter.indexOf(fc) >= 0\n  // })));\n\n  //return items.filter(x => x.filterCodes.some(f => filters.every(t => t.indexOf(f) >= 0)))\n}\n\n// get distinct filter names (there could be the same named filter with different id in different categories.)\nfunction getDistinctFilters(filters) {\n  const distinctFilters = [];\n  filters.forEach((x) => {\n    const found = utils.array.find(\n      distinctFilters,\n      (f) => f.name === x.filterName\n    );\n    if (found) {\n      found.value = found.value + `${x.filterCode}|`;\n    } else {\n      distinctFilters.push({\n        label: `${x.filterName}`,\n        value: `|${x.filterCode}|`,\n      });\n    }\n  });\n  return distinctFilters;\n}\n\nfunction getFilterTitle(distinctFilters, value) {\n  const found = utils.array.find(distinctFilters, (f) => f.value === value);\n  return found ? found.label : null;\n}\n\nfunction GetRightFilter({ filterTitle, filterId, items, value, onChange }) {\n  const filterValues = value.toString();\n  function handleChange(event) {\n    const _value = event.target.value;\n    onChange((pre) => {\n      let _new = [...pre];\n      const check = !filterValues.includes(_value);\n      _new = _new.filter((item) => item !== _value);\n\n      if (check === true) {\n        _new.push(_value);\n      }\n      return _new;\n    });\n  }\n\n  return (\n    <div>\n      <div className='filter__title'> {filterTitle} </div>\n      <div className='form-group'>\n        {items.map((item, index) => {\n          return (\n            <div key={index} className='form-check false'>\n              <input\n                className='form-check-input'\n                id={`${filterId}_${index}`}\n                type='checkbox'\n                value={item.value}\n                name={filterId}\n                checked={filterValues.includes(item.value)}\n                onChange={handleChange}\n              />\n              <label\n                className='form-check-label'\n                htmlFor={`${filterId}_${index}`}\n              >\n                {item.label}\n              </label>\n            </div>\n          );\n        })}\n      </div>\n      <hr className='filter__line' />\n    </div>\n  );\n}\n\nfunction GetRightSort({ items, value, onChange }) {\n  function handleChange(event) {\n    const _value = event.target.value;\n    onChange(_value);\n  }\n\n  return (\n    <div>\n      <div className='form-group'>\n        {items.map((item, index) => {\n          return (\n            <div key={index} className='form-check false'>\n              <input\n                className='form-check-input'\n                id={`rightSortInput_${index}`}\n                type='radio'\n                name='rightSortInput'\n                value={item.value}\n                checked={value === item.value && true}\n                onChange={handleChange}\n              />\n              <label\n                className='form-check-label'\n                htmlFor={`rightSortInput_${index}`}\n              >\n                {item.label}\n              </label>\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n}\n\nfunction getDiscontinuedProducts(arrays) {\n  const result = [];\n\n  for (let i = 0; i < arrays.length; i++) {\n    if (arrays[i].productStatus === 98) {\n      result.push(arrays[i]);\n    }\n  }\n\n  return result;\n}","import React from \"react\";\nimport utils from \"../../utils\";\nimport { SiteLink } from \"../../components\";\n//import env from '../../env';\n\nexport function TileDisc({ product }) {\n  const imageUrl = product.productThumbnail\n    ? utils.site.resourcePath(product.productThumbnail)\n    : \"/assets/product-empty.png\";\n  //console.log(imageUrl)\n  const productUrl = product.productUrl\n    ? product.productUrl\n    : `/product/${product.productCode}`;\n  //const barcodeCleaned = product.barcode ? product.barcode.replace(/-/g, '').replace(/ /g, '') : null;\n  return (\n    <div className='productTile tile'>\n      {/* <div itemScope={true} itemType=\"http://schema.org/Product\">\n        <meta itemProp=\"name\" content={product.productName} />\n        <div itemProp=\"brand\" itemType=\"http://schema.org/Brand\" itemScope>\n          <meta itemProp=\"name\" content={env.siteName} />\n        </div>\n\n        {product.intro && <meta itemProp=\"description\" content={product.intro} />}\n        {barcodeCleaned && <meta itemProp=\"sku\" content={barcodeCleaned} />}\n        {barcodeCleaned && <meta itemProp=\"gtin13\" content={barcodeCleaned} />}\n        {imageUrl && <link itemProp=\"image\" href={utils.site.fullUrl(imageUrl)} />}\n        <div itemProp=\"offers\" itemType=\"http://schema.org/Offer\" itemScope>\n          <link itemProp=\"url\" href={utils.site.fullUrl(product.productUrl)} />\n          {product.price && <meta itemProp=\"price\" content={product.price} />}\n          <meta itemProp=\"priceCurrency\" content={utils.site.isNZ? 'NZD' : 'AUD'} />\n        </div> */}\n\n      <SiteLink className='productTile__link tile__content' to={productUrl}>\n        <div className=\"discontinued__watermark\"></div>\n        <div>\n          <img\n            src={utils.site.resourcePath(imageUrl)}\n            alt={product.productName}\n          />\n        </div>\n        <div className='productTile__title'>\n          {product.productName}\n          <div className='productTile__inlineRating'>\n            <div\n              data-bv-show='inline_rating'\n              data-bv-seo='false'\n              data-bv-product-id={product.productCode}\n            ></div>\n          </div>\n        </div>\n\n        <div className='productTile__price'>\n          {product.priceText ? product.priceText : \"\"}\n        </div>\n      </SiteLink>\n      {/* </div> */}\n    </div>\n  );\n}\n","import React, { Fragment } from \"react\";\nimport env from \"../../env\";\nimport { usePost } from \"../../components\";\nimport { ErrorPopup, Loading } from \"../../components\";\nimport { FilterDropdown } from \"./filterDropdown\";\nimport * as sortHelper from \"./sortHelper\";\n// import { Tile } from \"./productTile\";\nimport { TileDisc } from \"./productTileDiscontinued\"\nimport { gtm } from \"../../lib/tracking\";\nimport { useBV } from \"../bazzarVoice/useBV\";\nimport { Helmet } from \"react-helmet-async\";\nimport utils from \"../../utils\";\n\nexport function ProductListV2(props) {\n  const post = usePost();\n  const [filters, setFilters] = React.useState([]);\n  const [filtersHC, setFiltersHC] = React.useState([]);\n  const [filtersHT, setFiltersHT] = React.useState([]);\n  const [filtersPT, setFiltersPT] = React.useState([]);\n  const [filtersSR, setFiltersSR] = React.useState([]);\n\n  const subCategory = props.subCategory;\n\n  const [sortBy, setSortBy] = React.useState(\"price-desc\");\n  const [showAll, setShowAll] = React.useState(false);\n  useBV(null, { showReview: null });\n  const searchParam = { ...props };\n\n  const noFilterPages = [\n    \"/style-bar/volume\",\n    \"/style-bar/straight\",\n    \"/style-bar/curls-and-waves\",\n    \"/style-bar/length\",\n    \"/style-bar/occasion\",\n  ];\n  const noFilters = noFilterPages.includes(window.location.pathname);\n\n  // console.log(\"searchParam.subCategory\", searchParam.subCategory);\n\n  // const categoryT =\n  //   searchParam.category === \"DRYERS\" ||\n  //   searchParam.category === \"STRAIGHTENERS\" ||\n  //   searchParam.category === \"CURLERS\" ||\n  //   searchParam.subCategory === \"travel\" ||\n  //   searchParam.subCategory === \"attachments\" ||\n  //   searchParam.subCategory === \"diffusers\" ||\n  //   searchParam.subCategory === \"straightening-irons\" ||\n  //   searchParam.subCategory === \"straightening-brushes\" ||\n  //   searchParam.subCategory === \"mini-hair-straighteners\"\n  //     ? \"\"\n  //     : \"none_dryers\";\n\n  const categoryT = \"\";\n\n  React.useEffect(() => {\n    post.send(env.apiBase + \"/api/product/getDiscProducts\", searchParam);\n    // eslint-disable-next-line\n  }, []);\n\n  React.useEffect(() => {\n    if (\n      post.response &&\n      post.response.results &&\n      post.response.results.searchResult &&\n      filters.length > 0\n    ) {\n      const data = post.response.results.searchResult;\n      const distinctFilters = getDistinctFilters(data.filters);\n      const value = filters\n        .map((x) => getFilterTitle(distinctFilters, x))\n        .filter((x) => x)\n        .join(\",\");\n      //console.log(distinctFilters, filters, value)\n      //console.log('sdfsdfsdfsd', value)\n      //gtm.sendGAEvent('Product Filter', 'Filter By', value);\n      gtm.sendEvent(\"productFilterPush\", { productFilterName: value });\n    }\n\n    // eslint-disable-next-line\n  }, [filters]);\n\n  if (post.loading()) {\n    return <Loading />;\n  } else if (post.hasErrors()) {\n    return <ErrorPopup title='Loading Error' errors={post.errors} />;\n  }\n\n  const data = post.response.results.searchResult;\n  \n  const distinctFilters = getDistinctFilters(data.filters);\n  const distinctFiltersHC = getDistinctFilters(data.filtersHC);\n  const distinctFiltersHT = getDistinctFilters(data.filtersHT);\n  const distinctFiltersPT = getDistinctFilters(data.filtersPT);\n  const distinctFiltersSR = getDistinctFilters(data.filtersSR);\n\n  const filterItems = [...distinctFilters];\n  const filterItemsHC = [...distinctFiltersHC];\n  const filterItemsHT = [...distinctFiltersHT];\n  const filterItemsPT = [...distinctFiltersPT];\n  const filterItemsSR = [...distinctFiltersSR];\n\n  const sortItems = sortHelper.sortSelections();\n\n  //origin\n  //let filtered = filters.length > 0 ? getFilteredItems(data.items, filters, filterItemsHC, filterItemsHT) : data.items;\n\n  //let filtered = getFilteredItems(data.items, filters, );\n  let filtered = getFilteredItems(\n    data.items,\n    filters,\n    filtersHC,\n    filtersHT,\n    filtersPT,\n    filtersSR\n  );\n\n  sortHelper.sort(filtered, sortBy);\n\n  const maxListing = utils.css.screenWidth() > 1600 ? 100 : 120;\n  const showMoreButton =\n    !showAll && filters.length > 0 && filtered.length > maxListing;\n  //console.log(maxListing, !filter, filtered.length, maxListing,  showMoreButton)\n  if (showMoreButton) {\n    filtered = filtered.splice(0, maxListing);\n  }\n\n  const baseUrl = utils.site.isNZ\n    ? \"https://www.vssassoon.co.nz\"\n    : \"https://www.vssassoon.com.au\";\n  const itemListStructuredData = {\n    \"@context\": \"https://schema.org/\",\n    \"@type\": \"ItemList\",\n    \"itemListElement\": data.items.map((product, index) => ({\n      \"@type\": \"ListItem\",\n      \"position\": index + 1,\n      \"url\": `${baseUrl}${product.productUrl}`,\n      \"image\": product.productThumbnail,\n      \"name\": product.productName,\n    })),\n  };\n\n  if (data.totalCnt === 0) return <div>No product found.</div>;\n  return (\n    <>\n      {data.items && (\n        <Helmet>\n          <script type='application/ld+json'>\n            {JSON.stringify(itemListStructuredData)}\n          </script>\n        </Helmet>\n      )}\n      <div className='productList__warpper'>\n        <div className={`productList__container ${categoryT}`}>\n          <div className={`productList ${categoryT}`}>\n            {filtered.length === 0 ? (\n              <div className='no_products'>\n                Oops! Looks like there’s no product that matches this criteria.\n                <br />\n                Keep filtering, the perfect match awaits!\n              </div>\n            ) : (\n              filtered.map((product, index) => (\n                <TileDisc product={product} key={product.productCode}></TileDisc>\n              ))\n            )}\n          </div>\n          <div\n            style={{\n              fontSize: \"0.75rem\",\n              color: \"#777\",\n              textAlign: \"left\",\n              marginLeft: \"10px\",\n            }}\n          >\n            *Results depend on individual hair type & styling habits. Always\n            read the product instructions before use.\n          </div>\n        </div>\n      </div>\n\n      {showMoreButton && (\n        <div style={{ textAlign: \"center\" }}>\n          <button\n            className='btn btn-primary'\n            onClick={(e) => {\n              setShowAll(true);\n            }}\n          >\n            Show All\n          </button>\n        </div>\n      )}\n      {/* <div style={{ fontSize: \"0.75rem\", color: \"#777\", textAlign: \"left\" }}>\n        *Results depend on individual hair type & styling habits. Always read\n        the product instructions before use.\n      </div> */}\n    </>\n  );\n}\n\nfunction getFilteredItems(\n  items,\n  filters,\n  filtersHC,\n  filtersHT,\n  filtersPT,\n  filtersSR\n) {\n  let _items = items;\n\n  if (filters.length > 0) {\n    _items = _items.filter((x) =>\n      filters.every((filter) =>\n        x.filterCodes.some((fc) => {\n          return filter.indexOf(fc) >= 0;\n        })\n      )\n    );\n  }\n\n  if (filtersPT.length > 0) {\n    _items = _items.filter((x) =>\n      filtersPT.every((filter) =>\n        x.filterCodes.some((fc) => {\n          return filter.indexOf(fc) >= 0;\n        })\n      )\n    );\n  }\n\n  if (filtersHC.length > 0) {\n    _items = _items.filter((x) =>\n      filtersHC.every((filter) =>\n        x.filterCodes.some((fc) => {\n          return filter.indexOf(fc) >= 0;\n        })\n      )\n    );\n  }\n\n  if (filtersHT.length > 0) {\n    _items = _items.filter((x) =>\n      filtersHT.every((filter) =>\n        x.filterCodes.some((fc) => {\n          return filter.indexOf(fc) >= 0;\n        })\n      )\n    );\n  }\n\n  if (filtersSR.length > 0) {\n    _items = _items.filter((x) =>\n      filtersSR.every((filter) =>\n        x.filterCodes.some((fc) => {\n          return filter.indexOf(fc) >= 0;\n        })\n      )\n    );\n  }\n\n  return _items;\n\n  // Origin\n  // return items.filter(x => filters.every(filter => x.filterCodes.some(fc => {\n  //   //console.log(filter, fc, filter.indexOf(fc) >= 0)\n  //   return filter.indexOf(fc) >= 0\n  // })));\n\n  //return items.filter(x => x.filterCodes.some(f => filters.every(t => t.indexOf(f) >= 0)))\n}\n\n// get distinct filter names (there could be the same named filter with different id in different categories.)\nfunction getDistinctFilters(filters) {\n  const distinctFilters = [];\n  filters.forEach((x) => {\n    const found = utils.array.find(\n      distinctFilters,\n      (f) => f.name === x.filterName\n    );\n    if (found) {\n      found.value = found.value + `${x.filterCode}|`;\n    } else {\n      distinctFilters.push({\n        label: `${x.filterName}`,\n        value: `|${x.filterCode}|`,\n      });\n    }\n  });\n  return distinctFilters;\n}\n\nfunction getFilterTitle(distinctFilters, value) {\n  const found = utils.array.find(distinctFilters, (f) => f.value === value);\n  return found ? found.label : null;\n}\n\nfunction GetRightFilter({ filterTitle, filterId, items, value, onChange }) {\n  const filterValues = value.toString();\n  function handleChange(event) {\n    const _value = event.target.value;\n    onChange((pre) => {\n      let _new = [...pre];\n      const check = !filterValues.includes(_value);\n      _new = _new.filter((item) => item !== _value);\n\n      if (check === true) {\n        _new.push(_value);\n      }\n      return _new;\n    });\n  }\n\n  return (\n    <div>\n      <div className='filter__title'> {filterTitle} </div>\n      <div className='form-group'>\n        {items.map((item, index) => {\n          return (\n            <div key={index} className='form-check false'>\n              <input\n                className='form-check-input'\n                id={`${filterId}_${index}`}\n                type='checkbox'\n                value={item.value}\n                name={filterId}\n                checked={filterValues.includes(item.value)}\n                onChange={handleChange}\n              />\n              <label\n                className='form-check-label'\n                htmlFor={`${filterId}_${index}`}\n              >\n                {item.label}\n              </label>\n            </div>\n          );\n        })}\n      </div>\n      <hr className='filter__line' />\n    </div>\n  );\n}\n\nfunction GetRightSort({ items, value, onChange }) {\n  function handleChange(event) {\n    const _value = event.target.value;\n    onChange(_value);\n  }\n\n  return (\n    <div>\n      <div className='form-group'>\n        {items.map((item, index) => {\n          return (\n            <div key={index} className='form-check false'>\n              <input\n                className='form-check-input'\n                id={`rightSortInput_${index}`}\n                type='radio'\n                name='rightSortInput'\n                value={item.value}\n                checked={value === item.value && true}\n                onChange={handleChange}\n              />\n              <label\n                className='form-check-label'\n                htmlFor={`rightSortInput_${index}`}\n              >\n                {item.label}\n              </label>\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n}\n\nfunction filterArrayWithConditions(sourceArray, conditionArray, includeWhen = true) {\n  // Validate input arrays\n  if (!Array.isArray(sourceArray) || !Array.isArray(conditionArray)) {\n    throw new Error('Both sourceArray and conditionArray must be arrays');\n  }\n  \n  if (sourceArray.length !== conditionArray.length) {\n    throw new Error('Source array and condition array must have the same length');\n  }\n  \n  // Create a new array with filtered items\n  const result = [];\n  \n  for (let i = 0; i < sourceArray.length; i++) {\n    // Check if the condition matches our inclusion criteria\n    if (conditionArray[i] === includeWhen) {\n      result.push(sourceArray[i]);\n    }\n  }\n  \n  return result;\n}\n","import React, {Fragment} from 'react';\nimport env from '../../env';\nimport { useGet } from '../../components';\nimport { ErrorPopup, Loading } from '../../components';\n\nexport function WhereToBuyList(props) {\n\n  const get = useGet();\n  React.useEffect(() => {\n    get.send(env.apiBase + '/api/store/getstores');\n    // eslint-disable-next-line\n  }, []);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  console.log(get)\n  const data = get.response;\n\n  if (data.totalCnt === 0) return <div>No Store found.</div>\n  return (\n    <Stores stores={data}/>\n  );\n}\n\nfunction Stores({ stores }) {\n  return (\n    <ul className=\"stores\">\n      {stores.map(store => <li key={store.storeCode} className={`store`}>\n        <figure>\n        {store.storeUrl && store.storeUrl !== '' && store.buyOnline ? (\n          <a\n            href={store.storeUrl}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            <img\n              src={`/assets/shops/${store.iconPath}`}\n              alt={store.storeName}\n            />\n            <figcaption>Buy Online</figcaption>\n            {/* <figcaption>{store.storeName}</figcaption> */}\n          </a>\n        ) : (\n          <Fragment>\n            <img\n              src={`/assets/shops/${store.iconPath}`}\n              alt={store.storeName}\n            />\n            <figcaption>{store.storeName}</figcaption>\n          </Fragment>\n        )}\n          {/*{\n            (store.iconPath && store.iconPath !== '') &&\n            <img src={`/assets/shops/${store.iconPath}`} alt={store.storeName} />\n          }\n\n          <figcaption>{store.storeName}</figcaption>\n          {store.buyOnline && <a href={store.storeUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n            Buy online <span className=\"icon\"></span>\n          </a>}*/}\n        </figure>\n      </li>)}\n    </ul>)\n}\n\n// className={`store ${(store.iconPath && store.iconPath !== '') ? 'show' : 'hide'}`}","import React from \"react\";\nimport env from \"../../env\";\nimport { SiteLink } from \"../../components\";\nimport { usePost } from \"../../components\";\nimport { ErrorPopup, Loading } from \"../../components\";\nimport { useRouter } from \"../../components\";\nimport { Tile } from \"../product/productTile\";\nimport { TileDisc } from \"../product/productTileDiscontinued\";\nimport { useBV } from \"../bazzarVoice/useBV\";\n\nexport function SearchResult(props) {\n  const { query } = useRouter();\n  const post = usePost();\n  useBV(null, { showReview: null });\n\n  const keyword = query.q;\n\n  React.useEffect(() => {\n    post.send(env.apiBase + \"/api/search/search\", { keyword: keyword });\n    // eslint-disable-next-line\n  }, [keyword]);\n\n  if (post.loading()) {\n    return <Loading />;\n  } else if (post.hasErrors()) {\n    return <ErrorPopup title='Loading Error' errors={post.errors} />;\n  }\n\n  const data = post.response;\n\n  // products\n  const products = data.products;\n  const productsOn = products.filter(function (obj) {\n    return obj.productStatus !== 98;\n  });\n  // const sortedProductsOn = productsOn.sort((a, b) => b.price - a.price);\n  const sortedProductsOn = productsOn;\n\n  const productsOff = products.filter(function (obj) {\n    return obj.productStatus === 98;\n  });\n\n  // pages\n  const pages = data.pages;\n  function removeDuplicates(arr) {\n    const uniqueArray = [];\n    for (const item of arr) {\n      const existingItem = uniqueArray.find(\n        (uniqueItem) => uniqueItem.pageUrl === item.pageUrl\n      );\n      if (!existingItem) {\n        uniqueArray.push(item);\n      }\n    }\n    return uniqueArray;\n  }\n  const sortedPages = removeDuplicates(pages);\n\n  if (sortedProductsOn.length === 0 && sortedPages.length === 0)\n    return (\n      <div className='alert alert-danger' role='alert'>\n        No result found.\n      </div>\n    );\n  return (\n    <>\n      {sortedProductsOn.length > 0 && (\n        <div>\n          <h3>\n            Products related to{\" \"}\n            <span style={{ fontWeight: \"700\" }}>{keyword}</span>\n          </h3>\n          <ProductList products={sortedProductsOn} />\n        </div>\n      )}\n      {sortedPages.length > 0 && (\n        <div>\n          <h3 style={{ marginTop: \"2rem\" }}>\n            Articles related to{\" \"}\n            <span style={{ fontWeight: \"700\" }}>{keyword}</span>\n          </h3>\n          <PageList pages={sortedPages} />\n        </div>\n      )}\n      {productsOff.length > 0 && (\n        <div>\n          <h3 style={{ marginTop: \"2rem\" }}>\n            Discontinued Products related to{\" \"}\n            <span style={{ fontWeight: \"700\" }}>{keyword}</span>\n          </h3>\n          <DiscProductList products={productsOff} />\n        </div>\n      )}\n    </>\n  );\n}\n\nfunction ProductList({ products }) {\n  return (\n    <div className='productList'>\n      {products.map((product, index) => (\n        <Tile product={product} key={product.productCode}></Tile>\n      ))}\n    </div>\n  );\n}\n\nfunction DiscProductList({ products }) {\n  return (\n    <div className='productList'>\n      {products.map((product, index) => (\n        <TileDisc product={product} key={product.productCode}></TileDisc>\n      ))}\n    </div>\n  );\n}\n\nfunction PageList({ pages }) {\n  return (\n    <div className='pageList row'>\n      {pages.map((page, index) => (\n        <div className='pageListItem col-md-6 col-lg-4' key={index}>\n          <div className='pageListItem__inner'>\n            <SiteLink className='pageListItem__title' to={page.pageUrl}>\n              {page.imageUrl ? (\n                <img\n                  src={page.imageUrl}\n                  alt='page_image'\n                  className='page_image'\n                />\n              ) : (\n                <img\n                  src='/assets/logo-white-background.png'\n                  alt='page_image'\n                  className='page_image'\n                />\n              )}\n              {page.pageTitle}\n            </SiteLink>\n            {/* <div\n              className='pageListItem__highlight'\n              dangerouslySetInnerHTML={{ __html: page.searchHighlight }}\n            ></div>*/}\n          </div>\n        </div>\n      ))}\n    </div>\n  );\n}\n","import { css, keyframes  } from '@emotion/core'\nimport { variables, mq } from '../../cssInJs'\nconst spin = keyframes`\n100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); }\n`\n\nconst step = css(mq({\n  flex: '0 0 100%',\n  opacity: 0,\n  maxHeight: '300px',\n  transition: 'all 0.3s',\n  '>div': {\n    paddingLeft: [5, 5, 100],\n    paddingRight: [5, 5, 100],\n  }\n}))\n\nconst navs = {\n  navs: css(mq({\n    marginTop: [5, 10, 20],\n    marginBottom: 15,\n    display: 'flex',\n    justifyContent: 'center',\n  })),\n  nav: css(mq({\n    width: 20,\n    height: 30,\n    background: '#ccc',\n    margin: 5,\n    transform: 'skewX(-12deg)'\n  })),\n  navCurrent: css({\n    backgroundColor: variables.primaryColor\n  }),\n  navFilled: css({\n    backgroundColor: '#666'\n  }),\n  navClickable: css({\n    cursor: 'pointer'\n  })\n}\n\nconst tileSelected = css({\n  '.tileImage:after': {\n    opacity: '1',\n    background: 'linear-gradient(0deg, rgba(194, 15, 47, 0.2) 0%, rgba(194, 15, 47, 1) 100%)',\n    animation: `${spin} 6s linear infinite`,\n  }\n})\nconst tiles = {\n  tiles: css(mq({\n    marginLeft: [0, -5, null, -10],\n    marginRight: [0, -5, null, -10],\n    display: 'flex',\n    justifyContent: 'center',\n    flexWrap: 'wrap'\n  })),\n  tile: css(mq({\n    flexBasis: ['50%', null, '33.33%'],\n    padding: [0, 5, null, 10],\n    cursor: 'pointer',\n    maxWidth: [200, 200, 220],\n    ':hover, :focus': tileSelected\n  })),\n  tileSelected: tileSelected,\n  tileImage: css({\n    position: 'relative',\n    padding: '10px',\n\n    ':after': {\n      content: `''`,\n      position: 'absolute',\n      left: '0',\n      top: '0',\n      zIndex: '-1',\n      borderRadius: '50%',\n      width: '100%',\n      height: '100%',\n      transition: 'all 1s',\n      opacity: '0',\n      background: 'rgb(255, 255, 255)',\n    }\n  })\n}\n\nexport default {\n  styleMatch: css({\n    position: 'relative',\n    maxWidth: '1300px',\n    margin: 'auto',\n    paddingBottom: '3rem'\n  }),\n\n  steps: css({\n    overflow: 'hidden',\n  }),\n  stepsInner: css({\n    display: 'flex',\n    transition: 'all 1s cubic-bezier(0.22, 0.61, 0.36, 1)',\n    '& h3, & h4': {\n      textTransform: 'uppercase'\n    }\n  }),\n  step,\n  stepCurrent: css(step, {\n    maxHeight: '2000px',\n    opacity: 1\n  }),\n  stepPrev: css(step, {}),\n  stepNext: css(step, {}),\n  stepLast: css({\n    //maxHeight: '1000px',\n    opacity: 1\n  }),\n\n  arrow: css(mq({\n    position: \"absolute\",\n    cursor: 'pointer',\n    color: '#aaa',\n    transition: 'all 0.3s',\n    zIndex: '1',\n    // xs, sm(>=576), md(>=768), lg(>=992), xl(>=1200), xxl(>=1600)\n    top: 0,\n    // [mqMax.md]: {\n    //   width: 100\n    // },\n    width: [20, 25, 30, 40],\n    '&:hover': {\n      color: '#666'\n    }\n  })),\n  arrowPrev: css(mq({\n    left: [-15, 0]\n  })),\n  arrowNext: css(mq({\n    right: [-15, 0]\n  })),\n\n  ...tiles,\n  ...navs\n}\n","const questions = [\n  {\n    title: `What's your natural hair type`,\n    answers: [\n      { id: 'B', label: 'Straight', icon: 'q1-straight.png' },\n      { id: 'C', label: 'Wavy', icon: 'q1-wavy.png' },\n      { id: 'D', label: 'Curly', icon: 'q1-curly.png' },\n    ]\n  },\n  {\n    title: `What's your natural hair texture`,\n    answers: [\n      { id: 'E', label: 'Fine', icon: 'q3-fine.png' },\n      { id: 'F', label: 'Medium', icon: 'q3-medium.png' },\n      { id: 'G', label: 'Thick', icon: 'q3-thick.png' },\n    ]\n  },\n  {\n    title: `What's your current hair length`,\n    answers: [\n      { id: 'H', label: 'Short', icon: 'q5-short-2.png' },\n      { id: 'I', label: 'Medium', icon: 'q5-medium-2.png' },\n      { id: 'J', label: 'Long', icon: 'q5-long-2.png' },\n    ]\n  },\n  {\n    title: 'What is your biggest hair concern',\n    answers: [\n      { id: 'K', label: 'Frizzy', icon: 'q4-frizzy.png' },\n      { id: 'L', label: 'Dry & Dull', icon: 'q4-dry.png' },\n      //{ id: 'L', label: 'Dull', icon: 'q4-dull.png' },\n      { id: 'M', label: 'Fine', icon: 'q4-fine.png' },\n      { id: 'N', label: 'Overly Treated / Colour Fade', icon: 'q4-coloured.png' },\n    ]\n  },\n  {\n    title: 'And, how do you tend to wear it',\n    answers: [\n      { id: 'O', label: 'Keep it consistent', icon: 'q5-consistent-2.png' },\n      { id: 'P', label: 'Regularly change it up', icon: 'q2-change-it.png' },\n      { id: 'Q', label: 'Try to be adventourous', icon: 'q5-adventurous-2.png' },\n    ]\n  },\n  {\n    title: 'Choose your most important hair goal',\n    answers: [\n      { id: 'R', label: 'Build Volume', icon: 'q6-volume-2.png' },\n      { id: 'T', label: 'Tame Frizz', icon: 'q6-frizz-2.png' },\n      { id: 'S', label: 'Create Curls', icon: 'q6-curls-2.png' },\n      { id: 'U', label: 'Create Waves', icon: 'q6-waves.png' },\n      { id: 'V', label: 'Straight Styles', icon: 'q6-straight-styles-2.png' },\n      { id: 'W', label: 'Enhance Your Natural Hair', icon: 'q6-natural-2.png' },\n      //{ id: 'W', label: 'Add texture', icon: 'q6-texture.png' },\n      { id: 'X', label: 'Enhance Hair Health', icon: 'q6-hair-health.png' },\n    ]\n  },\n  {\n    title: 'Choose your style vibe',\n    answers: [\n      { id: 'Y', label: 'Casual', icon: 'q7-casual.png' },\n      { id: 'Z', label: 'Classic', icon: 'q7-sleek.png' },//new\n      { id: 'AA', label: 'Boss Babe', subLabel: '', icon: 'q7-luxe.png' },\n      { id: 'AB', label: 'Edgy', subLabel: '', icon: 'q7-edgy.png' },\n      { id: 'AC', label: 'Girly', subLabel: '', icon: 'q7-girly.png' },\n      { id: 'AD', label: 'Socialite', subLabel: '', icon: 'q7-glam.png' },//new\n      { id: 'AE', label: 'Boho', subLabel: '', icon: 'q7-boho-2.png' },\n      { id: 'AF', label: 'Glam', subLabel: '', icon: 'q7-glam-2.png' },//??\n    ]\n  }\n]\n\nconst results = [\n  { id: '1', label: 'Natural Beauty', page: '/hair-style-quiz-natural-beauty' },\n  { id: '2', label: 'Polished Elegance', page: '/hair-style-quiz-polished-elegance' },\n  { id: '3', label: 'Sleek Style', page: '/hair-style-quiz-sleek-style' },\n  { id: '4', label: 'Romantic at Heart', page: '/hair-style-quiz-romantic-at-heart' },\n  { id: '5', label: 'Free Spirit', page: '/hair-style-quiz-free-spirit' },\n  { id: '6', label: 'Bold Beauty', page: '/hair-style-quiz-bold-beauty' },\n  { id: '7', label: 'Urban Chic', page: '/hair-style-quiz-urban-chic' },\n  { id: '8', label: 'Party Gal', page: '/hair-style-quiz-party-gal ' },\n]\n\nconst matches = [  \n  { answer: 'B', results: [1, 1, 1, 1, 1, 1, 1, 1]}, \n{ answer: 'C', results: [1, 1, 1, 1, 1, 1, 1, 1]}, \n{ answer: 'D', results: [1, 1, 1, 1, 1, 0, 0, 0]}, \n{ answer: 'E', results: [1, 1, 1, 1, 1, 1, 1, 1]}, \n{ answer: 'F', results: [1, 1, 1, 1, 1, 1, 1, 1]}, \n{ answer: 'G', results: [1, 0, 1, 1, 1, 1, 0, 1]}, \n{ answer: 'H', results: [1, 0, 0, 0, 0, 1, 0, 0]}, \n{ answer: 'I', results: [1, 1, 1, 1, 1, 1, 1, 1]}, \n{ answer: 'J', results: [1, 1, 1, 1, 1, 1, 1, 1]}, \n{ answer: 'K', results: [1, 0, 1, 0, 0, 0, 1, 1]}, \n{ answer: 'L', results: [0, 0, 0, 0, 1, 1, 1, 0]}, \n{ answer: 'M', results: [1, 1, 1, 1, 1, 1, 0, 1]}, \n{ answer: 'N', results: [0, 0, 1, 0, 0, 1, 1, 0]}, \n{ answer: 'O', results: [1, 0, 0, 0, 0, 0, 0, 0]}, \n{ answer: 'P', results: [0, 1, 1, 1, 1, 1, 1, 0]}, \n{ answer: 'Q', results: [0, 0, 0, 0, 1, 0, 0, 1]}, \n{ answer: 'R', results: [0, 1, 1, 1, 0, 1, 0, 1]}, \n{ answer: 'S', results: [1, 0, 1, 0, 0, 0, 1, 1]}, \n{ answer: 'T', results: [0, 1, 0, 1, 1, 1, 0, 1]}, \n{ answer: 'U', results: [0, 0, 1, 1, 1, 1, 1, 1]}, \n{ answer: 'V', results: [1, 0, 1, 0, 1, 0, 0, 1]}, \n{ answer: 'W', results: [1, 0, 0, 0, 0, 0, 0, 0]}, \n{ answer: 'X', results: [1, 0, 1, 0, 0, 1, 0, 0]}, \n{ answer: 'Y', results: [1, 0, 0, 1, 1, 0, 0, 0]}, \n{ answer: 'Z', results: [1, 1, 1, 1, 0, 1, 0, 0]}, \n{ answer: 'AA', results: [0, 1, 1, 0, 0, 1, 0, 0]}, \n{ answer: 'AB', results: [0, 0, 0, 0, 1, 1, 1, 0]}, \n{ answer: 'AC', results: [0, 0, 0, 1, 1, 1, 1, 0]}, \n{ answer: 'AD', results: [0, 0, 0, 1, 1, 0, 1, 1]}, \n{ answer: 'AE', results: [0, 0, 0, 1, 0, 1, 0, 0]}, \n{ answer: 'AF', results: [0, 0, 1, 1, 0, 1, 1, 0]}, \n]\n\nexport default { questions: questions, results: results, matches: matches };\n\n\n// =CONCATENATE(\"{ answer: '\",B15,\"', results: [\", \n// \"'\", B5, \"', \",\n// \"'\", B6, \"', \",\n// \"'\", B7, \"', \",\n// \"'\", B8, \"', \",\n// \"'\", B9, \"', \",\n// \"'\", B10, \"', \",\n// \"'\", B11, \"', \",\n// \"'\", B12, \"'\",\n// , \"]}, \")","import React from \"react\";\r\n\r\nfunction SvgNarrowLeft(props) {\r\n  return (\r\n    <svg viewBox=\"0 0 100 240\" {...props}>\r\n      <path\r\n        fill=\"currentColor\"\r\n        d=\"M76 20L26 120l50 100v-10l-44-90 44-90z\"\r\n      />\r\n    </svg>\r\n  );\r\n}\r\n\r\nexport default SvgNarrowLeft;\r\n","import React from \"react\";\r\n\r\nfunction SvgNarrowRight(props) {\r\n  return (\r\n    <svg viewBox=\"0 0 100 240\" {...props}>\r\n      <path\r\n        fill=\"currentColor\"\r\n        d=\"M26 20l50 100-50 100v-10l44-90-44-90z\"\r\n      />\r\n    </svg>\r\n  );\r\n}\r\n\r\nexport default SvgNarrowRight;\r\n","import * as React from \"react\";\r\nimport siteConfig from '../../../config';\r\n\r\nconst iconColors = (siteConfig && siteConfig.iconColors) || { primary: \"#eee\", secondary: \"#000\" }\r\n\r\nfunction SvgLoading(props) {\r\n  return (\r\n    <svg\r\n      width={200}\r\n      height={200}\r\n      viewBox=\"0 0 100 100\"\r\n      preserveAspectRatio=\"xMidYMid\"\r\n      {...props}\r\n    >\r\n      <circle\r\n        cx={50}\r\n        cy={50}\r\n        r={29.973}\r\n        fill=\"none\"\r\n        stroke={iconColors.primary}\r\n        strokeWidth={8}\r\n      >\r\n        <animate\r\n          attributeName=\"r\"\r\n          repeatCount=\"indefinite\"\r\n          dur=\"1.8518518518518516s\"\r\n          values=\"0;40\"\r\n          keyTimes=\"0;1\"\r\n          keySplines=\"0 0.2 0.8 1\"\r\n          calcMode=\"spline\"\r\n          begin=\"-0.9259259259259258s\"\r\n        />\r\n        <animate\r\n          attributeName=\"opacity\"\r\n          repeatCount=\"indefinite\"\r\n          dur=\"1.8518518518518516s\"\r\n          values=\"1;0\"\r\n          keyTimes=\"0;1\"\r\n          keySplines=\"0.2 0 0.8 1\"\r\n          calcMode=\"spline\"\r\n          begin=\"-0.9259259259259258s\"\r\n        />\r\n      </circle>\r\n      <circle\r\n        cx={50}\r\n        cy={50}\r\n        r={8.673}\r\n        fill=\"none\"\r\n        stroke={iconColors.secondary}\r\n        strokeWidth={8}\r\n      >\r\n        <animate\r\n          attributeName=\"r\"\r\n          repeatCount=\"indefinite\"\r\n          dur=\"1.8518518518518516s\"\r\n          values=\"0;40\"\r\n          keyTimes=\"0;1\"\r\n          keySplines=\"0 0.2 0.8 1\"\r\n          calcMode=\"spline\"\r\n        />\r\n        <animate\r\n          attributeName=\"opacity\"\r\n          repeatCount=\"indefinite\"\r\n          dur=\"1.8518518518518516s\"\r\n          values=\"1;0\"\r\n          keyTimes=\"0;1\"\r\n          keySplines=\"0.2 0 0.8 1\"\r\n          calcMode=\"spline\"\r\n        />\r\n      </circle>\r\n    </svg>\r\n  );\r\n}\r\n\r\nexport default SvgLoading;","import React, { useEffect } from 'react';\n/** @jsx jsx */\nimport { jsx } from '@emotion/core';\nimport utils from '../../utils';\nimport style from './styleMatchStyles';\nimport { getStyleMatchModel } from './styleMatchFormModel';\nimport { useForm } from '../../form';\n//import env from '../../env';\n\n//import { StyleMatchTest } from './styleMatchTest';\nimport data from './styleData';\nimport { useRouter } from '../../components';\nimport { NarrowLeft, NarrowRight } from '../../icons';\n\nexport function StyleMatch(props) {\n  const { history } = useRouter();\n  const navEl = React.useRef(null);\n  //const [inTransition, setInTransition] = React.useState(false);\n  const [lastStep, setLastStep] = React.useState(0);\n  const [currentStep, setCurrentStep] = React.useState(0);\n  const [selection, setSelection] = React.useState(['', '', '', '', '', '', '']);\n  const [submitTrigger, setSubmitTrigger] = React.useState(0);\n  const model = getStyleMatchModel({});\n  const form = useForm(model, { usePlaceholder: true });\n\n  const onSelected = (questionIndex, answerId) => {\n    //console.log(questionIndex, answerId, selection);\n\n    selection[questionIndex] = answerId;\n    setSelection(selection);\n    moveNext();\n  }\n\n  const onSubmit = (e) => {\n    e.preventDefault();\n\n    form.validateForm(e, () => {\n      //const value = { ...form.getValue() };\n      setSubmitTrigger(submitTrigger + 1);\n    });\n\n    // const result = sum(selection);\n    // const maxScore = Math.max(...result)\n    // const targets = result.map((x, i) => x === maxScore ? i : '').filter(String);\n    // const resultIndex = targets[Math.floor(Math.random() * targets.length)];\n    // console.log(targets, resultIndex)\n    // const page = data.results[resultIndex].page;\n    // console.log(selection, result, maxScore, targets, resultIndex, page);\n    // history.push(page);\n  }\n\n  const onMove = (loc) => {\n    if (loc === 'prev')\n      movePrev()\n    else\n      moveNext()\n  }\n\n  const moveNext = () => {\n    moveTo(currentStep < selection.length ? currentStep + 1 : currentStep)\n  }\n\n  const movePrev = () => {\n    moveTo(currentStep > 0 ? currentStep - 1 : 0)\n  }\n\n  const jump = (index) => {\n    if (!clickable(index)) return\n    moveTo(index)\n  }\n\n  const moveTo = (index) => {\n    setLastStep(currentStep)\n    setCurrentStep(index)\n    if (!utils.ui.isElementInViewport(navEl.current)) {\n      utils.ui.scrollTo(navEl.current)\n    }\n  }\n\n  function isSelected(questionIndex, answerId) {\n    return selection[questionIndex] === answerId;\n  }\n\n  function Step({ question, index }) {\n    const locStyle = index === currentStep ? style.stepCurrent : (\n      index === currentStep - 1 ? style.stepPrev : (\n        index === currentStep + 1 ? style.stepNext : style.step))\n    const movingStyle = index === lastStep ? style.stepLast : null;\n    return <div\n      css={[locStyle, movingStyle]}>\n      <h4>STEP {index + 1}</h4>\n      <h3>{question.title}</h3>\n      <div css={style.tiles}>\n        {question.answers.map(x => <div key={x.id}\n          css={[style.tile, isSelected(index, x.id) && style.tileSelected]}\n          onClick={() => onSelected(index, x.id)}>\n          <div className=\"tileImage\" css={style.tileImage}>\n            <img src={utils.site.resourcePath(`/sites/vssassoon/media/style-match/${x.icon}`)} alt={x.label} />\n          </div>\n          <div css={{ marginTop: '0.3rem' }}>{x.label}</div>\n          <div>{x.subLabel}</div>\n        </div>)}\n      </div>\n    </div>\n  }\n\n  //\n\n  // function LastStep({form}) {\n  //   const locStyle = 7 === currentStep ? style.stepCurrent : (\n  //     7 === currentStep + 1 ? style.stepNext : style.step)\n\n  //   const render = (name) => form.renderControl(name, null);\n\n  //   return <div className={`styleMatch__step`}\n  //     css={locStyle}>\n  //     <p>&nbsp;</p>\n  //     <h2><strong>ALL DONE!</strong></h2>\n  //     <p>Now submit your answers to view your style match.</p>\n  //     <p>&nbsp;</p>\n\n  //     <form className=\"\">\n  //       <div className=\"form-row style__match__email\">\n  //         <div className=\"col-md-6 mb-2\">{render('name')}</div>\n  //         <div className=\"col-md-6 mb-2\">{render('email')}</div>\n  //       </div>\n  //       <div className=\"form-row unsubscribed\">\n  //         <div className=\"col-md-12 mb-2\">{render('unsubscribed')}</div>\n  //       </div>\n  //       <h5><a className=\"button\" href=\"/\" onClick={onSubmit}><span><strong>SUBMIT</strong></span></a></h5>\n  //     </form>\n\n  //     <p>&nbsp;</p>\n  //     <h5>We know your style changes, you can come back and update your choices whenever needed.&nbsp;</h5>\n  //   </div>\n  // }\n\n  function Nav() {\n    return <div css={style.navs}>\n      {[0, 1, 2, 3, 4, 5, 6, 7].map((question, index) =>\n        <div key={index} index={index}\n          css={[style.nav,\n          hasValue(index) && style.navFilled,\n          index === currentStep ? style.navCurrent : null,\n          clickable(index) && style.navClickable\n          ]}\n          onClick={() => jump(index)}\n        ></div>)}\n    </div>\n  }\n\n  function hasValue(index) {\n    return !!selection[index]\n  }\n\n  function clickable(index) {\n    if (hasValue(index)) return true;\n    const maxIndexFilled = Math.max(...selection.map((x, i) => !!x ? i : -1));\n    return index <= maxIndexFilled + 1\n  }\n\n  function canGoNext() {\n    return currentStep < selection.length && clickable(currentStep + 1)\n  }\n\n  function canGoPrev() {\n    return currentStep > 0 && clickable(currentStep - 1)\n  }\n\n  useEffect(() => {\n    if (submitTrigger === 0) {\n      return\n    }\n\n    const abortController = new AbortController();\n    //const signal = abortController.signal;\n\n    //const value = { ...form.getValue() };\n    const result = sum(selection);\n    const maxScore = Math.max(...result)\n    const targets = result.map((x, i) => x === maxScore ? i : '').filter(String);\n    const resultIndex = targets[Math.floor(Math.random() * targets.length)];\n    //console.log(targets, resultIndex)\n    const page = data.results[resultIndex].page;\n    //const label = data.results[resultIndex].label;\n    //console.log(selection, result, maxScore, targets, resultIndex, page);\n\n    // console.log(\"selection\", selection);\n    // console.log(\"value\", value);\n\n    // const _questions = data.questions.map(x => {\n    //   let _answer = '';\n    //   let _checkBreak = false;\n    //   for (let n in selection) {\n    //     for (let nn in x.answers) {\n    //       if (x.answers[nn].id === selection[n]) {\n    //         _answer = x.answers[nn].label;\n    //         _checkBreak = true;\n    //         break;\n    //       }\n    //     }\n\n    //     if (_checkBreak === true) {\n    //       break;\n    //     }\n\n    //   }\n    //   return { title: x.title, answer: _answer }\n    // }\n    // );\n\n    const fetchData = async () => {\n\n      // const res = await fetch(env.apiBase + \"/api/stylematch/register\", {\n      //   method: 'post',\n      //   signal: signal,\n      //   headers: { 'Content-Type': 'application/json' },\n      //   body: JSON.stringify({\n      //     email: value.email,\n      //     name: value.name,\n      //     unsubscribed: value.unsubscribed,\n      //     questions: _questions,\n      //     label : label\n      //   })\n      // });\n\n      //const data = await res.json();\n      //console.log();\n      history.push(page);\n    };\n\n    fetchData();\n    return function cleanup() {\n      abortController.abort();\n    }\n\n    // eslint-disable-next-line\n  }, [submitTrigger]);\n\n  return <React.Fragment>\n    <div className=\"styleMatch\" css={style.styleMatch}>\n      {canGoPrev() && <Arrow loc=\"prev\" currentStep={currentStep} onMove={onMove} />}\n      <div className=\"styleMatch__steps\" css={style.steps}>\n\n        <div ref={navEl}><Nav /></div>\n        <div css={style.stepsInner} style={{ transform: `translateX(${-100 * currentStep}%)` }}>\n          {data.questions.map((question, inx) =>\n            <Step key={inx} question={question} index={inx} />)}\n          <LastStep form={form} currentStep={currentStep} onSubmit={onSubmit} />\n        </div>\n      </div>\n      {canGoNext() && <Arrow loc=\"next\" currentStep={currentStep} onMove={onMove} />}\n    </div>\n  </React.Fragment>\n\n  //return <div>test <StyleMatchTest/> </div>\n}\n\nfunction Arrow({ loc, onMove }) {\n  return <div\n    css={[style.arrow, (loc === 'prev' ? style.arrowPrev : style.arrowNext)]} onClick={() => onMove(loc)}>\n    {loc === 'prev' ? <NarrowLeft /> : <NarrowRight />}\n  </div>\n}\n\nfunction sum([...choices]) {\n  let results = [0, 0, 0, 0, 0, 0, 0, 0]\n  choices.forEach(c => {\n    const match = data.matches.find(x => x.answer === c);\n    results = results.map(function (num, idx) {\n      return num + match.results[idx];\n    });\n  })\n  return results;\n}\n\nfunction LastStep({ form, currentStep, onSubmit }) {\n\n  const locStyle = 7 === currentStep ? style.stepCurrent : (\n    7 === currentStep + 1 ? style.stepNext : style.step)\n\n  const render = (name) => form.renderControl(name, null);\n\n  return <div className={`styleMatch__step`}\n    css={locStyle}>\n    <p>&nbsp;</p>\n    <h2><strong>ALL DONE!</strong></h2>\n    <p>Now submit your answers to view your style match.</p>\n    <p>&nbsp;</p>\n\n    <form className=\"\">\n      <div className=\"form-row style__match__email\">\n        <div className=\"col-md-6 mb-2\">{render('name')}</div>\n        <div className=\"col-md-6 mb-2\">{render('email')}</div>\n      </div>\n      <div className=\"form-row unsubscribed\">\n        <div className=\"col-md-12 mb-2\">{render('unsubscribed')}</div>\n      </div>\n      <h5><a className=\"button\" href=\"/\" onClick={onSubmit}><span><strong>SUBMIT</strong></span></a></h5>\n    </form>\n\n    <p>&nbsp;</p>\n    <h5>We know your style changes, you can come back and update your choices whenever needed.&nbsp;</h5>\n  </div>\n}","import { fb, validators } from '../../lib/form';\n\nexport function getStyleMatchModel(data) {\n    const model = fb.group({\n        unsubscribed: [true, [], { label: `Subscribe to our newsletter`, type: 'checkbox' }],\n        email: [data.email || '', [validators.Required(), validators.Email()], { label: 'Email', type: 'email' }],\n        name: [data.name || '', [validators.Required()], { label: 'Name', type: 'text' }]\n    });\n    return model;\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core';\nimport { useLayoutEffect } from 'react';\n\nexport function InstagramFeedEmbed(props){\n    \n    useLayoutEffect(() => {\n        const existingScript = document.getElementById('EmbedSocialHashtagScript');\n        if(existingScript){\n            document.body.removeChild(existingScript);\n        }\n        const script = document.createElement('script');\n        script.src = 'https://embedsocial.com/cdn/ht.js';\n        script.id = 'EmbedSocialHashtagScript';\n        document.body.appendChild(script);\n\n        // eslint-disable-next-line\n    }, []);\n\n    return(\n        <div className=\"embedsocial-hashtag\" data-ref=\"1b7b0e1ab09b2bdc92e7bcb9305a4b90615e3fe6\"></div>\n    )\n\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core';\nimport cmsUtils from '../../cms/utils/cmsUtils';\nimport { useEffect } from 'react';\n//import style from './style';\n\nexport function TextWithJavScript(props){\n\n    const item = props.item;\n    const cssClass = props.cssClass;\n    const code = cmsUtils.payload(item, 'Code') || '';\n    \n    const javaScriptCode = code.substring(code.indexOf(\"<script\"), (code.indexOf(\"</script>\") + 9)).trim();\n    const nonjavaScriptCode = code.replace(javaScriptCode, '').trim();\n    console.log('nonjavaScriptCode', nonjavaScriptCode);\n\n    useEffect(() => {\n        \n        const javaScriptTopCode = javaScriptCode.substring(javaScriptCode.indexOf(\"<script\"), (javaScriptCode.indexOf(\">\") + 1)).trim();\n        const javaScriptInsideCode = javaScriptCode.substring((javaScriptCode.indexOf(\">\") + 1), (javaScriptCode.indexOf(\"</script>\"))).trim();\n\n        const script = document.createElement('script');\n        script.type = `text/javascript`;\n        \n        if(javaScriptInsideCode !== ''){\n            script.text = javaScriptInsideCode;\n        }\n\n        if(javaScriptTopCode.includes(\"src=\")){\n            let _src = javaScriptTopCode.indexOf('src=\"') === -1 ? '' : javaScriptTopCode.substring(javaScriptTopCode.indexOf('src=\"')).trim();\n            let src = _src.substring((_src.indexOf('src=\"') + 5), _src.indexOf('\"',5));\n            script.src = src;\n        }\n\n        if(javaScriptTopCode.includes(\"async\")){\n            script.async = true;\n        }\n\n        if(javaScriptTopCode.includes(\"defer\")){\n            script.defer = true;\n        }\n\n        if(javaScriptTopCode.includes(\"onload=\")){\n            \n            let _functionName = javaScriptTopCode.substring(javaScriptTopCode.indexOf('onload=') + 8);\n            let functionName = _functionName.substring(0, _functionName.indexOf('\"')-1).replace('()','');\n            script.onload = function(){\n                window[functionName]();\n            };\n        }\n\n        document.body.appendChild(script);\n    }, [javaScriptCode]);\n\n    return(\n        <div className={cssClass} id={item.anchorName}\n            dangerouslySetInnerHTML={{ __html: nonjavaScriptCode }}>\n        </div>\n    )\n}","import React, { lazy, Suspense } from 'react';\nimport { Loading } from '../../components';\nconst Warranty = lazy(() => import('./warrantyForm'));\n\nexport function WarrantyLazy(props) {\n  return <div>\n    <Suspense fallback={<Loading />}>\n      <Warranty />\n    </Suspense>\n  </div>\n}","import { css  } from '@emotion/core'\nimport { variables, mq } from '../../cssInJs'\n\nconst step = css(mq({\n  flex: '0 0 100%',\n  opacity: 0,\n  maxHeight: '300px',\n  transition: 'all 0.3s',\n  '>div': {\n    paddingLeft: [5, 5, 100],\n    paddingRight: [5, 5, 100],\n  }\n}))\n\nconst navs = {\n  navs: css(mq({\n    marginTop: [5, 10, 20],\n    marginBottom: 15,\n    display: 'flex',\n    justifyContent: 'center',\n  })),\n  nav: css(mq({\n    width: 20,\n    height: 30,\n    background: '#ccc',\n    margin: 5,\n    transform: 'skewX(-12deg)'\n  })),\n  navCurrent: css({\n    backgroundColor: variables.primaryColor\n  }),\n  navFilled: css({\n    backgroundColor: '#666'\n  }),\n  navClickable: css({\n    cursor: 'pointer'\n  })\n}\n\nexport default {\n  joinForm: css({\n    position: 'relative',\n    margin: 'auto',\n    marginBottom: '3rem',\n    padding: '1rem 1rem 2rem',\n    background: 'rgba(255,255,255,0.9)',\n    textAlign: 'left'\n  }),\n\n  stepsWrapper: css({\n    overflow: 'hidden',\n  }),\n  steps: css({\n    display: 'flex',\n    transition: 'all 1s cubic-bezier(0.22, 0.61, 0.36, 1)',\n    '& h3, & h4': {\n      textTransform: 'uppercase'\n    }\n  }),\n  step,\n  stepCurrent: css(step, {\n    maxHeight: '2000px',\n    opacity: 1\n  }),\n  stepPrev: css(step, {}),\n  stepNext: css(step, {}),\n  stepLast: css({\n    //maxHeight: '1000px',\n    opacity: 1\n  }),\n\n  arrow: css(mq({\n    position: \"absolute\",\n    cursor: 'pointer',\n    color: '#aaa',\n    transition: 'all 0.3s',\n    zIndex: '1',\n    // xs, sm(>=576), md(>=768), lg(>=992), xl(>=1200), xxl(>=1600)\n    top: 0,\n    // [mqMax.md]: {\n    //   width: 100\n    // },\n    width: [20, 25, 30, 40],\n    '&:hover': {\n      color: '#666'\n    }\n  })),\n  arrowPrev: css(mq({\n    left: [-15, 0]\n  })),\n  arrowNext: css(mq({\n    right: [-15, 0]\n  })),\n\n  ...navs\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './joinStyle';\nimport React from 'react';\nimport env from '../../env';\nimport utils from '../../utils';\nimport { SiteLink } from '../../components';\n\nimport { usePost } from '../../components';\nimport { useForm } from '../../form';\nimport { useStep } from '../warranty/useStep';\nimport { Button, ErrorMessage } from '../../components';\nimport { getFormDataStep1, getFormDataStep2, getFormDataStep3, getFormDataStep5 } from './joinFormData';\n//import { useBV } from '../bazzarVoice/useBV';\n\n\nexport function Join() {\n\n  //const post = usePost();\n  const { steps, currentStep, lastStep, moveTo, moveNext, markAsFilled, canGo } = useStep([\n    { id: 'name' },\n    { id: 'contact' },\n    { id: 'dob' },\n    //{ id: 'hairType' },\n    { id: 'interests' },\n    { id: 'thanks' },\n  ])\n  const model1 = getFormDataStep1({})\n  const form1 = useForm(model1, {});\n  const model2 = getFormDataStep2({})\n  const form2 = useForm(model2, {});\n  const model3 = getFormDataStep3({})\n  const form3 = useForm(model3, {});\n  // const model4 = getFormDataStep4({})\n  // const form4 = useForm(model4, {});\n  const model5 = getFormDataStep5({})\n  const form5 = useForm(model5, {});\n\n  const navEl = React.useRef(null);\n\n  const stepStyle = (index) => {\n    const locStyle = index === currentStep ? style.stepCurrent : (\n      index === currentStep - 1 ? style.stepPrev : (\n        index === currentStep + 1 ? style.stepNext : style.step))\n    const movingStyle = index === lastStep ? style.stepLast : null;\n    return [locStyle, movingStyle];\n  }\n\n\n  function Nav() {\n    if (currentStep === steps.length - 1) return null;\n    return <div css={style.navs}>\n      {steps.filter(x => x.id !== 'thanks').map((step, index) =>\n        <div key={step.id}\n          css={[style.nav,\n          step.filled && style.navFilled,\n          index === currentStep ? style.navCurrent : null,\n          canGo(index) && style.navClickable\n          ]}\n          onClick={() => moveTo(index)}\n        ></div>)}\n    </div>\n  }\n\n  const next = () => {\n    markAsFilled(currentStep);\n    moveNext();\n\n    if (!utils.ui.isElementInViewport(navEl.current)) {\n      utils.ui.scrollTo(navEl.current)\n    }\n  }\n\n  const onSubmit = () => {\n    markAsFilled(currentStep);\n    moveNext();\n\n    if (!utils.ui.isElementInViewport(navEl.current)) {\n      utils.ui.scrollTo(navEl.current)\n    }\n  }\n\n  const getSelection = () => {\n    const value = {...form1.getValue(), ...form2.getValue(), ...form3.getValue(), ...form5.getValue()}\n    //console.log(value)\n    return { productName: '9000 CORDLESS STRAIGHTENER', value: value };\n  }\n\n  return <div css={style.joinForm}>\n    <div css={style.stepsWrapper}>\n      <div ref={navEl}><Nav /></div>\n      <div css={style.steps} style={{ transform: `translateX(${-100 * currentStep}%)` }}>\n        {steps.map((step, index) => {\n          let stepView = null\n          switch (step.id) {\n            case 'name': stepView = <Step1 model={model1} form={form1} moveNext={next} getSelection={getSelection} />; break;\n            case 'contact': stepView = <Step2 model={model2} form={form2} moveNext={next} getSelection={getSelection} />; break;\n            case 'dob': stepView = <Step3 model={model3} form={form3} moveNext={next} getSelection={getSelection} />; break;\n            // case 'hairType': stepView = <Step4 model={model4} form={form4} moveNext={next} getSelection={getSelection} />; break;\n            case 'interests': stepView = <Step5 model={model5} form={form5} onSubmit={onSubmit} getSelection={getSelection} />; break;\n            case 'thanks': stepView = <Step6 getSelection={getSelection} />; break;\n            default: break;\n          }\n          return (\n            <div css={stepStyle(index)} key={step.id}>\n              {stepView}\n            </div>\n          )\n        })}\n      </div>\n    </div>\n  </div>;\n}\n\n\nfunction Step1({ model, form, moveNext, getSelection }) {\n  const render = (name) => form.renderControl(name, null);\n\n  const next = (e) => {\n    form.validateForm(e, () => {\n      moveNext();\n    })\n  }\n\n  return <div>\n    <h4>Please tell us a bit about yourself</h4>\n    <form>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('firstName')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('lastName')}\n        </div>\n      </div>\n      {/* <div className=\"row\">\n        <div className=\"col-12\">\n          {render('gender')}\n        </div>\n      </div> */}\n      <div className=\"row\">\n        <div className=\"col-12\">\n          <div className=\"form__actions\">\n            <Button onClick={next} status={form.status}>Next</Button>\n            <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n          </div>\n        </div>\n      </div>\n    </form>\n  </div>\n}\n\nfunction Step2({ model, form, moveNext, getSelection }) {\n  const render = (name) => form.renderControl(name, null);\n\n  const next = (e) => {\n    form.validateForm(e, () => {\n      moveNext();\n    })\n  }\n\n  return <div>\n    <h4>How can we contact you?</h4>\n    <form>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('email')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('mobile')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          <div className=\"form__actions\">\n            <Button onClick={next} status={form.status}>Next</Button>\n            <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n          </div>\n        </div>\n      </div>\n    </form>\n  </div>\n}\n\nfunction Step3({ model, form, moveNext, getSelection }) {\n  const render = (name) => form.renderControl(name, null);\n\n  const next = (e) => {\n    form.validateForm(e, () => {\n      moveNext();\n    })\n  }\n\n  return <div>\n    <h4>Tell us more about you.</h4>\n    <p>Awesome!</p>\n    <p>Let us know a bit more about yourself so that we can personalise what we send.</p>\n    <form>\n      <div className=\"row\">\n        <div className=\"col-12 col-md-6\">\n          {render('dob')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('postcode')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          <div className=\"form__actions\">\n            <Button onClick={next} status={form.status}>Next</Button>\n            <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n          </div>\n        </div>\n      </div>\n    </form>\n  </div>\n}\n\n// function Step4({ model, form, moveNext, getSelection }) {\n//   const render = (name) => form.renderControl(name, null);\n\n//   const next = (e) => {\n//     form.validateForm(e, () => {\n//       moveNext();\n//     })\n//   }\n\n//   return <div>\n//     <p>How would you describe your hair?</p>\n//     <p><i>Choose everything that applies.</i></p>\n//     <form>\n//       <div className=\"row\">\n//         <div className=\"col-12\">\n//           {render('hairTypes')}\n//         </div>\n//       </div>\n//       <div className=\"row\">\n//         <div className=\"col-12\">\n//           <div className=\"form__actions\">\n//             <Button onClick={next} status={form.status}>Next</Button>\n//             <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n//           </div>\n//         </div>\n//       </div>\n//     </form>\n//   </div>\n// }\n\nfunction Step5({ model, form, onSubmit, getSelection }) {\n  const render = (name) => form.renderControl(name, null);\n\n  const post = usePost();\n\n  // const bv = useBV({\n  //   showReview: null\n  // });\n\n  const next = (e) => {\n    form.validateForm(e, () => {\n      const selection = getSelection();\n      post.send(env.apiBase + \"/api/join/register\", selection.value);\n    })\n  }\n\n  if (post.status === 'done') {\n    // // send BV pixel\n    // const value = getSelection().value;\n    // //const modelNumber = value.modelNumber;\n    // const nickname = value.firstName + ' ' + value.lastName;\n    // const email = value.email;\n    // const locale = env.bvLocale;\n\n    // bv.sendEvent('JoinUs', 'Registration', nickname, { \"email\": email, \"locale\": locale, \"nickname\": nickname})\n\n\n    post.reset();\n    onSubmit();\n  }\n\n  return <div>\n          \n          <form>\n            <div className=\"row\">\n              <div className='col-12 col-md-7'>\n                <h4>What are you interested in hearing about?</h4>\n                <p><i>Choose everything that applies.</i></p>\n                <div>\n                {render('interests')}\n                </div>\n                  <p>By clicking 'Submit' you accept the terms of our <a href=\"/privacy\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Policy</a>.</p>\n                  <div className=\"form__actions\">\n                    <Button onClick={next} status={form.status}>Submit</Button>\n                    <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n                    <ErrorMessage errors={post.errors} />\n                  </div>\n              </div>\n              \n              <div className='col-12 col-md-5'>\n                <img src=\"/assets/lady-with-love.jpg\" className='mt-1r' alt=\"young lady with love\" />\n              </div>\n            </div>\n          </form>\n        </div>\n}\n\nfunction Step6({ getSelection }) {\n  //const selection = getSelection();\n  return <div>\n    <p css={{marginTop: '2rem'}}>CONGRATULATIONS! You’ve successfully registered to access VS VIPs. </p>\n    <SocialLinks/>\n    <p>\nIf you need help from our Customer Service Team simply <SiteLink to=\"/contact\">Ask Us</SiteLink></p>\n  </div>\n}\n\nfunction SocialLinks() {\n  const instaLink = env.siteCode === 'vssassoon' ?\n    'https://instagram.com/vs_sassoon' : 'https://www.instagram.com/vsformen_anz/'\n  const youtubeLink = env.siteCode === 'vssassoon' ?\n    'https://www.youtube.com/user/vssassoon' : 'https://www.youtube.com/playlist?list=PLxG2Cg96L0isvQfXmM-RemWmJ94h_oKrV'\n  return <React.Fragment>\n    <p>\n      We'll be sure to keep you in-the-loop on all that's happening in the VS world, but don't forget to check us out on\n<a href={instaLink} target=\"_blank\" rel=\"noopener noreferrer\"> 'the gram' <img css={{ width: '2em', marginRight: '0.5em' }} alt=\"\" data-widget=\"image\" src=\"/assets/social/instagram.png\" /></a>\n\n and <a href={youtubeLink} target=\"_blank\" rel=\"noopener noreferrer\">view our latest videos <img css={{ width: '2em' }} alt=\"\" src=\"/assets/social/youtube.png\" /></a> </p>\n  </React.Fragment>\n}","import React from \"react\";\nimport { fb, validators } from '../../form'\nimport utils from \"../../utils\";\n\nexport function getFormDataStep1(data) {\n  //const genderList = ['Female', 'Male'].map(x => { return { name: x, value: x } })\n\n  const model = fb.group({\n    firstName: [\n      data.firstName || '',\n      [validators.Required()],\n      { label: 'First Name', type: 'text' },\n    ],\n    lastName: [\n      data.lastName || '',\n      [validators.Required()],\n      { label: 'Last Name', type: 'text' },\n    ],\n    //gender: [data.gender || [], [validators.Required()], { type: 'radioList', options: genderList, style: { inline: false } }]\n  })\n\n  return model\n}\n\nexport function getFormDataStep2(data) {\n  const model = fb.group({\n    email: [\n      data.email || '',\n      [validators.Required(), validators.Email()],\n      { label: 'Email Address', type: 'email' },\n    ],\n    mobile: [\n      data.mobile || '',\n      [],\n      { label: 'Mobile (optional)', type: 'number' },\n    ],\n  })\n\n  return model\n}\n\nexport function getFormDataStep3(data) {\n  let stateList = utils.site.isNZ\n    ? [\n        { name: \"Auckland\", value: \"NZ_AKL\" },\n        { name: \"New Plymouth\", value: \"NZ_NPL\" },\n        { name: \"Hawke's Bay\", value: \"NZ_HKB\" },\n        { name: \"Wellington\", value: \"NZ_WGN\" },\n        { name: \"Nelson\", value: \"NZ_NSN\" },\n        { name: \"Marlborough\", value: \"NZ_MBH\" },\n        { name: \"Westland\", value: \"NZ_WTC\" },\n        { name: \"Canterbury\", value: \"NZ_CAN\" },\n        { name: \"Otago\", value: \"NZ_OTA\" },\n        { name: \"Southland\", value: \"NZ_STL\" },\n      ]\n    : [\n        { name: \"NSW\", value: \"AU_NSW\" },\n        { name: \"VIC\", value: \"AU_VIC\" },\n        { name: \"QLD\", value: \"AU_QLD\" },\n        { name: \"WA\", value: \"AU_WA\" },\n        { name: \"SA\", value: \"AU_SA\" },\n        { name: \"TAS\", value: \"AU_TAS\" },\n        { name: \"ACT\", value: \"AU_ACT\" },\n        { name: \"NT\", value: \"AU_NT\" },\n      ];\n  stateList = stateList.sort((a, b) => a.name.localeCompare(b.name));\n  stateList = [{ name: \"Select...\", value: \"\" }, ...stateList];\n  const model = fb.group({\n    dob: [\n      data.dob || '',\n      [validators.Required(), validators.PastDate('Please check the date.')],\n      { label: 'When is your Birthday?', type: 'dob' },\n    ],\n    // postcode: [\n    //   data.postcode || '',\n    //   [validators.Required()],\n    //   { label: 'Postcode ', type: 'text' },\n    // ],\n    postcode: [\n      data.postcode || \"\",\n      [validators.Required(\"Please select your State or Province.\")],\n      { label: \"State / Province\", type: \"select\", options: stateList },\n    ],\n  })\n\n  return model\n}\n\nexport function getFormDataStep4(data) {\n  let hairTypeList = [\n    'LONG',\n    'MEDIUM',\n    'SHORT',\n    'FINE',\n    'THICK',\n    'STRAIGHT',\n    'CURLY',\n    'NATURAL',\n    'FRIZZY',\n    'COLOURED',\n  ].map((x) => {\n    return { name: x, value: x }\n  })\n\n  const model = fb.group({\n    hairTypes: [\n      data.hairTypes || '',\n      [validators.Required('Please select at least one.')],\n      {\n        label: null,\n        type: 'checkboxList',\n        options: hairTypeList,\n        style: { inline: true, className: 'listMin3' },\n      },\n    ],\n  })\n\n  return model\n}\n\nexport function getFormDataStep5(data) {\n  let interestList = [\n    {\n      bold: \"Hair trends, hair hacks & tips\",\n      regular:\n        \"(latest hair trends, how to make the most out of your VS Sassoon styling tools)\",\n    },\n    {\n      bold: \"Promotions & offers\",\n      regular:\n        \"(monthly competitions to win VS Sassoon bundles & other goodies)\",\n    },\n    {\n      bold: \"New product releases\",\n      regular:\n        \"(be the first to know about the latest VS Sassoon product innovations)\",\n    },\n  ].map((x) => {\n    return { name: (\n        <React.Fragment>\n          <strong>{x.bold}</strong> {x.regular}\n        </React.Fragment>\n      ),\n      value: `${x.bold} ${x.regular}`, }\n  })\n\n  const model = fb.group({\n    //interests: [data.interests || '', [validators.Required('Please select at least one.')], { label: null, type: 'checkboxList', options: interestList, style: { inline: false, className: 'listMin3' } }]\n    interests: [\n      data.interests || interestList.map((option) => option.value),\n      [],\n      {\n        label: null,\n        type: 'checkboxList',\n        options: interestList,\n        style: { inline: false, className: 'listMin3' },\n      },\n    ],\n  })\n\n  return model\n}\n","import { css  } from '@emotion/core'\nexport default {\n  form: css({\n    position: 'relative',\n    margin: 'auto',\n    marginBottom: '3rem',\n    padding: '1rem 1rem 2rem',\n    background: 'rgba(255,255,255,0.9)',\n    textAlign: 'left',\n    \n    maxWidth: '960px',\n  }),\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './ambassadorStyle';\nimport React from 'react';\nimport env from '../../env';\n\nimport { usePost } from '../../components';\nimport { useForm } from '../../form';\nimport { Button, ErrorMessage } from '../../components';\nimport { getFormData } from './ambassadorFormData';\n\nexport function AmbassadorForm() {\n\n  const model = getFormData({})\n  const form = useForm(model, {});\n  const post = usePost();\n  const [sendingStatus, setSendingStatus] = React.useState(null);\n\n  const onSubmit = (e) => {\n    form.validateForm(e, () => {\n      const value = { ...form.getValue() };\n      post.send(env.apiBase + \"/api/ambassador/register\", value);\n      setSendingStatus('pending')\n    })\n  }\n  if (post.done() && sendingStatus === 'pending') {\n    form.reset(model)\n    setSendingStatus(null)\n  }\n\n\n  const render = (name) => form.renderControl(name, null);\n  return <div css={style.form}>\n\n\n    <form>\n      <h4>ABOUT YOU!</h4>\n      <div className=\"row\">\n        <div className=\"col-12 col-md-6\">\n          {render('name')}\n        </div>\n        <div className=\"col-12 col-md-6\">\n          {render('email')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12 col-md-6\">\n          {render('hairType')}\n        </div>\n        <div className=\"col-12 col-md-6\">\n          {render('hairLength')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('hairConcerns')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('favouriteProduct')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('reason')}\n        </div>\n      </div>\n\n      <h4 style={{ marginTop: '2rem' }}>SOCIAL MEDIA</h4>\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('website')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12 col-md-6\">\n          {render('websiteVisitor')}\n        </div>\n      </div>\n      <hr />\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('instagram')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12 col-md-6\">\n          {render('instagramAuFollowers')}\n        </div>\n        <div className=\"col-12 col-md-6\">\n          {render('instagramNzFollowers')}\n        </div>\n      </div>\n      <hr />\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('facebook')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12 col-md-6\">\n          {render('facebookAuFollowers')}\n        </div>\n        <div className=\"col-12 col-md-6\">\n          {render('facebookNzFollowers')}\n        </div>\n      </div>\n\n      <hr />\n\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('youtube')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12 col-md-6\">\n          {render('youtubeAuFollowers')}\n        </div>\n        <div className=\"col-12 col-md-6\">\n          {render('youtubeNzFollowers')}\n        </div>\n      </div>\n\n      <hr />\n\n      <div className=\"row\">\n        <div className=\"col-12\">\n          {render('tiktok')}\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col-12 col-md-6\">\n          {render('tiktokAuFollowers')}\n        </div>\n        <div className=\"col-12 col-md-6\">\n          {render('tiktokNzFollowers')}\n        </div>\n      </div>\n\n      <div className=\"row\">\n        <div className=\"col-12 col-md-6\">\n          {render('unsubscribed')}\n        </div>\n      </div>\n\n      <div className=\"row\">\n        <div className=\"col-12\">\n          <div className=\"form__actions\">\n            <Button onClick={onSubmit} status={form.status}>Submit</Button>\n            <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n            <ErrorMessage errors={post.errors} />\n            {post.done() && <span style={{ marginLeft: '1.5rem', color: 'red', fontWeight: 'bold' }}>Successfully sent!</span>}\n          </div>\n        </div>\n      </div>\n\n    </form>\n  </div>;\n}\n","import { fb, validators } from '../../form';\n//import utils from '../../utils';\n\nexport function getFormData(data) {\n  const model = fb.group({\n    name: [data.name || '', [validators.Required()], { label: 'Name', type: 'text' }],\n    email: [data.email || '', [validators.Required(), validators.Email()], { label: 'Email Address', type: 'email' }],\n    hairType: [data.hairType || '', [validators.Required()], { label: 'Hair type', type: 'text' }],\n    hairLength: [data.hairLength || '', [validators.Required()], { label: 'Hair length', type: 'text' }],\n    hairConcerns: [data.name || '', [validators.Required()], {\n      label: 'Hair concerns', type: 'textarea',\n      style: { rows: 3 }\n    }],\n    favouriteProduct: [data.favouriteProduct || '', [validators.Required()], {\n      label: 'What are your current favourite VS Sassoon products you’d love to use / trial', type: 'textarea',\n      style: { rows: 3 }\n    }],\n    reason: [data.reason || '', [validators.Required()], {\n      label: 'Why do you think you’d be a fabulous VS Ambassador?', type: 'textarea',\n      style: { rows: 5 }\n    }],\n    website: [data.website || '', [], { label: 'Website/blog URL', type: 'text' }],\n    websiteVisitor: [data.websiteVisitor || '', [], { label: 'Visitors per month', type: 'text' }],\n    instagram: [data.instagram || '', [], { label: 'Instagram profile', type: 'text' }],\n    instagramAuFollowers: [data.instagramAuFollowers || '', [], { label: 'No.  of AUS followers', type: 'text' }],\n    instagramNzFollowers: [data.instagramNzFollowers || '', [], { label: 'No.  of NZ followers', type: 'text' }],\n    facebook: [data.facebook || '', [], { label: 'Facebook profile', type: 'text' }],\n    facebookAuFollowers: [data.facebookAuFollowers || '', [], { label: 'No.  of AUS followers', type: 'text' }],\n    facebookNzFollowers: [data.facebookNzFollowers || '', [], { label: 'No.  of NZ followers', type: 'text' }],\n    \n    youtube: [data.website || '', [], { label: 'YouTube channel', type: 'text' }],\n    youtubeAuFollowers: [data.websiteVisitor || '', [], { label: 'No.  of AUS followers', type: 'text' }],\n    youtubeNzFollowers: [data.websiteVisitor || '', [], { label: 'No.  of NZ followers', type: 'text' }],\n    \n    tiktok: [data.tiktok || '', [], { label: 'Tiktok profile', type: 'text' }],\n    tiktokAuFollowers: [data.tiktokAuFollowers || '', [], { label: 'No.  of AUS followers', type: 'text' }],\n    tiktokNzFollowers: [data.tiktokNzFollowers || '', [], { label: 'No.  of NZ followers', type: 'text' }],\n\n    unsubscribed : [true, [], { label: `Subscribe to our newsletter`, type: 'checkbox' }]\n  });\n\n  return model;\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { ProductList } from '../../../site/product/productList';\nimport { ProductListV2 } from '../../../site/product/productListV2';\nimport { WhereToBuyList } from '../../../site/wheretobuy/wheretobuyList';\nimport { SearchResult } from '../../../site/searchResult/searchResult';\nimport { StyleMatch } from '../../../site/styleMatch/styleMatch';\n// import { InstagramFeed } from '../../../components';\nimport { InstagramFeedEmbed } from '../../../components/InstagramFeedEmbed/InstagramFeedEmbed';\nimport { TextWithJavScript } from '../../../components/TextWithJavaScript/view';\nimport { AppVersion } from '../../../components';\nimport { WarrantyLazy } from '../../../site/warranty/warrantyLazy';\nimport { Join } from '../../../site/joinus/joinForm';\n//import { Join } from '../../../site/joinus/joinFormNew';\n\nimport { AmbassadorForm } from '../../../site/ambassador/ambassadorForm';\n\nexport function Code(props) {\n  const item = props.item;\n  //const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  const code = cmsUtils.payload(item, 'Code');\n  const codeType = cmsUtils.payload(item, 'CodeType');\n  let controls = null;\n  if (codeType === 'Json') {\n\n    const codeJson = JSON.parse(code);\n    //codeJson.subCategory = \"full-size\";\n    const searchType = (codeJson.category && 'category') || (codeJson.style && 'style') || (codeJson.subCategory && 'subCategory') || '';\n\n    if (codeJson.control === 'product-list') {\n      controls = <ProductList category={codeJson.category} style={codeJson.style} searchType={searchType} subCategory={codeJson.subCategory} />\n    } else if (codeJson.control === 'product-list-v2') {\n      controls = <ProductListV2 category={codeJson.category} style={codeJson.style} searchType={searchType} subCategory={codeJson.subCategory} />\n    } else if (codeJson.control === 'where-to-buy-list') {\n      controls = <WhereToBuyList />\n    } else if (codeJson.control === 'search-results') {\n      controls = <SearchResult />\n    } else if (codeJson.control === 'style-match') {\n      controls = <StyleMatch />\n    } else if (codeJson.control === 'app') {\n      controls = <AppVersion />\n    } else if (codeJson.control === 'instagram') {\n      controls = <InstagramFeedEmbed />\n    } else if (codeJson.control === 'warranty') {\n      controls = <WarrantyLazy />\n    } else if (codeJson.control === 'join') {\n      controls = <Join />\n    } else if (codeJson.control === 'ambassador') {\n      controls = <AmbassadorForm />\n    }\n\n  }\n\n  const cssClass = utils.classNames('cms_item', item.cssClass || item.anchorName || '');\n\n  //let itemElt = (<div dangerouslySetInnerHTML={{ __html: content }}></div>);\n\n  if (cmsOption.isCmsEdit)\n    return (\n      <div className={cssClass}\n        data-cms-item-id={item.itemId}\n        id={item.anchorName}>\n        <pre style={{ fontSize: '12px', margin: '5px', padding: '10px', background: '#eee', border: '1px solid #ccc' }}>\n          <b>Code Type: {codeType}</b>\n          {code} </pre>\n      </div>\n    )\n  else if (codeType === 'Text')\n    return (\n      <div className={cssClass} id={item.anchorName}\n        dangerouslySetInnerHTML={{ __html: code }}></div>\n    )\n  else if (codeType === 'TextWithJs')\n    return (\n      <TextWithJavScript item={item} cssClass={cssClass} />\n    )\n  else\n    return (\n      <div className={cssClass} id={item.anchorName}>{controls}</div>\n    )\n}\n","import React from \"react\";\nimport cmsUtils from \"../../utils/cmsUtils\";\nimport utils from \"../../../utils\";\nimport { SiteLink } from \"../../../components\";\n\nexport function BlogPosts(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  const posts = getPages(cmsUtils.payload(item, \"BlogPosts\"));\n  const numOfTileLines = parseInt(\n    cmsUtils.payload(item, \"NumOfTileLines\", \"3\")\n  );\n\n  const bp = utils.ui.getCurrentBreakpoint();\n  const tilesPerLine = { xs: 1, sm: 1, md: 2, lg: 2, xl: 3, xxl: 4 };\n  const numOfPost = numOfTileLines * (tilesPerLine[bp] || 3);\n  const step = numOfPost;\n\n  const [tilesToShow, setTilesToShow] = React.useState(numOfPost);\n\n  const displayingPosts =\n    posts.length > tilesToShow ? posts.slice(0, tilesToShow) : posts;\n\n  const showMore = posts.length > displayingPosts.length;\n\n  const pageTileElts = displayingPosts.map((page, index) => (\n    <Tile page={page} key={index} disableLink={cmsOption.isCmsEdit}></Tile>\n  ));\n\n  const cssClass = utils.classNames(\n    \"cms_item\",\n    \"blogTiles tiles\",\n    item.cssClass || item.anchorName || \"\"\n  );\n\n  return (\n    <>\n      <div\n        className={cssClass}\n        data-cms-item-id={cmsOption.isCmsEdit && item.itemId}\n        id={item.anchorName}\n      >\n        {pageTileElts}\n      </div>\n      {showMore && (\n        <div className='blogTiles__loadMore'>\n          <span\n            className='thinBtn'\n            onClick={(e) => {\n              setTilesToShow(tilesToShow + step);\n            }}\n          >\n            LOAD MORE\n          </span>\n        </div>\n      )}\n    </>\n  );\n}\n\nfunction getPages(pagesSerialized) {\n  if (pagesSerialized) {\n    return JSON.parse(pagesSerialized);\n  }\n  return [];\n}\n\nfunction Tile(props) {\n  const page = props.page;\n  const imageUrl = utils.site.resourcePath(\n    page.bottomImageUrl && page.bottomImageUrl !== \"\"\n      ? page.bottomImageUrl\n      : page.imageUrl\n  );\n  const pageTitle =\n    page.blogTileTitle && page.blogTileTitle !== \"\"\n      ? page.blogTileTitle\n      : page.pageTitle;\n  const disableLink = props.disableLink;\n  return (\n    <div className='blogTile'>\n      <SiteLink className='blogTile__link' to={disableLink ? \"\" : page.pageUrl}>\n        <div\n          className='blogTile__bg'\n          style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}\n        ></div>\n        <div className='blogTile__content'>\n          <div className='blogTile__contentInner'>\n            <div className='blogTile__title'>\n              {/* {page.pageTitle} */}\n              {pageTitle}\n            </div>\n            <div className='blogTile__desc'>\n              {page.tileDesc || page.description}\n            </div>\n            <div className='blogTile__readMore thinBtn'>READ MORE</div>\n          </div>\n        </div>\n      </SiteLink>\n    </div>\n  );\n}\n","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\n\nexport function BlogPostTitle(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n\n  const title = cmsUtils.payload(item, 'PageTitle');\n  const postDate = cmsUtils.payload(item, 'PostDate');\n\n  const cssClass = utils.classNames('blogView__titleContainer', 'cms_item', item.cssClass || item.anchorName || '');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      <div className=\"blogView__date\">\n        {postDate}\n      </div>\n      <h1 className=\"blogView__title\">\n        {title}\n      </h1>\n    </div>\n  );\n}\n","import React from 'react';\n//import cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { Item } from '../../items/item';\n\nexport function VideoHolder(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, subItems);\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n\n  const cssClass = utils.classNames('cms_item', 'videoHolder', item.cssClass || item.anchorName || '');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      {subItemsElts}\n    </div>\n  );\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { YoutubeEmbedPopup } from '../../../components';\n\nexport function VideoItem(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n\n  const youtubeCode = cmsUtils.payload(item, 'YoutubeCode');\n  const posterFrameUrl = cmsUtils.payload(item, 'PosterFrameUrl');\n  const captionTitleYoutube = cmsUtils.payload(item, 'CaptionTitleYoutube');\n  const shortDesc = cmsUtils.payload(item, 'ShortDesc');\n\n  const cssClass = utils.classNames('cms_item', 'videoItem', item.cssClass || item.anchorName || '');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      <div className=\"row video\">\n        <div className=\"col-md-5\">\n          <YoutubeEmbedPopup url={youtubeCode} title={captionTitleYoutube} posterUrl={posterFrameUrl} />\n        </div>\n        <div className=\"col-md-7\">\n          <h4>{captionTitleYoutube}</h4>\n          <div dangerouslySetInnerHTML={{ __html: shortDesc }}></div>\n        </div>\n      </div>\n    </div>\n  );\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport { Item } from '../../items/item';\nimport  utils from '../../../utils';\n\nexport function MultiColumnPanel(props){\n    const item = props.item;\n    const mobileReverse = cmsUtils.payload(item, 'MobileReverse', 'no');\n    //const subItems = item.items || [];\n    const subItems = (mobileReverse === \"yes\" && utils.css.screenWidth() <= 550) ? item.items.reverse() || [] : item.items || [];\n    const cmsOption = props.cmsOption || {};\n    const columnWidths = cmsUtils.payload(item, 'ColumnWidths').split(\",\");\n    const mobileColumnWidths = cmsUtils.payload(item, 'MobileColumnWidths').split(\",\");\n    const countItem = {countD : 0, countM : 0, col : \"\"};\n\n    const bgColor = cmsUtils.payload(item, 'BgColor');\n    //const textColorTheme = cmsUtils.payload(item, 'TextColorTheme');\n    const imageUrl = cmsUtils.payload(item, 'ImageUrl');\n    const backgroundTile = cmsUtils.payload(item, 'BackgroundTile');\n    const bgTheme = cmsUtils.payload(item, 'TextColorTheme') || 'white';\n    \n    let bgUrl = null;\n    if (imageUrl)\n        bgUrl = utils.site.resourcePath(imageUrl);\n    else if (backgroundTile)\n        bgUrl = utils.site.resourcePath(`/dist/transparent-textures/textures/${backgroundTile}`);\n\n    const cssClass = utils.classNames('cms_item', 'contentPanel', 'multiColumnPanel', 'contentPanel--' + bgTheme, item.cssClass || item.anchorName || ''); \n\n    function setupClass(index){ \n        countItem.col = \"\";\n        if(columnWidths.length === countItem.countD){\n            countItem.countD = 0;\n        }\n\n        if(mobileColumnWidths.length === countItem.countM){\n            countItem.countM = 0;\n        }\n        \n        countItem.col = \"col-sm-\" + columnWidths[countItem.countD] + \" col-\" + mobileColumnWidths[countItem.countM];\n        countItem.countD  ++;\n        countItem.countM  ++;\n    };\n\n    const subItemsElts = subItems.map((subItem, index) => {\n            setupClass();\n            return <div className = {countItem.col} key={subItem.itemId}>\n                        <Item item={subItem} cmsOption={cmsOption}></Item>\n                    </div> \n        }  \n    );\n    return (\n        <section className={cssClass} style={{\n            backgroundColor: `${bgColor}`,\n            backgroundImage: bgUrl && utils.css.bgUrlStyle(bgUrl)\n            }} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n            <div className=\"container\">\n              <div className = \"row\">\n                {subItemsElts}\n              </div> \n            </div>\n        </section>\n    );\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core';\nimport { FaChevronDown } from \"react-icons/fa\";\nimport React, { useLayoutEffect, useRef } from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { useRouter } from '../../../components';\nimport { handleElementLink } from '../../../components';\nimport env from '../../../env';\n\nexport function ExpandableHtml(props) {\n  const cmsOption = props.cmsOption || {};\n  const [open, setOpen] = React.useState(cmsOption.isCmsEdit);\n  const ver = env.ver;\n  const item = props.item;\n  //const subItems = item.items || [];\n  const { history } = useRouter();\n  //console.log('item', item, cmsOption);\n  //console.log(open)\n  let content = cmsOption.isCmsEdit? \n    cmsUtils.payload(item, 'Content'): \n    cmsUtils.payload(item, 'Content').replace(\"__version__\", \"<a href = '/app' class = 'app_version'> PWA \"+ ver +\"</a>\");\n\n  const buttonTitle = cmsUtils.payload(item, 'ButtonTitle');\n\n\n  const cssClass = utils.classNames('cms_item', 'htmlPanel exHtml', cmsOption.isCmsEdit && 'html', item.cssClass || item.anchorName || '');\n\n  //let itemElt = (<div dangerouslySetInnerHTML={{ __html: content }}></div>);\n\n  function handleClick(e) { \n    \n    let target = \"\";\n    if(e.target.closest('a')){\n      target = e.target.closest('a').getAttribute('target');\n    }\n    const processed = (target === \"_blank\" ? handleElementLink(e.target, null) : handleElementLink(e.target));\n    //const link = utils.url.getLinkFromElement(e.target);\n    //console.log('clicked', e, e.target, processed);\n    \n    if (processed.handled) {\n      e.preventDefault();\n      e.stopPropagation();\n    } else if (processed.linkInfo && processed.linkInfo.type === 'internal') {\n      e.preventDefault();\n      e.stopPropagation();\n      history.push(processed.linkInfo.url)\n    } else {\n      // e.preventDefault();\n      // e.stopPropagation();\n      // setPdfViewPath(utils.site.resourcePath(link))\n    }\n  }\n\n  const htmlBlock = useRef(null);\n  // function iframeSizer() {\n  //   //console.log('iframesizer')\n  //   let iframesContainer = htmlBlock.current.querySelectorAll('iframe.youtube, .ytvideo iframe');\n  //   //console.log('iframesizer', iframesContainer)\n  //   if (iframesContainer && iframesContainer.length) {\n  //     iframesContainer.forEach(element => {\n  //       let height = (element.parentElement.offsetWidth * 9) / 16\n  //       //console.log(height, element.parentElement.offsetWidth)\n  //       element.style.height = height + 'px';\n  //     });\n  //   }\n  // }\n\n  useLayoutEffect(() => {\n    const buttons = htmlBlock.current.querySelectorAll('.button');\n    for (let i = 0; buttons && i < buttons.length; i++) {\n      restructureButton(buttons[i])\n    }\n\n    // const youtubes = htmlBlock.current.querySelectorAll('iframe[src*=\"youtube\"]');\n    // console.log(youtubes)\n\n    // iframeSizer();\n    // window.addEventListener('resize', iframeSizer)\n    // return (): void => {\n    //   window.removeEventListener('resize', iframeSizer)\n    // }\n\n  }, [])\n\n\n  const style = {\n    icon: {\n      marginLeft: '0.5rem',\n      width: 'auto !important',\n      fontSize: '80%',\n      transition: 'all 0.5s'\n    },\n    iconOpen: {\n      transform: 'translateY(-0.1rem) rotate(-180deg)'\n    },\n    iconClosed: {\n      transform: 'translateY(-0.1rem) rotate(0)'\n    },\n    panelCollapsed: {\n      maxHeight: 0,\n      transition: 'all 0.6s',\n      opacity: 0,\n      overflow: 'hidden'\n    },\n    panelOpen: {\n      opacity: 1,\n      maxHeight: '2000px',\n      transition: 'all 1s'\n    }\n  }\n\n  const toggleExPanel = (e) => {\n    e.preventDefault()\n    e.stopPropagation()\n    setOpen(!open)\n  }\n\n\n  if (cmsOption.isCmsEdit)\n  return (\n    <div ref={htmlBlock} className={cssClass}\n      data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName} onClick={(e) => handleClick(e)}>\n        <div css={{textAlign: 'center'}}>\n          <a className=\"button\" href=\"/\" onClick={(e) => {e.preventDefault(); e.stopPropagation();}}><strong>{buttonTitle}</strong> <span css={[style.icon, open? style.iconOpen : style.iconClosed]}><FaChevronDown /></span> </a>\n          <div css={{color: 'chocolate'}}>To edit the button title, please double click or open item editor</div>\n        </div>\n        \n        <div data-cms-html=\"true\"\n      data-cms-item-id={cmsOption.isCmsEdit && item.itemId} css={[{margin: '1rem 0'}, open? style.panelOpen: style.panelCollapsed ]}\n      dangerouslySetInnerHTML={{ __html: content }}></div>\n      </div>\n  )\n\n  return (\n    <div ref={htmlBlock} className={cssClass} data-cms-html=\"true\"\n      data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName} onClick={(e) => handleClick(e)}>\n        <div css={{textAlign: 'center'}}>\n          <a className=\"button\" href=\"/\" onClick={toggleExPanel}><strong>{buttonTitle}</strong> <span css={[style.icon, open? style.iconOpen : style.iconClosed]}><FaChevronDown /></span> </a>\n        </div>\n        \n        <div css={[{margin: '1rem 0'}, open? style.panelOpen: style.panelCollapsed ]}\n      dangerouslySetInnerHTML={{ __html: content }}></div>\n      </div>\n  )\n}\n\n\nfunction restructureButton(el) {\n  if (!el.querySelector('span')) {\n    const span = document.createElement('span');\n    span.innerHTML = el.innerHTML;\n    el.innerHTML = '';\n    el.appendChild(span);\n  }\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\n\nimport env from '../../../env';\nimport { useGet } from '../../../components';\nimport { ErrorPopup, Loading } from '../../../components';\n\nimport { Tile } from '../../../site/product/productTile';\n\nexport function ProductTiles(props) {\n  const item = props.item;\n  //const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n  const productCodes = getProductCodes(cmsUtils.payload(item, 'ProductList'))\n  //console.log(productCodes)\n  const cssClass = utils.classNames('cms_item', 'productListByCodes', item.cssClass || item.anchorName || '');\n\n  return <div className={cssClass}>\n    {productCodes && productCodes.length > 0 && <TilesFromCodes productCodes={productCodes}/>}\n  </div>\n}\n\nfunction getProductCodes(str){\n  const list = (str || '').replace(/\\r\\n/g, '\\n').split('\\n');\n  return list.filter(x => !!x)\n}\n\nexport function TilesFromCodes({productCodes}) {\n  const get = useGet();\n  React.useEffect(() => {\n    get.send(env.apiBase + '/api/product/getProductByCodes?productCodes=' + productCodes.join(','));\n    // eslint-disable-next-line\n  }, []);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  console.log(get)\n  const data = get.response;\n\n  if (!data || data.length === 0) return <div></div>\n  return (\n    <div className=\"productList\">\n      {data.map((product, index) =>\n        <Tile product={product} key={product.productCode}></Tile>\n      )}\n    </div>\n  );\n}","import React from 'react';\nimport { Item } from '../../items/item';\n//import cmsUtils from '../../utils/cmsUtils';\nimport  utils from '../../../utils';\nimport './style.scss';\n\nexport function LinkTiles(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, subItems);\n\n  //const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n\n  const tiles = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n\n  const cssClass = utils.classNames('cms_item', 'linkTiles', item.cssClass || item.anchorName || '');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      {tiles}\n    </div>\n  );\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { SiteLink } from '../../../components';\n\nexport function LinkTileItem(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n\n  const bgUrl = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n  const captionTitle = cmsUtils.payload(item, 'CaptionTitle');\n  const captionButton = cmsUtils.payload(item, 'CaptionButton');\n  const linkUrl = cmsUtils.payload(item, 'LinkUrl');\n\n  //console.log('item', linkUrl);\n  const titlePanel = captionTitle ? (\n    linkUrl ? (<div>\n      <div className=\"linkTile__title\" dangerouslySetInnerHTML={{ __html: captionTitle }}></div>\n      <SiteLink to={linkUrl} className=\"linkTile__link\"><span>{captionButton}</span></SiteLink>\n    </div>\n    ) : (<div className=\"linkTile__title\" dangerouslySetInnerHTML={{ __html: captionTitle }}></div>)\n  ) : null;\n\n  const cssClass = utils.classNames('cms_item', 'linkTile', `linkTile--${linkUrl ? 'link' : ''}`, item.cssClass || item.anchorName || '', titlePanel && 'bannerHasTitlePanel');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      {linkUrl ? <SiteLink to={linkUrl} className=\"linkTile__tileLink\">\n        <img className=\"linkTile__bg\" src={bgUrl} alt={captionTitle} />\n        {titlePanel && <div className=\"linkTile__text\">{titlePanel}</div>}\n      </SiteLink> : <React.Fragment>\n          <img className=\"linkTile__bg\" src={bgUrl} alt={captionTitle} />\n          {titlePanel && <div className=\"linkTile__text\">{titlePanel}</div>}\n        </React.Fragment>}\n    </div>\n  );\n\n\n}\n","import { css } from '@emotion/core'\n//import { mq } from '../../cssInJs'\nexport default{\n    exTextItem : css({\n        overflow:'hidden',\n        maxHeight:'0',\n        transition: 'all 0.8s',\n        padding: '0px',\n        '&.expand' : {\n            maxHeight:'100%',\n            padding: '1rem 0'\n        }\n    })\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\n//import React from 'react';\nimport cmsUtils from '../../cms/utils/cmsUtils';\nimport utils from '../../utils';\nimport style from './style';\nimport { Item } from '../../cms/items/item';\n\nexport function ExpandablePanel(props){\n    const item = props.item;\n    const subItems = item.items || [];\n    const cmsOption = props.cmsOption || {};\n\n    const bgColor = cmsUtils.payload(item, 'BgColor');\n    const imageUrl = cmsUtils.payload(item, 'ImageUrl');\n    const backgroundTile = cmsUtils.payload(item, 'BackgroundTile');\n    \n    let bgUrl = null;\n\n    if (imageUrl){\n        bgUrl = utils.site.resourcePath(imageUrl);\n    }\n    else if (backgroundTile){\n        bgUrl = utils.site.resourcePath(`/dist/transparent-textures/textures/${backgroundTile}`);\n    }\n\n    const cssClass = utils.classNames('cms_item', 'contentPanel', 'expandablePanel', cmsOption.isCmsEdit && 'expandablePanel_item_cms', item.cssClass || item.anchorName || '');\n    const subItemsElts = subItems.map((subItem, index) =>\n        <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n    );\n    //id={item.anchorName}\n    return (\n            <section className={cssClass} style={{\n                backgroundColor: `${bgColor}`,\n                backgroundImage: bgUrl && utils.css.bgUrlStyle(bgUrl)\n                }} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} css={!cmsOption.isCmsEdit && style.exTextItem} data-anchor-status = \"collapse\" data-cms-item-anchor = {item.anchorName} data-cms-anchor = {item.anchorName}>\n                <div className=\"contentPanel__bg\"></div>\n                <div className=\"container\">\n                  {subItemsElts}\n                </div>\n              </section> \n    )\n}","import React from 'react';\r\nimport { Item } from '../../items/item';\r\nimport cmsUtils from '../../utils/cmsUtils';\r\nimport utils from '../../../utils';\r\nimport './style.scss';\r\n\r\nexport function WallToWallPanel(props) {\r\n    const item = props.item;\r\n    const subItems = item.items || [];\r\n    const cmsOption = props.cmsOption || {};\r\n\r\n    const subItemsElts = subItems.map((subItem, index) =>\r\n        <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\r\n    );\r\n\r\n    const cssClass = utils.classNames(\r\n        \"cms_item\",\r\n        \"wall-to-wall-panel\",\r\n        item.cssClass || item.anchorName || \"\"\r\n    );\r\n\r\n    return (\r\n        <section\r\n            className={cssClass}\r\n            data-cms-item-id={cmsOption.isCmsEdit && item.itemId}\r\n            id={item.anchorName}\r\n        >\r\n            {subItemsElts}\r\n        </section>\r\n    )\r\n}","import React, { useState, useRef, useEffect } from 'react';\r\nimport { Item } from '../../items/item';\r\nimport cmsUtils from '../../utils/cmsUtils';\r\nimport utils from '../../../utils';\r\nimport './style.scss';\r\nimport { SiteLink } from '../../../components';\r\n\r\nexport function WallToWallItem(props) {\r\n    const item = props.item;\r\n    const cmsOption = props.cmsOption || {};\r\n\r\n    const bgUrl = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\r\n    const alignV = cmsUtils.payload(item, 'VAlign') || '50%';\r\n    const alignH = cmsUtils.payload(item, 'HAlign') || '50%';\r\n    const buttonText = cmsUtils.payload(item, 'ButtonTxt');\r\n    const linkUrl = cmsUtils.payload(item, 'LinkUrl');\r\n\r\n    const [hoverTime, setHoverTime] = useState(0);\r\n    const timerRef = useRef(null);\r\n\r\n    useEffect(() => {\r\n        return () => {\r\n            if (timerRef.current) clearInterval(timerRef.current);\r\n        };\r\n    }, []);\r\n\r\n    const handleMouseEnter = () => {\r\n        if (timerRef.current) clearInterval(timerRef.current);\r\n        timerRef.current = setInterval(() => {\r\n            setHoverTime((prev) => (prev < 7 ? prev + 0.1 : prev));\r\n        }, 100);\r\n    };\r\n\r\n    const handleMouseLeave = () => {\r\n        if (timerRef.current) clearInterval(timerRef.current);\r\n        timerRef.current = setInterval(() => {\r\n            setHoverTime((prev) => {\r\n                if (prev <= 0) {\r\n                    clearInterval(timerRef.current);\r\n                    return 0;\r\n                }\r\n                return prev - 0.1;\r\n            });\r\n        }, 100);\r\n    };\r\n\r\n    const handleClick = () => {\r\n        window.location.href = `${linkUrl}`;\r\n    };\r\n\r\n    const cssClass = utils.classNames(\r\n        \"cms_item\",\r\n        \"wall-to-wall-item\",\r\n        item.cssClass || item.anchorName || \"\"\r\n    );\r\n\r\n    return (\r\n        <div\r\n            className={cssClass}\r\n            data-cms-item-id={cmsOption.isCmsEdit && item.itemId}\r\n            id={item.anchorName}\r\n            onClick={handleClick}\r\n            onMouseEnter={handleMouseEnter}\r\n            onMouseLeave={handleMouseLeave}\r\n        >\r\n            <div\r\n                className=\"item-background-image\"\r\n                style={{\r\n                    backgroundImage: utils.css.bgUrlStyle(bgUrl),\r\n                    backgroundPositionY: alignV,\r\n                    backgroundPositionX: alignH,\r\n                    transform: `scale(${1 + hoverTime * 0.01})`,\r\n                    transition: \"transform 0.1s linear\",\r\n                }}\r\n            />\r\n            <SiteLink to={linkUrl} className=\"cta-button\">\r\n                <span>\r\n                    {buttonText}\r\n                </span>\r\n            </SiteLink>\r\n        </div>\r\n    )\r\n}","import React, { useState, useEffect, useRef } from 'react';\nimport { Item } from '../item';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport Slider from \"react-slick\";\nimport './style.scss';\nimport { AnimatePresence } from \"framer-motion\";\nexport let exportTimer;\n\n\nexport function FullSizeBannerPanel(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  const isMobile = utils.site.isMobile();\n\n  const timer = cmsUtils.payload(item, 'Timer') || 5;\n\n  exportTimer = timer;\n\n  // const slides = subItems.map((subItem, index) =>\n  //   <Item\n  //     item={subItem}\n  //     key={`${subItem.itemId}-${index}`}\n  //   ></Item>\n  // );\n  const [activeIndex, setActiveIndex] = useState(0);\n  const [progress, setProgress] = useState(0);\n\n  const sliderRef = useRef(null);\n\n  const slides = subItems.map((subItem, index) => (\n    <div key={`${subItem.itemId}-${index}`}>\n      <AnimatePresence>\n        {index === activeIndex && (\n          <Item\n            item={subItem}\n            cmsOption={cmsOption}\n          />\n        )}\n      </AnimatePresence>\n    </div>\n  ));\n\n\n\n  useEffect(() => {\n    let startTime = performance.now();\n    let duration = timer * 1000; // `autoplaySpeed` 一致\n    let animationFrameId;\n\n    const updateProgress = (timestamp) => {\n      let elapsed = timestamp - startTime;\n      let newProgress = Math.min((elapsed / duration) * 100, 100);\n      setProgress(newProgress);\n\n      if (newProgress < 100) {\n        animationFrameId = requestAnimationFrame(updateProgress);\n      }\n    };\n\n    animationFrameId = requestAnimationFrame(updateProgress);\n\n    return () => cancelAnimationFrame(animationFrameId);\n  }, [activeIndex, timer]);\n  // console.log(\"Timer value:\", timer);\n\n  var settings = {\n    dots: true,\n    infinite: true,\n    speed: 1000,\n    autoplaySpeed: timer * 0,\n    fade: true,\n    autoplay: true,\n    arrows: false,\n    slidesToShow: 1,\n    slidesToScroll: 1,\n    beforeChange: (_, next) => {\n      setActiveIndex(next);\n      setProgress(0);\n    },\n    customPaging: (i) => (\n      <div className=\"custom-dot\">\n        <div\n          className=\"progress-ring\"\n          style={{\n            background: i === activeIndex\n              ? `conic-gradient(white ${progress}%, transparent ${progress}%)`\n              : \"transparent\",\n          }}\n        ></div>\n      </div>\n    ),\n    appendDots: (dots) => (\n      <div style={{ position: \"absolute\", top: isMobile ? \"92%\" : \"85%\", left: \"50%\", transform: \"translateX(-50%)\" }}>\n        <ul style={{ display: \"flex\", gap: \"10px\", paddingLeft: \"0\" }}> {dots} </ul>\n      </div>\n    )\n  };\n\n  const cssClass = utils.classNames('cms_item', 'bannerPanel', 'full-size-container', item.cssClass || item.anchorName || '');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      <\n        // @ts-ignore\n        Slider {...settings} ref={sliderRef}>\n        {slides}\n      </Slider>\n    </div>\n  );\n}","import React, { useEffect, useState } from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { SiteLink } from '../../../components';\nimport { motion } from \"framer-motion\";\nimport './style.scss';\n\nimport { exportTimer } from '../fullSizeBannerPanel/view';\n\nexport function FullSizeBannerItem(props) {\n  const item = props.item;\n  const activeIndex = props.activeIndex;\n  const itemIndex = props.itemIndex;\n  const cmsOption = props.cmsOption || {};\n  const isMobile = utils.site.isMobile();\n\n  const bgUrl = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n\n  const captionTitle = cmsUtils.payload(item, 'CaptionTitle');\n  const linkUrl = cmsUtils.payload(item, 'LinkUrl');\n  const alignV = cmsUtils.payload(item, 'VAlign') || '50%';\n  const alignH = cmsUtils.payload(item, 'HAlign') || '50%';\n  const bgUrlMobile = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl2'));\n  const lockup = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl3'));\n  const lockupAlign = cmsUtils.payload(item, 'LockupAlign') || '50%';\n  const lockupAlignM = cmsUtils.payload(item, 'LockupAlignM') || '50%';\n\n  const cssClass = utils.classNames('cms_item', 'banner-item2', item.cssClass || item.anchorName || '');\n\n  const [shouldAnimate, setShouldAnimate] = useState(false);\n  useEffect(() => {\n    if (itemIndex === activeIndex) {\n      setShouldAnimate(true);\n    } else {\n      setShouldAnimate(false);\n    }\n  }, [activeIndex, itemIndex]);\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n      style={{ backgroundImage: utils.css.bgUrlStyle(isMobile ? bgUrlMobile : bgUrl), backgroundPositionY: alignV, backgroundPositionX: alignH }}\n    >\n      <div className='lock-up-container' style={{ top: isMobile ? lockupAlignM : lockupAlign }}>\n        <motion.img\n          // key={`${item.itemId}-${activeIndex}`}\n          src={lockup}\n          initial={{ x: 100, opacity: 0 }}\n          animate={{ x: 0, opacity: 1 }}\n          exit={{ x: -100, opacity: 0 }}\n          transition={{ duration: 1.5, ease: \"easeOut\" }}\n        />\n      </div>\n      <div className='full-screen-button-container'>\n        <SiteLink to={linkUrl} className=\"full-screen-button\"><span>{captionTitle}</span></SiteLink>\n      </div>\n    </div>\n  );\n}\n","import React from \"react\";\nimport { BannerPanel } from \"./bannerPanel/view\";\nimport { BannerItem } from \"./bannerItem/view\";\nimport { Panel } from \"./panel/view\";\nimport { Html } from \"./html/view\";\nimport { TestimonialPanel } from \"./testimonialPanel/view\";\nimport { TestimonialItem } from \"./testimonialItem/view\";\nimport { ImagePanel } from \"./imagePanel/view\";\nimport { PageTiles } from \"./pageTiles/view\";\nimport { SingleBanner } from \"./singleBanner/view\";\nimport { AccordionPanel } from \"./accordionPanel/view\";\nimport { ContactForm } from \"./contactForm/view\";\nimport { YoutubeBannerPanel } from \"./youtubeBannerPanel/view\";\nimport { Code } from \"./code/view\";\nimport { BlogPosts } from \"./blogPosts/view\";\nimport { BlogPostTitle } from \"./blogPostTitle/view\";\nimport { VideoHolder } from \"./videoHolder/view\";\nimport { VideoItem } from \"./videoItem/view\";\nimport { MultiColumnPanel } from \"./multiColumnPanel/view\";\nimport { ExpandableHtml } from \"./expandableHtml/view\";\nimport { ProductTiles } from \"./productTiles/view\";\nimport { LinkTiles } from \"./linkTiles/view\";\nimport { LinkTileItem } from \"./linkTileItem/view\";\nimport { ExpandablePanel } from \"../../components/expandablePanel/view\";\nimport { WallToWallPanel } from \"./wallToWallPanel/view\";\nimport { WallToWallItem } from \"./wallToWallItem/view\";\nimport { FullSizeBannerPanel } from \"./fullSizeBannerPanel/view\";\nimport { FullSizeBannerItem } from \"./fullSizeBannerItem/view\";\n\nexport function Item(props) {\n  const item = props.item;\n  //const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, subItems, cmsOption);\n\n  let itemElt = <></>;\n  if (item.itemTypeCode === \"Panel\") {\n    itemElt = <Panel item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"Html\") {\n    itemElt = <Html item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"BannerPanel\") {\n    itemElt = <BannerPanel item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"BannerItem\") {\n    itemElt = <BannerItem item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"TestimonialPanel\") {\n    itemElt = <TestimonialPanel item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"TestimonialItem\") {\n    itemElt = <TestimonialItem item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"ImagePanel\") {\n    itemElt = <ImagePanel item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"PageTiles\") {\n    itemElt = <PageTiles item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"SingleBanner\") {\n    itemElt = <SingleBanner item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"AccordionPanel\") {\n    itemElt = <AccordionPanel item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"ContactForm\") {\n    itemElt = <ContactForm item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"YoutubeBannerPanel\") {\n    itemElt = <YoutubeBannerPanel item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"Code\") {\n    itemElt = <Code item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"Blog-Posts\") {\n    itemElt = <BlogPosts item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"Blog-PostTitle\") {\n    itemElt = <BlogPostTitle item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"MultiColumnPanel\") {\n    itemElt = <MultiColumnPanel item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"ExpandableHtml\") {\n    itemElt = <ExpandableHtml item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"VideoHolder\") {\n    itemElt = <VideoHolder item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"VideoItem\") {\n    itemElt = <VideoItem item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"ProductTiles\") {\n    itemElt = <ProductTiles item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"LinkTiles\") {\n    itemElt = <LinkTiles item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"LinkTileItem\") {\n    itemElt = <LinkTileItem item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"ExpandablePanel\") {\n    itemElt = <ExpandablePanel item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"WallToWallPanel\") {\n    itemElt = <WallToWallPanel item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"WallToWallItem\") {\n    itemElt = <WallToWallItem item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"FullSizeBannerPanel\") {\n    itemElt = <FullSizeBannerPanel item={item} cmsOption={cmsOption} />;\n  } else if (item.itemTypeCode === \"FullSizeBannerItem\") {\n    itemElt = <FullSizeBannerItem item={item} cmsOption={cmsOption} />;\n  } else {\n    itemElt = <div>{item.itemTypeCode}</div>;\n  }\n\n  // const subItemsElts = subItems.map((subItem, index) =>\n  //   <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  // );\n  return (\n    <>\n      {itemElt}\n      {/* {subItemsElts} */}\n    </>\n  );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { useRouter } from \"../../../components\";\nimport { useGet } from \"../../../components\";\nimport { Item } from \"../../items/item\";\nimport { NotFound } from \"../../../components\";\nimport env from \"../../../env\";\nimport { useStore } from \"../../../store\";\nimport { ErrorPopup, Loading } from \"../../../components\";\nimport { useInstagram } from \"../../../components\";\nimport { MetaTag } from \"../../../components\";\nimport cmsUtils from \"../../utils/cmsUtils\";\nimport utils from \"../../../utils\";\nimport { gtm } from \"../../../lib/tracking\";\nimport { Helmet } from \"react-helmet-async\";\n// import { loadTikTokJS } from \"../../../lib/tiktok\";\n\nconst log = (...args) => {\n  //console.log(args);\n};\nconst areEqual = (prevProps, nextProps) => {\n  return prevProps.pageData === nextProps.pageData;\n};\nconst PageMemo = React.memo(Page, areEqual);\n\nexport function ViewPage() {\n  const { dispatch } = useStore();\n  const [pageLoaded, setPageLoaded] = useState(false);\n  const [data, setData] = useState(null);\n  // const [embedTypes, setEmbedTypes] = useState(null);\n  //const path = usePath();\n  //log('view page', path);\n  const { pathname, Redirect } = useRouter();\n  useInstagram();\n\n  const get = useGet();\n  log(\"0. viewpage ready\");\n\n  useEffect(() => {\n    log(\"*. start loading\");\n    setPageLoaded(false);\n    get.send(env.apiBase + \"/api/cms/GetPublishedPage?path=\" + pathname);\n    // eslint-disable-next-line\n  }, [pathname]);\n\n  useEffect(() => {\n    if (data) {\n      dispatch({ type: \"SET_PAGE\", payload: data.data });\n      dispatch({ type: \"SET_MENU\", payload: data.menu });\n    }\n    // eslint-disable-next-line\n  }, [data]);\n\n  useEffect(() => {\n    utils.site.callMCPoopu();\n  }, []);\n\n  // useEffect(() => {\n  //   if (embedTypes && embedTypes.tiktok) {\n  //     loadTikTokJS();\n  //   }\n  // }, [embedTypes]);\n\n  if (get.loading()) {\n    return <Loading />;\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title='Loading Error' errors={get.errors} />;\n  }\n\n  //log(router.pathname);\n  //log(get.loading());\n  log(\"1. viewpage component\", pageLoaded, get.response);\n\n  console.log(\"get.response\", get.response);\n\n  const pageData = get.response.data;\n  //const menuData = get.response.menu;\n  const redirectTo = get.response.redirectTo;\n  const datePublishedForBlog = get.response.datePublishedForBlog;\n\n  const cmsOption = {};\n  log(pageLoaded, !pageLoaded && !!pageData);\n  if (!pageLoaded && pageData) {\n    //log(pageLoaded, pageData, menuData)\n    log(\"2. dispatching page & menu\");\n    setPageLoaded(true);\n    setData(get.response);\n    // setEmbedTypes(getEmbedTypes(pageData));\n    document.title = pageData.pageTitle;\n    gtm.pageView(pathname, pageData.pageTitle);\n    return null;\n  } else if (redirectTo) {\n    if (redirectTo.indexOf(\"http\") >= 0 && typeof window !== `undefined`) {\n      return (window.location.href = redirectTo);\n    } else {\n      return <Redirect to={redirectTo} />;\n    }\n  } else if (!pageLoaded && !pageData) {\n    setPageLoaded(true);\n    setData(get.response);\n    return <NotFound />;\n  }\n\n  log(\"3. call rendering memo\");\n  if (pageData)\n    return (\n      <PageMemo\n        pageData={pageData}\n        cmsOption={cmsOption}\n        datePublishedForBlog={datePublishedForBlog}\n      />\n    );\n  else return <NotFound />;\n}\n\nfunction Page(props) {\n  const pageData = props.pageData;\n  const cmsOption = props.cmsOption;\n  const datePublishedForBlog = props.datePublishedForBlog;\n  //const description = cmsUtils.payload(pageData, \"Description\");\n\n  const country = utils.site.isNZ ? \"New Zealand\" : \"Australia\";\n\n  const heroImageUrl = utils.site.fullUrl(\n    cmsUtils.payload(pageData, \"ImageUrl\")\n  );\n  cmsOption.pageData = pageData;\n  // document.title = pageData.pageTitle;\n\n  log(\"4. page rendering\", pageData, cmsOption);\n  const sectionItems = pageData.sections.map((section, index) => {\n    return (\n      <Section\n        item={section}\n        key={section.sectionName + index}\n        cmsOption={cmsOption}\n      ></Section>\n    );\n  });\n\n  const homeStructuredData = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"Organization\",\n    \"name\": \"VS Sassoon\",\n    \"url\":\n      country === \"New Zealand\"\n        ? \"https://www.vssassoon.co.nz\"\n        : \"https://www.vssassoon.com.au\",\n    \"logo\":\n      country === \"New Zealand\"\n        ? \"https://www.vssassoon.co.nz/assets/logos/logo.png\"\n        : \"https://www.vssassoon.com.au/assets/logos/logo.png\",\n    \"contactPoint\":\n      country === \"New Zealand\"\n        ? {\n            \"@type\": \"ContactPoint\",\n            \"telephone\": \"+64 800 266 247\",\n            \"contactType\": \"Customer Service\",\n            \"areaServed\": \"NZ\",\n            \"availableLanguage\": \"English\",\n            \"url\": \"https://www.vssassoon.co.nz/contact\",\n          }\n        : {\n            \"@type\": \"ContactPoint\",\n            \"telephone\": \"+61 1800 650 263\",\n            \"contactType\": \"Customer Service\",\n            \"areaServed\": \"AU\",\n            \"availableLanguage\": \"English\",\n            \"url\": \"https://www.vssassoon.com.au/contact\",\n          },\n    \"address\":\n      country === \"New Zealand\"\n        ? {\n            \"@type\": \"PostalAddress\",\n            \"streetAddress\": \"PO Box 251159\",\n            \"addressLocality\": \"Pakuranga\",\n            \"addressRegion\": \"Auckland\",\n            \"postalCode\": \"2140\",\n            \"addressCountry\": \"New Zealand\",\n          }\n        : {\n            \"@type\": \"PostalAddress\",\n            \"streetAddress\": \"PO Box 146\",\n            \"addressLocality\": \"Terrey Hills\",\n            \"addressRegion\": \"NSW\",\n            \"postalCode\": \"2084\",\n            \"addressCountry\": \"Australia\",\n          },\n    \"sameAs\": [\n      \"https://www.facebook.com/VSSassoon\",\n      \"https://instagram.com/vs_sassoon\",\n      \"https://www.youtube.com/vssassoon\",\n      \"https://www.tiktok.com/@vs_sassoon\",\n    ],\n  };\n  const articleStructuredData = {\n    \"@context\": \"https://schema.org/\",\n    \"@type\": \"BlogPosting\",\n    \"headline\": pageData.pageTitle,\n    //\"description\": description,\n    \"image\": heroImageUrl,\n    \"datePublished\":\n      datePublishedForBlog && datePublishedForBlog !== \"\"\n        ? datePublishedForBlog\n        : \"\",\n    \"dateModified\": pageData.dateUpdated,\n    \"author\": {\n      \"@type\": \"Organization\",\n      \"name\": \"VS Sassoon\",\n      \"url\":\n        country === \"New Zealand\"\n          ? \"https://www.vssassoon.co.nz\"\n          : \"https://www.vssassoon.com.au\",\n    },\n  };\n\n  return (\n    <>\n      <MetaTag data={getMetaTag(pageData)} />\n      {(pageData.pageUrl === \"/\" || pageData.pageUrl === \"/contact\") && (\n        <Helmet>\n          <script type='application/ld+json'>\n            {JSON.stringify(homeStructuredData)}\n          </script>\n        </Helmet>\n      )}\n      {pageData.pageTypeCode && pageData.pageTypeCode === \"BlogPost\" && (\n        <Helmet>\n          <script type='application/ld+json'>\n            {JSON.stringify(articleStructuredData)}\n          </script>\n        </Helmet>\n      )}\n\n      <div className={`cmsPage cmsPage--${pageData.pageTypeCode}`}>\n        {sectionItems}\n      </div>\n    </>\n  );\n}\n\n// function getEmbedTypes(pageData) {\n//   const embedTypes = { tiktok: false };\n//   const embedDataList = pageData?.embedDataList;\n//   embedTypes.tiktok = utils.array.find(embedDataList, (x) => (x.code || \"\").indexOf(\"tiktok.com\") >= 0);\n\n//   return embedTypes;\n// }\n\nfunction Section(props) {\n  log(\"5. section rendering\");\n  const item = props.item;\n  //const sectionName = item.sectionName;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  if (!subItems || subItems.length === 0) return <></>;\n\n  const subItemsElts = subItems.map((subItem, index) => (\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  ));\n  return <>{subItemsElts}</>;\n}\n\nfunction getMetaTag(pageData) {\n  const country = utils.site.isNZ ? \"New Zealand\" : \"Australia\";\n  const siteName = env.siteName + \" \" + country;\n\n  return {\n    title: pageData.pageTitle + \" | \" + siteName,\n    description: cmsUtils.payload(pageData, \"Description\"),\n    keywords: cmsUtils.payload(pageData, \"Keyword\"),\n    heroImageUrl: utils.site.fullUrl(cmsUtils.payload(pageData, \"ImageUrl\")),\n    language: \"English\",\n    country: country,\n    siteName: siteName,\n    url: utils.site.fullUrl(pageData.pageUrl),\n    alternates: utils.site.getAlternates(pageData.pageUrl),\n\n    //facebook-domain-verification\n    faceBookDomainVerifi:\n      country === \"New Zealand\"\n        ? env.FaceBookDomainVerifiNZ\n        : env.FaceBookDomainVerifiAU,\n    //canonical: utils.site.resourcePath(pageData.pageUrl)\n  };\n}\n","//import { CmsPageController } from './cms-page-controller'\n\nexport class CmsRadioSender {\n  controller;//: CmsPageController;\n  constructor(controller) {\n    this.controller = controller;\n  }\n\n  sendMessageToParent(action: string, data: any) {\n    var cloned = JSON.parse(JSON.stringify(data));\n    if (typeof window !== `undefined`) {\n      window.parent.postMessage({\n        action: action,\n        data: cloned\n      }, \"*\");\n    }\n  }\n\n  saveAllDirtyHtml(htmlChanges) {\n    // skip another unneccesary round trip\n    this.sendMessageToParent('return-all-dirty-html', {\n      returnTo: '_saveAllDirtyHtml',\n      htmlChanges: htmlChanges\n    });\n  }\n\n  selectControllerItem(data) {\n    this.sendMessageToParent(\"select-controller-item\", data);\n  }\n\n  returnAllDirtyHtml(returnTo, htmlChanges) {\n    this.sendMessageToParent('return-all-dirty-html', {\n      returnTo: returnTo,\n      htmlChanges: htmlChanges\n    });\n  }\n\n  returnHtml(id, html) {\n    this.sendMessageToParent('return-html', {\n      id: id,\n      html: html\n    });\n  }\n\n  markDirtyHtml(id) {\n    this.sendMessageToParent(\"mark-dirty-html-item\", { id: id });\n  }\n}\n","//declare var CKEDITOR: any;\n//import { CmsPageController } from './cms-page-controller'\n\nexport class CmsRadioReceiver {\n  controller;//: CmsPageController;\n  constructor(controller) {\n    this.controller = controller;\n    this.init();\n  }\n\n  init() {\n    if (typeof window !== `undefined`) {\n      var self = this;\n      window.addEventListener(\"message\", function (e) {\n\n        var action = e.data.action;\n        var data = e.data.data;\n\n        // console.log(e, \"cms-action-received: \" + action, data);\n\n        if (action === 'select-item') {\n          self.selectItem(data.itemId)\n        } else if (action === 'media-selected-ckeditor') {\n          self.mediaSelectedCKEditor(data)\n        } else if (action === 'get-all-dirty-html') {\n          var htmlChanges = self.controller.getAllDirtyHtml();\n          self.controller.sender.returnAllDirtyHtml(data.returnTo, htmlChanges);\n        } else if (action === 'get-html') {\n          var html = self.controller.getHtml(data.id);\n          self.controller.sender.returnHtml(data.id, html);\n        } else if (action === 'page-reload') {\n          window.location.reload();\n        }\n      }, false);\n    }\n  }\n\n  mediaSelectedCKEditor(data) {\n    const CKEDITOR = window['CKEDITOR'] || {};\n    CKEDITOR.tools.callFunction(data.funcNum, data.selectedPath);\n  }\n\n  selectItem(itemId) {\n    this.controller.selectItemFromController(itemId);\n  }\n}\n","import { CmsRadioSender } from './cms-radio-sender'\n// //import * as $ from 'jquery';\n// declare var CKEDITOR: any;\n// import * as $ from 'jquery';\n\nexport class CmsHtmlEditor {\n  ckeditorConfig;\n  ckeditorStylesSet;\n  sender;\n  constructor(cmsEndpoint: string, sender: CmsRadioSender) {\n    this.ckeditorConfig = {\n      startupFocus: true,\n      filebrowserBrowseUrl: cmsEndpoint + '/cms41helper/browse/selectpageormedia', //'/cms/browse',//'/cms/resource/selectfileckeditor',\n      filebrowserImageBrowseUrl: cmsEndpoint + '/cms41helper/browse/selectmedia', //'/cms/browse?type=rc',//'/cms/resource/selectfileckeditor?type=Images',\n      extraPlugins: 'sourcedialog,youtubejaba,lineutils,widget,embedjaba,image2',\n      toolbar: [{\n        name: 'basicstyles',\n        groups: ['basicstyles', 'cleanup'],\n        items: ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']\n      },\n      {\n        name: 'paragraph',\n        groups: ['list', 'align'],\n        items: ['NumberedList', 'BulletedList', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight',\n          'JustifyBlock'\n        ]\n      },\n      {\n        name: 'links',\n        items: ['Link', 'Unlink', 'Anchor']\n      },\n      {\n        name: 'insert',\n        items: ['Image', 'Table', 'HorizontalRule', 'PageBreak', 'Iframe', 'Youtube', 'EmbedJaba']\n      },\n        '/',\n      {\n        name: 'document',\n        groups: ['mode'],\n        items: ['Sourcedialog']\n      },\n      {\n        name: 'clipboard',\n        groups: ['clipboard', 'undo'],\n        items: ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo']\n      },\n      {\n        name: 'styles',\n        items: ['Styles', 'Format']\n      },\n      {\n        name: 'colors',\n        items: ['TextColor', 'BGColor']\n      },\n      {\n        name: 'tools',\n        items: ['Maximize', 'ShowBlocks']\n      }\n      ],\n      extraAllowedContent: 'style;span;*[id,rel,data-*](*){*}'\n    }\n\n    this.ckeditorStylesSet = [\n      /* Block Styles */\n\n      // These styles are already available in the \"Format\" combo (\"format\" plugin),\n      // so they are not needed here by default. You may enable them to avoid\n      // placing the \"Format\" combo in the toolbar, maintaining the same features.\n      /*\n      { name: 'Paragraph',\t\telement: 'p' },\n      { name: 'Heading 1',\t\telement: 'h1' },\n      { name: 'Heading 2',\t\telement: 'h2' },\n      { name: 'Heading 3',\t\telement: 'h3' },\n      { name: 'Heading 4',\t\telement: 'h4' },\n      { name: 'Heading 5',\t\telement: 'h5' },\n      { name: 'Heading 6',\t\telement: 'h6' },\n      { name: 'Preformatted Text',element: 'pre' },\n      { name: 'Address',\t\t\telement: 'address' },\n      */\n        { name: 'Title', attributes: { 'class': 'title' } },\n        // { name: 'Heading 3', element: 'h1', attributes: { 'class': 'h3' } },\n        // { name: 'Super paragraph',\t\telement: 'p', attributes: { 'class': 'superparagraph' } },\n\n      //{ name: 'Italic Title',\t\telement: 'h2', styles: { 'font-style': 'italic' } },\n      //{ name: 'Subtitle',\t\t\telement: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } },\n      //{\n      //\tname: 'Special Container',\n      //\telement: 'div',\n      //\tstyles: {\n      //\t\tpadding: '5px 10px',\n      //\t\tbackground: '#eee',\n      //\t\tborder: '1px solid #ccc'\n      //\t}\n      //},\n\n      /* Inline Styles */\n\n      // These are core styles available as toolbar buttons. You may opt enabling\n      // some of them in the Styles combo, removing them from the toolbar.\n      // (This requires the \"stylescombo\" plugin)\n      /*\n      { name: 'Strong',\t\t\telement: 'strong', overrides: 'b' },\n      { name: 'Emphasis',\t\t\telement: 'em'\t, overrides: 'i' },\n      { name: 'Underline',\t\telement: 'u' },\n      { name: 'Strikethrough',\telement: 'strike' },\n      { name: 'Subscript',\t\telement: 'sub' },\n      { name: 'Superscript',\t\telement: 'sup' },\n      */\n\n      //{ name: 'Marker',\t\t\telement: 'span', attributes: { 'class': 'marker' } },\n\n      //{ name: 'Big',\t\t\t\telement: 'big' },\n      //{ name: 'Small',\t\t\telement: 'small' },\n      //{ name: 'Typewriter',\t\telement: 'tt' },\n\n      //{ name: 'Computer Code',\telement: 'code' },\n      //{ name: 'Keyboard Phrase',\telement: 'kbd' },\n      //{ name: 'Sample Text',\t\telement: 'samp' },\n      //{ name: 'Variable',\t\t\telement: 'var' },\n\n      //{ name: 'Deleted Text',\t\telement: 'del' },\n      //{ name: 'Inserted Text',\telement: 'ins' },\n\n      //{ name: 'Cited Work',\t\telement: 'cite' },\n      //{ name: 'Inline Quotation',\telement: 'q' },\n\n      //{ name: 'Language: RTL',\telement: 'span', attributes: { 'dir': 'rtl' } },\n      //{ name: 'Language: LTR',\telement: 'span', attributes: { 'dir': 'ltr' } },\n\n      /* Object Styles */\n        { name: 'Button', element: 'a', attributes: { 'class': 'button' } },\n        { name: 'Primary Button', element: 'a', attributes: { 'class': 'p-button' } },\n        { name: 'Secondary Button', element: 'a', attributes: { 'class': 's-button' } },\n        { name: 'More link', element: 'a', attributes: { 'class': 'more' } }\n      //{\n      //\tname: 'Styled image (left)',\n      //\telement: 'img',\n      //\tattributes: { 'class': 'left' }\n      //},\n\n      //{\n      //\tname: 'Styled image (right)',\n      //\telement: 'img',\n      //\tattributes: { 'class': 'right' }\n      //},\n\n      //{\n      //\tname: 'Compact table',\n      //\telement: 'table',\n      //\tattributes: {\n      //\t\tcellpadding: '5',\n      //\t\tcellspacing: '0',\n      //\t\tborder: '1',\n      //\t\tbordercolor: '#ccc'\n      //\t},\n      //\tstyles: {\n      //\t\t'border-collapse': 'collapse'\n      //\t}\n      //},\n\n      //{ name: 'Borderless Table',\t\telement: 'table',\tstyles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } },\n      //{ name: 'Square Bulleted List',\telement: 'ul',\t\tstyles: { 'list-style-type': 'square' } }\n    ]\n\n    this.sender = sender;\n  }\n\n  show($editor) {\n    const CKEDITOR = window['CKEDITOR'] || {};\n    //for ckeditor\n    // console.log('ckeditor show');\n    try {\n      // We need to turn off the automatic editor creation first.\n      CKEDITOR.disableAutoInline = true;\n    } catch (e) { }\n\n    var editor = CKEDITOR.inline('cmsCurrentEditor', this.ckeditorConfig);\n    if (!CKEDITOR.stylesSet.get('default'))\n    CKEDITOR.stylesSet.add('default', this.ckeditorStylesSet);\n\n    var self = this;\n    editor.on('change', function (evt) {\n      // getData() returns CKEditor's HTML content.\n      //$(\"#cmsCurrentEditor\").addClass(\"dirtyHtml\");\n      //const itemId = $(\"#cmsCurrentEditor\").data('cms-item-id');\n      const ed = document.querySelector('#cmsCurrentEditor');\n      ed.classList.add('dirtyHtml');\n      const itemId = ed.getAttribute('data-cms-item-id');\n\n      //console.log(itemId);\n      self.sender.markDirtyHtml(itemId);\n      //console.log('Total bytes: ' + evt.editor.getData().length);\n    });\n    editor.on('paste', function (evt) {\n      //console.log(evt.data.dataValue);\n      //evt.data.dataValue = evt.data.dataValue.replace(/&nbsp;/g, '');\n      //evt.data.dataValue = evt.data.dataValue.replace(/<p><\\/p>/g, '');\n      //editor.insertHtml(evt.data.dataValue); return false;\n      setTimeout(function () {\n        CKEDITOR.instances.cmsCurrentEditor.setData(CKEDITOR.instances.cmsCurrentEditor.getData());\n      }, 100);\n    }, null, null, 9);\n  }\n\n  close($editor = null) {\n    const CKEDITOR = window['CKEDITOR'] || {};\n    //console.log('ckeditor close');\n    if (typeof CKEDITOR.instances.cmsCurrentEditor != \"undefined\")\n      CKEDITOR.instances.cmsCurrentEditor.destroy();\n\n    //for (var instance in CKEDITOR.instances) {\n    //    CKEDITOR.instances[instance].destroy();\n    //}\n\n  }\n}\n","import { CmsRadioSender } from './cms-radio-sender'\nimport { CmsRadioReceiver } from './cms-radio-receiver'\nimport { CmsHtmlEditor } from './cms-html-editor'\nimport env from '../../env';\n\n// declare var CKEDITOR: any;\n// import * as $ from 'jquery';\n\n\nexport class CmsPageController {\n  settings;//: any;\n  sender;//: CmsRadioSender;\n  receiver;//: CmsRadioReceiver;\n  htmlEditor;//: CmsHtmlEditor;\n\n  constructor() {\n    this.settings = { root: \"body\", viewOnly: false };\n    this.sender = new CmsRadioSender(this);\n    this.receiver = new CmsRadioReceiver(this);\n    this.htmlEditor = new CmsHtmlEditor(env.cmsEndpoint, this.sender);\n  }\n  init(options) {\n    const $ = window['jQuery'];\n    this.settings = Object.assign({}, /*default*/{ root: \"body\", viewOnly: false }, options);\n    this.initGlobalVars();\n\n    var self = this;\n    $(\"[onclick]\").prop(\"onclick\", null);\n    $(\"[dblclick]\").prop(\"dblclick\", null);\n    $(self.settings.root).off(\"click dblclick\", \"*\");\n    $(self.settings.root).on(\"click dblclick\", \"*\", function (e) {\n      //$(\".cms_html_editor_img_selected\").removeClass(\"cms_html_editor_img_selected\");\n      //                console.log($(e.target).hasClass(\"allowClick\"));\n      //                console.log(e.target);\n\n      if (!$(e.target).hasClass(\"allowClick\")) {\n        e.stopPropagation();\n        e.preventDefault();\n      }\n\n      if ($(this).attr(\"contenteditable\") === \"true\" ||\n        $(\"#cms_html_editor_source_id\").is(\":visible\")) {\n        e.stopPropagation();\n        return;\n      }\n      if (!self.settings.viewOnly)\n        self.selectItem($(this), false, e.type === \"dblclick\");\n    });\n\n    if (self.settings.viewOnly) return; // stop the editing logic for viewonly mode.\n\n    // ctrl + s for html block\n    $(self.settings.root).on('keydown', \"#cmsCurrentEditor\", function (e) {\n      if (e.ctrlKey && e.which === 83) {\n        //var itemId = $(this).data(\"cms-item-id\");\n        //if (!itemId)\n        //    itemId = $(this).closest(\"[data-cms-item-id]\").data(\"cms-item-id\");\n        //window.parent.cms.site.saveHtml(itemId);\n        //e.preventDefault();\n\n        self.sender.saveAllDirtyHtml(self.getAllDirtyHtml());\n        return false;\n      }\n    });\n  }\n\n  selectItemFromController(id) {\n    const $ = window['jQuery'];\n    var item = $(\".cms_item[data-cms-item-id='\" + id + \"']\");\n    this.scrollTo(item);\n    this.selectItem(item, true);\n  }\n\n  selectItem($item, fromController, doubleclicked = false) {\n    //console.log(\"select item - \" + fromController + \" - \" + doubleclicked);\n    //console.log($item);\n    var editor = $item.closest(\"[contenteditable]\");\n    if (editor.length > 0)\n      return;\n    var cke_top = $item.closest(\".cke_top\");\n    if (cke_top.length > 0)\n      return;\n\n    this.closeEditingItem();\n    //console.log($item);\n    if (typeof $item === \"undefined\") return;\n    if ($item.length === 0) return;\n    this.findItem($item, fromController, 0, doubleclicked);\n  }\n\n  closeEditingItem() {\n    const $ = window['jQuery'];\n    //console.log(\"close editing item\");\n    $(\"[contenteditable]\").removeAttr(\"contenteditable\");\n    $(\"#cms_hovermenu\").remove();\n    $(\".cms_editing_item\").removeClass(\"cms_editing_item\");\n\n  }\n\n  findItem($item, fromController, depth, doubleclicked) {\n    if (depth > 100) return false;\n    // console.log($item, fromController, depth, doubleclicked)\n    if (typeof $item.attr(\"data-cms-html\") !== \"undefined\" && $item.attr(\"data-cms-html\") === \"true\") {\n      $item.attr(\"contenteditable\", \"true\");\n      this.showHtmlEditor($item);\n    }\n    if (typeof $item.attr(\"data-cms-item-id\") !== \"undefined\") {\n      //$item.attr(\"contenteditable\", \"true\");\n      $item.addClass(\"cms_editing_item\");\n      if (!fromController) {\n        //window.parent.cms.site.selectControllerItem($item.attr(\"data-cms-item-id\"),\n        //    typeof doubleclicked != \"undefined\" && doubleclicked == true\n        //);\n        this.sender.selectControllerItem({\n          id: $item.attr(\"data-cms-item-id\"),\n          openEdit: typeof doubleclicked !== \"undefined\" && doubleclicked === true\n        });\n\n      }\n\n      //show_hovermenu($item);\n\n    } else {\n      var editableParent = $item.parents(\".cms_item[data-cms-item-id], [data-cms-html]\");\n      if (editableParent.length > 0)\n        this.findItem(editableParent.first(), fromController, depth + 1, doubleclicked);\n\n    }\n  }\n\n  sameContent(a, b) {\n    return a === b;\n  }\n\n  showHtmlEditor($item) {\n    const $ = window['jQuery'];\n    var editor = $item;\n    //console.log(editor);\n    //var $menu = $(\"#cms_html_editor_ctrl\");\n    ////$menu.css(\"top\", $item.offset().top - 40);\n    ////$menu.css(\"left\", $item.offset().left);\n    //$menu.show();\n    //initHtmlEditor($item);\n\n    if (editor.attr(\"id\") === \"cmsCurrentEditor\") return;\n\n    $(\"#cmsCurrentEditor\").attr(\"id\", \"\");\n    this.htmlEditor.close(editor);\n\n    editor.attr(\"id\", \"cmsCurrentEditor\");\n    //editor.data(\"current-content\", editor.html());\n\n    this.htmlEditor.show(editor);\n    //setHandlers($item);\n\n  }\n\n\n  initGlobalVars() {\n    const $ = window['jQuery'];\n    window[\"cmsPage\"] = $.extend({}, window[\"cmsPage\"] || {}, {\n      htmleditor: {\n        // cmsPage.htmleditor.getAnchors();\n        getAnchors: function (opt) {\n          //var options = $.extend({}, opt);\n          //console.log(options);\n          var anchors = [];\n\n          $(\"a[name]\").each(function (inx, obj) {\n            anchors.push({ id: $(obj).attr(\"id\"), name: $(obj).attr(\"name\") });\n          });\n\n          $(\"[data-cms-item-name],[data-cms-anchor]\").each(function (inx, obj) {\n            if (typeof $(obj).attr(\"data-cms-anchor\") !== \"undefined\" && $(obj).attr(\"data-cms-anchor\") !== \"\" && $(obj).parents(\".owl-item\").length === 0) {\n              anchors.push({ id: null, name: $(obj).attr(\"data-cms-anchor\") });\n            } else if ($(obj).attr(\"data-cms-item-name\") !== \"\" && $(obj).parents(\".owl-item\").length === 0) {\n              anchors.push({ id: null, name: $(obj).attr(\"data-cms-item-name\") });\n            }\n          });\n\n          return anchors;\n        }\n      }\n    });\n  }\n\n  scrollTo(target) {\n    const $ = window['jQuery'];\n    if (typeof target === \"undefined\") return;\n    if ($(target).length === 0) return;\n    var htmlbody = $('html,body');\n    var top = 0;\n    if ($(target).height() > $(window).height())\n      top = $(target).offset().top;\n    else {\n      top = $(target).offset().top - Math.floor(($(window).height() - $(target).height()) / 2);\n    }\n    //console.log(top);\n    //htmlbody.animate({ scrollTop: top }, 500, 'easeInOutQuint');\n    htmlbody.animate({ scrollTop: top }, 500);\n  }\n\n  getCurrentHtml() {\n    const CKEDITOR = window['CKEDITOR'] || {};\n    try {\n      return CKEDITOR.instances.cmsCurrentEditor.getData();\n    } catch (e) { return \"\"; }\n  }\n\n  getAllDirtyHtml() {\n    const $ = window['jQuery'];\n    var self = this;\n    var htmlChanges = [];\n    $(\".dirtyHtml\").each(function (inx, obj) {\n      var $section = $(obj);\n      var content = $section.is(\"#cmsCurrentEditor\") ? // if the html editor is active, it needs to get the html from the editor.\n        self.getCurrentHtml() : $section.html();\n      if ($section.is(\"[data-cms-section-id]\")) {\n        // section level?\n        let $item = $section.closest(\"[data-cms-item-id]\");\n        htmlChanges.push({ ItemId: $item.data(\"cms-item-id\"), SectionId: $section.data(\"cms-section-id\"), Content: content });\n      } else if ($section.is(\"[data-cms-item-id]\")) {\n        // section level?\n        let $item = $section;\n        htmlChanges.push({ ItemId: $item.data(\"cms-item-id\"), SectionId: \"Content\", Content: content });\n      }\n    });\n    return htmlChanges;\n  }\n\n  getHtml(itemid: any) {\n    const $ = window['jQuery'];\n    this.htmlEditor.close();\n    var self = this;\n    var item = $(\".cms_item[data-cms-item-id='\" + itemid + \"']\");\n\n    var formvals = { Content: this.cms_replace_item_html(item) };\n\n    //cms_msg_progressing(\"#save_message\", \"Saving...\");\n    if ($(\"[data-cms-section-id]\", item).length > 0) {\n      $(\"[data-cms-section-id]\", item).each(function (inx, section) {\n        var closestItemId = $(section).closest(\".cms_item\").data(\"cms-item-id\");\n        if (closestItemId === itemid) {\n          var id = $(section).attr(\"data-cms-section-id\");\n          formvals[id] = self.cms_replace_item_html($(section)); //.find(\">:first-child\")().html();\n\n        }\n      });\n    }\n    return formvals;\n  }\n\n  cms_replace_item_html(item) {\n    return item.html();\n    // var $tmp = $(\"<div></div>\").html(item.html());\n    // if ($tmp.find('.cms-skeleton').length > 0)\n    //   return $tmp.find('.cms-skeleton').html();\n    // else\n    //   return item.html();\n    //tmp.find(\".cms_ctrl_in_editor\").each(function (inx, obj) {\n    //    var ctrlid = $(obj).attr(\"data-cms-ctrl-id\");\n    //    $(obj).replaceWith(\"__cms__ctrl:\" + ctrlid + \"__\");\n    //});\n    //return tmp.html();\n  }\n\n}\n","import React, { useEffect } from 'react';\nimport { useRouter } from '../../../components';\nimport { useGet } from '../../../components';\nimport { Item } from '../../items/item';\nimport env from '../../../env';\nimport { loadJs } from '../../../lib/net-loader';\nimport { CmsPageController } from '../../services/cms-page-controller';\nimport { ErrorPopup, Loading } from '../../../components';\n\n// function useQuery() {\n//   return new URLSearchParams(useLocation().search);\n// }\n\nexport function EditPage(props) {\n  //const [page, setPage] = useState(null);\n\n  //const pageId = props.pageId;\n  const { query } = useRouter();\n  const { cmsViewMode = 'edit', id, publishVer, editVer } = query;\n  const pageId = id;\n\n  //console.log(pageId, cmsViewMode, env.apiBase, env)\n\n  const get = useGet();\n  useEffect(() => {\n    get.send(env.apiBase + '/api/cms/GetPage/' + pageId + '?cmsViewMode=' + cmsViewMode\n      + (publishVer ? '&publishVer=' + publishVer : '')\n      + (editVer ? '&editVer=' + editVer : '')\n    );\n    // eslint-disable-next-line\n  }, [pageId]);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  //console.log(router.pathname);\n  //console.log(res);\n\n  const pageData = get.response.data;\n  const cmsOption = { isCmsEdit: true, cmsViewMode: cmsViewMode };\n  cmsOption.pageData = pageData;\n\n  const cmsPageController = new CmsPageController();\n  if (cmsViewMode !== 'viewonly') {\n    const ver = 1;\n    loadJs(\n      env.resourceBase + '/dist/jquery-3.4.1/jquery.min.js?v=' + ver\n    ).then(data => {\n      return loadJs(\n        env.resourceBase + '/dist/cms/ckeditor/ckeditor.js?v=' + ver\n      )\n    }).then(data => {\n      // console.log('script loaded ', data);\n      cmsPageController.init({});\n      document.querySelector('body').classList.add('cmsedit');\n    }).catch(error => console.log(error));\n  } else {\n    const ver = 1;\n    loadJs(\n      env.resourceBase + '/dist/jquery-3.4.1/jquery.min.js?v=' + ver\n    ).then(data => {\n      cmsOption.isCmsEdit = false;\n      cmsPageController.init({ viewOnly: true });\n    }).catch(error => console.log(error));\n  }\n\n  //setPage(res.response.data);\n  const sectionItems = pageData.sections.map((section, index) =>\n    <Section item={section} key={section.sectionName + index} cmsOption={cmsOption}></Section>\n  );\n  return (\n    <div className={`cmsPage cmsPage--${pageData.pageTypeCode}`}>\n      {sectionItems}\n    </div>\n  );\n}\n\n\nfunction Section(props) {\n  const item = props.item;\n  //const sectionName = item.sectionName;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  if (!subItems || subItems.length === 0)\n    return (<></>);\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n  return (\n    <>\n      {subItemsElts}\n    </>\n  );\n}\n\n","import React from 'react';\nimport { useRouter } from '../../components';\n\nexport function SearchBar({onCloseMenu}) {\n  const [keyword, setKeyword ] = React.useState('')\n  const { navigate } = useRouter();\n  function search(e) {\n    e.preventDefault();\n    onCloseMenu();\n    navigate('/search-results?q=' + encodeURIComponent(keyword))\n  }\n  function onChange(e) {\n    setKeyword(e.target.value);\n  }\n  return (\n    <form className=\"searchBar\" onSubmit={(e) => search(e)}>\n      <input type=\"text\" className=\"searchBar__input\" placeholder=\"SEARCH\" value={keyword} onChange={onChange}></input>\n    </form>);\n\n}\n","import React, { useState, useEffect } from \"react\";\nimport { SiteLink } from \"../../components\";\nimport { useStore } from \"../../store\";\nimport { FaPlus } from \"react-icons/fa\";\nimport { FaMinus } from \"react-icons/fa\";\nimport { SearchBar } from \"./searchBar\";\n\nexport function NavBar(props) {\n  const open = props.open;\n  const currentLocation = props.currentLocation;\n  const { state } = useStore();\n  const menu = state.menu || { items: [] };\n  const [openItemIndex, setOpenItemIndex] = useState(null);\n  const handleMenuItemClick = (index) => {\n    setOpenItemIndex(index === openItemIndex ? null : index);\n  };\n\n  const depth = 1;\n  const menuItemElts = menu.items.map((item, index) => (\n    <MenuItem\n      item={item}\n      itemNum={index}\n      key={index}\n      depth={depth}\n      onCloseMenu={props.onCloseMenu}\n      currentLocation={currentLocation}\n      isOpen={index === openItemIndex}\n      onItemClick={() => handleMenuItemClick(index)}\n    ></MenuItem>\n  ));\n  return (\n    <div className={`navBar ${open ? \"navBar--on\" : \"\"}`} id='sliding-menu'>\n      <SearchBar onCloseMenu={props.onCloseMenu} />\n      <div className='navBar__scrollArea' id='top-menu'>\n        <nav className='navBar_nav'>\n          <ul>{menuItemElts}</ul>\n        </nav>\n      </div>\n    </div>\n  );\n}\n\nfunction MenuItem(props) {\n  const [subMenuOpened, setSubMenuOpened] = useState(false);\n  const item = props.item;\n  const subItems = item.items || [];\n  const currentLocation = props.currentLocation;\n\n  const subItemsElts =\n    subItems.length > 0\n      ? subItems.map((subItem, index) => (\n          <SubMenuItem\n            item={subItem}\n            key={index}\n            onCloseMenu={props.onCloseMenu}\n            level={0}\n          />\n        ))\n      : null;\n\n  useEffect(() => {\n    setSubMenuOpened(false);\n  }, [currentLocation]);\n\n  function closeMenu() {\n    props.onCloseMenu();\n  }\n\n  function toggleSubmenu(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    setSubMenuOpened(!subMenuOpened);\n    props.onItemClick();\n  }\n\n  if (item.url) {\n    return (\n      <li\n        className={`navBar__item ${subMenuOpened ? \"navBar__item--open\" : \"\"}`}\n      >\n        <div className='navBar__link'>\n          <SiteLink to={item.url} onClick={() => closeMenu()}>\n            {item.title}\n          </SiteLink>\n          {subItemsElts && (\n            <span className='navBar__icon' onClick={(e) => toggleSubmenu(e)}>\n              {subMenuOpened ? <FaMinus /> : <FaPlus />}\n            </span>\n          )}\n        </div>\n        {subItemsElts && <ul className={`navBar__subMenu`}>{subItemsElts}</ul>}\n      </li>\n    );\n  } else {\n    return (\n      <li\n        className={`navBar__item ${props.isOpen ? \"navBar__item--open\" : \"\"}`}\n      >\n        <div\n          className='navBar__link'\n          onClick={(e) => {\n            toggleSubmenu(e);\n          }}\n        >\n          <span>{item.title}</span>\n          {subItemsElts && (\n            <span className='navBar__icon'>\n              {props.isOpen ? <FaMinus /> : <FaPlus />}\n            </span>\n          )}\n        </div>\n        {subItemsElts && <ul className={`navBar__subMenu`}>{subItemsElts}</ul>}\n      </li>\n    );\n  }\n}\n\nfunction SubMenuItem(props) {\n  const item = props.item;\n  const level = props.level + 1;\n  const childItem = item.items || [];\n  const [subMenuOpened, setSubMenuOpened] = useState(false);\n  const childElts = childItem.map((item, index) => {\n    return (\n      <SubMenuItem\n        key={index}\n        item={item}\n        onCloseMenu={props.onCloseMenu}\n        level={level}\n      />\n    );\n  });\n\n  function closeMenu() {\n    props.onCloseMenu();\n  }\n\n  function toggleSubmenu(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    setSubMenuOpened(!subMenuOpened);\n  }\n\n  return (\n    <li\n      className={`level__${level} navBar__subItem ${level > 1 && \"sub__level\"}`}\n    >\n      <SiteLink\n        className='navBar__subLink'\n        to={item.url}\n        onClick={() => closeMenu()}\n      >\n        <span>{item.title}</span>\n        {childElts && childElts.length > 0 && (\n          <span\n            className={`navBar__icon__sub ${\n              subMenuOpened ? \"navBar__icon__sub--open\" : \"\"\n            }`}\n            onClick={(e) => toggleSubmenu(e)}\n          >\n            {\" \"}\n            {subMenuOpened ? <FaMinus /> : <FaPlus />}{\" \"}\n          </span>\n        )}\n      </SiteLink>\n      {childElts && childElts.length > 0 && (\n        <ul\n          className={`level__${level + 1} navBar__subMenu ${\n            level + 1 > 1 && \"sub__level\"\n          } ${level + 1 > 6 && \"over__level\"} ${\n            subMenuOpened ? \"navBar__subMenu--open\" : \"\"\n          }`}\n        >\n          {childElts}\n        </ul>\n      )}\n    </li>\n  );\n}\n","import React from \"react\";\nimport { useRouter } from \"../../components\";\nimport { MdClose } from \"react-icons/md\";\n\nexport function SearchBar({ onCloseMenu, setSearchOpened }) {\n  const [keyword, setKeyword] = React.useState(\"\");\n  const { navigate } = useRouter();\n  function search(e) {\n    e.preventDefault();\n    onCloseMenu();\n    navigate(\"/search-results?q=\" + encodeURIComponent(keyword));\n  }\n  function onChange(e) {\n    setKeyword(e.target.value);\n  }\n  return (\n    <div className='searchBar3'>\n      <form onSubmit={(e) => search(e)}>\n        <input\n          type='text'\n          className='searchBar__input'\n          placeholder='SEARCH'\n          value={keyword}\n          onChange={onChange}\n          autoFocus\n        ></input>\n      </form>\n      <div onClick={() => setSearchOpened(false)}>\n        <MdClose size={22} />\n      </div>\n    </div>\n  );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { SiteLink } from \"../../components\";\nimport { useStore } from \"../../store\";\nimport { FaPlus } from \"react-icons/fa\";\nimport { FaMinus } from \"react-icons/fa\";\nimport { GrSearch } from \"react-icons/gr\";\nimport { SearchBar } from \"./searchBar3\";\n\nexport function NavBarHori(props) {\n  const currentLocation = props.currentLocation;\n  const { state } = useStore();\n  const menu = state.menu || { items: [] };\n  const [searchOpened, setSearchOpened] = useState(false);\n\n  const depth = 1;\n  const menuItemElts = menu.items.map((item, index) => (\n    <MenuItem\n      item={item}\n      key={index}\n      depth={depth}\n      onCloseMenu={props.onCloseMenu}\n      currentLocation={currentLocation}\n    ></MenuItem>\n  ));\n\n  if (searchOpened) {\n    return (\n      <div className='horizontal_menu'>\n        <ul className='horizontal_menu_ul'>{menuItemElts} </ul>\n        <div\n          className={`search_container ${\n            searchOpened ? \"search_container_open\" : \"\"\n          }`}\n          onClick={() => setSearchOpened(true)}\n        >\n          <GrSearch size={18} />\n        </div>\n        <SearchBar\n          onCloseMenu={() => setSearchOpened(false)}\n          setSearchOpened={setSearchOpened}\n        />\n      </div>\n    );\n  } else {\n    return (\n      <div className='horizontal_menu'>\n        <ul className='horizontal_menu_ul'>{menuItemElts} </ul>\n        <div className='search_container' onClick={() => setSearchOpened(true)}>\n          <GrSearch size={18} />\n        </div>\n      </div>\n    );\n  }\n}\n\nfunction MenuItem(props) {\n  const [subMenuOpened, setSubMenuOpened] = useState(false);\n  const item = props.item;\n  const subItems = item.items || [];\n  const currentLocation = props.currentLocation;\n\n  const subItemsElts =\n    subItems.length > 0\n      ? subItems.map((subItem, index) => (\n          <SubMenuItem\n            item={subItem}\n            key={index}\n            onCloseMenu={props.onCloseMenu}\n            level={0}\n          />\n        ))\n      : null;\n\n  useEffect(() => {\n    setSubMenuOpened(false);\n  }, [currentLocation]);\n\n  function closeMenu() {\n    props.onCloseMenu();\n  }\n\n  if (item.url) {\n    return (\n      <li\n        className={`horizontal_menu_item ${\n          subMenuOpened ? \"horizontal_menu_item--open\" : \"\"\n        }`}\n      >\n        <div className='horizontal_menu_link'>\n          <SiteLink to={item.url} onClick={() => closeMenu()}>\n            {item.title}\n          </SiteLink>\n        </div>\n        {subItemsElts && (\n          <ul className={`horizontal_subMenu`}>{subItemsElts}</ul>\n        )}\n      </li>\n    );\n  } else {\n    return (\n      <li\n        className={`horizontal_menu_item ${\n          subMenuOpened ? \"horizontal_menu_item--open\" : \"\"\n        }`}\n      >\n        <div className='horizontal_menu_link'>\n          <span>{item.title}</span>\n        </div>\n        {subItemsElts && (\n          <ul className={`horizontal_subMenu`}>{subItemsElts}</ul>\n        )}\n      </li>\n    );\n  }\n}\n\nfunction SubMenuItem(props) {\n  const item = props.item;\n  const level = props.level + 1;\n  const childItem = item.items || [];\n  const [subMenuOpened, setSubMenuOpened] = useState(false);\n  const childElts = childItem.map((item, index) => {\n    return (\n      <SubMenuItem\n        key={index}\n        item={item}\n        onCloseMenu={props.onCloseMenu}\n        level={level}\n      />\n    );\n  });\n\n  function closeMenu() {\n    props.onCloseMenu();\n  }\n\n  function toggleSubmenu(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    setSubMenuOpened(!subMenuOpened);\n  }\n\n  return (\n    <li\n      className={`level__${level} navBar__subItem ${level > 1 && \"sub__level\"}`}\n    >\n      <SiteLink\n        className='navBar__subLink'\n        to={item.url}\n        onClick={() => closeMenu()}\n      >\n        <span>{item.title}</span>\n        {childElts && childElts.length > 0 && (\n          <span\n            className={`navBar__icon__sub ${\n              subMenuOpened ? \"navBar__icon__sub--open\" : \"\"\n            }`}\n            onClick={(e) => toggleSubmenu(e)}\n          >\n            {\" \"}\n            {subMenuOpened ? <FaMinus /> : <FaPlus />}{\" \"}\n          </span>\n        )}\n      </SiteLink>\n      {childElts && childElts.length > 0 && (\n        <ul\n          className={`level__${level + 1} navBar__subMenu ${\n            level + 1 > 1 && \"sub__level\"\n          } ${level + 1 > 6 && \"over__level\"} ${\n            subMenuOpened ? \"navBar__subMenu--open\" : \"\"\n          }`}\n        >\n          {childElts}\n        </ul>\n      )}\n    </li>\n  );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { useRouter } from \"../../components\";\nimport { SiteLink } from \"../../components\";\nimport { NavBar } from \"./navBar\";\nimport { NavBarHori } from \"./navBarHori\";\nimport { FaAngleLeft } from \"react-icons/fa\";\nimport { useHistory } from \"../../components\";\nimport utils from \"../../utils\";\n\nexport function TopHeader(props) {\n  const { pathname } = useRouter();\n  const [menuOpened, setMenuOpened] = useState(false);\n  const [currentLocation, setCurrentLocation] = useState(pathname);\n  const history = useHistory(pathname);\n  const isMobile = utils.site.isMobile();\n\n  const routeChanged = (path, history) => {\n    if (typeof window !== `undefined`) {\n      const hash = window.location.hash;\n      const search = window.location.search;\n      history.push(path + hash + search);\n\n      if (hash) {\n        scrollTo();\n      }\n    }\n  };\n\n  useEffect(() => {\n    scrollTo();\n  }, []);\n\n  useEffect(() => {\n    routeChanged(pathname, history);\n    setCurrentLocation(pathname);\n    // eslint-disable-next-line\n  }, [pathname]);\n\n  function scrollTo() {\n    const hash = window.location.hash;\n    if (hash) {\n      setTimeout(() => {\n        const anchor = utils.ui.findElement(hash);\n        if (anchor) utils.ui.scrollTo(anchor, 500);\n      }, 500);\n    }\n  }\n\n  function toggleMenu(e) {\n    setMenuOpened(!menuOpened);\n  }\n\n  function onCloseMenu() {\n    setMenuOpened(false);\n  }\n\n  function goBack(e) {\n    history.getPrevious();\n  }\n\n  function backTop() {\n    window.scrollTo({ top: 0, behavior: \"smooth\" });\n  }\n  if (isMobile) {\n    return (\n      <>\n        <header className='topNav topNav2' id='top'>\n          {history.history.length > 1 && (\n            <SiteLink\n              className='topNav__back'\n              title='Go Back'\n              to={history.getPreviousPath()}\n              onClick={goBack}\n            >\n              <FaAngleLeft /> BACK\n            </SiteLink>\n          )}\n\n          <div className='topNav__skewBar'></div>\n          <SiteLink to='/' className='topNav__logo' onClick={backTop}>\n            <img\n              src='/assets/logos/logo.png'\n              alt='logo'\n              className='topNav__logoImg'\n            />\n            <img\n              src='/assets/logos/logo_orange.png'\n              alt='logo'\n              className='topNav__logoImg--var1'\n            />\n            <img\n              src='/assets/logos/logo_grey.png'\n              alt='logo'\n              className='topNav__logoImg--var2'\n            />\n            <img\n              src='/assets/logos/logo_gold.png'\n              alt='logo'\n              className='topNav__logoImg--var3'\n            />\n          </SiteLink>\n\n          <button\n            id='mobile-menu-icon'\n            type='button'\n            aria-label='Menu'\n            className={`hamburger hamburger--collapse ${\n              menuOpened ? \"is-active\" : \"\"\n            }`}\n            onClick={toggleMenu}\n          >\n            <span className='hamburger-box'>\n              <span className='hamburger-inner'></span>\n            </span>\n          </button>\n\n          <NavBar\n            open={menuOpened}\n            onCloseMenu={onCloseMenu}\n            currentLocation={currentLocation}\n          ></NavBar>\n        </header>\n      </>\n    );\n  } else {\n    return (\n      <>\n        <header className='topNav topNav2' id='top'>\n          {history.history.length > 1 && (\n            <SiteLink\n              className='topNav__back'\n              title='Go Back'\n              to={history.getPreviousPath()}\n              onClick={goBack}\n            >\n              <FaAngleLeft /> BACK\n            </SiteLink>\n          )}\n          <div className='topNav__skewBar'></div>\n          <SiteLink to='/' className='topNav__logo' onClick={backTop}>\n            <img\n              src='/assets/logos/logo.png'\n              alt='logo'\n              className='topNav__logoImg'\n            />\n            <img\n              src='/assets/logos/logo_orange.png'\n              alt='logo'\n              className='topNav__logoImg--var1'\n            />\n            <img\n              src='/assets/logos/logo_grey.png'\n              alt='logo'\n              className='topNav__logoImg--var2'\n            />\n            <img\n              src='/assets/logos/logo_gold.png'\n              alt='logo'\n              className='topNav__logoImg--var3'\n            />\n          </SiteLink>\n          <NavBarHori\n            open={menuOpened}\n            onCloseMenu={onCloseMenu}\n            currentLocation={currentLocation}\n          ></NavBarHori>\n        </header>\n      </>\n    );\n  }\n}\n","import React, { useEffect } from \"react\";\nimport { useRouter } from \"../../components\";\n//import { navigate, usePath, useLocationChange } from 'raviger';\nimport { useHistory } from \"../../components\";\nimport utils from \"../../utils\";\n\nexport function TopHeaderQR(props) {\n  const { pathname } = useRouter();\n  const history = useHistory(pathname);\n\n  const routeChanged = (path, history) => {\n    if (typeof window !== `undefined`) {\n      const hash = window.location.hash;\n      const search = window.location.search;\n      history.push(path + hash + search);\n      if (hash) {\n        scrollTo();\n      }\n    }\n  };\n\n  useEffect(() => {\n    scrollTo();\n  }, []);\n\n  useEffect(() => {\n    routeChanged(pathname, history);\n    // eslint-disable-next-line\n  }, [pathname]);\n\n  function scrollTo() {\n    const hash = window.location.hash;\n    if (hash) {\n      setTimeout(() => {\n        const anchor = utils.ui.findElement(hash);\n        if (anchor) utils.ui.scrollTo(anchor, 500);\n      }, 500);\n    }\n  }\n\n  return (\n    <>\n      <header className=\"topNav\" id=\"top\">\n        <div className=\"topNav__logo\">\n          <img\n            src=\"/assets/logos/logo.png\"\n            alt=\"logo\"\n            className=\"topNav__logoImg\"\n          />\n          <img\n            src=\"/assets/logos/logo_orange.png\"\n            alt=\"logo\"\n            className=\"topNav__logoImg--var1\"\n          />\n          <img\n            src=\"/assets/logos/logo_grey.png\"\n            alt=\"logo\"\n            className=\"topNav__logoImg--var2\"\n          />\n          <img\n            src=\"/assets/logos/logo_gold.png\"\n            alt=\"logo\"\n            className=\"topNav__logoImg--var3\"\n          />\n        </div>\n      </header>\n    </>\n  );\n}\n","import Hammer from '@egjs/hammerjs'\nimport { gsap } from 'gsap';\n\nexport default class BottomDrawer {\n  constructor(el, options = {}) {\n    const defaults = {};\n    this.settings = Object.assign({}, defaults, options);\n    this.slider = el;\n\n    // location\n    this.currentTranslateY = 0;\n    this.size = null;\n    this.status = 'expanded';\n    this.inititialised = false;\n    this.tsEventHandled = new Date();\n  }\n\n  init() {\n    this.size = this.getSize(this.slider);\n    //console.log(this.size)\n    //this.close()\n    this.open()\n\n    //\n    const hammer = new Hammer.Manager(this.slider);\n    hammer.add(new Hammer.Pan({ direction: Hammer.DIRECTION_VERTICAL, threshold: 0 }));\n\n    hammer.on('panstart pan panend', e => {\n      //console.log(e.type, e)\n      if (e.type === 'panend') {\n        this.switch(e.deltaY);\n      } else if (e.type === 'pan') {\n        this.moveDeltaTmp(e.deltaY)\n      }\n    });\n\n    this.initEvent();\n  }\n\n  initEvent() {\n    const bar = this.slider.querySelector('.bottomMenu__bar');\n    if (this.inititialised) {\n      bar.removeEventListener('click', (e) => this.handleClick(e, this))\n    }\n    bar.addEventListener('click', (e) => this.handleClick(e, this))\n    this.inititialised = true;\n  }\n\n  handleClick(e, self) {\n    e.preventDefault();\n    e.stopPropagation();\n    const dt = (new Date()) - this.tsEventHandled;\n    //console.log('handleClick', dt);\n\n    if (dt < 100) return;\n    self.switch();\n  }\n\n  moveDeltaTmp(delta){\n    const y = this.getBaseY() + delta;\n    //console.log(y,delta)\n\n    this.currentTranslateY = y < 0? 0 : (y > this.size.max ? this.size.max : y);\n    this.move(this.currentTranslateY);\n  }\n\n  switch(delta){\n    this.tsEventHandled = new Date();\n    if ((delta < 0 && this.status === 'expanded') || (delta > 0 && this.status === 'collapsed')) return;\n    const targetY = this.getTargetY();\n    //console.log('return', this.currentTranslateY, targetY)\n    \n    gsap.fromTo(this.slider, {y: this.currentTranslateY}, {duration: 0.3, y: targetY, ease: 'power1'});\n    this.status = this.status === 'collapsed'? 'expanded' : 'collapsed';\n    this.currentTranslateY = targetY;\n  }\n\n  getBaseY() {\n    return this.status === 'collapsed'? this.size.max : this.size.min;\n  }\n\n  getTargetY() {\n    return this.status === 'collapsed'? this.size.min : this.size.max;\n  }\n\n  getSize(el) {\n    const links = el.querySelector('.bottomMenu__links');\n    const bar = el.querySelector('.bottomMenu__bar');\n    return { min: 0, max: links.offsetHeight, barHeight: bar.offsetHeight };\n  }\n\n  move(dy) {\n    this.slider.style.transform = `translate3d(0, ${dy}px, 0)`;\n  }\n\n  close() {\n    this.status = 'collapsed';\n    this.currentTranslateY = this.size.max;\n    this.move(this.currentTranslateY);\n  }\n\n  open() {\n    this.status = 'expanded';\n    this.currentTranslateY = this.size.min;\n    this.move(this.currentTranslateY);\n  }\n}","import React, { useEffect, useLayoutEffect, useRef } from \"react\";\nimport { useRouter } from \"../../components\";\nimport { SiteLink } from \"../../components\";\nimport BottomDrawer from \"../../components/bottomDrawer\";\nimport { useStore } from \"../../store\";\n\nexport function BottomDock(props) {\n  const links = [\n    { url: \"/products\", title: \"PRODUCTS\" },\n    { url: \"/warranty\", title: \"WARRANTY\" },\n    { url: \"/style-bar\", title: \"STYLE BAR\" },\n    { url: \"/blog\", title: \"BLOG\" },\n    { url: \"/contact\", title: \"CONTACT\" },\n  ];\n\n  //const path = usePath();\n  const { pathname } = useRouter();\n  const { state, dispatch } = useStore();\n\n  console.log(\"state.toggleBottomMenu\", state.toggleBottomMenu);\n\n  const isCurrent = (link) => {\n    return pathname && pathname.toLowerCase() === link.toLowerCase();\n  };\n\n  const linkElts = links.map((link, index) => (\n    <li key={index} className={`bottomMenu__li ${isCurrent(link.url) ? \"selected\" : \"\"}`}>\n      <SiteLink to={link.url} className={`bottomMenu__link bottomMenu__link--${index}`}>\n        <div className=\"icon\"></div>\n        <div>{link.title}</div>\n      </SiteLink>\n    </li>\n  ));\n\n  const bottomMenu = useRef(null);\n  useLayoutEffect(() => {\n    //console.log('useLayoutEffect');\n    const slider = new BottomDrawer(bottomMenu.current);\n\n    setTimeout(() => {\n      slider.init();\n      // slider.close();\n\n      // close by default on pc\n      const isMobile = window.innerWidth < 768;\n      if (!isMobile) {\n        slider.close(); \n    }\n\n      // if (pathname === \"/hydro-smooth\" || pathname === \"/digital-sensor-luxe\" || pathname === \"/digital-sensor-luxe-test\") {\n      //   slider.close();\n      // }\n    }, 1000);\n\n    // eslint-disable-next-line\n  }, []);\n\n  useEffect(() => {\n    if (!state.toggleBottomMenu) {\n      return;\n    }\n    const slider = new BottomDrawer(bottomMenu.current);\n    setTimeout(() => {\n      slider.init();\n      slider.close();\n    }, 1000);\n    dispatch({ type: \"SET_STATE\", payload: { toggleBottomMenu: null } });\n\n    // eslint-disable-next-line\n  }, [state.toggleBottomMenu]);\n\n  return (\n    <>\n      <nav className=\"bottomMenu\" ref={bottomMenu}>\n        <div className=\"bottomMenu__bar\"></div>\n        {/* <div className=\"bottomMenu__bg\"></div> */}\n        <ul className=\"bottomMenu__links\">{linkElts}</ul>\n      </nav>\n      <div className=\"bottomMenuPadding\"></div>\n    </>\n  );\n}\n","import { css } from \"@emotion/core\";\n\nexport default {\n  instagrams: css({\n    marginLeft: \"-10px\",\n    marginRight: \"-10px\",\n    display: \"flex\",\n    justifyContent: \"flex-start\",\n    flexWrap: \"wrap\",\n  }),\n  youtubes: css({\n    marginLeft: \"-10px\",\n    marginRight: \"-10px\",\n    display: \"flex\",\n    justifyContent: \"flex-start\",\n    flexWrap: \"wrap\",\n  }),\n  tiktoks: css({\n    marginLeft: \"-10px\",\n    marginRight: \"-10px\",\n    display: \"flex\",\n    justifyContent: \"flex-start\",\n    flexWrap: \"wrap\",\n  }),\n  qa: {\n    marginBottom: \"1rem\",\n    borderBottom: \"solid 1px #ccc\",\n  },\n  qaQuestion: {\n    fontWeight: \"bold\",\n    marginBottom: \"0.3rem\",\n  },\n  qaAnswer: {},\n};\n","import React from 'react';\nimport { SiteLink } from '../../components';\n\nexport function Breadcrumb({ breadcrumb }) {\n\n  return (\n    <ul className=\"breadcrumb\">\n      {breadcrumb.items.map((item, index) => Item(item, index))}\n    </ul>\n  );\n}\n\nfunction Item(item, index) {\n  if (item.link) {\n    return (\n      <li key={index}><SiteLink to={item.link}>{item.title}</SiteLink></li>\n    )\n  } else {\n    return (\n      <li key={index}>{item.title}</li>\n    )\n  }\n}","import React, { useState, useEffect } from 'react';\nimport { useGet } from '../../../components';\nimport { Item } from '../../items/item';\nimport { NotFound } from '../../../components';\nimport env from '../../../env';\nimport { useStore } from '../../../store';\nimport { ErrorPopup, Loading } from '../../../components';\n\nconst log = (...args) => {\n  //console.log(args);\n}\nconst areEqual = (prevProps, nextProps) => {\n  return (prevProps.pageData === nextProps.pageData)\n};\nconst PageMemo = React.memo(Page, areEqual)\n\nexport function ViewPartial({pageOptions = null}) {\n  const { dispatch } = useStore();\n  const [pageLoaded, setPageLoaded] = useState(false);\n  const [data, setData] = useState(null);\n  //const path = usePath();\n  //log('view page', path);\n  const pathname = '/partials/common-footer';\n\n  const get = useGet();\n  log('0. viewpage ready');\n\n  useEffect(() => {\n    log('*. start loading')\n    setPageLoaded(false);\n    get.send(env.apiBase + \"/api/cms/GetPublishedPage?path=\" + pathname);\n    // eslint-disable-next-line\n  }, [pathname]);\n\n  useEffect(() => {\n    if (data){\n      dispatch({ type: 'SET_PAGE', payload: data.data })\n      dispatch({ type: 'SET_MENU', payload: data.menu })\n    }\n    // eslint-disable-next-line\n  }, [data]);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  //log(router.pathname);\n  //log(get.loading());\n  log('1. viewpage component', pageLoaded, get.response);\n\n\n  const pageData = get.response.data;\n  //const menuData = get.response.menu;\n  const cmsOption = { pageOptions: pageOptions};\n  log(pageLoaded, !pageLoaded && !!pageData)\n  if (!pageLoaded && pageData) {\n    //log(pageLoaded, pageData, menuData)\n    log('2. dispatching page & menu')\n    setPageLoaded(true);\n    setData(get.response);\n\n    //document.title = pageData.pageTitle;\n    return null;\n  } else if (!pageData) {\n    return (<NotFound />)\n  }\n\n  log('3. call rendering memo')\n  return <PageMemo pageData={pageData} cmsOption={cmsOption} />;\n}\n\n\nfunction Page(props) {\n  const pageData = props.pageData;\n  const cmsOption = props.cmsOption;\n  // document.title = pageData.pageTitle;\n  log('4. page rendering', pageData, cmsOption)\n  const sectionItems = pageData.sections.map((section, index) => {\n    return (\n      <Section item={section} key={section.sectionName + index} cmsOption={cmsOption}></Section>\n    )\n  }\n  );\n  return (\n    <>\n      {sectionItems}\n    </>\n  );\n}\n\nfunction Section(props) {\n  log('5. section rendering')\n  const item = props.item;\n  //const sectionName = item.sectionName;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  if (!subItems || subItems.length === 0)\n    return (<></>);\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n  return (\n    <>\n      {subItemsElts}\n    </>\n  );\n}\n\n","import React, { useState, useEffect } from 'react';\nimport { useGet } from '../../../components';\nimport { Item } from '../../items/item';\nimport env from '../../../env';\nimport { ErrorPopup } from '../../../components';\n\nconst log = (...args) => {\n  //console.log(args);\n}\nconst areEqual = (prevProps, nextProps) => {\n  return (prevProps.pageData === nextProps.pageData)\n};\nconst PageMemo = React.memo(Page, areEqual)\n\nexport function CommonProductBottom() {\n  const [pageLoaded, setPageLoaded] = useState(false);\n  const pathname = '/partials/common-product-bottom';\n\n  const get = useGet();\n  useEffect(() => {\n    setPageLoaded(false);\n    get.send(env.apiBase + \"/api/cms/GetPublishedPage?path=\" + pathname);\n    // eslint-disable-next-line\n  }, [pathname]);\n\n  if (get.loading()) {\n    return <div></div>\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  const pageData = get.response.data;\n  const cmsOption = {};\n  if (!pageLoaded && pageData) {\n    setPageLoaded(true);\n    return null;\n  } else if (!pageData) {\n    return (<div></div>)\n  }\n\n  return <PageMemo pageData={pageData} cmsOption={cmsOption} />;\n}\n\n\nfunction Page(props) {\n  const pageData = props.pageData;\n  const cmsOption = props.cmsOption;\n  // document.title = pageData.pageTitle;\n  log('4. page rendering', pageData, cmsOption)\n  const sectionItems = pageData.sections.map((section, index) => {\n    return (\n      <Section item={section} key={section.sectionName + index} cmsOption={cmsOption}></Section>\n    )\n  }\n  );\n  return (\n    <>\n      {sectionItems}\n    </>\n  );\n}\n\nfunction Section(props) {\n  log('5. section rendering')\n  const item = props.item;\n  //const sectionName = item.sectionName;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  if (!subItems || subItems.length === 0)\n    return (<></>);\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n  return (\n    <>\n      {subItemsElts}\n    </>\n  );\n}\n\n","import React from \"react\";\nimport utils from \"../../utils\";\nimport * as yt from \"./iframeApi\";\n\nexport function YoutubeEmbedByLink({ url, title }) {\n  const videoId = yt.getYoutubeCode(url);\n  //const posterImageUrl = yt.thumbnailMax(videoId);\n  const playerVars = {\n    enablejsapi: 1,\n    //'autoplay': 1,\n    controls: 1,\n    loop: 0,\n    showinfo: 0,\n    rel: 0,\n    modestbranding: 1,\n    //'origin': typeof window !== `undefined` && window.location.origin,\n    allowfullscreen: true,\n    wmode: \"transparent\",\n  };\n\n  return (\n    <div className=\"youtubeEmbedByLink\">\n      <iframe\n        className=\"youtubeEmbed__iframe\"\n        width=\"640\"\n        height=\"585\"\n        title={title || \"Youtube video\"}\n        allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n        src={`https://www.youtube.com/embed/${videoId}?${utils.url.toQueryString(\n          playerVars\n        )}`}\n        frameBorder=\"0\"\n        allowFullScreen\n        style={{\n          background: \"#FFF\",\n          border: 0,\n          borderRadius: \"3px\",\n          boxShadow: \"0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15)\",\n          margin: \"1px\",\n          maxWidth: \"540px\",\n          minWidth: \"326px\",\n          padding: \"0\",\n          width: \"99.375%\",\n          // eslint-disable-next-line\n          width: \"-webkit-calc(100% - 2px)\",\n          // eslint-disable-next-line\n          width: \"calc(100% - 2px)\",\n        }}\n      ></iframe>\n    </div>\n  );\n}\n","import utils from '../../utils';\n\nexport function loadApi(onApiReady) {\n  if (typeof window !== `undefined` && !window.YT) { // If not, load the script asynchronously\n    const tag = document.createElement('script');\n    tag.src = 'https://www.youtube.com/iframe_api';\n\n    // onYouTubeIframeAPIReady will load the video after the script is loaded\n    window.onYouTubeIframeAPIReady = () => onApiReady(true);\n\n    const firstScriptTag = document.getElementsByTagName('script')[0];\n    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n  } else { // If script is already there, load the video directly\n    onApiReady(false);\n  }\n}\n\n// export function player(playerId, videoId, playerVars = {}, events = {}) {\n//   //let player = null;\n//   const defaultPlayerVars = {\n//     'autoplay': 1,\n//     'controls': 0,\n//     'loop': 1,\n//     'showinfo': 0,\n//     'rel': 0,\n//     'modestbranding': 1,\n//     'origin': window.location.origin,\n//     'allowfullscreen': true,\n//     'wmode': 'transparent'\n//   }\n//   const defaultEvents = {\n//     'onStateChange': (e) => { },\n//     'onReady': (e) => { console.log('onReady'); player.mute() },\n//     'onError': (e) => { console.log(e) }\n//   }\n\n//   const player = new window.YT.Player(playerId, {\n//     videoId: videoId,\n//     playerVars: Object.assign({}, defaultPlayerVars, playerVars),\n//     events: Object.assign({}, defaultEvents, events),\n//   });\n//   return player;\n// }\n\nexport function thumbnailMax(videoId){\n  return `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`\n}\n\n// onPlayerStateChange(event){\n//   switch (event.data){\n//     case window['YT'].PlayerState.PLAYING:\n//       //console.log('Playing');\n//       //this.player.mute();\n//       break;\n//     case window['YT'].PlayerState.PAUSED:\n//       //console.log('Pafdsu');\n//       break;\n//     case window['YT'].PlayerState.ENDED:\n//       //console.log('ended ');\n//       //this.player.playVideo();\n//       this.player.stopVideo();\n//       break;\n//   }\n// }\n\n// toggleBannerYoutueInCMS(toggleItem:string){ \n//   if(toggleItem == 'youtube'){\n//     //location.reload();\n//     this.toggleBannerOrYoutube = toggleItem;\n//     this.player.playVideo();\n//     this.init();\n//   }\n//   else{\n//     this.toggleBannerOrYoutube = toggleItem;\n//     this.player.stopVideo();\n//   }\n// }\n\n\nexport function getYoutubeCode(src) {\n  // if (src.indexOf('http') >= 0) {\n  //   if (src.indexOf('v=') >= 0) {\n  //     return src.split('v=')[1];\n  //   }\n  // }\n  // return src;\n  return utils.url.getYoutubeId(src);\n}","/** @jsx jsx */\nimport { jsx } from \"@emotion/core\";\nimport { useState, useEffect, Fragment } from \"react\";\nimport { Loading } from \"../../components\";\nimport { createPortal } from \"react-dom\";\nimport { MdClose } from \"react-icons/md\";\n\nfunction Portal({ children }) {\n  const [el] = useState(document.createElement(\"div\"));\n  useEffect(() => {\n    let mount = document.getElementById(\"portal-root\");\n    mount.appendChild(el);\n    return () => mount.removeChild(el);\n  }, [el]);\n  return createPortal(children, el);\n}\n\nexport function TiktokEmbedByLink({ className, url }) {\n  const [code, setCode] = useState();\n  const [openPopup, setOpenPopup] = useState(false);\n\n  const s = getStyle();\n\n  useEffect(() => {\n    const abortController = new AbortController();\n    const signal = abortController.signal;\n\n    fetch(`https://www.tiktok.com/oembed?url=${url}`, { signal: signal })\n      .then((res) => res.json())\n      .then((res) => {\n        setCode(res);\n      })\n      .catch((error) => {\n        setCode({ error: \"Load error\" });\n      });\n\n    return function cleanup() {\n      abortController.abort();\n    };\n\n    // eslint-disable-next-line\n  }, []);\n\n  function close() {\n    setOpenPopup(false);\n    document.body.style.overflow = \"unset\";\n  }\n\n  function open() {\n    setOpenPopup(true);\n    document.body.style.overflow = \"hidden\";\n  }\n\n  if (!code) {\n    return (\n      <div className={className}>\n        <Loading />\n      </div>\n    );\n  }\n  \n  return (\n    <Fragment>\n      {openPopup && (\n        <Portal>\n          <div css={s.portal__background} className=\"portal__background\">\n            <div\n              className=\"portal__close__btn\"\n              css={s.portal__close__btn}\n              onClick={close}\n            >\n              <MdClose />\n            </div>\n          </div>\n\n          <div css={s.portal__contents} className=\"portal__contents\">\n            <TiktokItem styleItem={s} html={code.html} />\n          </div>\n        </Portal>\n      )}\n\n      {code.error ? (\n        <div className={className} css={s.titok__embed__container__error}>\n          <div\n            className=\"titok__embed__watch__icon__text\"\n            css={s.titok__embed__watch__icon__text__error}\n          >\n            Load Error\n            <div style={{ padding: \"1rem\", textAlign: \"left\" }}>{url}</div>\n          </div>\n        </div>\n      ) : (\n        <div\n          className={className}\n          css={s.titok__embed__container}\n          onClick={open}\n        >\n          <img src={code.thumbnail_url} width=\"100%\" alt={code.title} />\n          <div\n            className=\"titok__embed__watch__icon\"\n            css={s.titok__embed__watch__icon}\n          >\n            <div>\n              <img src=\"/assets/watch.png\" alt=\"watch icon\" />\n            </div>\n            <div\n              className=\"titok__embed__watch__icon__text\"\n              css={s.titok__embed__watch__icon__text}\n            >\n              Watch on Tiktok\n            </div>\n          </div>\n        </div>\n      )}\n    </Fragment>\n    // <div className={className} dangerouslySetInnerHTML={{ __html: template }}></div>\n  );\n}\n\nfunction TiktokItem({ styleItem, html }) {\n    \n    const template = html;\n    const [show, setShow] = useState(false);\n\n  useEffect(() => {\n    const existingScript = document.getElementById(\"tiktokEmbedScript\");\n    if (existingScript) {\n      document.body.removeChild(existingScript);\n    }\n\n    const script = document.createElement(\"script\");\n    script.type = `text/javascript`;\n    script.id = \"tiktokEmbedScript\";\n    script.async = true;\n    script.src = \"https://www.tiktok.com/embed.js\";\n\n    document.body.appendChild(script);\n\n    let vvv = null;\n    const abc = setInterval(() => {\n      console.log(\"check inverval tiktokEmbedScript\");\n      if (document.getElementById(\"tiktokEmbedScript\")) {\n        vvv = setTimeout(() => {\n          setShow(true);\n        }, 2000);\n        clearInterval(abc);\n      }\n    }, 100);\n\n    return function cleanup() {\n      document.body.removeChild(script);\n      clearInterval(abc);\n      if (vvv) {\n        clearTimeout(vvv);\n      }\n    };\n\n    // eslint-disable-next-line\n  }, []);\n\n  return (\n    <Fragment>\n      {!show && <Loading />}\n      <div\n        css={styleItem.tiktok__item__show}\n        className={`${show && \"show\"}`}\n        style={{ padding: \"1rem\" }}\n        dangerouslySetInnerHTML={{ __html: template }}\n      ></div>\n    </Fragment>\n  );\n}\n\nfunction getStyle() {\n  const style = {\n    titok__embed__container: {\n      maxWidth: \"324px\",\n      position: \"relative\",\n      cursor: \"pointer\",\n      \"&:after\": {\n        content: '\"\"',\n        width: \"100%\",\n        height: \"100%\",\n        top: \"0\",\n        left: \"0\",\n        //zIndex: 2,\n        backgroundColor: \"rgba(0,0,0,0.5)\",\n        position: \"absolute\",\n      },\n    },\n\n    titok__embed__container__error: {\n      width: \"324px\",\n      position: \"relative\",\n      cursor: \"pointer\",\n      height: \"300px\",\n      backgroundColor: \"grey\",\n      display: \"flex\",\n      justifyContent: \"center\",\n      alignItems: \"center\",\n    },\n\n    titok__embed__watch__icon: {\n      position: \"absolute\",\n      top: \"50%\",\n      left: \"50%\",\n      transform: \"translate(-50%, -50%)\",\n      zIndex: 2,\n    },\n    titok__embed__watch__icon__text: {\n      fontSize: \"14px\",\n      marginTop: \"-1.5rem\",\n      fontWeight: 500,\n      textAlign: \"center\",\n      color: \"white\",\n    },\n\n    titok__embed__watch__icon__text__error: {\n      fontSize: \"14px\",\n      fontWeight: 500,\n      textAlign: \"center\",\n      color: \"white\",\n    },\n\n    portal__background: {\n      backgroundColor: \"rgba(0,0,0,0.8)\",\n      position: \"fixed\",\n      top: \"0px\",\n      left: \"0px\",\n      width: \"100%\",\n      height: \"100%\",\n      zIndex: \"9998\",\n    },\n\n    portal__close__btn: {\n      position: \"fixed\",\n      zIndex: \"9999\",\n      right: 0,\n      top: 0,\n      margin: \"1rem\",\n      cursor: \"pointer\",\n      svg: {\n        width: \"30px\",\n        height: \"30px\",\n        color: \"white\",\n      },\n    },\n\n    portal__contents: {\n      position: \"fixed\",\n      left: \"50%\",\n      top: \"50%\",\n      transform: \"translate(-50%, -50%)\",\n      zIndex: 9999,\n      //width: \"100%\",\n    },\n\n    tiktok__item__show: {\n      maxHeight: \"0px\",\n      overflow: \"hidden\",\n      \"&.show\": {\n        maxHeight: \"1000px\",\n        backgroundColor: \"white\",\n      },\n    },\n  };\n  return style;\n}\n","/** @jsx jsx */\nimport { jsx } from \"@emotion/core\";\nimport style from \"./productViewStyle\";\nimport React, { Fragment } from \"react\";\n//import { Redirect } from \"react-router-dom\";\nimport env from \"../../env\";\nimport { SiteLink, NotFound } from \"../../components\";\nimport { useGet } from \"../../components\";\nimport { useRouter } from \"../../components\";\nimport utils from \"../../utils\";\nimport { ErrorPopup, Loading } from \"../../components\";\nimport { Breadcrumb } from \"../../components/breadcrumb/breadcrumb\";\nimport { ViewPartial } from \"../../cms/pages/partials/viewPartial\";\nimport { CommonProductBottom } from \"../../cms/pages/partials/commonProductBottom\";\nimport { Tile } from \"./productTile\";\nimport { YoutubeEmbed } from \"../../components\";\nimport { useInstagram } from \"../../components\";\nimport { useBV } from \"../bazzarVoice/useBV\";\n//import { ImagePopup } from 'modules/imagePopup/imagePopup';\n// import InstagramEmbed from \"react-instagram-embed\";\nimport Slider from \"react-slick\";\nimport FsLightbox from \"fslightbox-react\";\nimport { MetaTag } from \"../../components\";\nimport { FaRegFilePdf } from \"react-icons/fa\";\nimport { IoMdOpen } from \"react-icons/io\";\n\nimport { debounce } from \"../../lib/utils-core/debounce\";\nimport { gtm } from \"../../lib/tracking\";\nimport { InstaEmbedByLink } from \"../embed/instagram\";\nimport { YoutubeEmbedByLink } from \"../embed/youtube\";\nimport { TiktokEmbedByLink } from \"../embed/tiktok\";\n\nexport function ProductView(props) {\n  const { query } = useRouter();\n  const [loaded, setLoaded] = React.useState(false);\n  const get = useGet();\n\n  useInstagram();\n\n  const productCode = query.id || \"\";\n  const category = query.category || \"\";\n  //const subcCtegory = query.subCategory || \"\";\n  const slug = query.slug || \"\";\n\n  React.useEffect(() => {\n    let url = productCode\n      ? `/api/product/getProduct/${productCode}`\n      : `/api/product/getProductByUrl?category=${category}&slug=${slug}`;\n    // if(subcCtegory && subcCtegory !== ''){\n    //   const newMainCategory = path.split(\"/\")[1];\n    //   url = `/api/product/getproductbyurlwithsubcategory?category=${newMainCategory}&subcategory=${subcCtegory}&slug=${slug}`;\n    // }\n    if (category === \"\") {\n      url = `/api/product/getproductbyUrlbyslug?slug=${slug}`;\n    }\n\n    get.send(env.apiBase + url);\n    setLoaded(false);\n\n    // eslint-disable-next-line\n  }, [productCode, slug]);\n\n  if (get.loading()) {\n    return <Loading />;\n  } else if (get.hasErrors() && get.containsErrorMessage(\"no product\")) {\n    return <NotFound />;\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title='Loading Error' errors={get.errors} />;\n  }\n\n  //console.log(get)\n  const data = get.response;\n\n  if (get.done() && !loaded) {\n    setLoaded(true);\n    const pageUrl = productCode\n      ? `/product/${productCode}`\n      : `/products/${category}/${slug}`;\n    const pageTitle =\n      data.totalCnt === 0 ? \"No product found\" : data.productName;\n    gtm.pageView(pageUrl, pageTitle);\n\n    if (data.totalCnt !== 0) {\n      gtm.sendEvent(\"productpageview\", {\n        pageUrl: pageUrl,\n        productName: data.productName,\n        productSku: data.productCode,\n      });\n    }\n  }\n\n  if (data.totalCnt === 0) return <div>No product found.</div>;\n\n  // const topBanner =\n  //   !utils.site.isNZ && data.canstar\n  //     ? \"/sites/vssassoon/media/canstar/product-generic-banner-canstar.jpg\"\n  //     : \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\";\n\n  //const topBanner = !utils.site.isNZ && data.canstar ? \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\" : \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\";\n\n  let topBanner =\n    \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\";\n  if (data.category && data.category.toLowerCase().includes(\"dryers\")) {\n    topBanner = utils.site.isNZ\n      ? \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\"\n      : \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\";\n  } else {\n    if (!utils.site.isNZ && data.canstar) {\n      topBanner =\n        \"/sites/vssassoon/media/canstar/product-generic-banner-canstar.jpg\";\n    }\n  }\n\n  return (\n    <React.Fragment>\n      <div\n        className='single-banner banner-item bannerSize--thin'\n        style={{\n          backgroundImage: utils.css.bgUrlStyle(\n            utils.site.resourcePath(topBanner)\n          ),\n        }}\n      ></div>\n      <Product product={data} />\n\n      <CommonProductBottom />\n      <ViewPartial />\n    </React.Fragment>\n  );\n}\n\nfunction Product({ product }) {\n  // const history = useHistoryStore();\n  const mainPhoto =\n    product.productImages.length > 0\n      ? product.productImages[0]\n      : { imageUrl: \"/assets/product-empty.png\", alt: product.productName };\n  const allPhotos = product.productImages || [];\n  //const otherPhotos = product.productImages.length > 0 ? product.productImages.filter(x => !x.isPackage) : [];\n  const packagePhotos =\n    product.productImages.length > 0\n      ? product.productImages.filter((x) => x.isPackage)\n      : [];\n\n  const popupImages = allPhotos.map((x) => x.imageUrl);\n  const showReviews = window.location.hash === \"#reviewnow\";\n  const showHowTo = window.location.hash === \"#styletips\";\n  const showFaqs = window.location.hash === \"#faqs\"\n  const [isMobile, setIsMobile] = React.useState(utils.site.isMobile());\n  const [currentTab, setCurrentTab] = React.useState(() => {\n    if (showReviews) {\n      return \"reviews\";\n    } else if (showHowTo) {\n      return \"howto\";\n    } else if (showFaqs) {\n      return \"faqs\"\n    } else if (isMobile) {\n      return \"wheretobuy\";\n    } \n    return \"wheretobuy\";\n  });\n  //const [currentTab, setCurrentTab] = React.useState(isMobile ? \"\" : \"howto\");\n  const [heroImage, setHeroImage] = React.useState(mainPhoto);\n\n  const [toggler, setToggler] = React.useState(false);\n  //const [popupImages, setPopupImages] = React.useState();\n  const [popupIndex, setPopupIndex] = React.useState(0);\n  const [checkStart, setCheckStart] = React.useState(0);\n  const country = utils.site.isNZ ? \"New Zealand\" : \"Australia\";\n  const schemaImages = product.productImages.map(\n    (x) =>\n      (country === \"New Zealand\"\n        ? \"https://www.vssassoon.co.nz\"\n        : \"https://www.vssassoon.com.au\") + x.imageUrl\n  );\n\n  React.useEffect(() => {\n    const resized = debounce(() => {\n      setIsMobile(utils.site.isMobile());\n    }, 1000);\n    if (typeof window !== `undefined`) {\n      window.addEventListener(\"resize\", resized);\n    }\n\n    utils.site.callMCPoopu();\n    setCheckStart(checkStart + 1);\n\n    const settingSchemaInterval = setInterval(() => {\n      // console.log(\"check__settingSchemaInterval\");\n\n      const bvRatingSchema = document.getElementById(\n        \"bv-jsonld-bvloader-summary\"\n      );\n\n      if (bvRatingSchema) {\n        const bvRatingSchemaData = JSON.parse(bvRatingSchema.innerHTML);\n        const productStructuredData = {\n          \"@context\": \"https://schema.org/\",\n          \"@type\": \"Product\",\n          name: product.productName,\n          url:\n            (country === \"New Zealand\"\n              ? \"https://www.vssassoon.co.nz\"\n              : \"https://www.vssassoon.com.au\") + product.productUrl,\n          description: product.intro,\n          sku: product.productCode,\n          brand: {\n            \"@type\": \"Brand\",\n            name: \"VS Sassoon\",\n          },\n          gtin13:\n            product.barcode && product.barcode !== \"\" ? product.barcode : \"\",\n          category: product.category,\n          image: schemaImages,\n          aggregateRating: bvRatingSchemaData.aggregateRating,\n          offers: {\n            \"@type\": \"Offer\",\n            priceCurrency: country === \"New Zealand\" ? \"NZD\" : \"AUD\",\n            price: product.price + \"\",\n            availability: \"https://schema.org/InStock\",\n          },\n        };\n\n        const productSchemaScript = document.createElement(\"script\");\n        productSchemaScript.id = \"productSchemaScript\";\n        productSchemaScript.type = \"application/ld+json\";\n        productSchemaScript.innerHTML = JSON.stringify(productStructuredData);\n\n        document.head.removeChild(bvRatingSchema);\n        document.body.appendChild(productSchemaScript);\n        clearInterval(settingSchemaInterval);\n      }\n    }, 100);\n\n    const checkBvReviewSchemaSI = setInterval(() => {\n      // console.log(\"check__checkBvReviewSchemaSI\");\n      const bvReviewSchemaScript = document.getElementById(\n        \"bv-jsonld-reviews-data\"\n      );\n      if (bvReviewSchemaScript) {\n        document.head.removeChild(bvReviewSchemaScript);\n        clearInterval(checkBvReviewSchemaSI);\n      }\n    }, 100);\n\n    return () => {\n      if (typeof window !== `undefined`) {\n        window.removeEventListener(\"resize\", resized);\n      }\n      clearInterval(settingSchemaInterval);\n      clearInterval(checkBvReviewSchemaSI);\n    };\n\n    // eslint-disable-next-line\n  }, []);\n\n  React.useLayoutEffect(() => {\n    setTimeout(() => {\n      bv.sendEvent(\n        \"WhereToBuy\",\n        \"WhereToBuyTab_ProductPage\",\n        product.productCode\n      );\n\n      // const _rating = document.querySelector('div.bv_avgRating_component_container.notranslate');\n      // const _ratingCount = document.querySelector('div.bv_numReviews_component_container meta');\n      // if (_rating && _ratingCount) {\n      //   setRating({ rating: _rating.innerText, count: _ratingCount.getAttribute('content') });\n      // }\n    }, 1500);\n\n    // setTimeout(() => {\n    //   const _rating = document.querySelector('div.bv_avgRating_component_container.notranslate');\n    //   const _ratingCount = document.querySelector('div.bv_numReviews_component_container meta');\n    //   if (_rating && _ratingCount) {\n    //     setRating({ rating: _rating.innerText, count: _ratingCount.getAttribute('content') });\n    //   }\n    // }, 500);\n\n    // eslint-disable-next-line\n  }, []);\n\n  React.useEffect(() => {\n    if (checkStart === 0) {\n      return;\n    }\n\n    if (window.instgrm) {\n      window.instgrm.Embeds.process();\n    }\n\n    // eslint-disable-next-line\n  }, [isMobile]);\n\n  // BV\n  const onShowReview = React.useCallback((e) => {\n    //e.stopPropagation();\n    showTab(\"reviews\", true);\n    // eslint-disable-next-line\n  }, []);\n\n  const bv = useBV(product, {\n    showReview: onShowReview,\n  });\n\n  function openPopupImage(imageUrl) {\n    const inx = utils.array.findIndex(popupImages, (x) => x === imageUrl);\n    setPopupIndex(inx >= 0 ? inx : 0);\n    setToggler(!toggler);\n  }\n\n  function showTab(tab, forceToScroll = false) {\n    if (tab === currentTab && isMobile) {\n      setCurrentTab(\"\");\n      return;\n    }\n    if (tab === \"wheretobuy\") {\n      bv.sendEvent(\n        \"WhereToBuy\",\n        \"WhereToBuyTab_ProductPage\",\n        product.productCode\n      );\n    }\n\n    if (tab !== currentTab) {\n      gtm.sendGAEvent(\"Product Tab\", \"Select\", tab);\n    }\n    setCurrentTab(tab);\n    scrollTo(\"tab-\" + tab, forceToScroll);\n  }\n\n  function scrollTo(selector, forceToScroll = false) {\n    if (!forceToScroll && !isMobile) return;\n    setTimeout(() => {\n      const anchor = utils.ui.findElement(selector);\n      if (anchor) utils.ui.scrollTo(anchor, 300);\n    }, 200);\n  }\n\n  React.useEffect(() => {\n    if (showReviews) {\n      scrollTo(\"reviews\", true);\n    }\n    if (showHowTo) {\n      scrollTo(\"howto\", true);\n    }\n    if (showFaqs) {\n      scrollTo(\"faqs\", true);\n    }\n    // eslint-disable-next-line\n  }, []);\n\n  const slides = allPhotos.map((photo, index) => (\n    <div\n      key={index}\n      className={`productView__image ${\n        heroImage.imageUrl === photo.imageUrl ? \"current\" : \"\"\n      }`}\n    >\n      <div\n        className={`productView__imageBg`}\n        style={{\n          backgroundImage: utils.css.bgUrlStyle(\n            utils.site.resourcePath(photo.imageUrl)\n          ),\n        }}\n        onClick={() => setHeroImage(photo)}\n      ></div>\n      {/* <img src={utils.site.resourcePath(photo.imageUrl)} alt={photo.alt} onClick={() => setHeroImage(photo)} /> */}\n    </div>\n  ));\n\n  var settings = {\n    dots: false,\n    lazyLoad: true,\n    infinite: slides.length > 2 ? true : false,\n    speed: 500,\n    autoplaySpeed: 3000,\n    initialSlide: 1,\n    //fade: true,\n    autoplay: false,\n    slidesToShow: 3,\n    slidesToScroll: 1,\n    responsive: [\n      {\n        breakpoint: 1024,\n        settings: {\n          slidesToShow: 2,\n          slidesToScroll: 1,\n        },\n      },\n    ],\n  };\n\n  const tabs = [\n    {\n      id: \"wheretobuy\",\n      title: \"Where to buy\",\n      tabView: WhereToBuyTab,\n      visible:\n        (product.whereToBuySection || []).length > 0 ||\n        (product.whereToBuys || []).length > 0,\n    },\n    { id: \"reviews\", title: \"Reviews\", tabView: BVReviewTab, visible: true },\n    { id: \"details\", title: \"Details\", tabView: DetailsTab, visible: true },\n    { id: \"howto\", title: \"Style Tips\", tabView: HowtoTab, visible: true },\n    {\n      id: \"seemore\",\n      title: \"Inspiration\",\n      tabView: SeeMoreTab,\n      visible: (product.seeMoreSection || []).length > 0,\n    },\n    {\n      id: \"faqs\",\n      title: \"FAQs\",\n      tabView: FaqTab,\n      visible: (product.faqSection || []).length > 0,\n    },\n  ];\n\n  const visibleTabs = tabs.filter((tab) => tab.visible);\n  const tabPanels = isMobile ? (\n    <div className='productView_tabPanels--mobile'>\n      {visibleTabs.map((tab) => (\n        <div key={tab.id} className='productView_section'>\n          <div\n            id={tab.id}\n            className={`tab ${(currentTab === tab.id && \"selected\") || \"\"}`}\n            onClick={(e) => showTab(tab.id)}\n          >\n            {tab.title}\n          </div>\n          <div\n            className={`tabContent ${\n              (currentTab === tab.id && \"selected\") || \"\"\n            }`}\n          >\n            <tab.tabView product={product} />\n          </div>\n        </div>\n      ))}\n    </div>\n  ) : (\n    <div className='productView_tabPanels--desktop'>\n      <div className='productView__tabs'>\n        {visibleTabs.map((tab) => (\n          <div\n            key={tab.id}\n            id={tab.id}\n            className={`tab ${(currentTab === tab.id && \"selected\") || \"\"}`}\n            onClick={(e) => showTab(tab.id)}\n          >\n            {tab.title}\n          </div>\n        ))}\n      </div>\n\n      <div className='productView__tabContents'>\n        {visibleTabs.map((tab) => (\n          <div\n            key={tab.id}\n            className={`tabContent ${\n              (currentTab === tab.id && \"selected\") || \"\"\n            }`}\n          >\n            <tab.tabView product={product} />\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n\n  const _discoverMoreLinks = product.discoverMoreSection.map((x) =>\n    JSON.parse(x.itemValue)\n  );\n\n  const auNz = country === \"New Zealand\" ? \"NZ\" : \"AU\";\n  const discoverMoreLinks = _discoverMoreLinks.filter((item) => {\n    if (\n      item.auNzCheck &&\n      item.auNzCheck.length > 0 &&\n      item.auNzCheck.includes(auNz)\n    ) {\n      return true;\n    }\n\n    return false;\n  });\n\n  const barcodeCleaned = product.barcode\n    ? product.barcode.replace(/-/g, \"\").replace(/ /g, \"\")\n    : null;\n\n  //console.log(\"dddsfsdfsdfsdfsd\", discoverMoreLinks); /// auNzCheck\n\n  return (\n    <div className='contentPanel productViewPanel'>\n      <FsLightbox\n        toggler={toggler}\n        sources={popupImages}\n        sourceIndex={popupIndex}\n      />\n      <MetaTag data={getMetaTag(product, mainPhoto)} />\n      {/* <SchemaTagView product={product} country={country} schemaImages={schemaImages} rating={rating} /> */}\n      <div className='contentPanel__bg'></div>\n      <div className='container'>\n        <Breadcrumb breadcrumb={product.breadcrumb} />\n        <div className='productView'>\n          <div itemScope={true} itemType='http://schema.org/Product'>\n            <meta itemProp='name' content={product.productName} />\n            <div itemProp='brand' itemType='http://schema.org/Brand' itemScope>\n              <meta itemProp='name' content={env.siteName} />\n            </div>\n\n            {product.intro && (\n              <meta itemProp='description' content={product.intro} />\n            )}\n            {barcodeCleaned && <meta itemProp='sku' content={barcodeCleaned} />}\n            {barcodeCleaned && (\n              <meta itemProp='gtin13' content={barcodeCleaned} />\n            )}\n            {heroImage && heroImage.imageUrl && (\n              <link\n                itemProp='image'\n                href={utils.site.fullUrl(heroImage.imageUrl)}\n              />\n            )}\n\n            <div itemProp='offers' itemType='http://schema.org/Offer' itemScope>\n              <link\n                itemProp='url'\n                href={utils.site.resourcePath(product.productUrl)}\n              />\n              {product.price && (\n                <meta itemProp='price' content={product.price} />\n              )}\n              <meta\n                itemProp='priceCurrency'\n                content={utils.site.isNZ ? \"NZD\" : \"AUD\"}\n              />\n            </div>\n\n            <div className='row'>\n              <div className='col-md-6'>\n                {/* <ImagePopup\n              src={utils.site.resourcePath(heroImage.imageUrl)}\n              thumbnailSrc={utils.site.resourcePath(heroImage.imageUrl)}\n              alt={heroImage.alt} title={heroImage.alt} /> */}\n                <img\n                  className='productView__hero'\n                  src={utils.site.resourcePath(heroImage.imageUrl)}\n                  alt={heroImage.alt || product.productName}\n                  onClick={() => openPopupImage(heroImage.imageUrl)}\n                />\n                {allPhotos.length > 1 && (\n                  <div className='productView__images'>\n                    <Slider {...settings}>{slides}</Slider>\n                  </div>\n                )}\n              </div>\n              <div className='col-md-6 right'>\n                {product.productName.indexOf(\"i-\") === 0 ? (\n                  <h1 className='productView__title'>\n                    <strong>\n                      {product.productName.toUpperCase().replace(\"I-\", \"i-\")}\n                    </strong>\n                  </h1>\n                ) : (\n                  <h1\n                    className='productView__title'\n                    style={{ textTransform: \"uppercase\" }}\n                  >\n                    <strong>{product.productName}</strong>\n                  </h1>\n                )}\n                <div className='productView__price'>\n                  {product.priceText ? product.priceText : \"\"}\n                </div>\n                <div className='productView__productCode'>\n                  Product code: <b>{product.productCode}</b>\n                </div>\n                <div className='productView__bzSummary'>\n                  <div\n                    data-bv-show='rating_summary'\n                    data-bv-product-id={product.productCode}\n                  ></div>\n                </div>\n                {product.productStatus === 98 /*Discontinued*/ && (\n                  <div className='productView__discontinued'>\n                    This product is now discontinued.\n                  </div>\n                )}\n                <div className='productView__intro'>{product.intro}</div>\n                {discoverMoreLinks && discoverMoreLinks.length > 0 && (\n                  <div className='productView__discoverMores'>\n                    {discoverMoreLinks.map((link, index) => (\n                      <div key={index} style={{ marginBottom: \"0.8rem\" }}>\n                        <SiteLink\n                          className='productView__skewButton'\n                          to={\n                            utils.site.isNZ &&\n                            (product.productCode === \"VSC1600A\" ||\n                              product.productCode === \"VSP1300A\") &&\n                            link.title === \"MEET OUR NEW CURL SECRET®\"\n                              ? \"/curl-secret\"\n                              : link.url\n                          }\n                        >\n                          <span>\n                            {utils.site.isNZ &&\n                            (product.productCode === \"VSC1600A\" ||\n                              product.productCode === \"VSP1300A\") &&\n                            link.title === \"MEET OUR NEW CURL SECRET®\"\n                              ? \"DISCOVER MORE\"\n                              : link.title}\n                          </span>\n                        </SiteLink>\n                      </div>\n                    ))}\n                  </div>\n                )}\n\n                <div className='productView__packages'>\n                  {/* {\n                    product.productCode === 'VSD6395A' &&\n                    <div className=\"productView__package__s_container\">\n                      <div className=\"productView__package__special\">\n                        <a href=\"https://www.finder.com.au/hair-dryers#hair-dryer-4\" target=\"_blank\" rel=\"noopener noreferrer\">\n                          <img\n                            src=\"/assets/Recommended-Badge-1.png\"\n                            alt=\"Recommended-Badge\"\n                          />\n                        </a>\n                      </div>\n                    </div>\n                  } */}\n\n                  {/* {\n                    product.productCode === 'VSD6730A' &&\n                    <div className=\"productView__package__s_container\">\n                      <div className=\"productView__package__special\">\n                        <a href=\"https://www.finder.com.au/hair-dryers#hair-dryer-8\" target=\"_blank\" rel=\"noopener noreferrer\">\n                          <img\n                            src=\"/assets/Recommended-Badge-1.png\"\n                            alt=\"Recommended-Badge\"\n                          />\n                        </a>\n                      </div>\n                    </div>\n                  } */}\n\n                  {product.productCode === \"VSLE2540A\" && (\n                    <div className='productView__package__s_container'>\n                      <div className='productView__package__special'>\n                        <a\n                          href='https://www.finder.com.au/hair-straighteners#hair-straighteners-2'\n                          target='_blank'\n                          rel='noopener noreferrer'\n                        >\n                          <img\n                            src='/assets/Recommended-Badge-1.png'\n                            alt='Recommended-Badge'\n                          />\n                        </a>\n                      </div>\n                    </div>\n                  )}\n\n                  {packagePhotos.map((photo, index) => (\n                    <div key={index} className='productView__package'>\n                      <img\n                        src={utils.site.resourcePath(photo.imageUrl)}\n                        alt={photo.alt || product.productName + \" Packages\"}\n                        onClick={() => openPopupImage(photo.imageUrl)}\n                      />\n                    </div>\n                  ))}\n                  {!utils.site.isNZ && product.canstar && (\n                    <div className='productView__package productView__canstar'>\n                      {/* <a href='https://www.canstarblue.com.au/health-beauty/hair-dryers/' target='_blank' rel='noopener noreferrer'>\n                        <img src='/assets/icons/cns-mas-hair-dryers-2021-300.png' alt='Canstar' />\n                      </a> */}\n                      <SiteLink to='/blog/the-best-5-hair-dryers-in-2023'>\n                        {/* <img src=\"/assets/icons/cns-mas-hair-dryers-2021-300.png\" alt=\"Canstar\" /> */}\n                        <img\n                          src='/assets/icons/product-canstar-double-icon.png'\n                          alt='canstart'\n                        />\n                      </SiteLink>\n                    </div>\n                  )}\n                </div>\n              </div>\n            </div>\n\n            {tabPanels}\n\n            <RelatedProducts products={product.relatedProducts} />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction getMetaTag(product, mainPhoto) {\n  const country = utils.site.isNZ ? \"New Zealand\" : \"Australia\";\n  const siteName = env.siteName + \" \" + country;\n\n  return {\n    title: product.productName + \" | \" + siteName,\n    description: product.metaDesc || product.intro,\n    keywords: \"\",\n    heroImageUrl: utils.site.fullUrl(mainPhoto.imageUrl),\n    language: \"English\",\n    country: country,\n    siteName: siteName,\n    url: utils.site.fullUrl(product.productUrl),\n    alternates: utils.site.getAlternates(product.productUrl),\n\n    //facebook-domain-verification\n    faceBookDomainVerifi:\n      country === \"New Zealand\"\n        ? env.FaceBookDomainVerifiNZ\n        : env.FaceBookDomainVerifiAU,\n    //canonical: utils.site.resourcePath(pageData.pageUrl)\n  };\n}\n\nfunction BVReviewTab({ product }) {\n  return (\n    <div data-bv-show='reviews' data-bv-product-id={product.productCode}></div>\n  );\n}\n\nfunction WhereToBuyTab({ product }) {\n  const section = product.whereToBuySection || [];\n  return (\n    <div>\n      {section.length > 0 && <ItemList product={product} section={section} />}\n      {product.whereToBuys && product.whereToBuys.length > 0 && (\n        <Stores stores={product.whereToBuys} />\n      )}\n    </div>\n  );\n}\n\nfunction RelatedProducts({ products }) {\n  const filteredAndSortedProducts = products.filter(\n    (product) => product.productStatus === 0\n  );\n  if (filteredAndSortedProducts.length === 0) return null;\n  return (\n    <div className='productView__relatedProducts'>\n      <h3>RELATED PRODUCTS</h3>\n      <div className='productList'>\n        {filteredAndSortedProducts.map((product, index) => (\n          <Tile product={product} key={product.productCode}></Tile>\n        ))}\n      </div>\n    </div>\n  );\n}\n\nfunction Stores({ stores }) {\n  return (\n    <ul className='stores'>\n      {stores.map((store) => (\n        <li key={store.storeCode} className='store'>\n          <figure>\n          {store.storeUrl && store.storeUrl !== '' && store.buyOnline ? (\n            <a\n              href={store.storeUrl}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              <img\n                src={`/assets/shops/${store.iconPath}`}\n                alt={store.storeName}\n              />\n              <figcaption>Buy Online</figcaption>\n              {/* <figcaption>{store.storeName}</figcaption> */}\n            </a>\n          ) : (\n            <Fragment>\n              <img\n                src={`/assets/shops/${store.iconPath}`}\n                alt={store.storeName}\n              />\n              <figcaption>{store.storeName}</figcaption>\n            </Fragment>\n          )}\n            {/*<img\n              src={`/assets/shops/${store.iconPath}`}\n              alt={store.storeName}\n            />\n            <figcaption>{store.storeName}</figcaption>\n            {store.buyOnline && (\n              <a\n                href={store.storeUrl}\n                target='_blank'\n                rel='noopener noreferrer'\n              >\n                Buy online <span className='icon'></span>\n              </a>\n            )}*/}\n          </figure>\n        </li>\n      ))}\n    </ul>\n  );\n}\n\nfunction HowtoTab({ product }) {\n  const section = product.howToSection || [];\n  const countryCode = utils.site.isNZ ? \"NZ\" : \"AU\";\n  const _section = section.filter(x => x.itemAuNZCheck && x.itemAuNZCheck.includes(countryCode));\n  return <ItemList product={product} section={_section} />;\n}\n\nfunction FaqTab({ product }) {\n  const section = product.faqSection || [];\n  return <ItemList product={product} section={section} />;\n}\n\nfunction DetailsTab({ product }) {\n  const section = product.detailSection || [];\n  const hasWarranty = section.some(\n    (x) => (x.itemValue || \"\").indexOf(\"WARRANTY\") >= 0\n  );\n\n  const techSpecs =\n    product.specSection && product.specSection.length > 0\n      ? TechSpecs(product.specSection)\n      : null;\n  const hasTech = section.some(\n    (x) => (x.itemValue || \"\").indexOf(\"TECHNICAL SPECIFICATIONS\") >= 0\n  );\n\n  return (\n    <React.Fragment>\n      <ItemList product={product} section={section} />\n      {!hasTech && techSpecs && (\n        <div>\n          <h3>TECHNICAL SPECIFICATIONS</h3>\n          {techSpecs}\n        </div>\n      )}\n      {!hasWarranty && product.warranty && (\n        <Warranty\n          warrantyYear={product.warranty}\n          warrantyDetails={product.warrantyDetails}\n        />\n      )}\n      {product.barcode && (\n        <div>\n          <h3>BARCODE</h3>\n          <p>{product.barcode}</p>\n        </div>\n      )}\n      {product.useSparePartInstruction && <SparePart />}\n      {product.bookletLink && <Booklet bookletLink={product.bookletLink} />}\n    </React.Fragment>\n  );\n}\n\nfunction SparePart() {\n  return (\n    <div>\n      <h3>SPARE PARTS</h3>\n      <p>\n        Love it but lost it? Spare parts are available.{\" \"}\n        <SiteLink to='/contact'>Contact Conair</SiteLink> for more information.\n      </p>\n    </div>\n  );\n}\n\nfunction Warranty({ warrantyYear, warrantyDetails }) {\n  if (warrantyDetails) {\n    return (\n      <div>\n        <h3>WARRANTY</h3>\n        <p>Backed by a {warrantyYear} year warranty*</p>\n        <p>* {warrantyDetails}</p>\n      </div>\n    );\n  } else {\n    return (\n      <div>\n        <h3>WARRANTY</h3>\n        <p>Backed by a {warrantyYear} year warranty</p>\n      </div>\n    );\n  }\n}\n\nfunction Booklet({ bookletLink }) {\n  const bookletTitle = utils.url.getFilename(bookletLink);\n  return (\n    <div>\n      <h3>INSTRUCTION BOOKLET</h3>\n      <a href={bookletLink} target='_blank' rel='noopener noreferrer'>\n        <FaRegFilePdf /> {bookletTitle}\n      </a>\n    </div>\n  );\n}\n\nfunction TechSpecs(items) {\n  const specs = items.map((x) => JSON.parse(x.itemValue));\n  const left = specs.filter((x) => x.category !== \"R\");\n  const right = specs.filter((x) => x.category === \"R\");\n  if (right.length === 0) {\n    // render all - men\n    const splitLefts = [],\n      splitRights = [];\n    left.forEach((x, index) =>\n      index % 2 === 0 ? splitLefts.push(x) : splitRights.push(x)\n    );\n    return (\n      <div className='row' style={{ marginBottom: \"0.5rem\" }}>\n        <div className='col-md-6'>\n          {splitLefts.map((x, index) => (\n            <div key={index}>\n              <b>{x.label}</b>: {x.text}\n            </div>\n          ))}\n        </div>\n        <div className='col-md-6'>\n          {splitRights.map((x, index) => (\n            <div key={index}>\n              <b>{x.label}</b>: {x.text}\n            </div>\n          ))}\n        </div>\n      </div>\n    );\n  } else {\n    // render left/right - women\n    return (\n      <div className='row' style={{ marginBottom: \"0.5rem\" }}>\n        <div className='col-md-6'>\n          {left.map((x, index) => (\n            <div key={index}>\n              <b>{x.label}</b>: {x.text}\n            </div>\n          ))}\n        </div>\n        <div className='col-md-6'>\n          {right.map((x, index) => (\n            <div key={index}>\n              <b>{x.label}</b>: {x.text}\n            </div>\n          ))}\n        </div>\n      </div>\n    );\n  }\n}\n\nfunction SeeMoreTab({ product }) {\n  const section = product.seeMoreSection || [];\n  const countryCode = utils.site.isNZ ? \"NZ\" : \"AU\";\n  const _section = section.filter(x => x.itemAuNZCheck && x.itemAuNZCheck.includes(countryCode));\n  \n  const blogs = [], instagrams = [];\n  const pre = [], post = [], tiktoks = [];\n  const youtubes = [];\n  const empty = [0, 1, 2, 3, 4];\n\n  let hasInstaOrBlog = false;\n  _section.forEach((item) => {\n\n    let processed = false;\n    if (item.itemTypeCode === \"link\") {\n      const link = JSON.parse(item.itemValue);\n      if (link.url && link.url.indexOf(\"instagram.com\") >= 0) {\n        hasInstaOrBlog = true;\n        processed = true;\n        instagrams.push(item);\n      } else if (\n        link.linkType === \"blog\" ||\n        link.linkType === \"page\" ||\n        link.linkType === \"web\"\n      ) {\n        hasInstaOrBlog = true;\n        processed = true;\n        if (link.title !== \"\") {\n          blogs.push(item);\n        }\n      } else if (link.url && link.url.indexOf(\"youtube.com\") >= 0) {\n        hasInstaOrBlog = true;\n        processed = true;\n        youtubes.push(item);\n      } else if (link.linkType === \"tiktok\") {\n        hasInstaOrBlog = true;\n        processed = true;\n        tiktoks.push(item);\n      }\n    }\n\n    if (!processed) {\n      if (hasInstaOrBlog) {\n        post.push(item);\n      } else {\n        pre.push(item);\n      }\n    }\n  });\n\n  //console.log(pre, post)\n  return (\n    <React.Fragment>\n      <div>\n        <ItemList product={product} section={pre} />\n      </div>\n\n      <div className='blogTiles tiles blogTiles--productView'>\n        <ItemList product={product} section={blogs} />\n      </div>\n\n      <div css={style.instagrams}>\n        <ItemList product={product} section={instagrams} />\n        {empty.map((x) => (\n          <Empty key={x} />\n        ))}\n      </div>\n\n      <div css={style.youtubes} className='testsss'>\n        <ItemList product={product} section={youtubes} />\n        {empty.map((x) => (\n          <Empty key={x} />\n        ))}\n      </div>\n\n      <div css={style.tiktoks}>\n        <ItemList product={product} section={tiktoks} />\n        {empty.map((x) => (\n          <Empty key={x} />\n        ))}\n      </div>\n\n      {/* <div>\n        <ItemList product={product} section={post} />\n      </div> */}\n      <div className='blogTiles tiles blogTiles--productView'>\n        <ItemList product={product} section={post} />\n      </div>\n    </React.Fragment>\n  );\n}\n\n// function ReviewTab({ product }) {\n//   return <div>Coming...</div>\n// }\n\nfunction ItemList({ section }) {\n  return (\n    <React.Fragment>\n      {section.map((item, index) => (\n        <ItemView item={item} key={index} />\n      ))}\n    </React.Fragment>\n  );\n}\n\nfunction ItemView({ item }) {\n  //console.log(item, item.itemTypeCode, item.itemTypeCode === 'html')\n\n  if (item.itemTypeCode === \"html\") {\n    return <div dangerouslySetInnerHTML={{ __html: item.itemValue }}></div>;\n  }\n  if (item.itemTypeCode === \"video\") {\n    const video = JSON.parse(item.itemValue);\n\n    if (video.video) {\n      return (\n        <div className='row video'>\n          <div className='col-md-5'>\n            <YoutubeEmbed url={video.video} title={video.title} />\n          </div>\n          <div className='col-md-7'>\n            <h4>{video.title}</h4>\n            <div dangerouslySetInnerHTML={{ __html: video.desc }}></div>\n          </div>\n        </div>\n      );\n    } else {\n      return (\n        <div className='row video'>\n          <div className='col-12'>\n            <h3>{video.title}</h3>\n            <div dangerouslySetInnerHTML={{ __html: video.desc }}></div>\n          </div>\n        </div>\n      );\n    }\n  }\n  if (item.itemTypeCode === \"link\") {\n    let link = JSON.parse(item.itemValue);\n    let title = link.title;\n    if (!link.title) {\n      title = (link.url || \"\").split(\"/\").pop();\n    }\n    // console.log(link, env.instagramUseFirst);\n\n    if (\n      link.linkType === \"instagram\" ||\n      (link.url && link.url.indexOf(\"instagram.com\") >= 0)\n    ) {\n      return (\n        <div className='productView__linkItem productView__linkItem--instagram'>\n          {env.instagramUseFirst === \"embed\" && link.instagramEmbed ? (\n            <div\n              dangerouslySetInnerHTML={{ __html: link.instagramEmbed }}\n            ></div>\n          ) : link.url ? (\n            // <InstagramEmbed\n            //   url={link.url}\n            //   maxWidth={320}\n            //   hideCaption={true}\n            //   clientAccessToken={env.instagramClientAccessToken}\n            // />\n            <InstaEmbedByLink url={link.url} />\n          ) : null}\n        </div>\n      );\n    }\n\n    if (link.url && link.url.indexOf(\"youtube.com\") >= 0) {\n      var video_item = JSON.parse(item.itemValue);\n      var video_item_split = video_item.url.split(\"/\");\n      var video_id = video_item_split[video_item_split.length - 1];\n      return (\n        <div className='productView__linkItem productView__linkItem--youtube'>\n          <YoutubeEmbedByLink url={video_id} title={video_item.title} />\n        </div>\n      );\n    }\n\n    if (link.linkType === \"tiktok\") {\n      return (\n        <div className='productView__linkItem productView__linkItem--tiktok'>\n          <TiktokEmbedByLink url={link.url} />\n        </div>\n      );\n    }\n\n    if (link.linkType === \"blog\" || link.linkType === \"page\") {\n      return <PageTile page={link} type={\"blog\"} />;\n    }\n    if (link.url && link.url.indexOf(\"http\") < 0) {\n      return (\n        <div>\n          <SiteLink\n            className='productView__linkItem productView__linkItem--page'\n            to={link.url}\n          >\n            {title}\n          </SiteLink>\n        </div>\n      );\n    }\n    if (link.url && link.url.indexOf(\"http\") >= 0 && link.imageUrl) {\n      return (\n        <PageTile\n          page={{\n            imageUrl: link.imageUrl,\n            url: link.url,\n            title: title,\n            tileDesc: \"\", //link.desc\n          }}\n        />\n      );\n    }\n    return (\n      <div>\n        <a\n          className='productView__linkItem'\n          href={link.url}\n          target='_blank'\n          rel='noopener noreferrer'\n        >\n          <IoMdOpen /> {title}\n        </a>\n      </div>\n    );\n  }\n  if (item.itemTypeCode === \"qa\") {\n    const qa = JSON.parse(item.itemValue);\n    return (\n      <div css={style.qa}>\n        <div css={style.qaQuestion}>{qa.question}</div>\n        <div\n          css={style.qaAnswer}\n          dangerouslySetInnerHTML={{ __html: qa.answer }}\n        ></div>\n      </div>\n    );\n  }\n  if (item.itemTypeCode === \"spec\") {\n    const spec = JSON.parse(item.itemValue);\n\n    return (\n      <div>\n        <strong>{spec.label}</strong>: {spec.text}\n      </div>\n    );\n  }\n  return <div></div>;\n}\n\nfunction Empty() {\n  return (\n    <div className='productView__empty'>\n      <div></div>\n    </div>\n  );\n}\n\nfunction PageTile({ page, type = null }) {\n  var checkType = false;\n  if (type && type === \"blog\") {\n    if (page.imageUrl2 && page.imageUrl2 !== \"\") {\n      checkType = true;\n    }\n  }\n\n  const imageUrl = utils.site.resourcePath(\n    checkType === true ? page.imageUrl2 : page.imageUrl\n  );\n\n  return (\n    <div className='blogTile'>\n      <SiteLink className='blogTile__link' to={page.url}>\n        <div\n          className='blogTile__bg'\n          style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}\n        ></div>\n        <div className='blogTile__content'>\n          <div className='blogTile__contentInner'>\n            <div className='blogTile__title'>{page.title}</div>\n            <div className='blogTile__desc'>{page.tileDesc}</div>\n            <div className='blogTile__readMore thinBtn'>READ MORE</div>\n          </div>\n        </div>\n      </SiteLink>\n    </div>\n  );\n}\n","import { css } from \"@emotion/core\";\n\nexport default {\n  instagrams: css({\n    marginLeft: \"-10px\",\n    marginRight: \"-10px\",\n    display: \"flex\",\n    justifyContent: \"flex-start\",\n    flexWrap: \"wrap\",\n  }),\n  youtubes: css({\n    marginLeft: \"-10px\",\n    marginRight: \"-10px\",\n    display: \"flex\",\n    justifyContent: \"flex-start\",\n    flexWrap: \"wrap\",\n  }),\n  tiktoks: css({\n    marginLeft: \"-10px\",\n    marginRight: \"-10px\",\n    display: \"flex\",\n    justifyContent: \"flex-start\",\n    flexWrap: \"wrap\",\n  }),\n  qa: {\n    marginBottom: \"1rem\",\n    borderBottom: \"solid 1px #ccc\",\n  },\n  qaQuestion: {\n    fontWeight: \"bold\",\n    marginBottom: \"0.3rem\",\n  },\n  qaAnswer: {},\n};\n","import React from \"react\";\nimport utils from \"../../utils\";\nimport { SiteLink } from \"../../components\";\n//import env from '../../env';\n\nexport function Tile({ product }) {\n  const imageUrl = product.productThumbnail\n    ? utils.site.resourcePath(product.productThumbnail)\n    : \"/assets/product-empty.png\";\n  //console.log(imageUrl)\n  const productUrl = product.productUrl\n    ? product.productUrl\n    : `/product/${product.productCode}`;\n  //const barcodeCleaned = product.barcode ? product.barcode.replace(/-/g, '').replace(/ /g, '') : null;\n  return (\n    <div className='productTile tile'>\n      {/* <div itemScope={true} itemType=\"http://schema.org/Product\">\n        <meta itemProp=\"name\" content={product.productName} />\n        <div itemProp=\"brand\" itemType=\"http://schema.org/Brand\" itemScope>\n          <meta itemProp=\"name\" content={env.siteName} />\n        </div>\n\n        {product.intro && <meta itemProp=\"description\" content={product.intro} />}\n        {barcodeCleaned && <meta itemProp=\"sku\" content={barcodeCleaned} />}\n        {barcodeCleaned && <meta itemProp=\"gtin13\" content={barcodeCleaned} />}\n        {imageUrl && <link itemProp=\"image\" href={utils.site.fullUrl(imageUrl)} />}\n        <div itemProp=\"offers\" itemType=\"http://schema.org/Offer\" itemScope>\n          <link itemProp=\"url\" href={utils.site.fullUrl(product.productUrl)} />\n          {product.price && <meta itemProp=\"price\" content={product.price} />}\n          <meta itemProp=\"priceCurrency\" content={utils.site.isNZ? 'NZD' : 'AUD'} />\n        </div> */}\n\n      <SiteLink className='productTile__link tile__content' to={productUrl}>\n        <div>\n          <img\n            src={utils.site.resourcePath(imageUrl)}\n            alt={product.productName}\n          />\n        </div>\n        <div className='productTile__title'>\n          {product.productName}\n          <div className='productTile__inlineRating'>\n            <div\n              data-bv-show='inline_rating'\n              data-bv-seo='false'\n              data-bv-product-id={product.productCode}\n            ></div>\n          </div>\n        </div>\n\n        <div className='productTile__price'>\n          {product.priceText ? product.priceText : \"\"}\n        </div>\n      </SiteLink>\n      {/* </div> */}\n    </div>\n  );\n}\n","/** @jsx jsx */\nimport { jsx } from \"@emotion/core\";\nimport style from \"./productViewStyle\";\nimport React, { Fragment } from \"react\";\n//import { Redirect } from \"react-router-dom\";\nimport env from \"../../env\";\nimport { SiteLink, NotFound } from \"../../components\";\nimport { useGet } from \"../../components\";\nimport { useRouter } from \"../../components\";\nimport utils from \"../../utils\";\nimport { ErrorPopup, Loading } from \"../../components\";\nimport { Breadcrumb } from \"../../components/breadcrumb/breadcrumb\";\nimport { ViewPartial } from \"../../cms/pages/partials/viewPartial\";\nimport { CommonProductBottom } from \"../../cms/pages/partials/commonProductBottom\";\nimport { Tile } from \"./productTile\";\nimport { YoutubeEmbed } from \"../../components\";\nimport { useInstagram } from \"../../components\";\nimport { useBV } from \"../bazzarVoice/useBV\";\n//import { ImagePopup } from 'modules/imagePopup/imagePopup';\n// import InstagramEmbed from \"react-instagram-embed\";\nimport Slider from \"react-slick\";\nimport FsLightbox from \"fslightbox-react\";\nimport { MetaTag } from \"../../components\";\nimport { FaRegFilePdf } from \"react-icons/fa\";\nimport { IoMdOpen } from \"react-icons/io\";\n\nimport { debounce } from \"../../lib/utils-core/debounce\";\nimport { gtm } from \"../../lib/tracking\";\nimport { InstaEmbedByLink } from \"../embed/instagram\";\nimport { YoutubeEmbedByLink } from \"../embed/youtube\";\nimport { TiktokEmbedByLink } from \"../embed/tiktok\";\n\nexport function DiscontinuedProductView(props) {\n  const { query } = useRouter();\n  const [loaded, setLoaded] = React.useState(false);\n  const get = useGet();\n\n  useInstagram();\n\n  const productCode = query.id || \"\";\n  const category = query.category || \"\";\n  //const subcCtegory = query.subCategory || \"\";\n  const slug = query.slug || \"\";\n\n  React.useEffect(() => {\n    let url = productCode\n      ? `/api/product/getProduct/${productCode}`\n      : `/api/product/getProductByUrl?category=${category}&slug=${slug}`;\n    // if(subcCtegory && subcCtegory !== ''){\n    //   const newMainCategory = path.split(\"/\")[1];\n    //   url = `/api/product/getproductbyurlwithsubcategory?category=${newMainCategory}&subcategory=${subcCtegory}&slug=${slug}`;\n    // }\n    if (category === \"\") {\n      url = `/api/product/getproductbyUrlbyslug?slug=${slug}`;\n    }\n\n    get.send(env.apiBase + url);\n    setLoaded(false);\n\n    // eslint-disable-next-line\n  }, [productCode, slug]);\n\n  if (get.loading()) {\n    return <Loading />;\n  } else if (get.hasErrors() && get.containsErrorMessage(\"no product\")) {\n    return <NotFound />;\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title='Loading Error' errors={get.errors} />;\n  }\n\n  //console.log(get)\n  const data = get.response;\n\n  if (get.done() && !loaded) {\n    setLoaded(true);\n    const pageUrl = productCode\n      ? `/product/${productCode}`\n      : `/products/${category}/${slug}`;\n    const pageTitle =\n      data.totalCnt === 0 ? \"No product found\" : data.productName;\n    gtm.pageView(pageUrl, pageTitle);\n\n    if (data.totalCnt !== 0) {\n      gtm.sendEvent(\"productpageview\", {\n        pageUrl: pageUrl,\n        productName: data.productName,\n        productSku: data.productCode,\n      });\n    }\n  }\n\n  if (data.totalCnt === 0) return <div>No product found.</div>;\n\n  // const topBanner =\n  //   !utils.site.isNZ && data.canstar\n  //     ? \"/sites/vssassoon/media/canstar/product-generic-banner-canstar.jpg\"\n  //     : \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\";\n\n  //const topBanner = !utils.site.isNZ && data.canstar ? \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\" : \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\";\n\n  let topBanner =\n    \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\";\n  if (data.category && data.category.toLowerCase().includes(\"dryers\")) {\n    topBanner = utils.site.isNZ\n      ? \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\"\n      : \"/sites/vssassoon/media/banners-group/vidal_sassoon-day133928.jpg\";\n  } else {\n    if (!utils.site.isNZ && data.canstar) {\n      topBanner =\n        \"/sites/vssassoon/media/canstar/product-generic-banner-canstar.jpg\";\n    }\n  }\n\n  return (\n    <React.Fragment>\n      <div\n        className='single-banner banner-item bannerSize--thin'\n        style={{\n          backgroundImage: utils.css.bgUrlStyle(\n            utils.site.resourcePath(topBanner)\n          ),\n        }}\n      ></div>\n      <Product product={data} />\n\n      <CommonProductBottom />\n      <ViewPartial />\n    </React.Fragment>\n  );\n}\n\nfunction Product({ product }) {\n  // const history = useHistoryStore();\n\n  const mainPhoto =\n    product.productImages.length > 0\n      ? product.productImages[0]\n      : { imageUrl: \"/assets/product-empty.png\", alt: product.productName };\n  const allPhotos = product.productImages || [];\n  //const otherPhotos = product.productImages.length > 0 ? product.productImages.filter(x => !x.isPackage) : [];\n  const packagePhotos =\n    product.productImages.length > 0\n      ? product.productImages.filter((x) => x.isPackage)\n      : [];\n\n  const popupImages = allPhotos.map((x) => x.imageUrl);\n  const showReviews = window.location.hash === \"#reviewnow\";\n  const showHowTo = window.location.hash === \"#styletips\";\n  const showFaqs = window.location.hash === \"#faqs\"\n  const [isMobile, setIsMobile] = React.useState(utils.site.isMobile());\n  const [currentTab, setCurrentTab] = React.useState(() => {\n    if (showReviews) {\n      return \"reviews\";\n    } else if (showHowTo) {\n      return \"howto\";\n    } else if (showFaqs) {\n      return \"faqs\"\n    } else if (isMobile) {\n      return \"wheretobuy\";\n    } \n    return \"wheretobuy\";\n  });\n  //const [currentTab, setCurrentTab] = React.useState(isMobile ? \"\" : \"howto\");\n  const [heroImage, setHeroImage] = React.useState(mainPhoto);\n\n  const [toggler, setToggler] = React.useState(false);\n  //const [popupImages, setPopupImages] = React.useState();\n  const [popupIndex, setPopupIndex] = React.useState(0);\n  const [checkStart, setCheckStart] = React.useState(0);\n  const country = utils.site.isNZ ? \"New Zealand\" : \"Australia\";\n  const schemaImages = product.productImages.map(\n    (x) =>\n      (country === \"New Zealand\"\n        ? \"https://www.vssassoon.co.nz\"\n        : \"https://www.vssassoon.com.au\") + x.imageUrl\n  );\n\n  React.useEffect(() => {\n    const resized = debounce(() => {\n      setIsMobile(utils.site.isMobile());\n    }, 1000);\n    if (typeof window !== `undefined`) {\n      window.addEventListener(\"resize\", resized);\n    }\n\n    utils.site.callMCPoopu();\n    setCheckStart(checkStart + 1);\n\n    const settingSchemaInterval = setInterval(() => {\n      // console.log(\"check__settingSchemaInterval\");\n\n      const bvRatingSchema = document.getElementById(\n        \"bv-jsonld-bvloader-summary\"\n      );\n\n      if (bvRatingSchema) {\n        const bvRatingSchemaData = JSON.parse(bvRatingSchema.innerHTML);\n        const productStructuredData = {\n          \"@context\": \"https://schema.org/\",\n          \"@type\": \"Product\",\n          name: product.productName,\n          url:\n            (country === \"New Zealand\"\n              ? \"https://www.vssassoon.co.nz\"\n              : \"https://www.vssassoon.com.au\") + product.productUrl,\n          description: product.intro,\n          sku: product.productCode,\n          brand: {\n            \"@type\": \"Brand\",\n            name: \"VS Sassoon\",\n          },\n          gtin13:\n            product.barcode && product.barcode !== \"\" ? product.barcode : \"\",\n          category: product.category,\n          image: schemaImages,\n          aggregateRating: bvRatingSchemaData.aggregateRating,\n          offers: {\n            \"@type\": \"Offer\",\n            priceCurrency: country === \"New Zealand\" ? \"NZD\" : \"AUD\",\n            price: product.price + \"\",\n            availability: \"https://schema.org/InStock\",\n          },\n        };\n\n        const productSchemaScript = document.createElement(\"script\");\n        productSchemaScript.id = \"productSchemaScript\";\n        productSchemaScript.type = \"application/ld+json\";\n        productSchemaScript.innerHTML = JSON.stringify(productStructuredData);\n\n        document.head.removeChild(bvRatingSchema);\n        document.body.appendChild(productSchemaScript);\n        clearInterval(settingSchemaInterval);\n      }\n    }, 100);\n\n    const checkBvReviewSchemaSI = setInterval(() => {\n      // console.log(\"check__checkBvReviewSchemaSI\");\n      const bvReviewSchemaScript = document.getElementById(\n        \"bv-jsonld-reviews-data\"\n      );\n      if (bvReviewSchemaScript) {\n        document.head.removeChild(bvReviewSchemaScript);\n        clearInterval(checkBvReviewSchemaSI);\n      }\n    }, 100);\n\n    return () => {\n      if (typeof window !== `undefined`) {\n        window.removeEventListener(\"resize\", resized);\n      }\n      clearInterval(settingSchemaInterval);\n      clearInterval(checkBvReviewSchemaSI);\n    };\n\n    // eslint-disable-next-line\n  }, []);\n\n  React.useLayoutEffect(() => {\n    setTimeout(() => {\n      bv.sendEvent(\n        \"WhereToBuy\",\n        \"WhereToBuyTab_ProductPage\",\n        product.productCode\n      );\n\n      // const _rating = document.querySelector('div.bv_avgRating_component_container.notranslate');\n      // const _ratingCount = document.querySelector('div.bv_numReviews_component_container meta');\n      // if (_rating && _ratingCount) {\n      //   setRating({ rating: _rating.innerText, count: _ratingCount.getAttribute('content') });\n      // }\n    }, 1500);\n\n    // setTimeout(() => {\n    //   const _rating = document.querySelector('div.bv_avgRating_component_container.notranslate');\n    //   const _ratingCount = document.querySelector('div.bv_numReviews_component_container meta');\n    //   if (_rating && _ratingCount) {\n    //     setRating({ rating: _rating.innerText, count: _ratingCount.getAttribute('content') });\n    //   }\n    // }, 500);\n\n    // eslint-disable-next-line\n  }, []);\n\n  React.useEffect(() => {\n    if (checkStart === 0) {\n      return;\n    }\n\n    if (window.instgrm) {\n      window.instgrm.Embeds.process();\n    }\n\n    // eslint-disable-next-line\n  }, [isMobile]);\n\n  // BV\n  const onShowReview = React.useCallback((e) => {\n    //e.stopPropagation();\n    showTab(\"reviews\", true);\n    // eslint-disable-next-line\n  }, []);\n\n  const bv = useBV(product, {\n    showReview: onShowReview,\n  });\n\n  function openPopupImage(imageUrl) {\n    const inx = utils.array.findIndex(popupImages, (x) => x === imageUrl);\n    setPopupIndex(inx >= 0 ? inx : 0);\n    setToggler(!toggler);\n  }\n\n  function showTab(tab, forceToScroll = false) {\n    if (tab === currentTab && isMobile) {\n      setCurrentTab(\"\");\n      return;\n    }\n    if (tab === \"wheretobuy\") {\n      bv.sendEvent(\n        \"WhereToBuy\",\n        \"WhereToBuyTab_ProductPage\",\n        product.productCode\n      );\n    }\n\n    if (tab !== currentTab) {\n      gtm.sendGAEvent(\"Product Tab\", \"Select\", tab);\n    }\n    setCurrentTab(tab);\n    scrollTo(\"tab-\" + tab, forceToScroll);\n  }\n\n  function scrollTo(selector, forceToScroll = false) {\n    if (!forceToScroll && !isMobile) return;\n    setTimeout(() => {\n      const anchor = utils.ui.findElement(selector);\n      if (anchor) utils.ui.scrollTo(anchor, 300);\n    }, 200);\n  }\n\n  React.useEffect(() => {\n    if (showReviews) {\n      scrollTo(\"reviews\", true);\n    }\n    if (showHowTo) {\n      scrollTo(\"howto\", true);\n    }\n    if (showFaqs) {\n      scrollTo(\"faqs\", true);\n    }\n    // eslint-disable-next-line\n  }, []);\n\n  const slides = allPhotos.map((photo, index) => (\n    <div\n      key={index}\n      className={`productView__image ${\n        heroImage.imageUrl === photo.imageUrl ? \"current\" : \"\"\n      }`}\n    >\n      <div\n        className={`productView__imageBg`}\n        style={{\n          backgroundImage: utils.css.bgUrlStyle(\n            utils.site.resourcePath(photo.imageUrl)\n          ),\n        }}\n        onClick={() => setHeroImage(photo)}\n      ></div>\n      {/* <img src={utils.site.resourcePath(photo.imageUrl)} alt={photo.alt} onClick={() => setHeroImage(photo)} /> */}\n    </div>\n  ));\n\n  var settings = {\n    dots: false,\n    lazyLoad: true,\n    infinite: slides.length > 2 ? true : false,\n    speed: 500,\n    autoplaySpeed: 3000,\n    initialSlide: 1,\n    //fade: true,\n    autoplay: false,\n    slidesToShow: 3,\n    slidesToScroll: 1,\n    responsive: [\n      {\n        breakpoint: 1024,\n        settings: {\n          slidesToShow: 2,\n          slidesToScroll: 1,\n        },\n      },\n    ],\n  };\n\n  const tabs = [\n    {\n      id: \"wheretobuy\",\n      title: \"Where to buy\",\n      tabView: WhereToBuyTab,\n      visible:\n        (product.whereToBuySection || []).length > 0 ||\n        (product.whereToBuys || []).length > 0,\n    },\n    { id: \"reviews\", title: \"Reviews\", tabView: BVReviewTab, visible: true },\n    { id: \"details\", title: \"Details\", tabView: DetailsTab, visible: true },\n    { id: \"howto\", title: \"Style Tips\", tabView: HowtoTab, visible: true },\n    {\n      id: \"seemore\",\n      title: \"Inspiration\",\n      tabView: SeeMoreTab,\n      visible: (product.seeMoreSection || []).length > 0,\n    },\n    {\n      id: \"faqs\",\n      title: \"FAQs\",\n      tabView: FaqTab,\n      visible: (product.faqSection || []).length > 0,\n    },\n  ];\n\n  const visibleTabs = tabs.filter((tab) => tab.visible);\n  const tabPanels = isMobile ? (\n    <div className='productView_tabPanels--mobile'>\n      {visibleTabs.map((tab) => (\n        <div key={tab.id} className='productView_section'>\n          <div\n            id={tab.id}\n            className={`tab ${(currentTab === tab.id && \"selected\") || \"\"}`}\n            onClick={(e) => showTab(tab.id)}\n          >\n            {tab.title}\n          </div>\n          <div\n            className={`tabContent ${\n              (currentTab === tab.id && \"selected\") || \"\"\n            }`}\n          >\n            <tab.tabView product={product} />\n          </div>\n        </div>\n      ))}\n    </div>\n  ) : (\n    <div className='productView_tabPanels--desktop'>\n      <div className='productView__tabs'>\n        {visibleTabs.map((tab) => (\n          <div\n            key={tab.id}\n            id={tab.id}\n            className={`tab ${(currentTab === tab.id && \"selected\") || \"\"}`}\n            onClick={(e) => showTab(tab.id)}\n          >\n            {tab.title}\n          </div>\n        ))}\n      </div>\n\n      <div className='productView__tabContents'>\n        {visibleTabs.map((tab) => (\n          <div\n            key={tab.id}\n            className={`tabContent ${\n              (currentTab === tab.id && \"selected\") || \"\"\n            }`}\n          >\n            <tab.tabView product={product} />\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n\n  const _discoverMoreLinks = product.discoverMoreSection.map((x) =>\n    JSON.parse(x.itemValue)\n  );\n\n  const auNz = country === \"New Zealand\" ? \"NZ\" : \"AU\";\n  const discoverMoreLinks = _discoverMoreLinks.filter((item) => {\n    if (\n      item.auNzCheck &&\n      item.auNzCheck.length > 0 &&\n      item.auNzCheck.includes(auNz)\n    ) {\n      return true;\n    }\n\n    return false;\n  });\n\n  const barcodeCleaned = product.barcode\n    ? product.barcode.replace(/-/g, \"\").replace(/ /g, \"\")\n    : null;\n\n  //console.log(\"dddsfsdfsdfsdfsd\", discoverMoreLinks); /// auNzCheck\n\n  return (\n    <div className='contentPanel productViewPanel'>\n      <FsLightbox\n        toggler={toggler}\n        sources={popupImages}\n        sourceIndex={popupIndex}\n      />\n      <MetaTag data={getMetaTag(product, mainPhoto)} />\n      {/* <SchemaTagView product={product} country={country} schemaImages={schemaImages} rating={rating} /> */}\n      <div className='contentPanel__bg'></div>\n      <div className='container'>\n        <Breadcrumb breadcrumb={product.breadcrumb} />\n        <div className='productView'>\n          <div itemScope={true} itemType='http://schema.org/Product'>\n            <meta itemProp='name' content={product.productName} />\n            <div itemProp='brand' itemType='http://schema.org/Brand' itemScope>\n              <meta itemProp='name' content={env.siteName} />\n            </div>\n\n            {product.intro && (\n              <meta itemProp='description' content={product.intro} />\n            )}\n            {barcodeCleaned && <meta itemProp='sku' content={barcodeCleaned} />}\n            {barcodeCleaned && (\n              <meta itemProp='gtin13' content={barcodeCleaned} />\n            )}\n            {heroImage && heroImage.imageUrl && (\n              <link\n                itemProp='image'\n                href={utils.site.fullUrl(heroImage.imageUrl)}\n              />\n            )}\n\n            <div itemProp='offers' itemType='http://schema.org/Offer' itemScope>\n              <link\n                itemProp='url'\n                href={utils.site.resourcePath(product.productUrl)}\n              />\n              {product.price && (\n                <meta itemProp='price' content={product.price} />\n              )}\n              <meta\n                itemProp='priceCurrency'\n                content={utils.site.isNZ ? \"NZD\" : \"AUD\"}\n              />\n            </div>\n\n            <div className='row'>\n              <div className='col-md-6'>\n                {/* <ImagePopup\n              src={utils.site.resourcePath(heroImage.imageUrl)}\n              thumbnailSrc={utils.site.resourcePath(heroImage.imageUrl)}\n              alt={heroImage.alt} title={heroImage.alt} /> */}\n                <img\n                  className='productView__hero'\n                  src={utils.site.resourcePath(heroImage.imageUrl)}\n                  alt={heroImage.alt || product.productName}\n                  onClick={() => openPopupImage(heroImage.imageUrl)}\n                />\n                {allPhotos.length > 1 && (\n                  <div className='productView__images'>\n                    <Slider {...settings}>{slides}</Slider>\n                  </div>\n                )}\n              </div>\n              <div className='col-md-6 right'>\n                {product.productName.indexOf(\"i-\") === 0 ? (\n                  <h1 className='productView__title'>\n                    <strong>\n                      {product.productName.toUpperCase().replace(\"I-\", \"i-\")}\n                    </strong>\n                  </h1>\n                ) : (\n                  <h1\n                    className='productView__title'\n                    style={{ textTransform: \"uppercase\" }}\n                  >\n                    <strong>{product.productName}</strong>\n                  </h1>\n                )}\n                <div className='productView__price'>\n                  {product.priceText ? product.priceText : \"\"}\n                </div>\n                <div className='productView__productCode'>\n                  Product code: <b>{product.productCode}</b>\n                </div>\n                <div className='productView__bzSummary'>\n                  <div\n                    data-bv-show='rating_summary'\n                    data-bv-product-id={product.productCode}\n                  ></div>\n                </div>\n                {product.productStatus === 98 /*Discontinued*/ && (\n                  <div className='productView__discontinued'>\n                    This product is now discontinued.\n                  </div>\n                )}\n                <div className='productView__intro'>{product.intro}</div>\n                {discoverMoreLinks && discoverMoreLinks.length > 0 && (\n                  <div className='productView__discoverMores'>\n                    {discoverMoreLinks.map((link, index) => (\n                      <div key={index} style={{ marginBottom: \"0.8rem\" }}>\n                        <SiteLink\n                          className='productView__skewButton'\n                          to={\n                            utils.site.isNZ &&\n                            (product.productCode === \"VSC1600A\" ||\n                              product.productCode === \"VSP1300A\") &&\n                            link.title === \"MEET OUR NEW CURL SECRET®\"\n                              ? \"/curl-secret\"\n                              : link.url\n                          }\n                        >\n                          <span>\n                            {utils.site.isNZ &&\n                            (product.productCode === \"VSC1600A\" ||\n                              product.productCode === \"VSP1300A\") &&\n                            link.title === \"MEET OUR NEW CURL SECRET®\"\n                              ? \"DISCOVER MORE\"\n                              : link.title}\n                          </span>\n                        </SiteLink>\n                      </div>\n                    ))}\n                  </div>\n                )}\n\n                <div className='productView__packages'>\n                  {/* {\n                    product.productCode === 'VSD6395A' &&\n                    <div className=\"productView__package__s_container\">\n                      <div className=\"productView__package__special\">\n                        <a href=\"https://www.finder.com.au/hair-dryers#hair-dryer-4\" target=\"_blank\" rel=\"noopener noreferrer\">\n                          <img\n                            src=\"/assets/Recommended-Badge-1.png\"\n                            alt=\"Recommended-Badge\"\n                          />\n                        </a>\n                      </div>\n                    </div>\n                  } */}\n\n                  {/* {\n                    product.productCode === 'VSD6730A' &&\n                    <div className=\"productView__package__s_container\">\n                      <div className=\"productView__package__special\">\n                        <a href=\"https://www.finder.com.au/hair-dryers#hair-dryer-8\" target=\"_blank\" rel=\"noopener noreferrer\">\n                          <img\n                            src=\"/assets/Recommended-Badge-1.png\"\n                            alt=\"Recommended-Badge\"\n                          />\n                        </a>\n                      </div>\n                    </div>\n                  } */}\n\n                  {product.productCode === \"VSLE2540A\" && (\n                    <div className='productView__package__s_container'>\n                      <div className='productView__package__special'>\n                        <a\n                          href='https://www.finder.com.au/hair-straighteners#hair-straighteners-2'\n                          target='_blank'\n                          rel='noopener noreferrer'\n                        >\n                          <img\n                            src='/assets/Recommended-Badge-1.png'\n                            alt='Recommended-Badge'\n                          />\n                        </a>\n                      </div>\n                    </div>\n                  )}\n\n                  {packagePhotos.map((photo, index) => (\n                    <div key={index} className='productView__package'>\n                      <img\n                        src={utils.site.resourcePath(photo.imageUrl)}\n                        alt={photo.alt || product.productName + \" Packages\"}\n                        onClick={() => openPopupImage(photo.imageUrl)}\n                      />\n                    </div>\n                  ))}\n                  {!utils.site.isNZ && product.canstar && (\n                    <div className='productView__package productView__canstar'>\n                      {/* <a href='https://www.canstarblue.com.au/health-beauty/hair-dryers/' target='_blank' rel='noopener noreferrer'>\n                        <img src='/assets/icons/cns-mas-hair-dryers-2021-300.png' alt='Canstar' />\n                      </a> */}\n                      <SiteLink to='/blog/the-best-5-hair-dryers-in-2023'>\n                        {/* <img src=\"/assets/icons/cns-mas-hair-dryers-2021-300.png\" alt=\"Canstar\" /> */}\n                        <img\n                          src='/assets/icons/product-canstar-double-icon.png'\n                          alt='canstart'\n                        />\n                      </SiteLink>\n                    </div>\n                  )}\n                </div>\n              </div>\n            </div>\n\n            {tabPanels}\n\n            <RelatedProducts products={product.relatedProducts} />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction getMetaTag(product, mainPhoto) {\n  const country = utils.site.isNZ ? \"New Zealand\" : \"Australia\";\n  const siteName = env.siteName + \" \" + country;\n\n  return {\n    title: product.productName + \" | \" + siteName,\n    description: product.metaDesc || product.intro,\n    keywords: \"\",\n    heroImageUrl: utils.site.fullUrl(mainPhoto.imageUrl),\n    language: \"English\",\n    country: country,\n    siteName: siteName,\n    url: utils.site.fullUrl(product.productUrl),\n    alternates: utils.site.getAlternates(product.productUrl),\n\n    //facebook-domain-verification\n    faceBookDomainVerifi:\n      country === \"New Zealand\"\n        ? env.FaceBookDomainVerifiNZ\n        : env.FaceBookDomainVerifiAU,\n    //canonical: utils.site.resourcePath(pageData.pageUrl)\n  };\n}\n\nfunction BVReviewTab({ product }) {\n  return (\n    <div data-bv-show='reviews' data-bv-product-id={product.productCode}></div>\n  );\n}\n\nfunction WhereToBuyTab({ product }) {\n  const section = product.whereToBuySection || [];\n  return (\n    <div>\n      {section.length > 0 && <ItemList product={product} section={section} />}\n      {product.whereToBuys && product.whereToBuys.length > 0 && (\n        <Stores stores={product.whereToBuys} />\n      )}\n    </div>\n  );\n}\n\nfunction RelatedProducts({ products }) {\n  const filteredAndSortedProducts = products.filter(\n    (product) => product.productStatus === 0\n  );\n  if (filteredAndSortedProducts.length === 0) return null;\n  return (\n    <div className='productView__relatedProducts'>\n      <h3>RELATED PRODUCTS</h3>\n      <div className='productList'>\n        {filteredAndSortedProducts.map((product, index) => (\n          <Tile product={product} key={product.productCode}></Tile>\n        ))}\n      </div>\n    </div>\n  );\n}\n\nfunction Stores({ stores }) {\n  return (\n    <ul className='stores'>\n      {stores.map((store) => (\n        <li key={store.storeCode} className='store'>\n          <figure>\n          {store.storeUrl && store.storeUrl !== '' && store.buyOnline ? (\n            <a\n              href={store.storeUrl}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              <img\n                src={`/assets/shops/${store.iconPath}`}\n                alt={store.storeName}\n              />\n              <figcaption>Buy Online</figcaption>\n              {/* <figcaption>{store.storeName}</figcaption> */}\n            </a>\n          ) : (\n            <Fragment>\n              <img\n                src={`/assets/shops/${store.iconPath}`}\n                alt={store.storeName}\n              />\n              <figcaption>{store.storeName}</figcaption>\n            </Fragment>\n          )}\n            {/*<img\n              src={`/assets/shops/${store.iconPath}`}\n              alt={store.storeName}\n            />\n            <figcaption>{store.storeName}</figcaption>\n            {store.buyOnline && (\n              <a\n                href={store.storeUrl}\n                target='_blank'\n                rel='noopener noreferrer'\n              >\n                Buy online <span className='icon'></span>\n              </a>\n            )}*/}\n          </figure>\n        </li>\n      ))}\n    </ul>\n  );\n}\n\nfunction HowtoTab({ product }) {\n  const section = product.howToSection || [];\n  const countryCode = utils.site.isNZ ? \"NZ\" : \"AU\";\n  const _section = section.filter(x => x.itemAuNZCheck && x.itemAuNZCheck.includes(countryCode));\n  return <ItemList product={product} section={_section} />;\n}\n\nfunction FaqTab({ product }) {\n  const section = product.faqSection || [];\n  return <ItemList product={product} section={section} />;\n}\n\nfunction DetailsTab({ product }) {\n  const section = product.detailSection || [];\n  const hasWarranty = section.some(\n    (x) => (x.itemValue || \"\").indexOf(\"WARRANTY\") >= 0\n  );\n\n  const techSpecs =\n    product.specSection && product.specSection.length > 0\n      ? TechSpecs(product.specSection)\n      : null;\n  const hasTech = section.some(\n    (x) => (x.itemValue || \"\").indexOf(\"TECHNICAL SPECIFICATIONS\") >= 0\n  );\n\n  return (\n    <React.Fragment>\n      <ItemList product={product} section={section} />\n      {!hasTech && techSpecs && (\n        <div>\n          <h3>TECHNICAL SPECIFICATIONS</h3>\n          {techSpecs}\n        </div>\n      )}\n      {!hasWarranty && product.warranty && (\n        <Warranty\n          warrantyYear={product.warranty}\n          warrantyDetails={product.warrantyDetails}\n        />\n      )}\n      {product.barcode && (\n        <div>\n          <h3>BARCODE</h3>\n          <p>{product.barcode}</p>\n        </div>\n      )}\n      {product.useSparePartInstruction && <SparePart />}\n      {product.bookletLink && <Booklet bookletLink={product.bookletLink} />}\n    </React.Fragment>\n  );\n}\n\nfunction SparePart() {\n  return (\n    <div>\n      <h3>SPARE PARTS</h3>\n      <p>\n        Love it but lost it? Spare parts are available.{\" \"}\n        <SiteLink to='/contact'>Contact Conair</SiteLink> for more information.\n      </p>\n    </div>\n  );\n}\n\nfunction Warranty({ warrantyYear, warrantyDetails }) {\n  if (warrantyDetails) {\n    return (\n      <div>\n        <h3>WARRANTY</h3>\n        <p>Backed by a {warrantyYear} year warranty*</p>\n        <p>* {warrantyDetails}</p>\n      </div>\n    );\n  } else {\n    return (\n      <div>\n        <h3>WARRANTY</h3>\n        <p>Backed by a {warrantyYear} year warranty</p>\n      </div>\n    );\n  }\n}\n\nfunction Booklet({ bookletLink }) {\n  const bookletTitle = utils.url.getFilename(bookletLink);\n  return (\n    <div>\n      <h3>INSTRUCTION BOOKLET</h3>\n      <a href={bookletLink} target='_blank' rel='noopener noreferrer'>\n        <FaRegFilePdf /> {bookletTitle}\n      </a>\n    </div>\n  );\n}\n\nfunction TechSpecs(items) {\n  const specs = items.map((x) => JSON.parse(x.itemValue));\n  const left = specs.filter((x) => x.category !== \"R\");\n  const right = specs.filter((x) => x.category === \"R\");\n  if (right.length === 0) {\n    // render all - men\n    const splitLefts = [],\n      splitRights = [];\n    left.forEach((x, index) =>\n      index % 2 === 0 ? splitLefts.push(x) : splitRights.push(x)\n    );\n    return (\n      <div className='row' style={{ marginBottom: \"0.5rem\" }}>\n        <div className='col-md-6'>\n          {splitLefts.map((x, index) => (\n            <div key={index}>\n              <b>{x.label}</b>: {x.text}\n            </div>\n          ))}\n        </div>\n        <div className='col-md-6'>\n          {splitRights.map((x, index) => (\n            <div key={index}>\n              <b>{x.label}</b>: {x.text}\n            </div>\n          ))}\n        </div>\n      </div>\n    );\n  } else {\n    // render left/right - women\n    return (\n      <div className='row' style={{ marginBottom: \"0.5rem\" }}>\n        <div className='col-md-6'>\n          {left.map((x, index) => (\n            <div key={index}>\n              <b>{x.label}</b>: {x.text}\n            </div>\n          ))}\n        </div>\n        <div className='col-md-6'>\n          {right.map((x, index) => (\n            <div key={index}>\n              <b>{x.label}</b>: {x.text}\n            </div>\n          ))}\n        </div>\n      </div>\n    );\n  }\n}\n\nfunction SeeMoreTab({ product }) {\n  const section = product.seeMoreSection || [];\n  const countryCode = utils.site.isNZ ? \"NZ\" : \"AU\";\n  const _section = section.filter(x => x.itemAuNZCheck && x.itemAuNZCheck.includes(countryCode));\n  \n  const blogs = [], instagrams = [];\n  const pre = [], post = [], tiktoks = [];\n  const youtubes = [];\n  const empty = [0, 1, 2, 3, 4];\n\n  let hasInstaOrBlog = false;\n  _section.forEach((item) => {\n\n    let processed = false;\n    if (item.itemTypeCode === \"link\") {\n      const link = JSON.parse(item.itemValue);\n      if (link.url && link.url.indexOf(\"instagram.com\") >= 0) {\n        hasInstaOrBlog = true;\n        processed = true;\n        instagrams.push(item);\n      } else if (\n        link.linkType === \"blog\" ||\n        link.linkType === \"page\" ||\n        link.linkType === \"web\"\n      ) {\n        hasInstaOrBlog = true;\n        processed = true;\n        if (link.title !== \"\") {\n          blogs.push(item);\n        }\n      } else if (link.url && link.url.indexOf(\"youtube.com\") >= 0) {\n        hasInstaOrBlog = true;\n        processed = true;\n        youtubes.push(item);\n      } else if (link.linkType === \"tiktok\") {\n        hasInstaOrBlog = true;\n        processed = true;\n        tiktoks.push(item);\n      }\n    }\n\n    if (!processed) {\n      if (hasInstaOrBlog) {\n        post.push(item);\n      } else {\n        pre.push(item);\n      }\n    }\n  });\n\n  //console.log(pre, post)\n  return (\n    <React.Fragment>\n      <div>\n        <ItemList product={product} section={pre} />\n      </div>\n\n      <div className='blogTiles tiles blogTiles--productView'>\n        <ItemList product={product} section={blogs} />\n      </div>\n\n      <div css={style.instagrams}>\n        <ItemList product={product} section={instagrams} />\n        {empty.map((x) => (\n          <Empty key={x} />\n        ))}\n      </div>\n\n      <div css={style.youtubes} className='testsss'>\n        <ItemList product={product} section={youtubes} />\n        {empty.map((x) => (\n          <Empty key={x} />\n        ))}\n      </div>\n\n      <div css={style.tiktoks}>\n        <ItemList product={product} section={tiktoks} />\n        {empty.map((x) => (\n          <Empty key={x} />\n        ))}\n      </div>\n\n      {/* <div>\n        <ItemList product={product} section={post} />\n      </div> */}\n      <div className='blogTiles tiles blogTiles--productView'>\n        <ItemList product={product} section={post} />\n      </div>\n    </React.Fragment>\n  );\n}\n\n// function ReviewTab({ product }) {\n//   return <div>Coming...</div>\n// }\n\nfunction ItemList({ section }) {\n  return (\n    <React.Fragment>\n      {section.map((item, index) => (\n        <ItemView item={item} key={index} />\n      ))}\n    </React.Fragment>\n  );\n}\n\nfunction ItemView({ item }) {\n  //console.log(item, item.itemTypeCode, item.itemTypeCode === 'html')\n\n  if (item.itemTypeCode === \"html\") {\n    return <div dangerouslySetInnerHTML={{ __html: item.itemValue }}></div>;\n  }\n  if (item.itemTypeCode === \"video\") {\n    const video = JSON.parse(item.itemValue);\n\n    if (video.video) {\n      return (\n        <div className='row video'>\n          <div className='col-md-5'>\n            <YoutubeEmbed url={video.video} title={video.title} />\n          </div>\n          <div className='col-md-7'>\n            <h4>{video.title}</h4>\n            <div dangerouslySetInnerHTML={{ __html: video.desc }}></div>\n          </div>\n        </div>\n      );\n    } else {\n      return (\n        <div className='row video'>\n          <div className='col-12'>\n            <h3>{video.title}</h3>\n            <div dangerouslySetInnerHTML={{ __html: video.desc }}></div>\n          </div>\n        </div>\n      );\n    }\n  }\n  if (item.itemTypeCode === \"link\") {\n    let link = JSON.parse(item.itemValue);\n    let title = link.title;\n    if (!link.title) {\n      title = (link.url || \"\").split(\"/\").pop();\n    }\n    // console.log(link, env.instagramUseFirst);\n\n    if (\n      link.linkType === \"instagram\" ||\n      (link.url && link.url.indexOf(\"instagram.com\") >= 0)\n    ) {\n      return (\n        <div className='productView__linkItem productView__linkItem--instagram'>\n          {env.instagramUseFirst === \"embed\" && link.instagramEmbed ? (\n            <div\n              dangerouslySetInnerHTML={{ __html: link.instagramEmbed }}\n            ></div>\n          ) : link.url ? (\n            // <InstagramEmbed\n            //   url={link.url}\n            //   maxWidth={320}\n            //   hideCaption={true}\n            //   clientAccessToken={env.instagramClientAccessToken}\n            // />\n            <InstaEmbedByLink url={link.url} />\n          ) : null}\n        </div>\n      );\n    }\n\n    if (link.url && link.url.indexOf(\"youtube.com\") >= 0) {\n      var video_item = JSON.parse(item.itemValue);\n      var video_item_split = video_item.url.split(\"/\");\n      var video_id = video_item_split[video_item_split.length - 1];\n      return (\n        <div className='productView__linkItem productView__linkItem--youtube'>\n          <YoutubeEmbedByLink url={video_id} title={video_item.title} />\n        </div>\n      );\n    }\n\n    if (link.linkType === \"tiktok\") {\n      return (\n        <div className='productView__linkItem productView__linkItem--tiktok'>\n          <TiktokEmbedByLink url={link.url} />\n        </div>\n      );\n    }\n\n    if (link.linkType === \"blog\" || link.linkType === \"page\") {\n      return <PageTile page={link} type={\"blog\"} />;\n    }\n    if (link.url && link.url.indexOf(\"http\") < 0) {\n      return (\n        <div>\n          <SiteLink\n            className='productView__linkItem productView__linkItem--page'\n            to={link.url}\n          >\n            {title}\n          </SiteLink>\n        </div>\n      );\n    }\n    if (link.url && link.url.indexOf(\"http\") >= 0 && link.imageUrl) {\n      return (\n        <PageTile\n          page={{\n            imageUrl: link.imageUrl,\n            url: link.url,\n            title: title,\n            tileDesc: \"\", //link.desc\n          }}\n        />\n      );\n    }\n    return (\n      <div>\n        <a\n          className='productView__linkItem'\n          href={link.url}\n          target='_blank'\n          rel='noopener noreferrer'\n        >\n          <IoMdOpen /> {title}\n        </a>\n      </div>\n    );\n  }\n  if (item.itemTypeCode === \"qa\") {\n    const qa = JSON.parse(item.itemValue);\n    return (\n      <div css={style.qa}>\n        <div css={style.qaQuestion}>{qa.question}</div>\n        <div\n          css={style.qaAnswer}\n          dangerouslySetInnerHTML={{ __html: qa.answer }}\n        ></div>\n      </div>\n    );\n  }\n  if (item.itemTypeCode === \"spec\") {\n    const spec = JSON.parse(item.itemValue);\n\n    return (\n      <div>\n        <strong>{spec.label}</strong>: {spec.text}\n      </div>\n    );\n  }\n  return <div></div>;\n}\n\nfunction Empty() {\n  return (\n    <div className='productView__empty'>\n      <div></div>\n    </div>\n  );\n}\n\nfunction PageTile({ page, type = null }) {\n  var checkType = false;\n  if (type && type === \"blog\") {\n    if (page.imageUrl2 && page.imageUrl2 !== \"\") {\n      checkType = true;\n    }\n  }\n\n  const imageUrl = utils.site.resourcePath(\n    checkType === true ? page.imageUrl2 : page.imageUrl\n  );\n\n  return (\n    <div className='blogTile'>\n      <SiteLink className='blogTile__link' to={page.url}>\n        <div\n          className='blogTile__bg'\n          style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}\n        ></div>\n        <div className='blogTile__content'>\n          <div className='blogTile__contentInner'>\n            <div className='blogTile__title'>{page.title}</div>\n            <div className='blogTile__desc'>{page.tileDesc}</div>\n            <div className='blogTile__readMore thinBtn'>READ MORE</div>\n          </div>\n        </div>\n      </SiteLink>\n    </div>\n  );\n}\n","import React, { lazy, Suspense } from \"react\";\nimport { Loading } from \"../../components\";\nimport { ViewPartial } from \"../../cms/pages/partials/viewPartial\";\nconst CurlSecret = lazy(() => import(\"./curlSecret\"));\n\nexport function CurlSecretLoadingV4(props) {\n  return (\n    <div>\n      <Suspense fallback={<Loading />}>\n        <CurlSecret />\n      </Suspense>\n      <div className='curlSecretFooter' id='curlSecretFooter'>\n        <ViewPartial />\n      </div>\n    </div>\n  );\n}\n","import React, { lazy, Suspense } from \"react\";\nimport { Loading } from \"../../components\";\nimport { ViewPartial } from \"../../cms/pages/partials/viewPartial\";\nconst CurlSecret = lazy(() => import(\"./curlSecret\"));\n\nexport function CurlSecretLoadingV4NZ(props) {\n  return (\n    <div>\n      <Suspense fallback={<Loading />}>\n        <CurlSecret />\n      </Suspense>\n      <div className='curlSecretFooter' id='curlSecretFooter'>\n        <ViewPartial />\n      </div>\n    </div>\n  );\n}\n","import React, { lazy, Suspense } from \"react\";\nimport { Loading } from \"../../components\";\nconst CurlSecret = lazy(() => import(\"./curlSecret\"));\n\nexport function CurlSecretLoadingV4QR(props) {\n  return (\n    <div>\n      <Suspense fallback={<Loading />}>\n        <CurlSecret />\n      </Suspense>\n    </div>\n  );\n}\n","import React, { lazy, Suspense } from 'react';\n//import { FrizzDefense } from './frizzDefense';\nimport { Loading } from '../../components';\nimport { ViewPartial } from '../../cms/pages/partials/viewPartial';\nconst FrizzDefense = lazy(() => import('./frizzDefense'));\n\nexport function FrizzDefenseLoading(props) {\n  return <div>\n    <Suspense fallback={<Loading />}>\n     <FrizzDefense />\n    </Suspense>\n    <div className=\"frizzDefenseFooter\">\n      <ViewPartial/>\n    </div>\n  </div>\n}","import React, { lazy, Suspense } from 'react';\n//import { KeratinDefense } from './keratin';\nimport { Loading } from '../../components';\nimport { ViewPartial } from '../../cms/pages/partials/viewPartial';\nconst Keratin = lazy(() => import('./keratin'));\n\nexport function KeratinLoading(props) {\n  return <div>\n    <Suspense fallback={<Loading />}>\n     <Keratin />\n    </Suspense>\n    <div className=\"keratinFooter\">\n      <ViewPartial/>\n    </div>\n  </div>\n}","import React, { lazy, Suspense } from 'react';\n//import { BrillianceDefense } from './brilliance';\nimport { Loading } from '../../components';\nimport { ViewPartial } from '../../cms/pages/partials/viewPartial';\nconst Brilliance = lazy(() => import('./brilliance'));\n\nexport function BrillianceLoading(props) {\n  return <div>\n    <Suspense fallback={<Loading />}>\n     <Brilliance />\n    </Suspense>\n    <div className=\"brillianceFooter\">\n      <ViewPartial pageOptions={{ imagePath: '/dist/brilliance/images/love-your-style-brilliance-banner.jpg' }}/>\n    </div>\n  </div>\n}","import React, { lazy, Suspense } from 'react';\nimport { Loading } from '../../components';\nimport { ViewPartial } from '../../cms/pages/partials/viewPartial';\nconst Brilliance = lazy(() => import('./brilliance'));\n\nexport function BrillianceLoading(props){\n    return(\n        <div>\n            <Suspense fallback={<Loading />}>\n                <Brilliance />\n            </Suspense>\n            <div className=\"brillianceFooter\">\n                <ViewPartial pageOptions={{ imagePath: '/dist/brilliance/images/love-your-style-brilliance-banner.jpg' }}/>\n            </div>\n        </div>\n    )\n}","import React, { lazy, Suspense } from 'react';\nimport { Loading } from '../../components';\nimport { ViewPartial } from '../../cms/pages/partials/viewPartial';\nconst DigitalSensorRange = lazy(() => import('./digitalSensorRange'));\n\nexport function DigitalSensorLoading(props) {\n  return <div>\n    <Suspense fallback={<Loading />}>\n     <DigitalSensorRange />\n    </Suspense>\n    <div className=\"digitalSensorFooter\">\n      <ViewPartial/>\n    </div>\n  </div>\n}","import React, { lazy, Suspense } from 'react';\n//import { UnboundDefense } from './unbound';\nimport { Loading } from '../../components';\n//import { NotFound } from '../../components';\nimport { ViewPartial } from '../../cms/pages/partials/viewPartial';\n//import utils from '../../utils';\n\nconst Unbound = lazy(() => import('./unbound'));\n\nexport function UnboundLoading(props) {\n\n  // if (utils.site.isNZ) {\n  //   return <NotFound />\n  // }\n\n  return <div>\n    <Suspense fallback={<Loading />}>\n     <Unbound />\n    </Suspense>\n    <div className=\"unboundFooter\">\n      <ViewPartial/>\n    </div>\n  </div>\n}","import React, { lazy, Suspense } from 'react';\n//import { UnboundDefense } from './unbound';\nimport { Loading } from '../../components';\n//import { NotFound } from '../../components';\nimport { ViewPartial } from '../../cms/pages/partials/viewPartial';\nimport { Helmet } from \"react-helmet-async\";\n\nconst HydroSmooth = lazy(() => import('./hydroSmooth'));\n//const HydroSmoothAnimation = lazy(() => import('./hydroSmoothAnimation'));\n\nexport function HydroSmoothLoading(props){\n  \n  const schema = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"ItemList\",\n    \"url\": \"https://www.vssassoon.com.au/hydro-smooth\",\n    \"numberOfItems\": \"3\",\n    \"itemListElement\": [\n\t\t  {\n\t\t\t  \"@type\": \"Product\", \n\t\t\t  \"name\": \"HYDRO SMOOTH FAST DRY\",\n\t\t\t  \"description\": \"Coloured, hard-to-manage, moisture-stripped hair? Hydrate & replenish dull, dry hair with the Hydro Smooth Fast Dry's Advanced Plasma Conditioning Ions. The proven technology that leaves hair in better condition so that it feels healthier, glossier, smoother & frizz-free after consistent use.\",\n\t\t\t  \"sku\": \"VSD5573A\",\n        \"url\": \"https://www.vssassoon.com.au/hydro-smooth\",\n\t\t\t  \"brand\": {\n\t\t\t\t  \"@type\": \"Brand\", \n\t\t\t\t  \"name\": \"VS Sassoon\"\n\t\t\t  },\n\t\t\t  \"category\": \"Dryers\",\n\t\t\t  \"image\": [\n\t\t\t\t  \"https://www.vssassoon.com.au/dist/hydroSmooth/images/fast-dryer-anim.gif\",\n\t\t\t\t  \"https://www.vssassoon.com.au/dist/hydroSmooth/images/dryer-table.png\",\n\t\t\t\t  \"https://img.youtube.com/vi/fK6xbSXWIB0/maxresdefault.jpg\"\n\t\t\t  ],\n\t\t\t  \"aggregateRating\": {\n\t\t\t\t  \"@type\": \"AggregateRating\",\n\t\t\t\t  \"ratingValue\": \"4.7\",\n\t\t\t\t  \"ratingCount\": \"88\"\n\t\t\t  },\n\t\t\t  \"offers\": {\n\t\t\t\t  \"@type\": \"Offer\",\n\t\t\t\t  \"priceCurrency\": \"AUD\",\n\t\t\t\t  \"price\": \"99.95\",\n\t\t\t\t  \"availability\": \"https://schema.org/InStock\",\n\t\t\t  }\n\t\t  },\n\t\t  {\n\t\t\t  \"@context\": \"https://schema.org/\", \n\t\t\t  \"@type\": \"Product\", \n\t\t\t  \"name\": \"HYDRO SMOOTH STRAIGHT & CURL\",\n\t\t\t  \"description\": \"Coloured, hard-to-manage, moisture-stripped hair? Hydrate & replenish while you style for perfectly straight or curled results with Hydro Smooth Straight & Curl's Advanced Plasma Conditioning Ions. The proven technology that leaves hair healthier, glossier, smoother & frizz-free after consistent use.\",\n\t\t\t  \"sku\": \"VSS3290A\",\n        \"url\": \"https://www.vssassoon.com.au/hydro-smooth\",\n\t\t\t  \"brand\": {\n\t\t\t\t  \"@type\": \"Brand\", \n\t\t\t\t  \"name\": \"VS Sassoon\"\n\t\t\t  },\n\t\t\t  \"category\": \"Stylers\",\n\t\t\t  \"image\": [\n\t\t\t\t  \"https://www.vssassoon.com.au/dist/hydroSmooth/images/styler.gif\",\n\t\t\t\t  \"https://www.vssassoon.com.au/dist/hydroSmooth/images/styler-table.png\",\n\t\t\t\t  \"https://img.youtube.com/vi/4mZBU2V6TJo/maxresdefault.jpg\"\n\t\t\t  ],\n\t\t\t  \"aggregateRating\": {\n\t\t\t\t  \"@type\": \"AggregateRating\",\n\t\t\t\t  \"ratingValue\": \"3.0\",\n\t\t\t\t  \"ratingCount\": \"27\"\n\t\t\t  },\n\t\t\t  \"offers\": {\n\t\t\t\t  \"@type\": \"Offer\",\n\t\t\t\t  \"priceCurrency\": \"AUD\",\n\t\t\t\t  \"price\": \"89.95\",\n\t\t\t\t  \"availability\": \"https://schema.org/InStock\",\n\t\t\t  }\n\t\t  }\n\t  ]\n  }\n  \n  return(\n    <>\n      <Helmet>\n        <script type=\"application/ld+json\">\n          {JSON.stringify(schema)}\n        </script>\n      </Helmet>\n      <div>\n        <Suspense fallback={<Loading />}>  \n          <HydroSmooth />\n        </Suspense>\n        <div className=\"hydroSmoothFooter\">\n          <ViewPartial pageOptions={{ imagePath: '/dist/hydroSmooth/images/love-your-style-banner-hydro2.jpg' }}/>\n        </div>\n      </div>\n    </>\n  )\n}","import React, { lazy, Suspense } from \"react\";\n//import { UnboundDefense } from './unbound';\nimport { Loading } from \"../../components\";\n//import { NotFound } from '../../components';\nimport { ViewPartial } from \"../../cms/pages/partials/viewPartial\";\nimport { Helmet } from \"react-helmet-async\";\n\nconst HydroSmooth = lazy(() => import(\"./hydroSmooth\"));\n//const HydroSmoothAnimation = lazy(() => import('./hydroSmoothAnimation'));\n\nexport function HydroSmoothLoading(props) {\n\n  const schema = {\n\t\"@context\": \"https://schema.org\",\n    \"@type\": \"ItemList\",\n    \"url\": \"https://www.vssassoon.com.au/hydro-smooth\",\n    \"numberOfItems\": \"3\",\n    \"itemListElement\": [\n\t\t\t{\n\t\t\t\t\"@type\": \"Product\", \n\t\t\t\t\"name\": \"HYDRO SMOOTH 5-IN-1 AIR STYLER\",\n\t\t\t\t\"description\": \"Dry, smooth, straighten, shape & create envious volume with this 5-in-1 hair dryer brush that will transform your locks to the smoothest, softest, bounciest style. With 5 styling attachments, you can change it, smooth it, style it & mix it up, while the Advanced Plasma Conditioning Ions hydrate & replenish dull, dry hair, for healthier, glossier, smoother & frizz-free hair after consistent use.\",\n\t\t\t\t\"sku\": \"VSHA2774A\",\n\t\t\t\t\"url\": \"https://www.vssassoon.com.au/hydro-smooth\",\n\t\t\t\t\"brand\": {\n\t\t\t\t\"@type\": \"Brand\", \n\t\t\t\t\t\"name\": \"VS Sassoon\"\n\t\t\t\t},\n\t\t\t\t\t\"category\": \"Stylers\",\n\t\t\t\t\"image\": [\n\t\t\t\t\t\"https://www.vssassoon.com.au/dist/hydroSmooth/images/groupshot-styler.jpg\",\n\t\t\t\t\t\"https://www.vssassoon.com.au/dist/hydroSmooth/images/styler-anim-comp.gif\",\n\t\t\t\t\t\"https://img.youtube.com/vi/d-qgP51ODaw/maxresdefault.jpg\"\n\t\t\t\t],\n\t\t\t\t\"offers\": {\n\t\t\t\t\t\"@type\": \"Offer\",\n\t\t\t\t\t\"priceCurrency\": \"AUD\",\n\t\t\t\t\t\"price\": \"129.95\",\n\t\t\t\t\t\"availability\": \"https://schema.org/InStock\",\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"@type\": \"Product\", \n\t\t\t\t\"name\": \"HYDRO SMOOTH FAST DRY\",\n\t\t\t\t\"description\": \"Coloured, hard-to-manage, moisture-stripped hair? Hydrate & replenish dull, dry hair with the Hydro Smooth Fast Dry's Advanced Plasma Conditioning Ions. The proven technology that leaves hair in better condition so that it feels healthier, glossier, smoother & frizz-free after consistent use.\",\n\t\t\t\t\"sku\": \"VSD5573A\",\n\t\t\t\t\"url\": \"https://www.vssassoon.com.au/hydro-smooth\",\n\t\t\t\t\"brand\": {\n\t\t\t\t\t\"@type\": \"Brand\", \n\t\t\t\t\t\"name\": \"VS Sassoon\"\n\t\t\t\t},\n\t\t\t\t\"category\": \"Dryers\",\n\t\t\t\t\"image\": [\n\t\t\t\t\t\"https://www.vssassoon.com.au/dist/hydroSmooth/images/fast-dryer-anim.gif\",\n\t\t\t\t\t\"https://www.vssassoon.com.au/dist/hydroSmooth/images/dryer-table.png\",\n\t\t\t\t\t\"https://img.youtube.com/vi/fK6xbSXWIB0/maxresdefault.jpg\"\n\t\t\t\t],\n\t\t\t\t\"aggregateRating\": {\n\t\t\t\t\t\"@type\": \"AggregateRating\",\n\t\t\t\t\t\"ratingValue\": \"4.7\",\n\t\t\t\t\t\"ratingCount\": \"88\"\n\t\t\t\t},\n\t\t\t\t\"offers\": {\n\t\t\t\t\t\"@type\": \"Offer\",\n\t\t\t\t\t\"priceCurrency\": \"AUD\",\n\t\t\t\t\t\"price\": \"99.95\",\n\t\t\t\t\t\"availability\": \"https://schema.org/InStock\",\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"@context\": \"https://schema.org/\", \n\t\t\t\t\"@type\": \"Product\", \n\t\t\t\t\"name\": \"HYDRO SMOOTH STRAIGHT & CURL\",\n\t\t\t\t\"description\": \"Coloured, hard-to-manage, moisture-stripped hair? Hydrate & replenish while you style for perfectly straight or curled results with Hydro Smooth Straight & Curl's Advanced Plasma Conditioning Ions. The proven technology that leaves hair healthier, glossier, smoother & frizz-free after consistent use.\",\n\t\t\t\t\"sku\": \"VSS3290A\",\n\t\t\t\t\"url\": \"https://www.vssassoon.com.au/hydro-smooth\",\n\t\t\t\t\"brand\": {\n\t\t\t\t\t\"@type\": \"Brand\", \n\t\t\t\t\t\"name\": \"VS Sassoon\"\n\t\t\t\t},\n\t\t\t\t\"category\": \"Stylers\",\n\t\t\t\t\"image\": [\n\t\t\t\t\t\"https://www.vssassoon.com.au/dist/hydroSmooth/images/styler.gif\",\n\t\t\t\t\t\"https://www.vssassoon.com.au/dist/hydroSmooth/images/styler-table.png\",\n\t\t\t\t\t\"https://img.youtube.com/vi/4mZBU2V6TJo/maxresdefault.jpg\"\n\t\t\t\t],\n\t\t\t\t\"aggregateRating\": {\n\t\t\t\t\t\"@type\": \"AggregateRating\",\n\t\t\t\t\t\"ratingValue\": \"3.0\",\n\t\t\t\t\t\"ratingCount\": \"27\"\n\t\t\t\t},\n\t\t\t\t\"offers\": {\n\t\t\t\t\t\"@type\": \"Offer\",\n\t\t\t\t\t\"priceCurrency\": \"AUD\",\n\t\t\t\t\t\"price\": \"89.95\",\n\t\t\t\t\t\"availability\": \"https://schema.org/InStock\",\n\t\t\t\t}\n\t\t\t}\n\t\t]\t\n\t}\n  \n  return (\n    <>\n      <Helmet>\n        <script type=\"application/ld+json\">\n          {JSON.stringify(schema)}\n        </script>\n      </Helmet>\n      <div>\n        <Suspense fallback={<Loading />}>\n          <HydroSmooth />\n        </Suspense>\n        <div className=\"hydroSmoothFooter\">\n          <ViewPartial\n            pageOptions={{\n              imagePath:\n                \"/dist/hydroSmooth/images/love-your-style-banner-hydro2.jpg\",\n            }}\n          />\n        </div>\n      </div>\n    </>\n  );\n}","import React, { lazy, Suspense } from 'react';\nimport { Loading } from '../../components';\nimport { ViewPartial } from '../../cms/pages/partials/viewPartial';\nconst Petite = lazy(() => import('./petite'));\n\nexport function PetiteLoading(props){\n    return(\n        <div>\n            <Suspense fallback={<Loading />}>\n                <Petite />\n            </Suspense>\n            <div className=\"petiteFooter\">\n                <ViewPartial/>\n            </div>\n        </div>\n    )\n}","import React, { lazy, Suspense } from 'react';\nimport { Loading } from '../../components';\nimport { ViewPartial } from '../../cms/pages/partials/viewPartial';\nconst Petite = lazy(() => import('./petite'));\n\nexport function PetiteLoadingNz(props){\n    return(\n        <div>\n            <Suspense fallback={<Loading />}>\n                <Petite />\n            </Suspense>\n            <div className=\"petiteFooter\">\n                <ViewPartial/>\n            </div>\n        </div>\n    )\n}","import React, { lazy, Suspense } from 'react';\nimport { Loading } from '../../components';\nimport { ViewPartial } from '../../cms/pages/partials/viewPartial';\nconst ShineLustre = lazy(() => import('./shineLustre'));\n\nexport function ShineLustreLoading(props){\n    return(\n        <div>\n            <Suspense fallback={<Loading />}>\n                <ShineLustre />\n            </Suspense>\n            <div className=\"shineLustreFooter\">\n                <ViewPartial/>\n            </div>\n        </div>\n    )\n}","import React from 'react';\nimport { useStore } from '../../store';\nimport FsLightbox from 'fslightbox-react';\n\nexport function CommonVideoPopup(props) {\n  const { state } = useStore();\n\n  const [toggler, setToggler] = React.useState(false);\n  const [sources, setSources] = React.useState([]);\n  const [popupIndex, setPopupIndex] = React.useState(0);\n\n  const popup = state.popup;\n  //console.log(popup, JSON.stringify((popup && popup.sources) || []), JSON.stringify(sources), (popup && popup.popupIndex), popupIndex)\n  if (JSON.stringify((popup && popup.sources) || []) !== JSON.stringify(sources) ||\n    ((popup && popup.popupIndex) || 0) !== popupIndex) {\n    setSources(popup.sources);\n    setPopupIndex(popup.popupIndex);\n    setTimeout(() => { setToggler(!toggler) }, 10)\n  } else {\n\n  }\n  //console.log(toggler, popupIndex, sources)\n  return (\n    <div className=\"\">\n      <FsLightbox\n\n        toggler={toggler}\n        sources={sources}\n        key={popupIndex}\n        onOpen={(e) => {\n        }}\n      />\n    </div>\n\n  );\n}","import React from 'react';\nimport { useRouter } from './components';\nimport { useHistoryStore } from './components';\nimport { useParallax } from './components';\nimport utils from './utils';\n\nexport function AppRouteChanged() {\n  const { path } = useRouter();\n  const parallax = useParallax();\n  const history = useHistoryStore();\n  \n  React.useLayoutEffect(() => {\n    console.log('route changed', path)\n    if (typeof window !== `undefined`) {\n      parallax.reset();\n      const hash = window.location.hash;\n      history.push({path: path})\n  \n      if (hash) { \n        setTimeout(() => {\n          const anchor = utils.ui.findElement(hash);\n          if (anchor)\n            utils.ui.scrollTo(anchor, 500);\n        }, 500)\n      } else {\n        window.scrollTo(0, 0);\n      }\n    }\n\n    //reset schema\n    const bvRatingSchemaScript = document.getElementById(\"bv-jsonld-bvloader-summary\");\n    const bvReviewSchemaScript = document.getElementById(\"bv-jsonld-reviews-data\");\n    const productSchemaScript = document.getElementById(\"productSchemaScript\");\n\n    if(bvRatingSchemaScript){\n      document.head.removeChild(bvRatingSchemaScript);\n    }\n\n    if(bvReviewSchemaScript){\n      document.head.removeChild(bvReviewSchemaScript);\n    }\n\n    if(productSchemaScript){\n      document.body.removeChild(productSchemaScript);\n    }\n\n    // eslint-disable-next-line\n  }, [path]);\n\n  return null;\n}","import React, { lazy, Suspense } from \"react\";\nimport { Loading } from \"../../components\";\nimport { ViewPartial } from \"../../cms/pages/partials/viewPartial\";\nconst DigitalSensorLuxe = lazy(() => import(\"./digitalSensorLuxe\"));\n\nexport function DigitalSensorLuxeLoading(props) {\n  return (\n    <div>\n      <Suspense fallback={<Loading />}>\n        <DigitalSensorLuxe />\n      </Suspense>\n      <div className=\"digitalSensorLuxeFooter\">\n        <ViewPartial />\n      </div>\n    </div>\n  );\n}\n","import facepaint from \"facepaint\";\nimport { css } from \"@emotion/core\";\nimport { darken } from \"polished\";\nimport { isNumeric } from \"lib/utils-core/text\";\nimport { getScreenSize } from \"lib/animation/animationUtils\";\nimport utils from \"utils\";\n\nconst breakpoints = [700, 1920, 2560];\nconst breakpointNames = [\"small\", \"wide\", \"xwide\"];\n\nconst breakpoints2 = [700, 1200, 1920, 2560];\nconst breakpointNames2 = [\"small\", \"middle\", \"wide\", \"xwide\"];\n\nconst mq = facepaint(breakpoints.map((bp) => `@media (min-width: ${bp}px)`));\n\nconst mqMin = {};\nbreakpointNames.forEach((bp, index) => (mqMin[bp] = `@media (min-width: ${breakpoints[index]}px)`));\n\nconst mqMin2 = {};\nbreakpointNames2.forEach((bp, index) => (mqMin2[bp] = `@media (min-width: ${breakpoints2[index]}px)`));\n\nconst mqMax = {};\nbreakpointNames.forEach((bp, index) => (mqMax[bp] = `@media (max-width: ${breakpoints[index] - 1}px)`));\n\nconst variables = {\n  familyBase: '\"Gotham\",sans-serif',\n  familyHeader: '\"Gotham\",sans-serif',\n  familyDin: '\"DIN Next LT Pro\",serif',\n  color: {\n    bgColor: \"#0c1728\",\n    gold: \"#ac9a63\",\n    darkBlue: \"#0c1728\",\n    lightBrown: \"#f2e5d4\",\n    fontColor: \"#444\",\n  },\n};\n\nfunction mqTransform(fn, ...args) {\n  // console.log(typeof args, args);\n  const ret = [];\n  const arr = args.length === 1 && Array.isArray(args) ? args[0] : args;\n  for (let i = 0; i < arr.length; i++) {\n    if (arr[i] === 0 || arr[i]) {\n      ret[i] = fn(arr[i], i);\n    }\n  }\n  return ret;\n}\n\nfunction getTransformX(value, inx) {\n  // console.log(value, inx);\n  return `translate(${getSize(value, inx)}, 0)`;\n}\n\nfunction getSize(value, inx) {\n  if (isNumeric(value)) return inx === 0 ? remM(value) : rem(value);\n  else return value;\n}\n\nconst mixin = {\n  r: (rem, baseSize = 40) => `calc(${rem} * var(--digitalSensorLuxeBase))`,\n  rem: (px, baseSize = 40) => `calc(${px / baseSize} * var(--digitalSensorLuxeBase))`,\n  remM: (px, baseSize = 20) => `calc(${px / baseSize} * var(--digitalSensorLuxeBase))`,\n  px: (...args) => mqTransform(getSize, args),\n  tx: (...args) => mqTransform(getTransformX, args),\n\n  vh: (v) => `calc(${v} * var(--digitalSensorLuxeVhBase) / 100)`,\n  vw: (v) => `calc(${v} * var(--digitalSensorLuxeVmBase) / 100)`,\n};\n\nconst { rem, remM } = mixin;\nconst base = {\n  h1: css({\n    fontFamily: variables.familyBase,\n    fontSize: rem(96),\n    color: \"black\",\n  }),\n  h2: css({\n    fontFamily: variables.familyBase,\n    fontSize: rem(60),\n    color: \"white\",\n  }),\n  h3: css({\n    fontFamily: variables.familyBase,\n    fontSize: rem(23),\n    color: variables.color.gold,\n  }),\n  button: css({\n    display: \"inline-block\",\n    fontFamily: variables.familyHeader,\n    fontSize: rem(20),\n    fontWeight: \"bold\",\n    background: variables.color.gold,\n    padding: `0.4em 1em`,\n    color: \"white\",\n    transition: \"all 0.3s\",\n    transform: \"skewX(-12deg)\",\n    lineHeight: 1,\n\n    span: {\n      lineHeight: 1,\n      textAlign: \"center\",\n      display: \"inline-block\",\n      transform: \"skewX(12deg)\",\n      width: \"100%\",\n    },\n\n    \"&: hover, &:focus\": {\n      textDecoration: \"none\",\n      color: \"white\",\n      background: darken(0.1, variables.color.gold),\n    },\n  }),\n  mobileOnly: css({\n    [mqMin.small]: {\n      display: \"none\",\n    },\n  }),\n  desktopOnly: css({\n    [mqMax.small]: {\n      display: \"none\",\n    },\n  }),\n};\n\nfunction viewportGuide() {\n  try {\n    return { width: document.querySelector(\".viewportGuide\").offsetWidth, height: document.querySelector(\".viewportGuide\").offsetHeight };\n  } catch (e) {\n    return getScreenSize();\n  }\n}\n\nconst isMobile = () => {\n  var width = utils.css.screenWidth();\n  return width < 700;\n};\nexport { variables, mixin, breakpoints, mq, mqMin, mqMin2, mqMax, base, viewportGuide, isMobile };\n","import { css } from \"@emotion/core\";\n//import { au } from '../../components';\nimport { variables, mixin, mqMin, mq, base } from \"./styles/common\";\n//import { rgba } from 'polished';\n//import utils from '../../utils';\n\nconst { rem, remM } = mixin;\n\nconst sc = {\n  content: {\n    position: \"relative\",\n    zIndex: \"1\",\n    fontSize: remM(16),\n    textAlign: \"left\",\n    //background: variables.color.pannelColor,\n    color: variables.color.pannelColor,\n    //padding: `25px 60px 500px 25px`,\n    overflow: \"hidden\",\n    [mqMin.small]: {\n      fontSize: rem(20),\n      fontWeight: 400,\n      position: \"absolute\",\n      zIndex: \"12\",\n      left: \"50%\",\n    },\n  },\n  header: css(base.h2, {\n    color: variables.color.pannelColor,\n    fontSize: remM(22),\n    [mqMin.small]: {\n      fontSize: rem(36),\n    },\n  }),\n  subHeader: css(base.h3, {\n    color: variables.color.pannelColor,\n    fontSize: remM(18),\n    marginBottom: rem(25),\n    [mqMin.small]: {\n      fontSize: rem(21),\n    },\n  }),\n  button: css(base.button, {\n    marginTop: 10,\n    fontSize: remM(20),\n    //padding: `${rem(4)}, ${rem(15)}`,\n    [mqMin.small]: {\n      marginTop: rem(10),\n      fontSize: rem(28),\n      letterSpacing: \"1px\",\n    },\n  }),\n  product: css({\n    pointerEvents: \"none\",\n    position: \"absolute\",\n    zIndex: 13,\n    left: \"50%\",\n  }),\n  package: css({\n    pointerEvents: \"none\",\n    width: 200,\n    [mqMin.small]: {\n      width: rem(365),\n      position: \"absolute\",\n      //marginBottom: rem(20)\n    },\n  }),\n};\n\nconst videoCommon = {\n  videoContainer: css({\n    position: \"relative\",\n    marginBottom: rem(20),\n  }),\n  playIcon: css({\n    position: \"absolute\",\n    left: \"50%\",\n    top: \"50%\",\n    transform: \"translate(-50%, -50%)\",\n    zIndex: 1,\n    width: rem(100),\n    height: rem(100),\n    color: \"white\",\n    pointerEvents: \"none\",\n    cursor: \"pointer\",\n  }),\n};\n\nconst parallax = {\n  panel: css(\n    mq({\n      height: [200, 570],\n      backgroundPositionX: \"center\",\n      backgroundRepeat: \"no-repeat\",\n      backgroundImage: \"url(/dist/unbound/images/Lifestyle_Vanity_HD.jpg)\",\n    })\n  ),\n};\n\nexport default {\n  landingPage: css({\n    // overflow: \"hidden\",\n    //background: variables.color.bgColor,\n    background: \"black\",\n    fontFamily: \"Gotham\",\n    fontSize: rem(20),\n    fontWeight: 400,\n    img: {\n      width: \"100%\",\n    },\n  }),\n  container: css({\n    maxWidth: \"2560px\",\n    overflow: \"hidden\",\n    margin: \"auto\",\n  }),\n  container2: css({\n    maxWidth: \"2560px\",\n    overflow: \"hidden\",\n    margin: \"auto\",\n  }),\n  notes: mq({\n    fontSize: [remM(13), rem(15)],\n  }),\n  parallax,\n  sc,\n  videoCommon,\n  base,\n  variables: variables,\n};\n","import React, { useState, useRef } from \"react\";\nimport utils from \"../../utils\";\nimport { debounce } from \"../../lib/utils-core/debounce\";\nimport * as yt from \"./iframeApi\";\nimport { FiVolumeX, FiVolume2 } from \"react-icons/fi\";\nimport { FaRegPlayCircle } from \"react-icons/fa\";\nimport ModalVideo from \"react-modal-video\";\n\nexport function YoutubeBannerMobilePopup(props) {\n  const youtubeBannerRef = React.useRef(null);\n\n  const [playerStatus, setPlayerStatus] = useState(\"loading\");\n  const [playerSize, setPlayerSize] = useState(null);\n  const [ytPlayer, setYtPlayer] = useState(null);\n  const [muted, setMuted] = useState(true);\n  const countPlayedRef = useRef(0);\n  const [popupOpened, setPopupOpened] = useState(false);\n  const { heightSet, videoLinkOrId, playerId } = props.video;\n  const videoId = yt.getYoutubeCode(videoLinkOrId);\n  //const posterImageUrl = yt.thumbnailMax(videoId);\n  const posterImageUrl = props.posterImageUrl && props.posterImageUrl !== \"\" ? props.posterImageUrl : yt.thumbnailMax(videoId);\n  const mobileImageUrl = props.mobileImageUrl;\n  //let countPlayed = 0;\n  const canPlayVideo = () => true;\n  const testOpt = window.localStorage.getItem(\"youtubeTestOpt\") ?? \"1\";\n  console.log(`testOpt: ${testOpt}`);\n\n  const playerVars = {\n    enablejsapi: 1,\n    autoplay: 1,\n    mute: 1,\n    controls: 0,\n    loop: 1,\n    showinfo: 0,\n    rel: 0,\n    modestbranding: 1,\n    //'origin': typeof window !== `undefined` && window.location.origin,\n    allowfullscreen: true,\n    wmode: \"transparent\",\n  };\n\n  //console.log('videoId: ' + videoId)\n  //const canPlayVideo = () => window.innerWidth >= 1200\n  React.useEffect(() => {\n    const resized = debounce(() => {\n      loadVideo();\n    });\n    loadVideo();\n    if (typeof window !== `undefined`) window.addEventListener(\"resize\", resized);\n    return () => {\n      if (typeof window !== `undefined`) window.removeEventListener(\"resize\", resized);\n    };\n    // eslint-disable-next-line\n  }, []);\n\n  function loadVideo() {\n    if (youtubeBannerRef.current) setPlayerSize(getSize(youtubeBannerRef.current, props.sizeCalculator));\n    if (canPlayVideo()) {\n      yt.loadApi((loadJs) => {\n        loadJs ? init() : setTimeout(init, 100);\n      });\n    }\n  }\n\n  function init() {\n    let player = null;\n    if (typeof window !== `undefined`) {\n      player = new window.YT.Player(playerId, {\n        events: {\n          onStateChange: (e) => {\n            console.log(\"onStateChange\", e, countPlayedRef.current);\n            switch (e.data) {\n              // case window.YT.PlayerState.PLAYING:\n              //   break;\n              // case window.YT.PlayerState.PAUSED:\n              //   break;\n              case window.YT.PlayerState.ENDED:\n                const countPlayed = countPlayedRef.current;\n                if (countPlayed < 3 - 1) {\n                  console.log(\"ended\", countPlayed + 1);\n                  countPlayedRef.current = countPlayed + 1;\n                  if (player && player.playVideo) {\n                    player.playVideo();\n                  } else {\n                    setPlayerStatus(\"finished\");\n                  }\n                } else {\n                  setPlayerStatus(\"finished\");\n                }\n                break;\n              default:\n            }\n          },\n          onReady: (e) => {\n            console.log(\"onReady\", e);\n            if (testOpt !== \"1\") {\n              if (player && player.mute && player.playVideo) {\n                player.mute();\n                player.playVideo();\n              }\n            }\n            setTimeout(() => setPlayerStatus(\"loaded\"), 1000);\n          },\n          onError: (e) => {\n            console.log(\"onError\", e);\n            console.log(e);\n          },\n        },\n      });\n\n      setYtPlayer(player);\n    }\n  }\n\n  function soundToggle(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    if (ytPlayer) {\n      if (muted) {\n        setMuted(false);\n        setTimeout(() => {\n          if (ytPlayer && ytPlayer.pauseVideo && ytPlayer.unMute && ytPlayer.playVideo) {\n            ytPlayer.pauseVideo();\n            ytPlayer.unMute();\n            ytPlayer.playVideo();\n          }\n        }, 100);\n      } else {\n        setMuted(true);\n        setTimeout(() => {\n          if (ytPlayer && ytPlayer.pauseVideo && ytPlayer.unMute && ytPlayer.playVideo) {\n            ytPlayer.pauseVideo();\n            ytPlayer.mute();\n            ytPlayer.playVideo();\n          }\n        }, 100);\n      }\n    }\n\n    //https://developers.google.com/web/updates/2017/09/autoplay-policy-changes\n  }\n\n  function playVideo() {\n    setPopupOpened(true);\n  }\n\n  function getSize(container, sizeCalculator) {\n    const containerSize = container ? { w: container.offsetWidth, h: container.offsetHeight } : { w: window.innerWidth, h: window.innerHeight };\n    if (sizeCalculator) {\n      const size = sizeCalculator(containerSize, canPlayVideo());\n      if (size) return size;\n    }\n\n    const overSize = 1;\n    const rate = 9 / 16;\n    const w = containerSize.w * overSize;\n    const h = containerSize.h * overSize;\n    const size = { width: w, height: w * rate, left: 0, top: 0 };\n    if (size.height < h) {\n      // stretch horizontally\n      size.height = h;\n      size.width = h / rate;\n    }\n\n    //console.log(size)\n    size.left = -(size.width - containerSize.w) / 2;\n    size.top = -(size.height - containerSize.h) / 2;\n    return size;\n  }\n\n  const canPlay = canPlayVideo();\n  const imageUrl = !canPlay && mobileImageUrl ? mobileImageUrl : posterImageUrl;\n  return (\n    <React.Fragment>\n      <div\n        className={utils.classNames(\n          \"youtubePlayer\",\n          `youtubePlayer--${canPlay ? \"canPlay\" : \"cannotPlay\"}`,\n          `youtubePlayer--${playerStatus}`,\n          `youtubePlayer--${heightSet}`\n        )}\n        ref={youtubeBannerRef}\n      >\n        <div className=\"youtubePlayer__mask\"></div>\n        <div className=\"youtubePlayer__poster\" style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}></div>\n        {canPlay && playerSize && (\n          <iframe\n            className=\"youtubePlayer__iframe\"\n            id={playerId}\n            width=\"640\"\n            height=\"390\"\n            title=\"Youtube video\"\n            style={{ width: `${playerSize.width}px`, height: `${playerSize.height}px`, top: `${playerSize.top}px`, left: `${playerSize.left}px` }}\n            src={`https://www.youtube.com/embed/${videoId}?${utils.url.toQueryString(playerVars)}`}\n            allow=\"autoplay; fullscreen\"\n            frameBorder=\"0\"\n          ></iframe>\n        )}\n        {canPlay && playerStatus === \"loaded\" && (\n          <div className=\"youtubePlayer__soundIcon\" title={muted ? \"Sound On\" : \"Sound Off\"} onClick={soundToggle}>\n            {muted ? <FiVolume2 /> : <FiVolumeX />}\n          </div>\n        )}\n\n        {!canPlay && !mobileImageUrl && (\n          <div className=\"youtubePlayer__playIcon\" title=\"Play\" onClick={playVideo}>\n            <FaRegPlayCircle />\n          </div>\n        )}\n      </div>\n      <ModalVideo channel=\"youtube\" isOpen={popupOpened} videoId={videoId} onClose={() => setPopupOpened(false)} />\n    </React.Fragment>\n  );\n}\n","import utils from '../../utils';\n\nexport function loadApi(onApiReady) {\n  if (typeof window !== `undefined` && !window.YT) { // If not, load the script asynchronously\n    const tag = document.createElement('script');\n    tag.src = 'https://www.youtube.com/iframe_api';\n\n    // onYouTubeIframeAPIReady will load the video after the script is loaded\n    window.onYouTubeIframeAPIReady = () => onApiReady(true);\n\n    const firstScriptTag = document.getElementsByTagName('script')[0];\n    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n  } else { // If script is already there, load the video directly\n    onApiReady(false);\n  }\n}\n\n// export function player(playerId, videoId, playerVars = {}, events = {}) {\n//   //let player = null;\n//   const defaultPlayerVars = {\n//     'autoplay': 1,\n//     'controls': 0,\n//     'loop': 1,\n//     'showinfo': 0,\n//     'rel': 0,\n//     'modestbranding': 1,\n//     'origin': window.location.origin,\n//     'allowfullscreen': true,\n//     'wmode': 'transparent'\n//   }\n//   const defaultEvents = {\n//     'onStateChange': (e) => { },\n//     'onReady': (e) => { console.log('onReady'); player.mute() },\n//     'onError': (e) => { console.log(e) }\n//   }\n\n//   const player = new window.YT.Player(playerId, {\n//     videoId: videoId,\n//     playerVars: Object.assign({}, defaultPlayerVars, playerVars),\n//     events: Object.assign({}, defaultEvents, events),\n//   });\n//   return player;\n// }\n\nexport function thumbnailMax(videoId){\n  return `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`\n}\n\n// onPlayerStateChange(event){\n//   switch (event.data){\n//     case window['YT'].PlayerState.PLAYING:\n//       //console.log('Playing');\n//       //this.player.mute();\n//       break;\n//     case window['YT'].PlayerState.PAUSED:\n//       //console.log('Pafdsu');\n//       break;\n//     case window['YT'].PlayerState.ENDED:\n//       //console.log('ended ');\n//       //this.player.playVideo();\n//       this.player.stopVideo();\n//       break;\n//   }\n// }\n\n// toggleBannerYoutueInCMS(toggleItem:string){ \n//   if(toggleItem == 'youtube'){\n//     //location.reload();\n//     this.toggleBannerOrYoutube = toggleItem;\n//     this.player.playVideo();\n//     this.init();\n//   }\n//   else{\n//     this.toggleBannerOrYoutube = toggleItem;\n//     this.player.stopVideo();\n//   }\n// }\n\n\nexport function getYoutubeCode(src) {\n  // if (src.indexOf('http') >= 0) {\n  //   if (src.indexOf('v=') >= 0) {\n  //     return src.split('v=')[1];\n  //   }\n  // }\n  // return src;\n  return utils.url.getYoutubeId(src);\n}","/** @jsx jsx */\nimport { jsx, css } from \"@emotion/core\";\nimport { mixin, mq } from \"./styles/common\";\n\nimport utils from \"utils\";\nimport { YoutubeBannerMobilePopup } from \"./youtubeBanner--mobilePopup\";\n\nconst { px } = mixin;\n\nexport function VideoPanel({ style, openVideo }) {\n  const ss = getSectionStyle(style);\n\n  const video = {\n    heightSet: \"full\",\n    videoLinkOrId: \"https://www.youtube.com/watch?v=Qw4BJHabHIk\",\n    playerId: \"ytBanner-digitalSensorLuxe\",\n  };\n\n  function testOption(opt) {\n    window.localStorage.setItem(\"youtubeTestOpt\", opt);\n    window.location.reload();\n  }\n\n  const mobileImageUrl = \"/dist/digitalSensorLuxe/new/video-poster-frame.jpg\";\n  const posterImageUrl = \"/dist/digitalSensorLuxe/new/video-poster-frame.jpg\";\n  const canPlayVideo = () => utils.css.screenWidth() >= 1200;\n  return (\n    <section css={ss.section} className=\"youtubeVideoPanel_digitalSensor\">\n      <div css={ss.content}>\n        <YoutubeBannerMobilePopup\n          video={video}\n          canPlayVideo={canPlayVideo()}\n          mobileImageUrl={mobileImageUrl}\n          posterImageUrl={posterImageUrl}\n          sizeCalculator={getSize}\n        />\n\n        <div style={{ margin: \"20px 0\", background: \"white\", padding: \"10px\", fontSize: \"14px\" }}>\n          <button onClick={() => testOption(1)}>1. Iframe-def</button>\n          <button onClick={() => testOption(2)} style={{ marginLeft: \"5px\" }}>\n            2. Js-auto\n          </button>\n        </div>\n\n        <video autoPlay loop muted playsInline>\n          <source src=\"/dist/test.mp4\" type=\"video/mp4\" />\n        </video>\n      </div>\n    </section>\n  );\n}\n\nfunction getSectionStyle(style) {\n  const sectionStyle = {\n    section: css(\n      mq({\n        backgroundColor: \"black\",\n        paddingTop: [0],\n        paddingBottom: [0],\n      })\n    ),\n    content: css({\n      marginBottom: px(0, 0),\n    }),\n  };\n  return sectionStyle;\n}\n\nfunction getSize(containerSize, canPlayVideo) {\n  if (window.innerWidth < 1200) return false;\n  if (!canPlayVideo) return false;\n  const overSize = 1;\n  const videoRatio = 9 / 16;\n\n  const bottomHeight = getBottomHeight();\n\n  //min Height\n  // if(window.innerWidth >= 2560 && containerSize.h <= 460){\n  //   containerSize.h = 460;\n  // }\n  // else{\n  //   containerSize.h -= bottomHeight;\n  // }\n\n  console.log(\"containerSize\", containerSize);\n\n  //document.querySelector(\".youtubeVideoPanel_digitalSensor .youtubePlayer\").style.height = containerSize.h + \"px\";\n  document.querySelector(\".youtubeVideoPanel_digitalSensor .youtubePlayer\").style.height = \"calc(100vh - \" + bottomHeight + \"px)\";\n\n  const containerRatio = containerSize.h / containerSize.w;\n  const w = containerSize.w * overSize;\n  const h = containerSize.h * overSize;\n  const size = { width: w, height: w * videoRatio, left: 0, top: 0 };\n\n  if (containerRatio < videoRatio) {\n    // console.log(\"wide\");\n    // wide screen --> set height as base\n    size.height = h;\n    size.width = h / videoRatio;\n  } else {\n    // console.log(\"square\");\n    // square screen --> set width as base\n    size.height = w * videoRatio;\n    size.width = w;\n  }\n\n  // console.log(size, w, h, videoRatio, containerRatio);\n\n  //console.log(size)\n  size.left = -(size.width - containerSize.w) / 2;\n  size.top = -(size.height - containerSize.h) / 2;\n\n  return size;\n}\n\nfunction getBottomHeight() {\n  try {\n    return (\n      // document.querySelector(\".bottomMenu\").offsetHeight +\n      document.querySelector(\".bottomMenu__bar\").offsetHeight +\n      document.querySelector(\".topNav\").offsetHeight +\n      document.querySelector(\".bottomMenuPadding\").offsetHeight\n    );\n  } catch (e) {}\n  return 100;\n}\n","/** @jsx jsx */\nimport { jsx } from \"@emotion/core\";\nimport style from \"./digitalSensorLuxeStyle\";\n\nimport \"./scss/index.scss\";\n\nimport { VideoPanel } from \"./videoPanel\";\n\nexport default function YoutubeTest() {\n  //const popupImages = [\"https://www.youtube.com/watch?v=Qw4BJHabHIk\"];\n\n  function openVideo(index) {}\n\n  return (\n    <div className=\"digitalSensorLuxeLanding\" css={style.landingPage}>\n      <div css={style.container}>\n        <VideoPanel style={style} openVideo={openVideo} />\n      </div>\n    </div>\n  );\n}\n","import React from \"react\";\nimport {\n  BrowserRouter as Router,\n  Switch,\n  Route,\n  Redirect,\n} from \"react-router-dom\";\nimport { useRouter } from \"./components\";\nimport { StoreProvider } from \"./store\";\nimport { ViewPage } from \"./cms/pages/viewPage/viewPage\";\nimport { EditPage } from \"./cms/pages/editPage/editPage\";\nimport { TopHeader } from \"./layout/topHeader/topHeader2\";\nimport { TopHeaderQR } from \"./layout/topHeaderQR/topHeaderQR\";\n//import { Footer } from './layout/footer/footer';\nimport { BottomDock } from \"./layout/bottomDock/bottomDock\";\nimport { ProductView } from \"./site/product/productView\";\nimport { DiscontinuedProductView } from \"./site/discontinuedProduct/productView\";\n// import { ProductView as ProductViewTest } from './site/product/productView-test';\n// import { BlogView } from './site/blog/blogView';\nimport { useScrollPosition } from \"@n8tb1t/use-scroll-position\";\n//import { useParallax } from './components';\nimport { AppVersionPage } from \"./components\";\nimport { MediaQueryStatus } from \"./components\";\n\n// import { CurlSecretLoading } from \"./site/curlSecret/curlSecretLoading\";\n// import { CurlSecretLoadingV2 } from \"./site/curlSecretV2/curlSecretLoadingV2\";\n// import { CurlSecretLoadingV2QR } from \"./site/curlSecretV2QR/curlSecretLoadingV2QR\";\n// import { CurlSecretLoadingV2NZ } from \"site/curlSecretV2NZ/curlSecretLoadingV2\";\n// import { CurlSecretLoadingV3 } from \"site/curlSecretV3/curlSecretLoadingV3\";\n// import { CurlSecretLoadingV3QR } from \"site/curlSecretV3QRCode/curlSecretLoadingV3QR\";\nimport { CurlSecretLoadingV4 } from \"site/curlSecretV4/curlSecretLoadingV4\";\nimport { CurlSecretLoadingV4NZ } from \"site/curlSecretV4NZ/curlSecretLoadingV4\";\nimport { CurlSecretLoadingV4QR } from \"site/curlSecretV4QRCode/curlSecretLoadingV4QR\";\n\nimport { FrizzDefenseLoading } from \"./site/frizzDefense/frizzDefenseLoading\";\nimport { KeratinLoading } from \"./site/keratin/keratinLoading\";\n//import { BrillianceLoading } from './site/brilliance/brillianceLoading';\nimport { BrillianceLoading as BrillianceLoadingV2 } from \"./site/brillianceV2/brillianceLoading\";\nimport { BrillianceLoading as BrillianceLoading2 } from \"./site/brilliance2/brillianceLoading2\";\nimport { DigitalSensorLoading } from \"./site/digitalSensor/digitalSensorLoading\";\nimport { UnboundLoading } from \"./site/unbound/unboundLoading\";\n\nimport { HydroSmoothLoading } from \"./site/hydroSmooth/hydroSmoothLoading\";\nimport { HydroSmoothLoading as HydroSmoothLoadingV2 } from \"./site/hydroSmoothV2/hydroSmoothLoading\";\n\nimport { PetiteLoading } from \"./site/petite/petiteLoading\";\nimport { PetiteLoadingNz } from \"site/petiteNz/petiteLoadingNz\";\nimport { ShineLustreLoading } from \"./site/shineLustre/shineLustreLoading\";\n\nimport { CommonVideoPopup } from \"./layout/popup/commonVideoPopup\";\nimport { HelmetProvider } from \"react-helmet-async\";\nimport { AppRouteChanged } from \"./AppRouteChanged\";\nimport { checkUpdate } from \"./lib/service-worker/swHelper\";\nimport { DigitalSensorLuxeLoading } from \"./site/digitalSensorLuxe/digitalSensorLuxeLoading\";\nimport YoutubeTest from \"site/youtube-test/digitalSensorLuxe\";\nimport utils from \"./utils\";\n\nfunction AppLayout(props) {\n  const { pathname } = useRouter();\n  console.log(\"pathname\", pathname);\n\n  React.useEffect(() => {\n    const fetchData = async () => {\n      await checkUpdate();\n    };\n    fetchData();\n  }, [pathname]);\n\n  //const [scrolled, setScrolled] = useState(false)\n  //const path = usePath();\n  //const routeResult = useRoutes(routes);\n\n  // const parallax = useParallax();\n  // //console.log(path, routeResult);\n  // const routeChanged = (path) => {\n  //   //console.log(path);\n  //   parallax.reset();\n  // }\n\n  useScrollPosition(\n    ({ prevPos, currPos }) => {\n      //console.log(currPos.x)\n      //console.log(currPos.y);\n      if (currPos.y > 90) {\n        document.querySelector(\"body\").classList.add(\"scrolled\");\n      } else {\n        document.querySelector(\"body\").classList.remove(\"scrolled\");\n      }\n      //setScrolled(currPos.y > 90)\n    },\n    [],\n    null,\n    true\n  );\n\n  //const pageChanged = useCallback(path => routeChanged(path), [])\n  //useLocationChange((path) => { routeChanged(path, history)})\n  //useLocationChange(path => routeChanged(path))\n  const pathFiltered = (pathname || \"\").toLocaleLowerCase();\n\n  let specialClassName = \"\";\n  if (\n    pathFiltered === \"/digital-sensor-luxe\" ||\n    pathFiltered === \"/digital-sensor-luxe-test\"\n  )\n    specialClassName = \"digital-sensor-luxe-page\";\n  else if (pathFiltered.indexOf(\"/digital-sensor\") >= 0)\n    specialClassName = \"digital-sensor-page\";\n  else if (pathFiltered === \"/brilliance\") specialClassName = \"brilliance-page\";\n  else if (pathFiltered === \"/brilliance-test\")\n    specialClassName = \"brilliance-page\";\n  else if (\n    pathFiltered === \"/curl-secret\" ||\n    pathFiltered === \"/curl-secret-stg-au\" ||\n    pathFiltered === \"/curl-secret-stg-nz\"\n  )\n    specialClassName = \"curl-secret-page\";\n  else if (\n    pathFiltered === \"/curl-secret-qrcode\" ||\n    pathFiltered === \"/curl-secret-stg-qrcode\"\n  )\n    specialClassName = \"curl-secret-qrcode-page\";\n  else if (pathFiltered === \"/unbound\") specialClassName = \"unbound-page\";\n  else if (\n    pathFiltered === \"/hydro-smooth\" ||\n    pathFiltered === \"/hydro-smooth-stg\"\n  )\n    specialClassName = \"hydroSmooth-page\";\n  else if (pathFiltered === \"/steam-straight-brilliance\")\n    specialClassName = \"steam-straight-brilliance-page\";\n  else if (pathFiltered === \"/shine-lustre-test\")\n    specialClassName = \"shine-lustre-page\";\n\n  if (\n    pathname.includes(\"/products/curlers/\") ||\n    pathname.includes(\"/products/dryers/\") ||\n    pathname.includes(\"/products/straighteners/\") ||\n    pathname.includes(\"/products/stylers/\")\n  ) {\n    const _pathName = pathname\n      .replace(\"/curlers/\", \"/\")\n      .replace(\"/dryers/\", \"/\")\n      .replace(\"/straighteners/\", \"/\")\n      .replace(\"/stylers/\", \"/\");\n    return <Redirect to={{ pathname: _pathName, state: { status: 301 } }} />;\n  }\n\n  if (!utils.site.isNZ && pathname === \"/curl-secret-qrcode\") {\n    return (\n      <div className={`body-content subpage ${specialClassName}`}>\n        <TopHeaderQR></TopHeaderQR>\n        <div className='main-content'>\n          <div className='app-content'>\n            <CurlSecretLoadingV4QR />\n          </div>\n        </div>\n      </div>\n    );\n  } else if (!utils.site.isNZ && pathname === \"/curl-secret-stg-qrcode\") {\n    return (\n      <div className={`body-content subpage ${specialClassName}`}>\n        <TopHeaderQR></TopHeaderQR>\n        <div className='main-content'>\n          <div className='app-content'>\n            <CurlSecretLoadingV4QR />\n          </div>\n        </div>\n      </div>\n    );\n  } else {\n    return (\n      <div\n        className={`body-content ${\n          pathname === \"/\" ? \"homepage\" : \"subpage\"\n        } ${specialClassName}`}\n      >\n        <AppRouteChanged />\n        <TopHeader></TopHeader>\n        <div className='main-content'>\n          <div className='app-content'>\n            <Switch>\n              <Route path='/ver' children={<AppVersionPage />} />\n              <Route path='/cms/page/render/:id' children={<EditPage />} />\n              <Route path='/product/:id' children={<ProductView />} />\n              {/* <Route path='/products/:category/:slug/test' children={<ProductViewTest />} /> */}\n\n              <Route\n                path='/products/:category/:slug'\n                children={<ProductView />}\n              />\n              <Route path='/products/:slug' children={<ProductView />} />\n\n              <Route path='/discontinued-products/:id' children={<DiscontinuedProductView />} />\n              <Route path='/discontinued-products/:category/:slug' children={<DiscontinuedProductView />} />\n              <Route path='/discontinued-products/:slug' children={<DiscontinuedProductView />} />\n\n              {/* <Route path=\"/straighteners/:subCategory/:slug\" children={<ProductView />} /> */}\n              {/* <Route path=\"/dryers/:subCategory/:slug\" children={<ProductView />} />\n              <Route path=\"/curlers/:subCategory/:slug\" children={<ProductView />} /> */}\n\n              {/* <Route path=\"/blog/:id\" children={<BlogView />} /> */}\n\n              {!utils.site.isNZ && (\n                <Route path='/curl-secret' children={<CurlSecretLoadingV4 />} />\n              )}\n\n              {utils.site.isNZ && (\n                <Route\n                  path='/curl-secret'\n                  children={<CurlSecretLoadingV4NZ />}\n                />\n              )}\n              {/* NZ - for presenting */}\n              {/* {!utils.site.isNZ && (\n                <Route\n                  path='/curl-secret-stg-nz'\n                  children={<CurlSecretLoadingV4NZ />}\n                />\n              )} */}\n\n              {/* {!utils.site.isNZ && (\n                <Route\n                  path='/curl-secret-stg-au'\n                  children={<CurlSecretLoadingV4 />}\n                />\n              )} */}\n\n              {/* <Route path=\"/curl-secret-stg\" children={<CurlSecretLoadingV2 />} /> */}\n              <Route path='/frizz-defense' children={<FrizzDefenseLoading />} />\n              <Route path='/keratin' children={<KeratinLoading />} />\n              <Route path='/keratin-protect' children={<KeratinLoading />} />\n              {/* <Route path='/brilliance' children={<BrillianceLoading />} /> */}\n              <Route path='/brilliance' children={<BrillianceLoadingV2 />} />\n              <Route\n                path='/steam-straight-brilliance'\n                children={<BrillianceLoading2 />}\n              />\n              <Route\n                path='/digital-sensor-luxe'\n                children={<DigitalSensorLuxeLoading />}\n              />\n              <Route\n                path='/digital-sensor-range'\n                children={<DigitalSensorLoading />}\n              />\n              <Route\n                path='/digital-sensor'\n                children={<DigitalSensorLoading />}\n              />\n              <Route path='/unbound' children={<UnboundLoading />} />\n\n              {/* <Route path=\"/hydro-smooth\" children={<HydroSmoothLoading />} />\n              <Route path=\"/hydro-smooth-stg\" children={<HydroSmoothLoadingV2 />} /> */}\n\n              <Route\n                path='/hydro-smooth'\n                children={\n                  utils.site.isNZ ? (\n                    <HydroSmoothLoading />\n                  ) : (\n                    <HydroSmoothLoadingV2 />\n                  )\n                }\n              />\n\n              <Route path='/petite' children={<PetiteLoadingNz />} />\n\n              {/*<Route path='/petite-stg-nz' children={<PetiteLoadingNz />} />*/}\n              \n              <Route path='/shine-lustre' children={<ShineLustreLoading />} />\n              <Route path='/youtube-test' children={<YoutubeTest />} />\n\n              <Route path='/admin'>\n                <Redirect to='/admin' />\n              </Route>\n              <Route path='/'>\n                <ViewPage />\n              </Route>\n            </Switch>\n          </div>\n          {/* <app-common-bottom-partial></app-common-bottom-partial> */}\n        </div>\n        {/* <Footer></Footer> */}\n        <BottomDock></BottomDock>\n        <MediaQueryStatus />\n        <CommonVideoPopup />\n      </div>\n    );\n  }\n}\n\nfunction App() {\n  return (\n    <StoreProvider>\n      <HelmetProvider>\n        <Router>\n          <AppLayout />\n        </Router>\n      </HelmetProvider>\n    </StoreProvider>\n  );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.0/8 are considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\nlet serviceUpdateCheckerInterval = null;\n\nexport function register(config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit https://bit.ly/CRA-PWA'\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl, config) {\n  navigator.serviceWorker\n    .register(swUrl, {updateViaCache: 'none'})\n    .then(async registration => {\n      // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration\n      console.log('Service Worker registration successful with scope: ', registration.scope);\n      if (registration && registration.waiting) {\n        registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n      }\n      \n      // Regular checking service worker\n      if (serviceUpdateCheckerInterval) { try { clearInterval(serviceUpdateCheckerInterval) } catch (e) { } }\n      serviceUpdateCheckerInterval = setInterval(() => {\n        console.log('Checking SW updates...')\n        registration.update();\n      }, 1/*hour(s)*/ * 10/*minutes*/ * 60 * 1000);\n\n      window.updateSW = function() {\n        console.log('Checking SW updates... (force)')\n        return registration.update();\n      }\n      \n      // When the user asks to refresh the UI, we'll need to reload the window\n      var preventDevToolsReloadLoop = false;\n      \n      const oldSw = (await navigator.serviceWorker.getRegistration())?.active?.state;\n      console.log(oldSw, registration)\n      navigator.serviceWorker.addEventListener('controllerchange', async function (ev) {\n        const newSw = (await navigator.serviceWorker.getRegistration())?.active?.state;\n        console.log('Service Worker controller change', ev)\n        console.log(oldSw, newSw)\n        // Ensure refresh is only called once.\n        // This works around a bug in \"force update on reload\".\n        if (preventDevToolsReloadLoop) return;\n        \n\n        if(oldSw === 'activated' && newSw === 'activating') {\n          preventDevToolsReloadLoop = true;\n          console.log('Reloading...')\n          window.location.reload();\n        }\n\n        //window.location.reload();\n      });\n\n      registration.onupdatefound = () => {\n        console.log('registration.onupdatefound', registration.installing)\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                'New content is available and will be used when all ' +\n                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: { 'Service-Worker': 'script' }\n  })\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type');\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            console.log('Reloading... No SW found')\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n","import 'react-app-polyfill/ie11';\nimport 'react-app-polyfill/stable';\nimport './polyfill';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport './_scss/index.scss';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\nimport { forceUpdateFlagged, markUpdate } from './lib/service-worker/swHelper';\n\nReactDOM.render(<App />, document.getElementById('root'));\n//ReactDOM.hydrate(<App />, document.getElementById('root'));\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.register({\n  onUpdate: (registration) => {\n    console.log('updated', registration, forceUpdateFlagged());\n    const update = true;//window.confirm('New Update Available. Do you want to update? (Refresh page)');\n    if (update){\n      if (!registration.waiting) {\n        // Just to ensure registration.waiting is available before calling postMessage()\n        return;\n      }\n\n      if (forceUpdateFlagged()) {\n        registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n      } else {\n        // update when navigate to a different page.\n        markUpdate();\n      }\n \n    }\n  }\n});\n","import utils from '../../utils';\r\n\r\nexport function loadApi(onApiReady) {\r\n  if (typeof window !== `undefined` && !window.YT) { // If not, load the script asynchronously\r\n    const tag = document.createElement('script');\r\n    tag.src = 'https://www.youtube.com/iframe_api';\r\n\r\n    // onYouTubeIframeAPIReady will load the video after the script is loaded\r\n    window.onYouTubeIframeAPIReady = () => onApiReady(true);\r\n\r\n    const firstScriptTag = document.getElementsByTagName('script')[0];\r\n    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n  } else { // If script is already there, load the video directly\r\n    onApiReady(false);\r\n  }\r\n}\r\n\r\n// export function player(playerId, videoId, playerVars = {}, events = {}) {\r\n//   //let player = null;\r\n//   const defaultPlayerVars = {\r\n//     'autoplay': 1,\r\n//     'controls': 0,\r\n//     'loop': 1,\r\n//     'showinfo': 0,\r\n//     'rel': 0,\r\n//     'modestbranding': 1,\r\n//     'origin': window.location.origin,\r\n//     'allowfullscreen': true,\r\n//     'wmode': 'transparent'\r\n//   }\r\n//   const defaultEvents = {\r\n//     'onStateChange': (e) => { },\r\n//     'onReady': (e) => { console.log('onReady'); player.mute() },\r\n//     'onError': (e) => { console.log(e) }\r\n//   }\r\n\r\n//   const player = new window.YT.Player(playerId, {\r\n//     videoId: videoId,\r\n//     playerVars: Object.assign({}, defaultPlayerVars, playerVars),\r\n//     events: Object.assign({}, defaultEvents, events),\r\n//   });\r\n//   return player;\r\n// }\r\n\r\nexport function thumbnailMax(videoId){\r\n  return `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`\r\n}\r\n\r\n// onPlayerStateChange(event){\r\n//   switch (event.data){\r\n//     case window['YT'].PlayerState.PLAYING:\r\n//       //console.log('Playing');\r\n//       //this.player.mute();\r\n//       break;\r\n//     case window['YT'].PlayerState.PAUSED:\r\n//       //console.log('Pafdsu');\r\n//       break;\r\n//     case window['YT'].PlayerState.ENDED:\r\n//       //console.log('ended ');\r\n//       //this.player.playVideo();\r\n//       this.player.stopVideo();\r\n//       break;\r\n//   }\r\n// }\r\n\r\n// toggleBannerYoutueInCMS(toggleItem:string){ \r\n//   if(toggleItem == 'youtube'){\r\n//     //location.reload();\r\n//     this.toggleBannerOrYoutube = toggleItem;\r\n//     this.player.playVideo();\r\n//     this.init();\r\n//   }\r\n//   else{\r\n//     this.toggleBannerOrYoutube = toggleItem;\r\n//     this.player.stopVideo();\r\n//   }\r\n// }\r\n\r\n\r\nexport function getYoutubeCode(src) {\r\n  // if (src.indexOf('http') >= 0) {\r\n  //   if (src.indexOf('v=') >= 0) {\r\n  //     return src.split('v=')[1];\r\n  //   }\r\n  // }\r\n  // return src;\r\n  return utils.url.getYoutubeId(src);\r\n}","import React from 'react';\n//import utils from '../../utils';\nimport env from '../../env';\nimport { loadJs, loadedJs } from '../../lib/net-loader';\n\nexport function useBV(prd, { showReview }) {\n  const [product] = React.useState(prd);\n\n  React.useEffect(() => {\n    // make sure whether the js has been loaded for every product page loading.\n    console.log('[useBV]--useEffect, js loading')\n    const url = `https://apps.bazaarvoice.com/deployments/${env.bvClientId}/${env.bvSiteId}/${env.bvEnv}/${env.bvLocale}/bv.js`\n    if (!loadedJs(url)) {\n      loadJs(url).then(data => {\n        console.log('[BV] script loaded ', data);\n      })\n    }\n  }, [product])\n\n  React.useEffect(() => {\n    console.log('[useBV]--useEffect')\n\n    const reviewClicked = function (e) {\n      console.log('[BV] show review panel')\n      showReview(e);\n    }\n\n    const bvCallback = (BV) => {\n      console.log('[BV] callback loaded', BV);\n\n      if (BV && BV.swat_reviews){\n        BV.swat_reviews.on('show', reviewClicked);\n      }\n\n      // BV.rating_summary.on('show', function () {\n      //   console.log('rating_summary show')\n      // });\n    }\n    if (typeof window !== `undefined`) {\n      if (window.BV) {\n        bvCallback(window.BV)\n      } else {\n        window.bvCallback = bvCallback\n      }\n    }\n    return () => {\n      console.log('[BV] clear events bound')\n      if (typeof window !== `undefined`) {\n        if (window.BV && window.BV.swat_reviews)\n          window.BV.swat_reviews.off('show', reviewClicked);\n        window.bvCallback = null\n      }\n    }\n  }, [showReview])\n\n  //https://knowledge.bazaarvoice.com/wp-content/conversations/en_US/Collect/bvpixel.html#events-captured-by-bv-pixel\n  const sendEvent = (type, label, value, options = {}) => {\n    console.log('[BV] event', type, label, value)\n    if (typeof window !== `undefined`) {\n      if (!window.BV) { console.error('No BV object'); return; }\n      const BV = window.BV\n      BV.pixel.trackConversion({\n        ...{\n          \"type\": type,\n          \"label\": label,\n          \"value\": value\n        }, ...options\n      });\n    }\n  }\n\n  const sendTransactionEvent = (currency, orderId, total, items, options = {}) => {\n    console.log('[BV] transaction event', currency, orderId, total, items)\n    if (typeof window !== `undefined`) {\n      if (!window.BV) { console.error('No BV object'); return; }\n      const BV = window.BV\n      BV.pixel.trackTransaction({\n        ...{\n          \"currency\": currency,\n          \"orderId\": orderId,\n          \"total\": total,\n          \"items\": items\n        }, ...options\n      });\n    }\n  }\n\n  return { sendEvent, sendTransactionEvent }\n}","// https://www.pluralsight.com/guides/re-render-react-component-on-window-resize\r\nexport function debounce(fn, ms) {\r\n  let timer\r\n  return _ => {\r\n    clearTimeout(timer)\r\n    timer = setTimeout(_ => {\r\n      timer = null\r\n      fn.apply(this, arguments)\r\n    }, ms)\r\n  };\r\n}","export function enableForceUpdate() {\r\n  localStorage.setItem('sw-enableForceUpdate', 'true');\r\n}\r\n\r\nexport function disableForceUpdate() {\r\n  localStorage.setItem('sw-enableForceUpdate', 'false');\r\n}\r\n\r\nexport function forceUpdateFlagged() {\r\n  return localStorage.getItem('sw-enableForceUpdate') === 'true';\r\n}\r\n\r\nexport function markUpdate() {\r\n  localStorage.setItem('sw-markUpdate', 'true');\r\n}\r\n\r\nexport function unmarkUpdate() {\r\n  localStorage.setItem('sw-markUpdate', 'false');\r\n}\r\n\r\nexport function hasUpdate() {\r\n  return localStorage.getItem('sw-markUpdate') === 'true';\r\n}\r\n\r\nexport async function checkUpdate() {\r\n  if (hasUpdate()){\r\n    unmarkUpdate();\r\n    const registration = await navigator.serviceWorker.getRegistration();\r\n    console.log(registration);\r\n    if (registration && registration.waiting) {\r\n      registration.waiting.postMessage({ type: 'SKIP_WAITING' });\r\n    }\r\n  }\r\n}\r\n\r\n// export function storeRegistration(registration) {\r\n//   window.swRegistration = registration\r\n// }\r\n\r\n// export function getRegistration() {\r\n//   return window.swRegistration\r\n// }\r\n\r\n// export function resetRegistration() {\r\n//   const registration = getRegistration();\r\n//   disableForceUpdate();\r\n//   console.log('reset', registration)\r\n//   if (registration && registration.waiting) {\r\n//     registration.waiting.postMessage({ type: 'SKIP_WAITING' });\r\n//   }\r\n// }","const defaultHolder = typeof window !== `undefined` ? window : {};\r\nconst storeName = '__j6_lazy_js'\r\n\r\nexport function loadJs(...scripts) {\r\n  const promises = [];\r\n  scripts.forEach((script) => promises.push(loadScript(script, defaultHolder)));\r\n  return Promise.all(promises);\r\n}\r\n\r\nexport function loadedJs(url, holder = defaultHolder) {\r\n  if (!holder[storeName]) return false;\r\n  return holder[storeName][url] && holder[storeName][url].loaded\r\n}\r\n\r\nexport function loadScript(url, holder_, forceToReload = false) {\r\n  const holder = holder_ || defaultHolder\r\n  if (!holder[storeName]) holder[storeName] = {};\r\n\r\n  return new Promise((resolve, reject) => {\r\n    //resolve if already loaded\r\n    if (!forceToReload && holder[storeName][url] && holder[storeName][url].loaded) {\r\n      resolve({ script: url, loaded: true, networkLoaded: false , status: 'Already Loaded' });\r\n    }\r\n    else {\r\n      // remove previous\r\n      const existing = document.querySelector('script[src=\"' + url +'\"]')\r\n      if (existing) existing.remove();\r\n\r\n      // load script\r\n      let script = document.createElement('script');\r\n      script.type = 'text/javascript';\r\n      script.src = url;\r\n      script.onload = () => {\r\n        holder[storeName][url] = { loaded: true };\r\n        resolve({ script: url, loaded: true, networkLoaded: true, status: 'Loaded' });\r\n      };\r\n      script.onerror = (error) => resolve({ script: url, loaded: false, status: 'Load failed' });\r\n      document.getElementsByTagName('head')[0].appendChild(script);\r\n    }\r\n  });\r\n}","import { loadJs, loadedJs, loadScript } from './loadJs';\r\n\r\nexport { loadJs, loadedJs, loadScript };","import React from \"react\";\nimport utils from \"../../utils\";\nimport { SiteLink } from \"../../components\";\n//import env from '../../env';\n\nexport function Tile({ product }) {\n  const imageUrl = product.productThumbnail\n    ? utils.site.resourcePath(product.productThumbnail)\n    : \"/assets/product-empty.png\";\n  //console.log(imageUrl)\n  const productUrl = product.productUrl\n    ? product.productUrl\n    : `/product/${product.productCode}`;\n  //const barcodeCleaned = product.barcode ? product.barcode.replace(/-/g, '').replace(/ /g, '') : null;\n  return (\n    <div className='productTile tile'>\n      {/* <div itemScope={true} itemType=\"http://schema.org/Product\">\n        <meta itemProp=\"name\" content={product.productName} />\n        <div itemProp=\"brand\" itemType=\"http://schema.org/Brand\" itemScope>\n          <meta itemProp=\"name\" content={env.siteName} />\n        </div>\n\n        {product.intro && <meta itemProp=\"description\" content={product.intro} />}\n        {barcodeCleaned && <meta itemProp=\"sku\" content={barcodeCleaned} />}\n        {barcodeCleaned && <meta itemProp=\"gtin13\" content={barcodeCleaned} />}\n        {imageUrl && <link itemProp=\"image\" href={utils.site.fullUrl(imageUrl)} />}\n        <div itemProp=\"offers\" itemType=\"http://schema.org/Offer\" itemScope>\n          <link itemProp=\"url\" href={utils.site.fullUrl(product.productUrl)} />\n          {product.price && <meta itemProp=\"price\" content={product.price} />}\n          <meta itemProp=\"priceCurrency\" content={utils.site.isNZ? 'NZD' : 'AUD'} />\n        </div> */}\n\n      <SiteLink className='productTile__link tile__content' to={productUrl}>\n        <div>\n          <img\n            src={utils.site.resourcePath(imageUrl)}\n            alt={product.productName}\n          />\n        </div>\n        <div className='productTile__title'>\n          {product.productName}\n          <div className='productTile__inlineRating'>\n            <div\n              data-bv-show='inline_rating'\n              data-bv-seo='false'\n              data-bv-product-id={product.productCode}\n            ></div>\n          </div>\n        </div>\n\n        <div className='productTile__price'>\n          {product.priceText ? product.priceText : \"\"}\n        </div>\n      </SiteLink>\n      {/* </div> */}\n    </div>\n  );\n}\n","import variables from './cssInJs/variables';\n\nconst cssEmotion = {\n  breakpointNames: variables.breakpointNames,\n  breakpoints: variables.breakpoints\n}\n\nexport default {\n  cssEmotion\n}"],"sourceRoot":""}