{"version":3,"sources":["webpack:///./Avensia.Common/Features/Product/ProductAddToCart/index.tsx","webpack:///./Avensia.Common/Features/Product/ProductCard/Badge.tsx","webpack:///./Avensia.Common/Features/Product/ProductDetails/UspBullets.tsx","webpack:///./Avensia.Common/Features/Shared/string-format.tsx","webpack:///./Avensia.Common/Features/Shared/Icon/RemovePlain.tsx","webpack:///./Avensia.Common/Features/Shared/variation-helper.ts","webpack:///./Avensia.Common/Features/Shared/Icon/Check-Thin.tsx","webpack:///./Avensia.Common/Features/Shared/SlideIn/index.tsx","webpack:///./Avensia.Common/Features/Shared/Panel/index.tsx","webpack:///./Avensia.Common/Features/Product/ProductCard/ProductCard.tsx","webpack:///./Avensia.Common/Features/Product/ProductDetails/AverageRatingBlack.tsx","webpack:///./Avensia.Common/Features/Shared/Icon/Star-Black.tsx","webpack:///./Avensia.Common/Features/Shared/Fields/Select.tsx","webpack:///./Avensia.Common/Features/Shared/Icon/glyphs/star-black.svg","webpack:///./Avensia.Common/Features/Shared/Icon/glyphs/star-outline-black.svg","webpack:///./Avensia.Common/Features/Shared/Icon/glyphs/star-half-black.svg","webpack:///./Avensia.Common/Features/Shared/Icon/glyphs/md-checkmark.svg","webpack:///./Avensia.Common/Features/Shared/Icon/glyphs/remove-plain.svg","webpack:///./Avensia.Common/Features/Shared/Icon/Info.tsx","webpack:///./Avensia.Common/Features/Shared/Icon/glyphs/information-icon.svg","webpack:///./Avensia.Common/Features/Product/ProductCard/List.tsx","webpack:///./Avensia.Common/Features/Product/ProductCard/ProductCardMobile.tsx","webpack:///./Avensia.Common/Features/Shared/Blocks/PaddedBlock.tsx","webpack:///./Avensia.Common/Features/Shared/email-pattern.ts","webpack:///./Avensia.Common/Features/Shared/Carousel/Carousel.tsx","webpack:///./Avensia.Common/Features/Shared/Carousel/Navigation.tsx","webpack:///./Avensia.Common/Features/Shared/Carousel/SlideIndexMarkers.tsx","webpack:///./Avensia.Common/Features/Shared/Carousel/ElementDimensions.tsx","webpack:///./Avensia.Common/Features/Shared/Carousel/CommonCarousel.tsx","webpack:///./Avensia.Common/Features/Shared/Carousel/Bullet.tsx","webpack:///./Avensia.Common/Features/Shared/Carousel/index.tsx","webpack:///./Avensia.Common/Features/Shared/Blocks/Video/VideoBlock.tsx","webpack:///./Avensia.Common/Features/Shared/Icon/glyphs/zoom-in.svg","webpack:///./Avensia.Common/Features/Shared/Icon/glyphs/zoom-out.svg","webpack:///./Avensia.Common/Features/Shared/Icon/glyphs/email.svg","webpack:///./Avensia.Common/Features/Shared/Icon/glyphs/icon-measure.svg","webpack:///./Avensia.Common/Features/Product/keyframes.scss?a43a","webpack:///./Avensia.Common/Features/Shared/Video/video-helper.tsx","webpack:///./Avensia.Common/Features/Shared/Video/youtube.ts","webpack:///./Avensia.Common/Features/Shared/Modal.tsx","webpack:///./Avensia.Common/Features/Product/ProductMedia/youtubeVideo.tsx","webpack:///./Avensia.Common/Features/Product/ProductMedia/vimeoVideo.tsx","webpack:///./Avensia.Common/Features/Shared/Icon/ZoomIn.tsx","webpack:///./Avensia.Common/Features/Shared/Icon/ZoomOut.tsx","webpack:///./Avensia.Common/Features/Product/ProductMedia/MobileModal.tsx","webpack:///./Avensia.Common/Features/Product/ProductMedia/index.tsx","webpack:///./Avensia.Common/Features/Shared/Icon/Email.tsx","webpack:///./Avensia.Common/Features/Shared/Generic/H2.tsx","webpack:///./Avensia.Common/Features/Product/WatchableProduct/Modal.tsx","webpack:///./Avensia.Common/Features/Product/WatchableProduct/index.tsx","webpack:///./Avensia.Common/Features/Product/ProductDesigner/dropdown.tsx","webpack:///./Avensia.Common/Features/Product/ProductDesigner/colorSelector.tsx","webpack:///./Avensia.Common/Features/Product/ProductDesigner/configurator.tsx","webpack:///./Avensia.Common/Features/Product/ProductDesigner/index.tsx","webpack:///./Avensia.Common/Features/Product/CommonPurchaseCombination/CommonPurchaseCombinationProduct.tsx","webpack:///./Avensia.Common/Features/Product/CommonPurchaseCombination/CommonPurchaseCombinationItem.tsx","webpack:///./Avensia.Common/Features/Product/CommonPurchaseCombination/CommonPurchaseCombination.tsx","webpack:///./Avensia.Common/Features/Product/ProductDetails/Brand.tsx","webpack:///./Avensia.Common/Features/Product/ProductDetails/shared.ts","webpack:///./Avensia.Common/Features/Product/ProductDetails/ProductName.tsx","webpack:///./Avensia.Common/Features/Product/Reviews/Ratings/ReadOnly.tsx","webpack:///./Avensia.Common/Features/Product/ProductDetails/Ratings.tsx","webpack:///./Avensia.Common/Features/Product/ProductDetails/Prices.tsx","webpack:///./Avensia.Common/Features/Product/ProductDetails/Description.tsx","webpack:///./Avensia.Common/Features/Product/ProductDetails/QuickFacts.tsx","webpack:///./Avensia.Common/Features/Shared/Icon/Measure.tsx","webpack:///./Avensia.Common/Features/Product/ProductDetails/SizeGuide.tsx","webpack:///./Avensia.Common/Features/Product/ProductDescriptionSection.tsx","webpack:///./Avensia.Common/Features/Product/Reviews/Box.tsx","webpack:///./Avensia.Common/Features/Product/Reviews/List.tsx","webpack:///./Avensia.Common/Features/Product/Reviews/AddReviewButton.tsx","webpack:///./Avensia.Common/Features/Product/Reviews/index.tsx","webpack:///./Avensia.Common/Features/Product/ReviewSection.tsx","webpack:///./Avensia.Common/Features/Product/ProductDetails/VariantSelector.tsx","webpack:///./Avensia.Common/Features/Product/ProductActionbar/index.tsx","webpack:///./Avensia.Common/Features/Product/ProductRelated/index.tsx","webpack:///./Avensia.Common/Features/Product/ProductRecentlyViewed/index.tsx","webpack:///./Avensia.Common/Features/Product/Reviews/ViewAll/index.tsx","webpack:///./Avensia.Common/Features/Product/GiftWithPurchase/index.tsx","webpack:///./Avensia.Common/Features/Product/Variation.tsx"],"names":["behavior","KeepEnabled","onClick","event","props","feedback","push","addToCart","stopPropagation","preventDefault","render","FeedbackButton","this","Button","css","compose","variant","appearance","Primary","Full","disabled","children","Component","Base","div","fontSize","position","textTransform","zIndex","Badge","CampaignBadge","color","theme","campaignTextProductcard","top","right","fontWeight","letterSpacing","textAlign","backgroundClip","margin","xy","WebkitBackgroundClip","textShadow","sharedStyle","borderRadius","height","lineHeight","width","triStyle","OuterWrapper","border","discountBadgeColor","style","InnerWrapper","left","NewBadge","backgroundColor","badgeColor","DiscountBadge","DiscountTriBadge","ListStyleType","display","Theme","bulletpoints","marginRight","verticalAlign","ListStyleMobileType","Li","li","overflow","textOverflow","whiteSpace","Value","span","UspBullets","Sliced","bulletPoints","bulletLimit","slice","UlComponent","isCompact","MobileUl","DesktopUl","hasValue","map","bulletPoint","index","title","key","listItemCss","isMobile","listStyleType","ul","minWidth","maxWidth","y","x","formatTitleCase","str","replace","txt","charAt","toUpperCase","substr","toLowerCase","prepareVariationName","name","m","String","fromCharCode","CheckIcon","Check","DEFAULT_SCALE","DEFAULT_ROTATE","DEFAULT_OPACITY","SlideIn","isOpen","scaleX","onCloseEnd","transform","opacity","CloseType","CompactBase","className","onTransitionEnd","flexDirection","Panel","property","duration","ExtensiveBase","bottom","marginLeft","marginTop","marginBottom","maxHeight","Header","header","primaryColor","alignItems","flexShrink","paddingLeft","Heading","flexGrow","Body","overflowY","ActionButton","paddingRight","BackIcon","Back","state","contentDisplay","toggleContentDisplay","setState","closeCompletely","keyDown","e","keyCode","onClose","UNSAFE_componentWillMount","componentDidMount","window","addEventListener","componentWillUnmount","scrollFreeze","removeEventListener","freeze","unfreezeScroll","componentDidUpdate","prevProps","currentBreakpoint","Medium","requestAnimationFrame","appendToDOM","panelProps","panelHeader","None","Bare","closeType","Close","panelBody","minHeight","Viewport","Overlay","enabled","connect","bulletPointsVisible","toggleBulletPointsTrue","toggleBulletPointsFalse","averageRating","brand","imageUrls","price","hasMultipleVariants","hasDiscount","hasPromotion","isNew","displayName","url","inStock","ticket","displayTagDesigner","displayHighlightImage","whiteHighlightText","highlightImageUrl","hideProductInfo","promotions","images","productImage","length","productBrand","trim","productName","current","original","currency","discountPercentage","isPriceDiscounted","currentPrice","originalPrice","currentTheme","imageWithPaddingStyle","paddingTop","actionButtonText","DoggieDefault","PromotionNode","Div","PromotionTitle","promotion","i","PromotionLink","to","promotionUrl","PromotionItemTitle","promotionName","ExtensionWrapper","onMouseEnter","onMouseLeave","productUrl","linkIdentifier","productTicket","HighlightImage","objectFit","src","Wrapper","visibility","startsWith","isProductNew","ImageStyled","alt","itemProp","preset","includes","undefined","Tiny","ratio","OneToOne","imageStyle","lazy","RatingsPlaceholder","productRatings","Ratings","average","spacing","Normal","size","RatingsNone","BrandPlaceholder","Brand","NameWrapper","Name","UspBulletsStyled","bulletListItemStyle","LowerWrapper","Prices","CurrentPrice","priceType","New","Regular","OldPrice","Old","StockPlaceholder","StockStatus","CrossIcon","ActionStyled","hasVariants","isInStock","addCart","CartIcon","ProductCard","Action","ViewProduct","Small","AddCart","boxShadow","shadowColor","cardBackgroundColor","willChange","timingFunction","buyButtonProductcardDesktop","padding","buttonTextColor","textColor","cursor","justifyContent","flex","basis","shrink","flexBasis","WebkitLineClamp","WebkitBoxOrient","actionStyle","mixBlendMode","campaignBackgroundColor","Spacing","Size","StarBlack","StarOutlineBlack","HalfStarBlack","floatPart","Number","Math","trunc","toFixed","parsedFloat","parseFloat","starStyles","Micro","Large","Huge","Wide","getStyles","rating","ceil","Appearance","Options","transformOrigin","OptionLi","borderBottom","borderBottomStyle","Option","OptionContent","Content","IconDown","IconUp","toggle","open","prevState","unsubscribeBodyClose","getContentWidth","count","options","forEach","option","text","selectOption","value","onChangeOption","selected","find","o","substring","lastIndexOf","contentWidth","divStyle","role","noRippleEffect","React","createElement","defaultProps","module","exports","default","StarHalfBlack","MdCheckmark","RemovePlain","InformationIcon","Layout","hasBulletpoints","IsVxnSite","ActionButtonIcon","InfoIconStyled","ShoppingBagIcon","CrossNoStock","HighlightImageWrapper","RatingsContainer","MobileBulletWrap","ButtonContainer","ButtonLeftContainer","Price","mobileActionButtonStyle","buyButtonProductcardMobile","img","Link","AverageRating","alignSelf","Info","flexFlow","pageStyled","blockStyled","baseStyled","BaseCard","BaseCardMobile","PageCard","PageCardMobile","BlockCard","BlockCardMobile","BasePlaceholder","PagePlaceholder","BlockPlaceholder","code","isCheckoutPage","addCartItem","Promise","reject","layout","Block","ProductCardMobile","Placeholder","ieBlockCardStyle","desktopCardStyle","mobileCardStyle","products","product","variation","Fragment","noPlaceholders","Array","fill","elem","PureComponent","currentPage","dispatch","quantity","emailPattern","AnimationStyle","Variant","Container","SWIPE_THRESHOLD","lastDeltaX","lastDir","offsetDeltaX","slideWillChange","goToSlide","continuous","min","itemCount","slidesPerPage","max","currentSlide","translateX","getTranslateX","onSlideChange","getAbsoluteIndex","goBack","steps","goForward","onSwiping","deltaX","velocity","items","isResting","diff","dir","sign","sameDir","onSwiped","currentDeltaX","slideWidth","onRest","onSwipeRest","carouselWidth","slideWidthPercent","Children","toArray","concat","itemCountUnique","itemCountCloned","setUpAutoSlide","clearInterval","autoSlideTimer","autoSlideTime","document","hidden","setInterval","componentWillReceiveProps","nextProps","hasNewSlideIndex","hasNewCarouselWidth","hasNewSlideWidth","hasNewSlidesAdded","slideShouldMoveToFront","itemCountToMoveToFront","isFirstHalf","isActiveSlideInFirstHalf","activeSlideIsInFront","slideIsInOtherHalf","indexOffsetFromEnd","getSlideTransformPercent","slideIndex","floor","thisSlidIsInFirstHalf","getLoopCount","getSpringConfig","animationStyle","Gentle","stiffness","damping","precision","noWobble","motionStyle","innerRef","elementRef","delta","trackTouch","interpolatedStyle","listStyle","item","onSlideClick","uniqueItemCount","Direction","SlideContainer","SlideContainerActive","pointerEvents","SlideIndex","isActive","radius","restProps","SlideIndexActive","onSlideIndexClick","relativeIndex","activeSlideIndex","nbrOfSlides","Tray","mounted","unsubscribeResize","el","measureElement","onDimensionChange","dimensions","getElementDimensions","getBoundingClientRect","initialDimensions","CarouselBase","SiteBanner","handleKeyPress","goPrev","goNext","nbrOfItems","isFirstSlide","isLastSlide","dimensionsProp","hideNavigationButtons","Navigation","direction","Prev","offset","navigationOffset","Next","hideIndexMarkers","svg","circle","transition","userSelect","getVideoUrl","videoId","videoSource","VideoIframe","iframe","VideoBlock","for","component","SixteenToNine","loading","frameBorder","allowFullScreen","allowFullscreen","description","ZoomIn","ZoomOut","Email","IconMeasure","youtubeIsInit","YoutubeStateTypes","PlayerError","body","setAttribute","removeAttribute","close","Modal","ensureYTInit","resolve","tag","id","firstScriptTag","getElementsByTagName","parentNode","insertBefore","initPlayer","player","YT","Player","events","onReady","onPlayerReady","mute","playerIsReady","toggleVideo","currentState","getPlayerState","UNSTARTED","PAUSED","ENDED","CUED","playVideo","pauseVideo","isCurrent","VideoContainer","LayerWrapper","allow","Layer","togglePlayer","getPaused","then","val","play","pause","VimeoPlayer","playerRef","addMute","ref","prismaZoom","createRef","openModal","modalOpen","closeModal","onZoomChange","zoom","zoomOut","zoomIn","imageUrl","ZoomContainer","minZoom","maxZoom","scrollVelocity","doubleTouchMaxDelay","Image","ModalIconContainer","IconButton","IconContainer","itemTotals","youTubeIds","vimeoIds","totalImages","totalYoutube","totalVimeo","currentIndex","INITIAL_INDEX","navigate","newIndex","onModalToggle","renderCarousel","imageHeight","youTubeId","vimeoId","imageAsset","renderModal","renderMobileModal","cloakedImages","renderSingleAsset","imgSrc","firstImageUrl","appShellData","cloakProductImages","h2","submitWatchRequest","productCode","email","pageUrl","hasError","success","setTimeout","inputEmailAddress","target","isInvalid","validateInput","loggedInUser","isLoggedIn","input","test","inputInvalidStyle","buttonSuccessStyle","backgroundImage","SignupInfo","EmailLabel","Form","EmailInput","autoComplete","invalid","placeholder","required","type","onChange","InvalidEmail","Submit","ErrorMessage","PrivacyPolicy","currentUser","form","Feedback","H2","p","content","WatchableButton","AddWatch","onPanelOpen","ButtonText","buttonText","EmailIcon","WatchableButtonActionbar","BaseActionbar","WrapperActionbar","MobileWatchableButton","MobileBase","OutOfStock","WatchablePanel","onPanelClose","MODAL_HEIGHT","MODAL_WIDTH","variationCode","grow","buyButtonProductPageMobile","buyButtonProductPageMobileText","woffValue","variants","DesktopBase","Span","label","onWatchableOpen","Ul","setColorName","colorName","handlingSelect","ColorNameContainer","ColorName","flexWrap","bkgColor","highlightColor","lighten","borderColor","desaturate","darken","string","TextBoxWrapper","TextBox","textBoxEmpty","maxLength","updateText","inputEl","onFocus","select","font","updateWoffValue","updateFont","availableFonts","updateColor","availableColors","productDesigner","background","fontFamily","CommonPurchaseCombinationProduct","checked","setChecked","LimitedBullets","data","ProductOuterContainer","ProductContainer","ProductImageContainer","ProductImage","NameBulletsContainer","ProductName","BulletPoints","CheckboxContainer","CheckboxText","CustomCheckbox","handleDeselect","handleReselect","CheckStyled","CommonPurchaseCombinationItem","originalPrices","comboTotal","setComboTotal","deSelectedItems","setDeselectedItems","selectedItemsCount","setSelectedItemsCount","deselectedTotalDiscount","setDeselectedTotalDiscount","currentDeselectedTotalDiscount","deselectedDiscount","deselected","combo","productList","indexOf","splice","CombinationOuterContainer","CombinationContainer","j","discount","PlusWrapper","Plus","EqualTo","PriceButtonContainer","ComboPriceHeader","ComboPrice","reduce","a","b","SaveSum","StyledButton","addAllItemsToCart","CommonPurchaseCombination","commonPurchaseCombinationList","forwardRef","forwardedRef","StyledDiv","textDecoration","brandUrl","h1","RATINGS","star","starOutline","Star","PriceWrapper","history","PriceStyle","productActionbarMobile","longPrice","DiscountedText","RecommendedPrice","RecommendedPriceText","HistoryPriceWrapper","historyPriceStyle","ProductDetails","handleShowMore","isExpanded","clientHeight","DEFAULT_HEIGHT","isMounted","isShowMore","Html","html","innerProps","FadeOut","ShowMore","overflowWrap","Caption","Row","RowData","RowHeader","QuickFactsCaption","QuickFactsRow","Table","Yes","No","ColumnGutter","getLabel","Sizes","sizes","Details","details","QUICKFACTS_SIZE","QUICKFACTS_DETAILS","baseCss","QuickFacts","quickFacts","filter","quickFact","category","detail","StyledIcon","TableContainer","ImageContainer","table","sizeGuideHeaderBackgroundColor","sizeGuideHeaderBackgroundImage","borderCollapse","tableLayout","TableRow","tr","TableRowHeader","TableData","td","TABLE_COLUMN_WIDTH","TableHeader","paddingBottom","loaded","handleImageLoaded","onLoad","sizeHeader","WideRight","sizeGuide","TABLE_TINY_GUTTER_WIDTH","TABLE_SMALL_GUTTER_WIDTH","toggleModal","Flyout","positionComponent","Right","ProductDescriptionSection","formatDateTime","isoDateTime","date","Date","year","getFullYear","month","getMonth","dt","getDate","adminReviewResponseLogo","siteSettings","siteName","reviewModalStyle","review","reviewAdminAnswer","reviewStyle","adminResponseStyle","isModal","Review","NameAndRatings","Alias","aliasName","FullStar","DefaultStar","CompactDate","CreatedText","publishDate","ExtensiveDate","Admin","AdminLogo","Label","Answer","ratingsStyled","Comments","dateCreatedStyled","dateSortedList","setDateSortedList","latestFirst","setLatestFirst","highestFirst","setHighestFirst","list","SortContainer","SortOptions","SortLabel","SortDate","sortedList","sort","getTime","reverse","SortRating","sortedRatings","isReviewModal","SortButton","AddReview","Secondary","productReview","HeaderContainer","TotalReviews","totalReviews","ShowAllContainer","topReviews","ShowAll","toggleReviewPanel","catalogId","language","ReviewSection","reviews","ProductReviews","rightColumnStyled","MobileSelectorActionbar","MobileSelectActionbar","TextActionbar","longVariantName","justifySelf","VariantPanel","TopBase","sizeguide","SizeGuideWrapper","PanelBase","VariantList","bare","PanelItem","onItemClick","RippleEffect","ripples","Item","CustomMobileButton","productMobileActionbar","borderTop","ProductPrices","ProductLinksMenu","ProductLinkItemContainer","ProductLinksMenuTopBar","ProductLinksMenuTitle","ProductLinkItemWrapper","ProductLinkItem","ProductLinkItemThumb","ProductActionbar","watchableButtonProps","onWatchablePanelOpen","toString","variantName","isProductLinkPanelOpen","setIsProductLinkPanelOpen","setHeight","productLinks","ProductLinksMenuUp","fillMode","ProductLinksMenuDown","toggleColorPanel","centerContentStyle","linkDisplayType","leftContentStyle","linkDisplayValue","tooltip","ThumbImage","TextSection","OutOfStockText","prices","ButtonSection","LinkMenuButton","CenterColor","selfProductLink","CurrentLinkThumb","onVariantPanelOpen","LinkMenuButtonBase","section","ResponsiveH2","relatedProducts","recentlyViewed","getMoreReviews","showMore","closeReviewsOpenSubmitOwnReview","closeReviews","betweenRange","handleScroll","currentTarget","scrollHeight","scrollTop","totalReview","isExpandReviews","HeadingText","ReviewsList","onScroll","List","ButtonWrapper","gwpFreePromotion","giftItem","PromotionContainer","FreeItemTitle","ImageAndInfoContainer","PhotoContainer","image","ItemDetailsContainer","PromotionDescriptionText","promotionConditionDescription","ProductNameText","PriceValue","UspContainer","MarginContainer","PercentDiscountBadge","LastBreadcrumb","Breadcrumbs","CustomBreadcrumbs","Campaign","SameDayDelivery","IconCart","IconWrap","DescriptionAndSizeGuide","AverageContainer","LastBreadCrumbBrandContainer","DetailsUsp","DetailsUspVxn","UspItem","UspItemText","BrandAndStockSection","ProductDescriptionSectionWrapper","Stock","WatchableHelperInfo","ShowReviews","ReadMore","BulletReviewWrapper","ProductLinksMenuWrapper","CurrentProductLink","ProductLinksContainer","ProductLinkWrapper","from","ProductLinkItemWrapperCurrent","ProductLinkItemWrapperCurrentThumb","ProductNameSmall","ProductLinksTitle","ColorMenuButton","DownStyled","UpStyled","ProductLinksColorWrapper","toggleproductInfoPosition","isFullscreenViewCarouselOpen","scrollToDescription","productDescriptionRef","descriptionScrollDuration","totalOffset","headerOffsetTop","pageYOffset","createEvent","initEvent","dispatchEvent","Event","openVariantPanel","isPanelOpen","closeVariantPanel","openWatchablePanel","isWatchablePanelOpen","closeWatchablePanel","toggleColorSelect","isColorPanelOpen","fetchingDone","allReviews","getReviews","reviewsPage","addItemToCart","designTagProperties","all","initializeReviews","variations","promotionNames","productRecommendations","sku","campaignCategoryPageUrl","productUspDelivery","productUspGuarantee","productUspReturn","productUspDeliveryVxn","productUspDeliveryVxnTitle","productUspDiscreetVxn","productUspDiscreetVxnTitle","iconExpressDelivery","iconDiscreet","imageContentBlock","gwpPromotionGift","designTagColors","designTagFonts","contentBlocks","variantPromotions","$cache","productPageUrl","skuCode","CampaignNode","averageRatingsNode","desktopDetails","backdropFilter","breadcrumbs","isSliced","wrap","Ratio","mobileDetails","detailsDesktopStyle","detailsMobileStyle","stockAndPromos","PageLayout","ProductRelated","ProductRecentlyViewed","ViewAll","productReviewId","isModalList","canonicalUrl","page","totalCount"],"mappings":"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","file":"assets/18.chunk.ee0f1a7108da448213d5.js","sourcesContent":["import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport {\r\n connectWithFeedback,\r\n Behavior as ButtonBehavior,\r\n Appearance as ButtonAppearance,\r\n ConnectPropType as FeedbackPropType,\r\n} from 'Shared/Button/Feedback';\r\nimport { Variant } from 'Shared/Button';\r\n\r\ntype PropType = {\r\n addToCart: () => Promise<void>;\r\n disabled?: boolean;\r\n variant?: Variant;\r\n children?: React.ReactNode;\r\n} & StyledProps &\r\n FeedbackPropType;\r\n\r\nexport default styled(\r\n connectWithFeedback({ behavior: ButtonBehavior.KeepEnabled })(\r\n class AddToCart extends React.Component<PropType> {\r\n onClick = (event: React.MouseEvent) => {\r\n this.props.feedback.push(this.props.addToCart());\r\n event.stopPropagation();\r\n event.preventDefault();\r\n };\r\n render() {\r\n const FeedbackButton = this.props.feedback.Button;\r\n return (\r\n <FeedbackButton\r\n css={this.props.compose()}\r\n variant={this.props.variant}\r\n appearance={[ButtonAppearance.Primary, ButtonAppearance.Full]}\r\n disabled={this.props.disabled}\r\n onClick={this.onClick}\r\n >\r\n {this.props.children}\r\n </FeedbackButton>\r\n );\r\n }\r\n },\r\n ),\r\n);\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { pixelsToUnit, white, sigma, kappa, minTinyMediaQuery } from 'Shared/Style';\r\nimport { Style } from '@glitz/type';\r\n\r\ntype PropType = StyledProps & {\r\n children?: React.ReactNode;\r\n};\r\n\r\nconst Base = styled.div({\r\n fontSize: kappa,\r\n position: 'absolute',\r\n textTransform: 'uppercase',\r\n zIndex: 1,\r\n [minTinyMediaQuery]: {\r\n fontSize: sigma,\r\n },\r\n});\r\n\r\nconst Badge = (props: PropType) => <Base css={props.compose()}>{props.children}</Base>;\r\nconst TriBadge = (props: PropType) => (\r\n <Base css={props.compose()}>\r\n <OuterWrapper>\r\n <InnerWrapper>{props.children}</InnerWrapper>\r\n </OuterWrapper>\r\n </Base>\r\n);\r\n\r\nexport const CampaignBadge = styled(Badge, {\r\n color: (theme) => theme.campaignTextProductcard,\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n fontWeight: 'bold',\r\n letterSpacing: pixelsToUnit(0.7),\r\n textAlign: 'left',\r\n backgroundClip: 'text',\r\n margin: { xy: '0.5rem' },\r\n WebkitBackgroundClip: 'text',\r\n textShadow: '-1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff',\r\n});\r\n\r\nconst sharedStyle: Style = {\r\n borderRadius: '50%',\r\n color: white,\r\n margin: { xy: '0.5rem' },\r\n height: pixelsToUnit(32),\r\n lineHeight: pixelsToUnit(32),\r\n textAlign: 'center',\r\n width: pixelsToUnit(32),\r\n [minTinyMediaQuery]: {\r\n height: pixelsToUnit(40),\r\n lineHeight: pixelsToUnit(40),\r\n width: pixelsToUnit(40),\r\n },\r\n};\r\n\r\nconst triStyle: Style = {\r\n height: pixelsToUnit(32),\r\n width: pixelsToUnit(32),\r\n lineHeight: pixelsToUnit(32),\r\n textAlign: 'center',\r\n};\r\n\r\nconst OuterWrapper = styled.div({\r\n position: 'relative',\r\n height: '100%',\r\n width: '100%',\r\n border: {\r\n top: {\r\n color: (theme) => theme.discountBadgeColor,\r\n width: '75px',\r\n style: 'solid',\r\n },\r\n right: {\r\n color: 'transparent',\r\n width: '75px',\r\n style: 'solid',\r\n },\r\n },\r\n});\r\n\r\nconst InnerWrapper = styled.div({\r\n position: 'absolute',\r\n top: pixelsToUnit(-75),\r\n left: pixelsToUnit(8),\r\n color: white,\r\n fontWeight: 'bold',\r\n fontSize: pixelsToUnit(16),\r\n});\r\n\r\nexport const NewBadge = styled(Badge, {\r\n backgroundColor: (theme) => theme.badgeColor,\r\n ...sharedStyle,\r\n});\r\n\r\nexport const DiscountBadge = styled(Badge, {\r\n backgroundColor: (theme) => theme.discountBadgeColor,\r\n ...sharedStyle,\r\n});\r\n\r\nexport const DiscountTriBadge = styled(TriBadge, {\r\n ...triStyle,\r\n});\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { theta, medium, large, micro, pixelsToUnit } from 'Shared/Style';\r\nimport { ValuePropType, ViewportPropType } from './shared';\r\nimport { StyleOrStyleArray } from '@glitz/type';\r\n\r\ntype PropType = {\r\n bulletPoints: string[];\r\n bulletLimit?: boolean;\r\n isMobile?: boolean;\r\n listItemCss?: StyleOrStyleArray;\r\n} & ViewportPropType &\r\n ValuePropType;\r\n\r\nconst ListStyleType = styled.div({\r\n display: 'inline-block',\r\n width: pixelsToUnit(8),\r\n height: pixelsToUnit(8),\r\n backgroundColor: (Theme) => Theme.bulletpoints,\r\n borderRadius: '50%',\r\n marginRight: medium,\r\n verticalAlign: 'middle',\r\n});\r\n\r\nconst ListStyleMobileType = styled(ListStyleType, {\r\n marginRight: micro,\r\n width: pixelsToUnit(6),\r\n height: pixelsToUnit(6),\r\n});\r\n\r\nconst Li = styled.li({\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n});\r\n\r\nconst Value = styled.span({\r\n textAlign: 'left',\r\n verticalAlign: 'middle',\r\n});\r\n\r\nconst UspBullets = styled(\r\n (props: PropType & StyledProps) => {\r\n let Sliced: string[] = props.bulletPoints;\r\n if (props.bulletLimit) {\r\n Sliced = props.bulletPoints.slice(0, 4);\r\n }\r\n const UlComponent = props.isCompact ? MobileUl : DesktopUl;\r\n return props.hasValue ? (\r\n <UlComponent css={props.compose()}>\r\n {Sliced.map((bulletPoint, index) => (\r\n <Li title={bulletPoint} key={bulletPoint + index} css={props.listItemCss}>\r\n {props.isMobile ? <ListStyleMobileType /> : <ListStyleType />}\r\n <Value>{bulletPoint}</Value>\r\n </Li>\r\n ))}\r\n </UlComponent>\r\n ) : null;\r\n },\r\n {\r\n listStyleType: 'none',\r\n textAlign: 'left',\r\n },\r\n);\r\n\r\nexport default UspBullets;\r\n\r\nconst MobileUl = styled.ul({\r\n minWidth: '138px',\r\n maxWidth: '308px',\r\n});\r\n\r\nconst DesktopUl = styled.ul({\r\n fontSize: theta,\r\n margin: {\r\n y: large,\r\n x: 0,\r\n },\r\n minWidth: 'initial',\r\n maxWidth: 'initial',\r\n});\r\n","export function formatTitleCase(str: string) {\r\n if (str === '') {\r\n return str;\r\n }\r\n return str.replace(/\\S*/g, function(txt) {\r\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\r\n });\r\n}\r\n","import factory from './icon';\r\nimport Svg from './glyphs/remove-plain.svg';\r\n\r\nexport default factory(Svg);\r\n","import { epiPropertyValue } from '@avensia/scope-episerver';\r\n\r\n// This function processes a variation name so it'll display nicer.\r\nexport function prepareVariationName(name: Scope.Property<string> | string): string {\r\n if (typeof name !== 'string') {\r\n name = epiPropertyValue(name) || '';\r\n }\r\n\r\n // don't linebreak between an amount and a single-word (presumed) unit\r\n name = name.replace(/\\d \\w*$/, m => m.replace(' ', String.fromCharCode(160))); // replacing with a non-breaking space\r\n\r\n return name;\r\n}\r\n","import { styled } from '@glitz/react';\r\nimport factory from './icon';\r\nimport Svg from './glyphs/md-checkmark.svg';\r\n\r\nexport const CheckIcon = factory(Svg);\r\n\r\nexport const Check = styled(CheckIcon, {\r\n verticalAlign: 'text-bottom',\r\n});\r\n","import React from 'react';\r\nimport { isIOS } from '@avensia/scope/device-type';\r\n\r\nconst DEFAULT_SCALE = 0.8;\r\nconst DEFAULT_ROTATE = 20;\r\nconst DEFAULT_OPACITY = 0;\r\n\r\ntype PropType = {\r\n isOpen: boolean;\r\n children?: (style: React.CSSProperties, onCloseEnd: () => void) => React.ReactElement<any>;\r\n scaleX?: boolean;\r\n onCloseEnd?: () => void;\r\n};\r\n\r\nexport default function SlideIn({ isOpen, scaleX = true, children, onCloseEnd }: PropType) {\r\n return children(\r\n {\r\n transform: isIOS()\r\n ? `scale(${isOpen ? 1 : DEFAULT_SCALE})`\r\n : `perspective(40cm) scale(${isOpen ? 1 : DEFAULT_SCALE}) rotateX(${isOpen ? 0 : DEFAULT_ROTATE}deg)`,\r\n opacity: isOpen ? 1 : DEFAULT_OPACITY,\r\n },\r\n onCloseEnd,\r\n );\r\n}\r\n","import React from 'react';\r\nimport { styled, StyledProps, StyledElementProps, applyClassName } from '@glitz/react';\r\nimport { ESC_KEY, Breakpoint } from '@avensia/scope';\r\nimport Button, { Appearance as ButtonAppearance, Variant as ButtonVariant } from 'Shared/Button';\r\nimport SlideIn from 'Shared/SlideIn';\r\nimport Close from 'Shared/Icon/Close';\r\nimport Back from 'Shared/Icon/Back';\r\nimport Overlay, { closeOpenOverlay } from 'Shared/Overlay';\r\nimport Viewport from 'Shared/Viewport';\r\nimport { ZIndex, large, depth, white, zeta, pixelsToUnit, transition } from 'Shared/Style';\r\nimport connect from 'Shared/connect';\r\nimport freezeScroll from 'Shared/freeze-scroll';\r\n\r\nexport enum CloseType {\r\n Close,\r\n Back,\r\n}\r\n\r\ntype ConnectStateType = {\r\n currentBreakpoint: number;\r\n};\r\n\r\ntype BasePropType = StyledProps & {\r\n isOpen: boolean;\r\n maxWidth: string;\r\n maxHeight: string;\r\n onCloseEnd?: () => void;\r\n};\r\n\r\nexport type StrictPropType = StyledProps & {\r\n isOpen?: boolean;\r\n maxWidth?: string;\r\n maxHeight?: string;\r\n};\r\n\r\nexport type PropType = StyledProps &\r\n StrictPropType &\r\n ConnectStateType & {\r\n title?: string;\r\n action?: React.StatelessComponent<any> | React.ComponentClass<any>;\r\n onClose: () => void;\r\n onCloseEnd?: () => void;\r\n closeType?: CloseType;\r\n };\r\n\r\nconst Transition: React.StatelessComponent<BasePropType & StyledElementProps> = ({\r\n className,\r\n isOpen,\r\n children,\r\n onCloseEnd,\r\n}) => (\r\n <SlideIn isOpen={isOpen}>\r\n {(style: React.CSSProperties) => (\r\n <div className={className} style={style} onTransitionEnd={onCloseEnd}>\r\n {children}\r\n </div>\r\n )}\r\n </SlideIn>\r\n );\r\n\r\nconst HEADER_HEIGHT = 50;\r\nconst CompactBase = styled(applyClassName(Transition), {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n height: '100%',\r\n width: '100%',\r\n backgroundColor: 'white',\r\n zIndex: ZIndex.Panel,\r\n ...transition({\r\n property: ['opacity', 'transform'],\r\n duration: '300ms',\r\n }),\r\n});\r\n\r\nconst ExtensiveBase = styled((props: BasePropType) => (\r\n <CompactBase\r\n css={{\r\n right: '0',\r\n bottom: '0',\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n marginTop: 'auto',\r\n marginBottom: 'auto',\r\n maxWidth: props.maxWidth || '45rem',\r\n height: props.maxHeight ? '100%' : '60rem',\r\n maxHeight: props.maxHeight || `calc(80% - ${large})`,\r\n ...depth(),\r\n }}\r\n {...props}\r\n />\r\n));\r\n\r\nconst Header = styled.header({\r\n backgroundColor: theme => theme.primaryColor,\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexShrink: 0,\r\n color: white,\r\n paddingLeft: '20px',\r\n height: pixelsToUnit(HEADER_HEIGHT),\r\n});\r\n\r\nconst Heading = styled.div({\r\n flexGrow: 1,\r\n fontSize: zeta,\r\n fontWeight: 'bold',\r\n textTransform: 'uppercase',\r\n});\r\n\r\n// Using flexbox here helps us growing children to\r\n// full height in some cases\r\nconst Body = styled.div({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n height: '100%',\r\n position: 'relative',\r\n overflowY: 'auto',\r\n});\r\n\r\nconst ActionButton = styled(Button, {\r\n paddingRight: '20px',\r\n});\r\n\r\nconst BackIcon = styled(Back, {\r\n width: pixelsToUnit(10.2),\r\n height: pixelsToUnit(17.6),\r\n verticalAlign: 'middle',\r\n});\r\n\r\nexport const StrictPanel = (props: StrictPropType) => {\r\n // @ts-ignore: type 'typeof globalThis' has no index signature\r\n const isOpen = !!this.props.isOpen;\r\n const panelProps = {\r\n isOpen,\r\n maxWidth: props.maxWidth,\r\n maxHeight: props.maxHeight,\r\n };\r\n return (\r\n <Viewport>\r\n {(isCompact: boolean) =>\r\n isCompact ? (\r\n // @ts-ignore: type 'typeof globalThis' has no index signature\r\n <CompactBase {...panelProps}>{this.props.children}</CompactBase>\r\n ) : (\r\n <ExtensiveBase css={props.compose()} {...panelProps}>\r\n // @ts-ignore: type 'typeof globalThis' has no index signature\r\n {this.props.children}\r\n </ExtensiveBase>\r\n )\r\n }\r\n </Viewport>\r\n );\r\n};\r\n\r\ntype StateType = {\r\n contentDisplay: boolean;\r\n};\r\nclass Panel extends React.Component<PropType, StateType> {\r\n unfreezeScroll: () => void;\r\n state: StateType = {\r\n contentDisplay: false,\r\n };\r\n UNSAFE_componentWillMount() {\r\n if (this.props.isOpen) {\r\n closeOpenOverlay();\r\n }\r\n }\r\n componentDidMount() {\r\n window.addEventListener('keydown', this.keyDown);\r\n }\r\n componentWillUnmount() {\r\n this.scrollFreeze(false);\r\n window.removeEventListener('keydown', this.keyDown);\r\n }\r\n scrollFreeze(freeze: boolean) {\r\n if (this.unfreezeScroll) {\r\n this.unfreezeScroll();\r\n }\r\n this.unfreezeScroll = freeze ? freezeScroll() : null;\r\n }\r\n toggleContentDisplay = () => {\r\n this.setState({\r\n contentDisplay: this.props.isOpen,\r\n });\r\n };\r\n closeCompletely = () => {\r\n if (!this.props.isOpen) {\r\n this.toggleContentDisplay();\r\n }\r\n if (this.props.onCloseEnd) {\r\n this.props.onCloseEnd();\r\n }\r\n };\r\n componentDidUpdate(prevProps: PropType) {\r\n if (prevProps.isOpen !== this.props.isOpen) {\r\n if (this.props.currentBreakpoint < Breakpoint.Medium) {\r\n this.scrollFreeze(this.props.isOpen);\r\n }\r\n if (this.props.isOpen) {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n this.toggleContentDisplay();\r\n });\r\n });\r\n }\r\n }\r\n }\r\n keyDown = (e: KeyboardEvent) => {\r\n if (e.keyCode === ESC_KEY && this.props.isOpen) {\r\n this.props.onClose();\r\n }\r\n };\r\n\r\n render() {\r\n const { contentDisplay } = this.state;\r\n const { maxWidth, maxHeight, isOpen } = this.props;\r\n const appendToDOM = isOpen ? isOpen : contentDisplay;\r\n const displayPanel = isOpen ? contentDisplay : isOpen;\r\n const panelProps = {\r\n isOpen: displayPanel,\r\n maxWidth,\r\n maxHeight,\r\n onCloseEnd: this.closeCompletely,\r\n };\r\n const panelHeader = this.props.title && (\r\n <Header>\r\n <Heading>{this.props.title}</Heading>\r\n <ActionButton onClick={this.props.onClose} variant={ButtonVariant.None} appearance={ButtonAppearance.Bare}>\r\n {this.props.closeType && this.props.closeType === CloseType.Back ? <BackIcon /> : <Close />}\r\n </ActionButton>\r\n </Header>\r\n );\r\n const panelBody = (\r\n <Body css={{ minHeight: this.props.title ? `calc(100% - ${HEADER_HEIGHT}px)` : '100%' }}>\r\n {this.props.children}\r\n </Body>\r\n );\r\n return (\r\n <Viewport>\r\n {(isCompact: boolean) =>\r\n appendToDOM &&\r\n (isCompact ? (\r\n <CompactBase css={this.props.compose()} {...panelProps}>\r\n {panelHeader}\r\n {panelBody}\r\n </CompactBase>\r\n ) : (\r\n <Overlay enabled={this.props.isOpen} onClose={this.props.onClose}>\r\n <ExtensiveBase css={this.props.compose()} {...panelProps}>\r\n {panelHeader}\r\n {panelBody}\r\n </ExtensiveBase>\r\n </Overlay>\r\n ))\r\n }\r\n </Viewport>\r\n );\r\n }\r\n}\r\n\r\nexport default styled(\r\n connect(\r\n (state): ConnectStateType => ({\r\n currentBreakpoint: state.currentBreakpoint,\r\n }),\r\n )(Panel),\r\n);\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { StyleOrStyleArray, Style } from '@glitz/type';\r\nimport Link from 'Shared/Link';\r\nimport { translate } from '@avensia/scope';\r\nimport { epiPropertyValue } from '@avensia/scope-episerver';\r\nimport EsalesProductForListType from '../../../Esales/Models/EsalesProductForList.type';\r\nimport Image, { Ratio as ImageRatio, Preset as ImagePreset } from 'Shared/Image/Ratio';\r\nimport UspBullets from './../ProductDetails/UspBullets';\r\nimport {\r\n gamma,\r\n theta,\r\n transition,\r\n pixelsToUnit,\r\n truncate,\r\n small,\r\n minMediumMediaQuery,\r\n zeta,\r\n sigma,\r\n} from 'Shared/Style';\r\nimport connect from 'Shared/connect';\r\nimport Button, { Appearance as ButtonAppearance, Variant as ButtonVariant } from 'Shared/Button';\r\nimport Icon from 'Shared/Icon/Cart';\r\nimport { formatTitleCase } from 'Shared/string-format';\r\nimport AddToCart from 'Product/ProductAddToCart';\r\nimport AverageRatings, { Spacing, Size } from 'Product/ProductDetails/AverageRating';\r\nimport AverageRatingsBlack from 'Product/ProductDetails/AverageRatingBlack';\r\nimport Price, { Type as PriceType } from 'Pricing/Price';\r\nimport { NewBadge, DiscountBadge, DiscountTriBadge } from './Badge';\r\nimport { prepareVariationName } from 'Shared/variation-helper';\r\nimport { Check } from 'Shared/Icon/Check-Thin';\r\nimport Cross from 'Shared/Icon/RemovePlain';\r\nimport { Theme } from 'Shared/Theming';\r\n\r\ntype RequiredPropType = {\r\n product: EsalesProductForListType;\r\n addToCart: () => Promise<void>;\r\n};\r\n\r\ntype StateType = {\r\n bulletPointsVisible: boolean;\r\n};\r\n\r\ntype ConnectStateType = {\r\n theme: string;\r\n};\r\n\r\ntype PropType = RequiredPropType & StyledProps & ConnectStateType;\r\n\r\nclass ProductCard extends React.Component<PropType, StateType> {\r\n state: StateType = {\r\n bulletPointsVisible: false,\r\n };\r\n\r\n toggleBulletPointsTrue = (event: React.MouseEvent<HTMLDivElement>) => {\r\n this.setState({ bulletPointsVisible: true });\r\n event.stopPropagation();\r\n event.preventDefault();\r\n };\r\n\r\n toggleBulletPointsFalse = (event: React.MouseEvent<HTMLDivElement>) => {\r\n this.setState({ bulletPointsVisible: false });\r\n event.stopPropagation();\r\n event.preventDefault();\r\n };\r\n\r\n render() {\r\n const {\r\n averageRating: productRatings = 0,\r\n brand = '',\r\n imageUrls,\r\n price,\r\n hasMultipleVariants = false,\r\n hasDiscount = false,\r\n hasPromotion = false,\r\n isNew: isProductNew = false,\r\n variation: { displayName },\r\n url: productUrl = '',\r\n inStock,\r\n ticket: productTicket,\r\n displayTagDesigner,\r\n displayHighlightImage,\r\n whiteHighlightText,\r\n highlightImageUrl,\r\n hideProductInfo,\r\n bulletPoints = [],\r\n promotions,\r\n } = this.props.product;\r\n\r\n const { bulletPointsVisible } = this.state;\r\n\r\n const images = imageUrls || [];\r\n const productImage = images.length > 0 ? images[0] : '';\r\n const productBrand = brand ? formatTitleCase(brand.trim()) : '';\r\n const productName = formatTitleCase(prepareVariationName(epiPropertyValue(displayName)).trim());\r\n const { current: currentPrice, original: originalPrice, currency, discountPercentage } = price;\r\n const isPriceDiscounted = currentPrice < originalPrice;\r\n const currentTheme = this.props.theme;\r\n const imageHoverStyle: Style = {\r\n height: '110px',\r\n };\r\n\r\n const imageNoHoverStyle: Style = {\r\n height: '200px',\r\n };\r\n\r\n const imageWithPaddingStyle: Style = {\r\n paddingTop: pixelsToUnit(10),\r\n };\r\n\r\n const actionButtonText =\r\n hasMultipleVariants || displayTagDesigner\r\n ? translate('/ProductListing/ViewProduct')\r\n : inStock\r\n ? this.props.theme === Theme.DoggieDefault\r\n ? translate('/Cart/BuyDoggie')\r\n : translate('/Cart/BuyDesktop')\r\n : translate('/Cart/OutOfStock');\r\n\r\n const PromotionNode = (\r\n <styled.Div css={{ position: 'absolute', right: 0, zIndex: 4 }}>\r\n <PromotionTitle>{translate('/Product/Badge/Campaign')}</PromotionTitle>\r\n {promotions.map((promotion, i) => {\r\n if (i < 4) {\r\n return (\r\n <PromotionLink key={i} to={promotion.promotionUrl}>\r\n <PromotionItemTitle>{promotion.promotionName}</PromotionItemTitle>\r\n </PromotionLink>\r\n );\r\n }\r\n })}\r\n </styled.Div>\r\n );\r\n\r\n return (\r\n <Base css={this.props.compose()}>\r\n {hasPromotion && PromotionNode}\r\n <ExtensionWrapper onMouseEnter={this.toggleBulletPointsTrue} onMouseLeave={this.toggleBulletPointsFalse}>\r\n <Body to={productUrl} linkIdentifier={productTicket}>\r\n {displayHighlightImage && (\r\n <HighlightImage>\r\n <img style={{ height: '100%', objectFit: 'cover' }} src={highlightImageUrl} />\r\n </HighlightImage>\r\n )}\r\n <Wrapper\r\n css={\r\n displayHighlightImage &&\r\n (hideProductInfo\r\n ? { visibility: 'hidden' }\r\n : whiteHighlightText\r\n ? { color: 'white', zIndex: 4 }\r\n : { zIndex: 4 })\r\n }\r\n >\r\n {hasDiscount ? (\r\n !currentTheme.startsWith('dog') &&\r\n !currentTheme.startsWith('cli') &&\r\n !currentTheme.startsWith('lac') ? (\r\n <DiscountTriBadge>{`-${discountPercentage}%`}</DiscountTriBadge>\r\n ) : (\r\n <DiscountBadge>{`-${discountPercentage}%`}</DiscountBadge>\r\n )\r\n ) : (\r\n isProductNew && <NewBadge>{`${translate('/Product/Badge/New')}!`}</NewBadge>\r\n )}\r\n {!displayHighlightImage ? (\r\n <ImageStyled\r\n alt={productName}\r\n itemProp=\"image\"\r\n preset={!productImage.includes('.gif') ? ImagePreset.Tiny : undefined}\r\n ratio={ImageRatio.OneToOne}\r\n src={productImage}\r\n css={bulletPointsVisible && bulletPoints.length > 0 ? imageHoverStyle : imageNoHoverStyle}\r\n imageStyle={imageWithPaddingStyle}\r\n lazy\r\n />\r\n ) : (\r\n <div style={{ height: '200px' }} />\r\n )}\r\n\r\n <RatingsPlaceholder>\r\n {!!productRatings ? (\r\n !currentTheme.startsWith('dog') &&\r\n !currentTheme.startsWith('cli') &&\r\n !currentTheme.startsWith('lac') ? (\r\n <AverageRatingsBlack average={productRatings} spacing={Spacing.Normal} size={Size.Tiny} />\r\n ) : (\r\n <Ratings average={productRatings} spacing={Spacing.Normal} size={Size.Normal} />\r\n )\r\n ) : (\r\n <RatingsNone average={productRatings} spacing={Spacing.Normal} size={Size.Normal} />\r\n )}\r\n </RatingsPlaceholder>\r\n <BrandPlaceholder>{productBrand && <Brand itemProp=\"brand\">{productBrand}</Brand>}</BrandPlaceholder>\r\n <NameWrapper css={displayHighlightImage && { zIndex: 4 }}>\r\n <Name itemProp=\"name\">{productName}</Name>\r\n </NameWrapper>\r\n {!displayHighlightImage && bulletPointsVisible && (\r\n <UspBulletsStyled\r\n bulletLimit\r\n hasValue={bulletPoints && bulletPoints.length > 0}\r\n bulletPoints={bulletPoints}\r\n listItemCss={bulletListItemStyle}\r\n />\r\n )}\r\n </Wrapper>\r\n </Body>\r\n <LowerWrapper>\r\n <Prices>\r\n <CurrentPrice\r\n css={whiteHighlightText && displayHighlightImage && { color: 'white' }}\r\n current={currentPrice}\r\n currency={currency}\r\n priceType={isPriceDiscounted ? PriceType.New : PriceType.Regular}\r\n />\r\n {isPriceDiscounted && <OldPrice current={originalPrice} currency={currency} priceType={PriceType.Old} />}\r\n </Prices>\r\n <StockPlaceholder>\r\n {inStock ? (\r\n <StockStatus>\r\n <CheckIcon />\r\n {translate('/Product/InStock')}\r\n </StockStatus>\r\n ) : (\r\n <StockStatus>\r\n {translate('/Product/OutOfStock')}\r\n <CrossIcon />\r\n </StockStatus>\r\n )}\r\n </StockPlaceholder>\r\n <ActionStyled\r\n displayTagDesigner={displayTagDesigner}\r\n css={displayHighlightImage ? { zIndex: 4 } : { zIndex: 0 }}\r\n hasVariants={hasMultipleVariants}\r\n productUrl={productUrl}\r\n isInStock={inStock}\r\n addCart={this.props.addToCart}\r\n >\r\n {inStock && <CartIcon />}\r\n {actionButtonText}\r\n </ActionStyled>\r\n </LowerWrapper>\r\n </ExtensionWrapper>\r\n </Base>\r\n );\r\n }\r\n}\r\n\r\nexport default styled(\r\n connect(\r\n (state): ConnectStateType => ({\r\n theme: state.currentTheme,\r\n }),\r\n )(ProductCard),\r\n);\r\n\r\ntype ActionPropType = {\r\n hasVariants: boolean;\r\n productUrl: string;\r\n isInStock: boolean;\r\n children: React.ReactNode;\r\n addCart: () => Promise<void>;\r\n displayTagDesigner: boolean;\r\n};\r\n\r\nconst Action = styled((props: ActionPropType & StyledProps) => {\r\n return props.hasVariants || props.displayTagDesigner ? (\r\n <ViewProduct\r\n css={props.compose()}\r\n to={props.productUrl}\r\n variant={ButtonVariant.Small}\r\n appearance={[ButtonAppearance.Primary, ButtonAppearance.Full]}\r\n >\r\n {props.children}\r\n </ViewProduct>\r\n ) : (\r\n <AddCart css={props.compose()} disabled={!props.isInStock} variant={ButtonVariant.Small} addToCart={props.addCart}>\r\n {props.children}\r\n </AddCart>\r\n );\r\n});\r\n\r\nconst Base = styled.div({\r\n height: '400px',\r\n boxShadow: (theme) => `0 0.2rem 1rem 0 rgba(${theme.shadowColor}, 0.2)`,\r\n display: 'flex',\r\n backgroundColor: (theme) => theme.cardBackgroundColor,\r\n flexDirection: 'column',\r\n position: 'relative',\r\n textAlign: 'left',\r\n marginBottom: '2rem',\r\n});\r\n\r\nconst Wrapper = styled.div({\r\n position: 'relative',\r\n});\r\n\r\nconst ExtensionWrapper = styled.div({\r\n position: 'relative',\r\n height: '400px',\r\n overflow: 'hidden',\r\n backgroundColor: (theme) => theme.cardBackgroundColor,\r\n borderRadius: '0.15rem',\r\n width: '100%',\r\n zIndex: 2,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n boxShadow: (theme) => `0 0 0.5rem rgba(${theme.shadowColor}, 0)`,\r\n transform: 'translateZ(0)',\r\n willChange: 'transform',\r\n ...transition({\r\n property: ['color', 'background', 'opacity', 'box-shadow', 'transform'],\r\n duration: '0.2s',\r\n timingFunction: 'ease-out',\r\n }),\r\n ':hover': {\r\n backgroundColor: '#fff',\r\n boxShadow: (theme) => `0 0.3rem 1rem 0 rgba(${theme.shadowColor}, 0.3)`,\r\n transform: 'translateZ(0) scale(1.02)',\r\n zIndex: 3,\r\n },\r\n});\r\n\r\nconst ActionStyled = styled(Action, {\r\n backgroundColor: (theme) => theme.buyButtonProductcardDesktop,\r\n});\r\n\r\nconst StockPlaceholder = styled.div({\r\n padding: {\r\n x: pixelsToUnit(5),\r\n },\r\n});\r\n\r\nconst StockStatus = styled.span({\r\n fontSize: pixelsToUnit(11),\r\n letterSpacing: pixelsToUnit(0.3),\r\n lineHeight: pixelsToUnit(10),\r\n});\r\n\r\nconst CheckIcon = styled(Check, {\r\n marginRight: pixelsToUnit(5),\r\n height: '1rem',\r\n color: (theme) => theme.buttonTextColor,\r\n});\r\n\r\nconst Body = styled(Link, {\r\n color: (theme) => theme.textColor,\r\n marginBottom: pixelsToUnit(10),\r\n});\r\n\r\nconst Brand = styled.div({\r\n fontSize: sigma,\r\n marginBottom: small,\r\n ...truncate(),\r\n});\r\n\r\nconst PromotionLink = styled(Link, {\r\n marginBottom: pixelsToUnit(10),\r\n cursor: 'pointer',\r\n});\r\n\r\nconst BrandPlaceholder = styled.div({\r\n height: small,\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n flex: {\r\n basis: pixelsToUnit(18),\r\n shrink: 0,\r\n },\r\n lineHeight: 'normal',\r\n marginTop: pixelsToUnit(10),\r\n padding: {\r\n x: pixelsToUnit(5),\r\n },\r\n});\r\n\r\nconst Ratings = styled(AverageRatings, {\r\n lineHeight: pixelsToUnit(18),\r\n});\r\n\r\nconst RatingsNone = styled(Ratings, {\r\n opacity: 0.3,\r\n});\r\n\r\nconst RatingsPlaceholder = styled.div({\r\n paddingLeft: pixelsToUnit(5),\r\n marginTop: pixelsToUnit(10),\r\n marginBottom: pixelsToUnit(8),\r\n});\r\n\r\nconst NameWrapper = styled.div({\r\n height: '2.4rem',\r\n padding: {\r\n x: pixelsToUnit(5),\r\n },\r\n});\r\n\r\nconst Name = styled.div({\r\n position: 'relative',\r\n flexBasis: pixelsToUnit(34),\r\n textTransform: 'uppercase',\r\n fontWeight: 'bold',\r\n flexShrink: 0,\r\n fontSize: zeta,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n display: '-webkit-box',\r\n WebkitLineClamp: 2,\r\n WebkitBoxOrient: 'vertical',\r\n letterSpacing: pixelsToUnit(0.2),\r\n lineHeight: 'normal',\r\n marginTop: pixelsToUnit(3),\r\n [minMediumMediaQuery]: {\r\n flexBasis: pixelsToUnit(46),\r\n fontSize: sigma,\r\n marginTop: pixelsToUnit(3),\r\n },\r\n});\r\n\r\nconst bulletListItemStyle: StyleOrStyleArray = {\r\n fontSize: '0.7rem',\r\n marginBottom: 0,\r\n marginLeft: '0.2rem',\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n [minMediumMediaQuery]: {\r\n fontSize: '0.8rem',\r\n },\r\n};\r\n\r\nconst Prices = styled.div({\r\n display: 'flex',\r\n flexBasis: pixelsToUnit(20),\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n flexShrink: 0,\r\n justifyContent: 'flex-start',\r\n padding: {\r\n x: pixelsToUnit(5),\r\n },\r\n margin: {\r\n top: pixelsToUnit(8),\r\n bottom: pixelsToUnit(8),\r\n },\r\n});\r\n\r\nconst CurrentPrice = styled(Price, {\r\n lineHeight: '1rem',\r\n fontSize: gamma,\r\n color: (theme) => theme.textColor,\r\n marginRight: small,\r\n});\r\n\r\nconst OldPrice = styled(Price, {\r\n paddingTop: '0.15rem',\r\n fontSize: theta,\r\n lineHeight: '0.8rem',\r\n});\r\n\r\nconst UspBulletsStyled = styled(UspBullets, {\r\n ...transition({ property: 'all', duration: 150 }),\r\n padding: {\r\n x: pixelsToUnit(5),\r\n bottom: pixelsToUnit(5),\r\n },\r\n margin: {\r\n xy: 0,\r\n },\r\n});\r\n\r\nconst CartIcon = styled(Icon, {\r\n width: pixelsToUnit(19.3),\r\n height: pixelsToUnit(18),\r\n [minMediumMediaQuery]: {\r\n marginRight: pixelsToUnit(10),\r\n },\r\n});\r\n\r\nconst CrossIcon = styled(Cross, {\r\n marginLeft: pixelsToUnit(5),\r\n height: '1rem',\r\n color: 'red',\r\n});\r\n\r\nconst actionStyle = styled({\r\n fontSize: theta,\r\n borderRadius: 0,\r\n padding: {\r\n x: pixelsToUnit(5),\r\n },\r\n ...transition({ property: ['opacity', 'background'], duration: '1s' }),\r\n});\r\n\r\nconst ViewProduct = actionStyle(Button);\r\nconst AddCart = actionStyle(AddToCart);\r\n\r\nconst ImageStyled = styled(Image, {\r\n mixBlendMode: 'multiply',\r\n ...transition({ property: 'all', duration: 200 }),\r\n});\r\n\r\nconst HighlightImage = styled.div({\r\n color: (theme) => theme.campaignBackgroundColor,\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n zIndex: 3,\r\n height: '100%',\r\n width: '100%',\r\n});\r\n\r\nconst LowerWrapper = styled.div({\r\n backgroundColor: (theme) => theme.cardBackgroundColor,\r\n position: 'absolute',\r\n bottom: 0,\r\n width: '100%',\r\n height: '95px',\r\n});\r\n\r\nexport const PromotionItemTitle = styled.div({\r\n color: 'white',\r\n backgroundColor: (theme) => theme.campaignTextProductcard,\r\n maxWidth: pixelsToUnit(90),\r\n minWidth: pixelsToUnit(60),\r\n width: '100%',\r\n fontSize: pixelsToUnit(8),\r\n marginBottom: pixelsToUnit(1),\r\n textTransform: 'uppercase',\r\n padding: { xy: pixelsToUnit(2) },\r\n textAlign: 'center',\r\n});\r\nexport const PromotionTitle = styled(PromotionItemTitle, {\r\n cursor: 'default',\r\n});\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { pixelsToUnit } from 'Shared/Style';\r\nimport { StarBlack, StarOutlineBlack, HalfStarBlack } from 'Shared/Icon/Star-Black';\r\n\r\nexport enum Spacing {\r\n Normal,\r\n Medium,\r\n Wide,\r\n}\r\n\r\nexport enum Size {\r\n Micro,\r\n Tiny,\r\n Normal,\r\n Large,\r\n Huge,\r\n}\r\n\r\ntype PropType = {\r\n average: number;\r\n spacing: Spacing;\r\n size: Size;\r\n} & StyledProps;\r\n\r\nfunction getStyles(size: Size, spacing: Spacing) {\r\n let height;\r\n let width;\r\n let marginLeft;\r\n switch (size) {\r\n case Size.Micro:\r\n height = pixelsToUnit(10);\r\n width = pixelsToUnit(10);\r\n break;\r\n case Size.Tiny:\r\n height = pixelsToUnit(12.8);\r\n width = pixelsToUnit(13.8);\r\n break;\r\n case Size.Normal:\r\n height = pixelsToUnit(15);\r\n width = pixelsToUnit(15);\r\n break;\r\n case Size.Large:\r\n height = pixelsToUnit(20);\r\n width = pixelsToUnit(20);\r\n break;\r\n case Size.Huge:\r\n height = pixelsToUnit(24);\r\n width = pixelsToUnit(24);\r\n break;\r\n default:\r\n break;\r\n }\r\n switch (spacing) {\r\n case Spacing.Normal:\r\n marginLeft = pixelsToUnit(5);\r\n break;\r\n case Spacing.Medium:\r\n marginLeft = pixelsToUnit(10);\r\n break;\r\n case Spacing.Wide:\r\n marginLeft = pixelsToUnit(15);\r\n break;\r\n default:\r\n break;\r\n }\r\n return {\r\n height,\r\n width,\r\n ':not(:first-child)': {\r\n marginLeft,\r\n },\r\n };\r\n}\r\n\r\nexport default styled((props: PropType) => {\r\n const RATINGS = [1, 2, 3, 4, 5];\r\n const floatPart = Number(props.average - Math.trunc(props.average)).toFixed(1);\r\n const parsedFloat = parseFloat(floatPart);\r\n const starStyles = getStyles(props.size, props.spacing);\r\n return (\r\n <Base css={props.compose()}>\r\n {RATINGS.map((rating) => {\r\n if (rating <= props.average) {\r\n return <StarBlack key={rating} css={starStyles} />;\r\n } else if (rating <= Math.ceil(props.average)) {\r\n if (parsedFloat < 0.4) {\r\n return <StarOutlineBlack key={rating} css={starStyles} />;\r\n } else if (parsedFloat < 0.8) {\r\n return <HalfStarBlack key={rating} css={starStyles} />;\r\n } else {\r\n return <StarBlack key={rating} css={starStyles} />;\r\n }\r\n } else {\r\n return <StarOutlineBlack key={rating} css={starStyles} />;\r\n }\r\n })}\r\n </Base>\r\n );\r\n});\r\n\r\nconst Base = styled.div({\r\n whiteSpace: 'nowrap',\r\n});\r\n","import factory from './icon';\r\nimport StarSvg from './glyphs/star-black.svg';\r\nimport StarOutlineSvg from './glyphs/star-outline-black.svg';\r\nimport StarHalfSvg from './glyphs/star-half-black.svg';\r\n\r\nexport const StarBlack = factory(StarSvg);\r\nexport const StarOutlineBlack = factory(StarOutlineSvg);\r\nexport const HalfStarBlack = factory(StarHalfSvg);\r\n","import React from 'react';\r\nimport { Style } from '@glitz/type';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { pseudo } from '@glitz/core';\r\nimport { on } from '@avensia/scope';\r\nimport appearanceFunc, { AppearanceType } from '../appearance';\r\nimport Button, { Appearance as ButtonAppearance, Variant as ButtonVariant } from '../Button';\r\nimport Ul from '../Generic/Ul';\r\nimport { Down } from '../Icon/Arrow';\r\nimport SelectType from './Select.type';\r\nimport { pixelsToUnit, concrete, white, transition, depth, sigma, small, General } from '../Style';\r\n\r\nexport { General as Variant } from '../Style';\r\nexport enum Appearance {\r\n Bare,\r\n Full,\r\n}\r\n\r\nconst PLACEHOLDER = '-';\r\nconst Options = styled(Ul, {\r\n fontWeight: 'normal',\r\n position: 'absolute',\r\n top: '100%',\r\n right: 0,\r\n left: 0,\r\n transform: 'scaleY(0)',\r\n transformOrigin: 'center top',\r\n backgroundColor: white,\r\n listStyleType: 'none',\r\n ...transition({ property: 'transform' }),\r\n ...depth(),\r\n});\r\n\r\nconst OptionLi = styled.li({\r\n position: 'relative',\r\n borderBottom: {\r\n width: pixelsToUnit(1),\r\n style: 'solid',\r\n color: '#e4d9eb',\r\n },\r\n padding: {\r\n y: pixelsToUnit(1.5),\r\n },\r\n ...pseudo(':last-child', {\r\n borderBottomStyle: 'none',\r\n }),\r\n ':hover': {\r\n backgroundColor: concrete,\r\n },\r\n});\r\n\r\nconst Option = styled(Button, {\r\n fontSize: sigma,\r\n letterSpacing: pixelsToUnit(1.3),\r\n height: pixelsToUnit(40),\r\n});\r\n\r\nconst OptionContent = styled.div({\r\n marginLeft: small,\r\n minWidth: '100%',\r\n textAlign: 'left',\r\n});\r\n\r\nconst Content = styled.div({\r\n alignItems: 'center',\r\n display: 'flex',\r\n fontWeight: 'bold',\r\n justifyContent: 'space-between',\r\n padding: { y: 0, x: pixelsToUnit(20) },\r\n});\r\n\r\nconst IconDown = styled(Down, {\r\n width: pixelsToUnit(21),\r\n height: pixelsToUnit(12),\r\n});\r\n\r\nconst IconUp = styled(IconDown, {\r\n transform: 'rotate(180deg)',\r\n});\r\n\r\ntype PropType = StyledProps &\r\n Pick<\r\n React.HTMLAttributes<HTMLInputElement>,\r\n Exclude<keyof React.HTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'className' | 'style'>\r\n > &\r\n SelectType & {\r\n variant?: General;\r\n appearance?: AppearanceType<Appearance | ButtonAppearance>;\r\n onChangeOption?: (value: string) => any;\r\n };\r\n\r\ntype StateType = {\r\n open?: boolean;\r\n};\r\n\r\nexport default styled(\r\n class Select extends React.Component<PropType, StateType> {\r\n unsubscribeBodyClose: () => any;\r\n constructor(props: PropType) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n };\r\n }\r\n componentDidUpdate(prevProps: PropType, prevState: StateType) {\r\n const { open } = this.state;\r\n if (open !== prevState.open) {\r\n if (open) {\r\n this.unsubscribeBodyClose = on('click', () => this.setState({ open: false }));\r\n } else if (this.unsubscribeBodyClose) {\r\n this.unsubscribeBodyClose();\r\n delete this.unsubscribeBodyClose;\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this.unsubscribeBodyClose) {\r\n this.unsubscribeBodyClose();\r\n delete this.unsubscribeBodyClose;\r\n }\r\n }\r\n\r\n toggle = () => this.setState({ open: !this.state.open });\r\n\r\n getContentWidth() {\r\n let count = 0;\r\n this.props.options.forEach((option) => {\r\n count = option.text.length > count ? option.text.length : count;\r\n });\r\n return `calc(${count} * (${sigma} / 2))`;\r\n }\r\n\r\n selectOption(value: string) {\r\n if (this.props.onChangeOption) {\r\n this.props.onChangeOption(value);\r\n }\r\n this.setState({ open: false });\r\n }\r\n\r\n render() {\r\n const selected =\r\n this.props.options.find((o) => o.value === this.props.value) ||\r\n this.props.options.find(\r\n (o) =>\r\n o.value.substring(o.value.lastIndexOf('/')) ===\r\n this.props.value.substring(this.props.value.lastIndexOf('/')),\r\n );\r\n\r\n const { compose, appearance = ButtonAppearance.Bare, variant, options } = this.props;\r\n const contentWidth = this.getContentWidth();\r\n const divStyle: Style = {\r\n alignItems: 'center',\r\n display: 'inline-flex',\r\n position: 'relative',\r\n maxWidth: '100%',\r\n textTransform: 'uppercase',\r\n zIndex: 1,\r\n ...(!appearanceFunc(appearance)(Appearance.Bare) && {\r\n backgroundColor: white,\r\n }),\r\n ...(appearanceFunc(appearance)(Appearance.Full) && {\r\n display: 'block',\r\n }),\r\n };\r\n\r\n return (\r\n <styled.Div css={compose(divStyle)} role=\"listbox\">\r\n <Button appearance={appearance} variant={variant} onClick={this.toggle}>\r\n <Content css={{ minWidth: contentWidth }}>\r\n {selected ? selected.text : PLACEHOLDER}\r\n {this.state.open ? <IconUp /> : <IconDown />}\r\n </Content>\r\n </Button>\r\n <Options css={this.state.open && { transform: 'scaleY(1)' }}>\r\n {options.map((option) => (\r\n <OptionLi key={option.value}>\r\n <Option\r\n variant={ButtonVariant.None}\r\n appearance={[ButtonAppearance.Bare, ButtonAppearance.Full]}\r\n onClick={() => this.selectOption(option.value)}\r\n noRippleEffect\r\n >\r\n <OptionContent>{option.text}</OptionContent>\r\n </Option>\r\n </OptionLi>\r\n ))}\r\n </Options>\r\n </styled.Div>\r\n );\r\n }\r\n },\r\n);\r\n","var React = require('react');\n\nfunction StarBlack (props) {\n return React.createElement(\"svg\",props,React.createElement(\"g\",{\"id\":\"Desktop-PDP-Copy\",\"stroke\":\"none\",\"strokeWidth\":\"1\",\"fill\":\"none\",\"fillRule\":\"evenodd\",\"transform\":\"translate(-774 -425)\"},React.createElement(\"g\",{\"id\":\"Product-Info\",\"transform\":\"translate(744 208)\",\"fill\":\"#000\"},React.createElement(\"g\",{\"id\":\"Recensioner\",\"transform\":\"translate(30 217)\"},React.createElement(\"g\",{\"id\":\"star60\"},React.createElement(\"path\",{\"d\":\"M19.968 7.374c0-.293-.223-.476-.67-.547l-6.015-.87L10.587.54C10.436.214 10.24.05 10 .05s-.435.163-.587.489L6.717 5.958l-6.014.869c-.448.071-.671.254-.671.547 0 .167.1.358.3.572l4.36 4.215-1.03 5.954c-.016.111-.024.19-.024.238a.7.7 0 00.126.423c.084.115.21.173.377.173.144 0 .304-.048.48-.143L10 15.996l5.38 2.81a.974.974 0 00.479.143c.16 0 .282-.058.366-.173a.7.7 0 00.125-.423 1.79 1.79 0 00-.012-.238l-1.03-5.954 4.349-4.215c.208-.206.311-.397.311-.572z\",\"id\":\"Shape\",\"fill\":\"#000\"}))))));\n}\n\nStarBlack.defaultProps = {\"width\":\"20\",\"height\":\"19\",\"viewBox\":\"0 0 20 19\"};\n\nmodule.exports = StarBlack;\n\nStarBlack.default = StarBlack;\n","var React = require('react');\n\nfunction StarOutlineBlack (props) {\n return React.createElement(\"svg\",props,React.createElement(\"g\",{\"id\":\"Desktop-PDP-Copy\",\"stroke\":\"none\",\"strokeWidth\":\"1\",\"fill\":\"currentColor\",\"fillRule\":\"currentColor\",\"transform\":\"translate(-774 -425)\",\"opacity\":\".446\"},React.createElement(\"g\",{\"id\":\"Product-Info\",\"transform\":\"translate(744 208)\",\"fill\":\"#000\"},React.createElement(\"g\",{\"id\":\"Recensioner\",\"transform\":\"translate(30 217)\"},React.createElement(\"g\",{\"id\":\"star61\"},React.createElement(\"path\",{\"d\":\"M19.968 7.374c0-.293-.223-.476-.67-.547l-6.015-.87L10.587.54C10.436.214 10.24.05 10 .05s-.435.163-.587.489L6.717 5.958l-6.014.869c-.448.071-.671.254-.671.547 0 .167.1.358.3.572l4.36 4.215-1.03 5.954c-.016.111-.024.19-.024.238a.7.7 0 00.126.423c.084.115.21.173.377.173.144 0 .304-.048.48-.143L10 15.996l5.38 2.81a.974.974 0 00.479.143c.328 0 .491-.198.491-.595 0-.104-.004-.183-.012-.239l-1.03-5.953 4.35-4.216c.207-.206.31-.397.31-.572zm-6.314 4.252l.863 5.013L10 14.269l-4.529 2.37.875-5.013-3.667-3.537 5.057-.738L10 2.8l2.264 4.55 5.057.738-3.667 3.537z\",\"id\":\"Shape\"}))))));\n}\n\nStarOutlineBlack.defaultProps = {\"width\":\"20\",\"height\":\"19\",\"viewBox\":\"0 0 20 19\"};\n\nmodule.exports = StarOutlineBlack;\n\nStarOutlineBlack.default = StarOutlineBlack;\n","var React = require('react');\n\nfunction StarHalfBlack (props) {\n return React.createElement(\"svg\",props,React.createElement(\"g\",{\"fillRule\":\"evenodd\"},[React.createElement(\"path\",{\"d\":\"M19.968 7.319c0-.292-.223-.473-.67-.544l-6.015-.862L10.587.536C10.436.213 10.24.05 10 .05s-.435.162-.587.485L6.717 5.913l-6.014.862c-.448.071-.671.252-.671.544 0 .166.1.355.3.567l4.36 4.184-1.03 5.909c-.016.11-.024.19-.024.236a.69.69 0 00.126.42c.084.114.21.171.377.171.144 0 .304-.047.48-.141L10 15.875l5.38 2.79a.98.98 0 00.479.141c.328 0 .491-.196.491-.59a1.75 1.75 0 00-.012-.237l-1.03-5.909 4.35-4.183c.207-.205.31-.395.31-.568zm-6.314 4.22l.863 4.975L10 14.162l-4.529 2.352.875-4.976-3.667-3.51 5.057-.733L10 2.781l2.264 4.514 5.057.733-3.667 3.51z\",\"key\":0}),React.createElement(\"path\",{\"d\":\"M10 .051c-.24 0-.435.163-.587.489L6.717 5.958l-6.014.869c-.448.071-.671.254-.671.547 0 .167.1.358.3.572l4.36 4.215-1.03 5.954c-.016.111-.024.19-.024.238a.7.7 0 00.126.423c.084.115.21.173.377.173.144 0 .304-.048.48-.143L10 15.87S10.24.051 10 .051z\",\"key\":1})]));\n}\n\nStarHalfBlack.defaultProps = {\"width\":\"20\",\"height\":\"19\",\"viewBox\":\"0 0 20 19\"};\n\nmodule.exports = StarHalfBlack;\n\nStarHalfBlack.default = StarHalfBlack;\n","var React = require('react');\n\nfunction MdCheckmark (props) {\n return React.createElement(\"svg\",props,React.createElement(\"path\",{\"d\":\"M186.301 339.893L96 249.461l-32 30.507L186.301 402 448 140.506 416 110z\",\"fill\":\"#13a970\"}));\n}\n\nMdCheckmark.defaultProps = {\"viewBox\":\"0 0 512 512\"};\n\nmodule.exports = MdCheckmark;\n\nMdCheckmark.default = MdCheckmark;\n","var React = require('react');\n\nfunction RemovePlain (props) {\n return React.createElement(\"svg\",props,React.createElement(\"g\",{\"id\":\"Page-1\",\"stroke\":\"none\",\"strokeWidth\":\"1\",\"fill\":\"none\",\"fillRule\":\"evenodd\",\"strokeLinecap\":\"square\"},React.createElement(\"g\",{\"id\":\"Group\",\"transform\":\"translate(2 2)\",\"stroke\":\"currentColor\",\"strokeWidth\":\"2\"},[React.createElement(\"path\",{\"d\":\"M10.607 0L0 10.607\",\"id\":\"Line\",\"key\":0}),React.createElement(\"path\",{\"d\":\"M10.607 10.607L0 0\",\"id\":\"Line-Copy\",\"key\":1})])));\n}\n\nRemovePlain.defaultProps = {\"width\":\"24\",\"height\":\"24\",\"viewBox\":\"0 0 24 24\"};\n\nmodule.exports = RemovePlain;\n\nRemovePlain.default = RemovePlain;\n","import factory from './icon';\r\nimport Svg from './glyphs/information-icon.svg';\r\n\r\nexport default factory(Svg);\r\n","var React = require('react');\n\nfunction InformationIcon (props) {\n return React.createElement(\"svg\",props,React.createElement(\"path\",{\"style\":{\"textIndent\":\"0\",\"textAlign\":\"start\",\"lineHeight\":\"normal\",\"textTransform\":\"none\",\"blockProgression\":\"tb\",\"-inkscapeFontSpecification\":\"Bitstream Vera Sans\"},\"d\":\"M16 4c-2.197 0-4 1.803-4 4s1.803 4 4 4 4-1.803 4-4-1.803-4-4-4zm0 2c1.116 0 2 .884 2 2s-.884 2-2 2-2-.884-2-2 .884-2 2-2zm-5 7v5h2v5h-2v5h10v-5h-2V13h-8zm2 2h4v10h2v1h-6v-1h2v-9h-2v-1z\",\"overflow\":\"visible\",\"fontFamily\":\"Bitstream Vera Sans\"}));\n}\n\nInformationIcon.defaultProps = {\"viewBox\":\"0 0 32 32\"};\n\nmodule.exports = InformationIcon;\n\nInformationIcon.default = InformationIcon;\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { isIE, Breakpoint } from '@avensia/scope';\r\nimport { epiPropertyValue } from '@avensia/scope-episerver';\r\nimport connect from 'Shared/connect';\r\nimport Card from './ProductCard';\r\nimport CardMobile from './ProductCardMobile';\r\nimport { addToCart } from 'Cart/action-creators';\r\nimport ProductCardType from '../../../Esales/Models/EsalesProductForList.type';\r\nimport {\r\n large,\r\n minMediumMediaQuery,\r\n minHugeMediaQuery,\r\n pixelsToUnit,\r\n minLargeMediaQuery,\r\n minTinyMediaQuery,\r\n minSmallMediaQuery,\r\n minMicroMediaQuery,\r\n} from 'Shared/Style';\r\nimport CurerntPageIsCheckout from 'Checkout/Pages/Checkout/current-page-is-checkout';\r\nimport { addCartItem } from 'Checkout//action-creators';\r\n\r\nexport enum Layout {\r\n Page,\r\n Block,\r\n}\r\n\r\ntype RequiredPropType = {\r\n products: ProductCardType[];\r\n layout?: Layout;\r\n margin?: boolean;\r\n noPlaceholders?: boolean;\r\n};\r\n\r\ntype ConnectStateType = {\r\n isCheckoutPage: boolean;\r\n currentBreakpoint: number;\r\n};\r\n\r\ntype ConnectActionType = {\r\n addToCart: (code: string, quantity: number, ticket: string) => Promise<void>;\r\n addCartItem: (code: string, quantity: number, ticket: string) => any;\r\n};\r\n\r\ntype PropType = RequiredPropType & ConnectStateType & ConnectActionType;\r\n\r\nconst MOBILE_CARD_WIDTH = 145;\r\nconst Base = styled.div({\r\n display: 'flex',\r\n flexFlow: 'row wrap',\r\n justifyContent: 'space-around',\r\n [minTinyMediaQuery]: {\r\n justifyContent: 'space-between',\r\n },\r\n});\r\n\r\nconst PAGE_MICRO_CARDS_PER_ROW = 2;\r\nconst PAGE_TINY_CARDS_PER_ROW = 3;\r\nconst PAGE_SMALL_CARDS_PER_ROW = 4;\r\nconst PAGE_MEDIUM_CARDS_PER_ROW = 5;\r\nconst PAGE_LARGE_CARDS_PER_ROW = 6;\r\nconst PAGE_TINY_GUTTER = 4;\r\nconst PAGE_SMALL_GUTTER = 6;\r\nconst PAGE_MEDIUM_GUTTER = 20;\r\nconst PAGE_LARGE_GUTTER = 12;\r\nconst pageStyled = styled({\r\n marginRight: 0,\r\n marginBottom: large,\r\n flexBasis: '100%',\r\n [minMicroMediaQuery]: {\r\n flexBasis: `calc(100% / ${PAGE_MICRO_CARDS_PER_ROW} - ${PAGE_SMALL_GUTTER}px)`,\r\n },\r\n [minTinyMediaQuery]: {\r\n flexBasis: `calc(100% / ${PAGE_TINY_CARDS_PER_ROW} - ${PAGE_TINY_GUTTER}px)`,\r\n },\r\n [minSmallMediaQuery]: {\r\n flexBasis: `calc(100% / ${PAGE_SMALL_CARDS_PER_ROW} - ${PAGE_SMALL_GUTTER}px)`,\r\n },\r\n [minMediumMediaQuery]: {\r\n flexBasis: `calc(100% / ${PAGE_MEDIUM_CARDS_PER_ROW} - ${PAGE_MEDIUM_GUTTER}px)`,\r\n },\r\n [minLargeMediaQuery]: {\r\n flexBasis: `calc(100% / ${PAGE_LARGE_CARDS_PER_ROW} - ${PAGE_LARGE_GUTTER}px)`,\r\n },\r\n [minHugeMediaQuery]: {\r\n flexBasis: `calc(100% / ${PAGE_LARGE_CARDS_PER_ROW} - ${PAGE_LARGE_GUTTER}px)`,\r\n },\r\n});\r\n\r\nconst BLOCK_MICRO_CARDS_PER_ROW = 2;\r\nconst BLOCK_TINY_CARDS_PER_ROW = 3;\r\nconst BLOCK_SMALL_CARDS_PER_ROW = 4;\r\nconst BLOCK_MEDIUM_CARDS_PER_ROW = 5;\r\nconst BLOCK_LARGE_CARDS_PER_ROW = 6;\r\nconst BLOCK_TINY_GUTTER = 3;\r\nconst BLOCK_SMALL_GUTTER = 6;\r\nconst BLOCK_MEDIUM_GUTTER = 15;\r\nconst BLOCK_LARGE_GUTTER = 20;\r\n\r\nconst blockStyled = styled({\r\n marginRight: 0,\r\n flexBasis: '100%',\r\n [minMicroMediaQuery]: {\r\n flexBasis: `calc(100% / ${BLOCK_MICRO_CARDS_PER_ROW} - ${BLOCK_SMALL_GUTTER}px)`,\r\n },\r\n [minTinyMediaQuery]: {\r\n flexBasis: `calc(100% / ${BLOCK_TINY_CARDS_PER_ROW} - ${BLOCK_TINY_GUTTER}px)`,\r\n },\r\n [minSmallMediaQuery]: {\r\n flexBasis: `calc(100% / ${BLOCK_SMALL_CARDS_PER_ROW} - ${BLOCK_SMALL_GUTTER}px)`,\r\n },\r\n [minMediumMediaQuery]: {\r\n flexBasis: `calc(100% / ${BLOCK_MEDIUM_CARDS_PER_ROW} - ${BLOCK_MEDIUM_GUTTER}px)`,\r\n flexGrow: 1,\r\n margin: {\r\n right: pixelsToUnit(BLOCK_MEDIUM_GUTTER),\r\n },\r\n },\r\n [minLargeMediaQuery]: {\r\n flexBasis: `calc(100% / ${BLOCK_LARGE_CARDS_PER_ROW} - ${BLOCK_LARGE_GUTTER}px)`,\r\n marginRight: pixelsToUnit(5),\r\n marginLeft: pixelsToUnit(5),\r\n },\r\n});\r\n\r\nconst baseStyled = styled({\r\n flexBasis: pixelsToUnit(MOBILE_CARD_WIDTH),\r\n flexGrow: 0,\r\n flexShrink: 0,\r\n minWidth: 0,\r\n});\r\n\r\nconst BaseCard = baseStyled(Card);\r\nconst BaseCardMobile = baseStyled(CardMobile);\r\nconst PageCard = pageStyled(BaseCard);\r\nconst PageCardMobile = pageStyled(BaseCardMobile);\r\nconst BlockCard = blockStyled(BaseCard);\r\nconst BlockCardMobile = blockStyled(BaseCardMobile);\r\n\r\nconst BasePlaceholder = baseStyled(styled.Div, {\r\n margin: {\r\n xy: 0,\r\n },\r\n padding: {\r\n xy: 0,\r\n },\r\n});\r\nconst PagePlaceholder = pageStyled(BasePlaceholder);\r\nconst BlockPlaceholder = blockStyled(BasePlaceholder);\r\n\r\nclass List extends React.PureComponent<PropType & StyledProps> {\r\n addToCart = async (code: string, ticket: string) => {\r\n try {\r\n const result = this.props.isCheckoutPage\r\n ? this.props.addCartItem(code, 1, ticket)\r\n : await this.props.addToCart(code, 1, ticket);\r\n return result;\r\n } catch (e) {\r\n console.error('Add item to cart error', e);\r\n return Promise.reject(null);\r\n }\r\n };\r\n\r\n render() {\r\n const isMobile = this.props.currentBreakpoint < Breakpoint.Medium;\r\n const ProductCard = this.props.layout === Layout.Block ? BlockCard : PageCard;\r\n const ProductCardMobile = this.props.layout === Layout.Block ? BlockCardMobile : PageCardMobile;\r\n const Placeholder = this.props.layout === Layout.Block ? BlockPlaceholder : PagePlaceholder;\r\n const ieBlockCardStyle = {\r\n [minMediumMediaQuery]: {\r\n flexBasis: 'auto',\r\n width: `calc(100% / ${BLOCK_LARGE_CARDS_PER_ROW})`,\r\n },\r\n };\r\n const desktopCardStyle = {\r\n marginBottom: pixelsToUnit(30),\r\n marginRight: this.props.margin ? 5 : 0,\r\n };\r\n\r\n const mobileCardStyle = {\r\n margin: { x: 0, y: pixelsToUnit(5), right: this.props.margin ? 5 : 0 },\r\n };\r\n\r\n return (\r\n <Base css={this.props.compose()}>\r\n {this.props.products.map((product, i) => {\r\n const code = epiPropertyValue(product.variation.code);\r\n return (\r\n <React.Fragment key={code}>\r\n {isMobile ? (\r\n <ProductCardMobile\r\n key={i}\r\n css={isIE() && this.props.layout === Layout.Block ? ieBlockCardStyle : mobileCardStyle}\r\n addToCart={() => this.addToCart(code, product.ticket)}\r\n product={product}\r\n />\r\n ) : (\r\n <ProductCard\r\n key={i}\r\n css={isIE() && this.props.layout === Layout.Block ? ieBlockCardStyle : desktopCardStyle}\r\n addToCart={() => this.addToCart(code, product.ticket)}\r\n product={product}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n })}\r\n {!this.props.noPlaceholders &&\r\n new Array(5)\r\n .fill(0)\r\n .map((elem, index) => (\r\n <Placeholder key={index} css={isIE() && this.props.layout === Layout.Block && ieBlockCardStyle} />\r\n ))}\r\n </Base>\r\n );\r\n }\r\n}\r\n\r\nexport default styled(\r\n connect(\r\n (state): ConnectStateType => ({\r\n isCheckoutPage: CurerntPageIsCheckout(state.currentPage),\r\n currentBreakpoint: state.currentBreakpoint,\r\n }),\r\n (dispatch): ConnectActionType => ({\r\n addToCart(code: string, quantity: number, ticket: string) {\r\n return dispatch(addToCart(code, quantity, ticket, 'Produktlista'));\r\n },\r\n addCartItem(code: string, quantity: number, ticket: string) {\r\n return dispatch(addCartItem(code, quantity, ticket, 'Kassakampanjer'));\r\n },\r\n }),\r\n )(List),\r\n);\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { StyleOrStyleArray, Style } from '@glitz/type';\r\nimport Link from 'Shared/Link';\r\nimport connect from 'Shared/connect';\r\nimport { translate } from '@avensia/scope';\r\nimport { epiPropertyValue } from '@avensia/scope-episerver';\r\nimport Image, { Ratio as ImageRatio, Preset as ImagePreset } from 'Shared/Image/Ratio';\r\nimport UspBullets from './../ProductDetails/UspBullets';\r\nimport { theta, epsilon, pixelsToUnit, zeta, milli, white } from 'Shared/Style';\r\nimport Button, { Appearance as ButtonAppearance, Variant as ButtonVariant } from 'Shared/Button';\r\nimport Icon from 'Shared/Icon/Cart';\r\nimport IconShoppingBag from 'Shared/Icon/ShoppingBag';\r\nimport InfoIcon from 'Shared/Icon/Info';\r\nimport { formatTitleCase } from 'Shared/string-format';\r\nimport AddToCart from 'Product/ProductAddToCart';\r\nimport AverageRatings, { Spacing, Size } from 'Product/ProductDetails/AverageRating';\r\nimport Price, { Type as PriceType } from 'Pricing/Price';\r\nimport { NewBadge, DiscountBadge, DiscountTriBadge } from './Badge';\r\nimport { prepareVariationName } from 'Shared/variation-helper';\r\nimport { Check } from 'Shared/Icon/Check-Thin';\r\nimport Cross from 'Shared/Icon/RemovePlain';\r\nimport EsalesProductForListType from '../../../Esales/Models/EsalesProductForList.type';\r\nimport AverageRatingsBlack from 'Product/ProductDetails/AverageRatingBlack';\r\nimport { PromotionTitle, PromotionItemTitle } from 'Product/ProductCard/ProductCard';\r\n\r\ntype ConnectStateType = {\r\n theme: string;\r\n};\r\n\r\ntype RequiredPropType = {\r\n product: EsalesProductForListType;\r\n addToCart: () => Promise<void>;\r\n};\r\n\r\ntype PropType = StyledProps & RequiredPropType & ConnectStateType;\r\n\r\nclass ProductCardMobile extends React.Component<PropType> {\r\n render() {\r\n const {\r\n averageRating: productRatings = 0,\r\n imageUrls,\r\n price,\r\n hasMultipleVariants = false,\r\n hasPromotion = false,\r\n hasDiscount = false,\r\n isNew: isProductNew = false,\r\n variation: { displayName },\r\n url: productUrl = '',\r\n bulletPoints = [],\r\n inStock,\r\n displayTagDesigner,\r\n ticket: productTicket,\r\n displayHighlightImage,\r\n highlightImageUrl,\r\n whiteHighlightText,\r\n hideProductInfo,\r\n promotions,\r\n } = this.props.product;\r\n const images = imageUrls || [];\r\n const productImage = images.length > 0 ? images[0] : '';\r\n const productName = formatTitleCase(prepareVariationName(epiPropertyValue(displayName)).trim());\r\n const { current: currentPrice, original: originalPrice, currency, discountPercentage } = price;\r\n const isPriceDiscounted = currentPrice < originalPrice;\r\n const currentTheme = this.props.theme;\r\n const hasBulletpoints = bulletPoints && bulletPoints.length > 0;\r\n const IsVxnSite =\r\n !currentTheme.startsWith('dog') &&\r\n !currentTheme.startsWith('cli') &&\r\n !currentTheme.startsWith('lac') &&\r\n !currentTheme.startsWith('party');\r\n const ActionButtonIcon =\r\n hasMultipleVariants || displayTagDesigner ? (\r\n <InfoIconStyled />\r\n ) : inStock ? (\r\n IsVxnSite ? (\r\n <ShoppingBagIcon />\r\n ) : (\r\n <CartIcon />\r\n )\r\n ) : (\r\n <CrossNoStock />\r\n );\r\n\r\n const imageWithPaddingStyle: Style = {\r\n paddingTop: pixelsToUnit(10),\r\n };\r\n\r\n const PromotionNode = (\r\n <styled.Div css={{ position: 'absolute', right: 0, zIndex: 4 }}>\r\n <PromotionTitle>{translate('/Product/Badge/Campaign')}</PromotionTitle>\r\n {promotions.map((promotion, i) => {\r\n if (i < 4) {\r\n return (\r\n <PromotionLink key={i} to={promotion.promotionUrl}>\r\n <PromotionItemTitle>{promotion.promotionName}</PromotionItemTitle>\r\n </PromotionLink>\r\n );\r\n }\r\n })}\r\n </styled.Div>\r\n );\r\n\r\n return (\r\n <Base css={this.props.compose()}>\r\n {hasPromotion && PromotionNode}\r\n {displayHighlightImage && (\r\n <HighlightImageWrapper>\r\n <HighlightImage src={highlightImageUrl} />\r\n </HighlightImageWrapper>\r\n )}\r\n <Body to={productUrl} linkIdentifier={productTicket} css={hideProductInfo && { zIndex: 4 }}>\r\n <Wrapper\r\n css={\r\n displayHighlightImage &&\r\n (hideProductInfo\r\n ? { visibility: 'hidden' }\r\n : whiteHighlightText\r\n ? { color: 'white', zIndex: 4 }\r\n : { zIndex: 4 })\r\n }\r\n >\r\n {hasDiscount ? (\r\n IsVxnSite ? (\r\n <DiscountTriBadge>{`-${discountPercentage}%`}</DiscountTriBadge>\r\n ) : (\r\n <DiscountBadge>{`-${discountPercentage}%`}</DiscountBadge>\r\n )\r\n ) : (\r\n isProductNew && <NewBadge>{`${translate('/Product/Badge/New')}!`}</NewBadge>\r\n )}\r\n <ImageStyled\r\n alt={productName}\r\n itemProp=\"image\"\r\n preset={!productImage.includes('.gif') ? ImagePreset.Tiny : undefined}\r\n ratio={ImageRatio.OneToOne}\r\n src={productImage}\r\n imageStyle={imageWithPaddingStyle}\r\n css={displayHighlightImage && { visibility: 'hidden' }}\r\n lazy\r\n />\r\n <RatingsContainer>\r\n {!!productRatings ? (\r\n !currentTheme.startsWith('dog') &&\r\n !currentTheme.startsWith('cli') &&\r\n !currentTheme.startsWith('lac') ? (\r\n <AverageRatingsBlack average={productRatings} spacing={Spacing.Normal} size={Size.Micro} />\r\n ) : (\r\n <Ratings average={productRatings} spacing={Spacing.Normal} size={Size.Micro} />\r\n )\r\n ) : (\r\n <RatingsNone average={productRatings} spacing={Spacing.Normal} size={Size.Micro} />\r\n )}\r\n </RatingsContainer>\r\n\r\n <NameWrapper>\r\n <Name itemProp=\"name\">{productName}</Name>\r\n </NameWrapper>\r\n <MobileBulletWrap>\r\n <UspBulletsStyled\r\n bulletLimit\r\n isMobile\r\n hasValue={hasBulletpoints}\r\n bulletPoints={bulletPoints}\r\n listItemCss={bulletListItemStyle}\r\n />\r\n </MobileBulletWrap>\r\n </Wrapper>\r\n </Body>\r\n <ButtonContainer css={displayHighlightImage && { zIndex: 4 }}>\r\n <ButtonLeftContainer>\r\n <Prices>\r\n <CurrentPrice\r\n current={currentPrice}\r\n currency={currency}\r\n priceType={isPriceDiscounted ? PriceType.New : PriceType.Regular}\r\n css={whiteHighlightText && displayHighlightImage && { color: 'white' }}\r\n />\r\n {isPriceDiscounted && (\r\n <OldPrice\r\n current={originalPrice}\r\n currency={currency}\r\n priceType={PriceType.Old}\r\n css={whiteHighlightText && displayHighlightImage && { color: 'white' }}\r\n />\r\n )}\r\n </Prices>\r\n <StockPlaceholder css={whiteHighlightText && { color: 'white' }}>\r\n {inStock ? (\r\n <StockStatus>\r\n {translate('/Product/InStock')}\r\n <CheckIcon />\r\n </StockStatus>\r\n ) : (\r\n <StockStatus>\r\n {translate('/Product/OutOfStock')}\r\n <CrossIcon />\r\n </StockStatus>\r\n )}\r\n </StockPlaceholder>\r\n </ButtonLeftContainer>\r\n <Action\r\n css={mobileActionButtonStyle}\r\n hasVariants={hasMultipleVariants}\r\n productUrl={productUrl}\r\n isInStock={inStock}\r\n addCart={this.props.addToCart}\r\n displayTagDesigner={displayTagDesigner}\r\n >\r\n {ActionButtonIcon}\r\n </Action>\r\n </ButtonContainer>\r\n </Base>\r\n );\r\n }\r\n}\r\nexport default styled(\r\n connect(\r\n (state): ConnectStateType => ({\r\n theme: state.currentTheme,\r\n }),\r\n )(ProductCardMobile),\r\n);\r\n\r\nconst mobileActionButtonStyle: StyleOrStyleArray = {\r\n backgroundColor: (theme) => theme.buyButtonProductcardMobile,\r\n width: '2.5rem',\r\n height: '2.5rem',\r\n minWidth: '2.5rem',\r\n minHeight: '2.5rem',\r\n borderRadius: '100%',\r\n marginRight: '0.2rem',\r\n marginBottom: '0.2rem',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n zIndex: 3,\r\n lineHeight: '2.1rem',\r\n};\r\n\r\nconst Base = styled.div({\r\n boxShadow: (theme) => `0 0.2rem 1rem 0 rgba(${theme.shadowColor}, 0.2)`,\r\n display: 'flex',\r\n backgroundColor: (theme) => theme.cardBackgroundColor,\r\n flexDirection: 'column',\r\n position: 'relative',\r\n textAlign: 'center',\r\n});\r\n\r\nconst HighlightImageWrapper = styled.div({\r\n color: (theme) => theme.campaignBackgroundColor,\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n zIndex: 3,\r\n height: '100%',\r\n width: '100%',\r\n});\r\n\r\nconst HighlightImage = styled.img({\r\n height: '100%',\r\n width: 'auto',\r\n objectFit: 'cover',\r\n});\r\n\r\nconst Body = styled(Link, {\r\n color: (theme) => theme.textColor,\r\n});\r\n\r\nconst Wrapper = styled.div({\r\n position: 'relative',\r\n});\r\n\r\nconst ImageStyled = styled(Image, {\r\n mixBlendMode: 'multiply',\r\n});\r\n\r\nconst RatingsContainer = styled.div({\r\n marginTop: pixelsToUnit(5),\r\n});\r\n\r\nconst Ratings = styled(AverageRatings, {});\r\n\r\nconst RatingsNone = styled(Ratings, {\r\n opacity: 0.3,\r\n});\r\n\r\nconst NameWrapper = styled.div({\r\n height: '2.4rem',\r\n padding: {\r\n x: pixelsToUnit(5),\r\n },\r\n});\r\n\r\nconst MobileBulletWrap = styled.div({\r\n height: '5rem',\r\n});\r\n\r\nconst Name = styled.div({\r\n position: 'relative',\r\n textTransform: 'uppercase',\r\n fontWeight: 'bold',\r\n fontSize: zeta,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n WebkitLineClamp: 2,\r\n marginTop: pixelsToUnit(3),\r\n display: '-webkit-box',\r\n WebkitBoxOrient: 'vertical',\r\n});\r\n\r\nconst ButtonContainer = styled.div({\r\n width: '100%',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n paddingLeft: pixelsToUnit(5),\r\n});\r\n\r\nconst ButtonLeftContainer = styled.div({\r\n maxWidth: '70%',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n height: '2.2rem',\r\n alignSelf: 'center',\r\n});\r\n\r\nconst Prices = styled.div({\r\n display: 'flex',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n justifyContent: 'flex-start',\r\n padding: {\r\n x: pixelsToUnit(5),\r\n },\r\n});\r\n\r\nconst CurrentPrice = styled(Price, {\r\n lineHeight: '1rem',\r\n fontSize: epsilon,\r\n color: (theme) => theme.textColor,\r\n marginRight: pixelsToUnit(3),\r\n});\r\n\r\nconst OldPrice = styled(Price, {\r\n fontSize: milli,\r\n paddingTop: '0.15rem',\r\n});\r\n\r\nconst StockPlaceholder = styled.div({\r\n lineHeight: '0.9rem',\r\n height: pixelsToUnit(10),\r\n padding: {\r\n x: pixelsToUnit(5),\r\n },\r\n});\r\n\r\nconst StockStatus = styled.span({\r\n fontSize: pixelsToUnit(11),\r\n letterSpacing: pixelsToUnit(0.3),\r\n lineHeight: pixelsToUnit(10),\r\n});\r\n\r\nconst CheckIcon = styled(Check, {\r\n marginRight: pixelsToUnit(5),\r\n height: '1rem',\r\n color: (theme) => theme.buttonTextColor,\r\n});\r\n\r\nconst InfoIconStyled = styled(InfoIcon, {\r\n fontSize: '2rem',\r\n height: 'unset',\r\n color: (theme) => theme.buttonTextColor,\r\n});\r\n\r\nconst CartIcon = styled(Icon, {\r\n width: pixelsToUnit(19.3),\r\n height: pixelsToUnit(18),\r\n});\r\n\r\nconst ShoppingBagIcon = styled(IconShoppingBag, {});\r\n\r\nconst CrossNoStock = styled(Cross, {\r\n marginLeft: pixelsToUnit(5),\r\n marginTop: pixelsToUnit(3),\r\n fontSize: '2rem',\r\n color: (theme) => theme.buttonTextColor,\r\n});\r\n\r\nconst CrossIcon = styled(Cross, {\r\n marginLeft: pixelsToUnit(5),\r\n height: '1.3rem',\r\n color: 'red',\r\n});\r\n\r\nconst bulletListItemStyle: StyleOrStyleArray = {\r\n fontSize: '0.7rem',\r\n marginLeft: '0.2rem',\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n};\r\n\r\nconst UspBulletsStyled = styled(UspBullets, {\r\n padding: {\r\n x: pixelsToUnit(5),\r\n bottom: pixelsToUnit(5),\r\n },\r\n margin: {\r\n xy: 0,\r\n },\r\n});\r\n\r\nconst PromotionLink = styled(Link, {\r\n color: white,\r\n marginBottom: pixelsToUnit(10),\r\n});\r\n\r\nconst actionStyle = styled({\r\n fontSize: theta,\r\n borderRadius: '0.15rem',\r\n padding: {\r\n x: pixelsToUnit(5),\r\n },\r\n});\r\n\r\nconst ViewProduct = actionStyle(Button);\r\nconst AddCart = actionStyle(AddToCart);\r\n\r\ntype ActionPropType = {\r\n hasVariants: boolean;\r\n productUrl: string;\r\n isInStock: boolean;\r\n children: React.ReactNode;\r\n addCart: () => Promise<void>;\r\n displayTagDesigner: boolean;\r\n};\r\n\r\nconst Action = styled((props: ActionPropType & StyledProps) => {\r\n return props.hasVariants || props.displayTagDesigner ? (\r\n <ViewProduct\r\n css={props.compose()}\r\n to={props.productUrl}\r\n variant={ButtonVariant.Small}\r\n appearance={[ButtonAppearance.Primary, ButtonAppearance.Full]}\r\n >\r\n {props.children}\r\n </ViewProduct>\r\n ) : (\r\n <AddCart css={props.compose()} disabled={!props.isInStock} variant={ButtonVariant.Small} addToCart={props.addCart}>\r\n {props.children}\r\n </AddCart>\r\n );\r\n});\r\n","import { styled } from '@glitz/react';\r\nimport { minTinyMediaQuery, minLargeMediaQuery, pixelsToUnit } from 'Shared/Style';\r\nimport { SPACING_DEFAULT, SPACING_MOBILE } from 'Shared/BoxLayout';\r\n\r\nexport default styled({\r\n marginTop: SPACING_MOBILE,\r\n [minLargeMediaQuery]: {\r\n marginTop: pixelsToUnit(40),\r\n },\r\n [minTinyMediaQuery]: {\r\n marginTop: SPACING_DEFAULT,\r\n },\r\n});\r\n","export const emailPattern = /[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-‌​9-]+)*/;\r\n","import React from 'react';\r\nimport { Motion, spring, OpaqueConfig, presets } from 'react-motion';\r\nimport { Swipeable } from 'react-swipeable';\r\nimport { styled, applyClassName } from '@glitz/react';\r\n\r\nexport enum AnimationStyle {\r\n Default,\r\n Gentle,\r\n}\r\n\r\nexport enum Variant {\r\n Variation,\r\n HtmlBlock,\r\n}\r\n\r\ntype Props = {\r\n currentSlide: number;\r\n onSlideChange?: (index: number) => void;\r\n className?: string;\r\n elementRef: (element: HTMLElement) => void;\r\n carouselWidth: number;\r\n slidesPerPage: number;\r\n autoSlideTime?: number;\r\n continuous?: boolean;\r\n disabled?: boolean;\r\n animationStyle?: AnimationStyle;\r\n children?: React.ReactNode;\r\n variant?: Variant;\r\n center?: boolean;\r\n height?: string;\r\n backgroundColor?: string;\r\n assumedImageWidth?: number;\r\n onSwipeRest?: () => void;\r\n onSlideClick?: (index: number) => void;\r\n};\r\n\r\ntype State = {\r\n translateX: number;\r\n currentSlide: number;\r\n items: React.ReactNode[];\r\n};\r\n\r\ntype PlainStyleType<TValue> = {\r\n translateX: TValue;\r\n};\r\n\r\nconst Container = styled.div({\r\n display: 'block',\r\n whiteSpace: 'nowrap',\r\n});\r\n\r\nconst DELTA = 3;\r\nconst SWIPE_THRESHOLD = 25;\r\n\r\nclass Carousel extends React.PureComponent<Props, State> {\r\n autoSlideTimer: number;\r\n slideWidth: number;\r\n slideWidthPercent: number;\r\n itemCountUnique: number;\r\n itemCountCloned: number;\r\n isResting: boolean;\r\n container: Element;\r\n lastDeltaX = 0;\r\n lastDir = 0;\r\n offsetDeltaX = 0;\r\n slideWillChange = 0;\r\n\r\n static defaultProps = {\r\n slidesPerPage: 1,\r\n };\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n\r\n this.slideWidth = props.carouselWidth / props.slidesPerPage;\r\n this.slideWidthPercent = 100 / props.slidesPerPage;\r\n\r\n let children = React.Children.toArray(this.props.children);\r\n const items = this.props.continuous ? children.concat(children) : children;\r\n this.itemCountUnique = children.length;\r\n this.itemCountCloned = items.length;\r\n\r\n this.isResting = true;\r\n this.itemCount = children.length;\r\n\r\n this.state = {\r\n translateX: 0,\r\n items,\r\n currentSlide: this.props.currentSlide ? this.props.currentSlide : 0,\r\n };\r\n }\r\n\r\n itemCount: number;\r\n\r\n componentDidMount() {\r\n this.setState({\r\n translateX: this.getTranslateX(this.props.currentSlide),\r\n });\r\n this.setUpAutoSlide();\r\n }\r\n\r\n componentWillUnmount() {\r\n clearInterval(this.autoSlideTimer);\r\n }\r\n\r\n setUpAutoSlide() {\r\n const { autoSlideTime, disabled } = this.props;\r\n if (\r\n !disabled &&\r\n this.state.items.length > 1 &&\r\n typeof autoSlideTime === 'number' &&\r\n autoSlideTime > 0 &&\r\n document.hidden !== undefined\r\n ) {\r\n this.autoSlideTimer && clearInterval(this.autoSlideTimer);\r\n this.autoSlideTimer = setInterval(() => {\r\n this.goForward(1);\r\n }, autoSlideTime);\r\n\r\n //Prevent autosliding when browser window is hidden\r\n document.addEventListener(\r\n 'visibilitychange',\r\n () => {\r\n if (document.hidden) {\r\n clearInterval(this.autoSlideTimer);\r\n } else {\r\n this.setUpAutoSlide();\r\n }\r\n },\r\n false,\r\n );\r\n }\r\n }\r\n\r\n getTranslateX(currentSlide: number) {\r\n return !this.props.disabled ? currentSlide * -this.slideWidth : 0;\r\n }\r\n\r\n componentWillReceiveProps(nextProps: Props) {\r\n const hasNewSlideIndex = nextProps.currentSlide !== this.state.currentSlide;\r\n const hasNewCarouselWidth = nextProps.carouselWidth !== this.props.carouselWidth;\r\n const hasNewSlideWidth = nextProps.slidesPerPage !== this.props.slidesPerPage;\r\n const hasNewSlidesAdded =\r\n React.Children.toArray(nextProps.children).length !== React.Children.toArray(this.props.children).length;\r\n\r\n if (hasNewCarouselWidth || hasNewSlideWidth) {\r\n this.slideWidth = nextProps.carouselWidth / nextProps.slidesPerPage;\r\n this.slideWidthPercent = 100 / nextProps.slidesPerPage;\r\n }\r\n if (hasNewSlideIndex) {\r\n this.setState({\r\n currentSlide: nextProps.currentSlide,\r\n translateX: this.getTranslateX(nextProps.currentSlide),\r\n });\r\n }\r\n if (hasNewSlideIndex || hasNewCarouselWidth || hasNewSlideWidth) {\r\n if (!hasNewSlidesAdded && !hasNewCarouselWidth && !hasNewSlideWidth) {\r\n this.isResting = false;\r\n }\r\n this.setUpAutoSlide();\r\n this.setState({ translateX: this.getTranslateX(nextProps.currentSlide) });\r\n }\r\n if (hasNewSlidesAdded) {\r\n const children = React.Children.toArray(nextProps.children);\r\n //Duplicate the slides if the carousel should be able to loop:\r\n const items = nextProps.continuous ? children.concat(children) : children;\r\n\r\n this.itemCountUnique = children.length;\r\n this.itemCountCloned = items.length;\r\n\r\n this.isResting = true;\r\n\r\n this.setState({\r\n items,\r\n translateX: this.getTranslateX(nextProps.currentSlide),\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * To enable looping and to have enough items to break out of page container we duplicate all items in array.\r\n * When we navigate in the carousel we are moving the container first and foremost.\r\n * Let's say we have X unique items.\r\n * Since we support looping, we will run out of slides to show when we are have navigated X*2 times.\r\n * To overcome this we are moving all individual items X*2 * 100 percent at this stage. No it's looping!\r\n * We also want to have slides visible at the right hand side all the time so when we have stepped X times we will move\r\n * the X first slides to the right so that our two duplicate halves of slides will rotate.\r\n * Since we want to have our start slide aligned with the left hand side of the page container and items are\r\n * flowing right we need slides to move infront of the first slide. We handle this with slideShouldMoveToFront method.\r\n */\r\n slideShouldMoveToFront(index: number) {\r\n // We visibly move items from the end of the non-active half to before the active half.\r\n const itemCountToMoveToFront = this.itemCountUnique > 2 ? 2 : 1;\r\n const isFirstHalf = this.isActiveSlideInFirstHalf();\r\n const activeSlideIsInFront =\r\n getAbsoluteIndex(this.state.currentSlide, this.itemCountUnique) < itemCountToMoveToFront;\r\n const slideIsInOtherHalf =\r\n (isFirstHalf && index >= this.itemCountUnique) || (!isFirstHalf && index < this.itemCountUnique);\r\n const indexOffsetFromEnd = (isFirstHalf ? this.itemCountCloned : this.itemCountUnique) - 1 - index;\r\n return activeSlideIsInFront && slideIsInOtherHalf && indexOffsetFromEnd < itemCountToMoveToFront;\r\n }\r\n getSlideTransformPercent(slideIndex: number) {\r\n if (!this.props.continuous) {\r\n return 0;\r\n }\r\n\r\n // When all slides have passed, move them all forward so index point on first item. Enables looping.\r\n const itemCountClonedLoopCount = Math.floor(this.state.currentSlide / this.itemCountCloned);\r\n let steps = itemCountClonedLoopCount * this.itemCountCloned;\r\n\r\n /* When the half of them items has passed move it back so that our two halfs will rotate being \"active\".\r\n Balances out the slides so that we have slides in viewport all the time. */\r\n const thisSlidIsInFirstHalf = slideIndex < this.itemCountUnique;\r\n if (!this.isActiveSlideInFirstHalf() && thisSlidIsInFirstHalf) {\r\n steps += this.itemCountCloned;\r\n }\r\n\r\n /* At the start of every loop we need to move some slides to the front of first slide.\r\n Some carousels breakout of container and needs slides before active slide all the time */\r\n if (this.slideShouldMoveToFront(slideIndex)) {\r\n steps -= this.itemCountCloned;\r\n }\r\n return steps * 100;\r\n }\r\n getLoopCount() {\r\n // 1 loop means when all the unique items has passed\r\n return this.itemCountUnique < 1 ? 0 : Math.floor(this.props.currentSlide / this.itemCountUnique);\r\n }\r\n isActiveSlideInFirstHalf() {\r\n return this.getLoopCount() % 2 === 0;\r\n }\r\n\r\n goToSlide = (index: number) => {\r\n if (!this.props.continuous) {\r\n index = Math.min(index, this.itemCount - this.props.slidesPerPage);\r\n index = Math.max(index, 0);\r\n }\r\n this.setState({\r\n currentSlide: index,\r\n translateX: this.getTranslateX(index),\r\n });\r\n this.props.onSlideChange && this.props.onSlideChange(getAbsoluteIndex(index, this.itemCount));\r\n };\r\n goBack = (steps: number) => {\r\n this.goToSlide(this.state.currentSlide - steps);\r\n };\r\n goForward = (steps: number) => {\r\n this.goToSlide(this.state.currentSlide + steps);\r\n };\r\n\r\n onSwiping = ({ deltaX, velocity }: { deltaX: number; velocity: number }) => {\r\n if (!!this.props.disabled || this.state.items.length <= 1) return;\r\n this.isResting = false;\r\n const { translateX } = this.state;\r\n const diff = deltaX - this.lastDeltaX;\r\n const dir = Math.sign(diff);\r\n const sameDir = dir === this.lastDir || dir === 0;\r\n if (dir !== 0) this.lastDir = dir;\r\n //If the user changes direction, use this point as the new starting point for calculating whether to trigger a slide change\r\n if (!sameDir) {\r\n this.offsetDeltaX = this.lastDeltaX;\r\n }\r\n this.lastDeltaX = deltaX;\r\n this.setState({\r\n translateX: translateX - diff,\r\n });\r\n };\r\n\r\n onSwiped = ({ deltaX, velocity }: { deltaX: number; velocity: number }) => {\r\n if (!!this.props.disabled || this.state.items.length <= 1) return;\r\n const currentDeltaX = deltaX - this.offsetDeltaX;\r\n //Trigger a slide change if swiped over the middle of the carousel, or swipe is fast or long enough:\r\n if (\r\n deltaX < -this.slideWidth / 2 ||\r\n (currentDeltaX < -SWIPE_THRESHOLD && velocity * velocity * currentDeltaX < -2 * SWIPE_THRESHOLD)\r\n ) {\r\n this.goBack(1);\r\n } else if (\r\n deltaX > this.slideWidth / 2 ||\r\n (currentDeltaX > SWIPE_THRESHOLD && velocity * velocity * currentDeltaX > 2 * SWIPE_THRESHOLD)\r\n ) {\r\n this.goForward(1);\r\n } else {\r\n this.setState({\r\n translateX: this.getTranslateX(this.state.currentSlide),\r\n });\r\n }\r\n this.lastDeltaX = 0;\r\n this.offsetDeltaX = 0;\r\n };\r\n\r\n getSpringConfig() {\r\n if (this.props.animationStyle === AnimationStyle.Gentle) {\r\n return {\r\n stiffness: 180,\r\n damping: 25,\r\n precision: 0.01,\r\n };\r\n }\r\n return presets.noWobble;\r\n }\r\n\r\n onRest = () => {\r\n this.isResting = true;\r\n this.props.onSwipeRest && this.props.onSwipeRest();\r\n };\r\n\r\n render() {\r\n const motionStyle: PlainStyleType<OpaqueConfig | number> = {\r\n translateX: this.isResting ? this.state.translateX : spring(this.state.translateX, this.getSpringConfig()),\r\n };\r\n\r\n return (\r\n <Swipeable\r\n innerRef={this.props.elementRef}\r\n onSwiping={this.onSwiping}\r\n onSwiped={this.onSwiped}\r\n delta={DELTA}\r\n className={this.props.className}\r\n trackTouch={!this.props.disabled && this.state.items.length > 1}\r\n style={{ height: this.props.height || 'auto' }}\r\n >\r\n <Motion style={motionStyle} onRest={this.onRest}>\r\n {(interpolatedStyle) => (\r\n <Container\r\n className={this.props.className}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n height: '100%',\r\n margin: 0,\r\n padding: 0,\r\n listStyle: 'none',\r\n ...(this.isResting\r\n ? { transform: `translateX(${this.state.translateX}px)` }\r\n : interpolatedStyle.translateX !== 0\r\n ? { transform: `translateX(${interpolatedStyle.translateX}px)` }\r\n : null),\r\n }}\r\n >\r\n {React.Children.toArray(this.props.children).map((item, index) => {\r\n //const isActive = index % this.itemCountUnique === getAbsoluteIndex(this.state.currentSlide, this.itemCountUnique);\r\n return (\r\n <div\r\n key={index}\r\n style={{\r\n transform: `translateX(${this.getSlideTransformPercent(index)}%)`,\r\n maxWidth: `${this.slideWidthPercent}%`,\r\n height: this.props.height || 'auto',\r\n backgroundColor: this.props.backgroundColor || '#ffffff',\r\n flexBasis: `${this.slideWidthPercent}%`,\r\n flexGrow: 0,\r\n flexShrink: 0,\r\n margin: 0,\r\n padding: 0,\r\n }}\r\n onClick={() =>\r\n this.props.onSlideClick && this.props.onSlideClick(getAbsoluteIndex(index, this.itemCountUnique))\r\n }\r\n >\r\n {item}\r\n </div>\r\n );\r\n })}\r\n </Container>\r\n )}\r\n </Motion>\r\n </Swipeable>\r\n );\r\n }\r\n}\r\n\r\nexport default styled(applyClassName(Carousel));\r\n\r\nexport function getAbsoluteIndex(index: number, uniqueItemCount: number) {\r\n return index < 0 ? (uniqueItemCount + (index % uniqueItemCount)) % uniqueItemCount : index % uniqueItemCount;\r\n}\r\n","import React from 'react';\r\nimport { Style } from '@glitz/type';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { transition, white, pixelsToUnit, minTinyMediaQuery } from 'Shared/Style';\r\nimport Button, { Variant as ButtonVariant, Appearance as ButtonAppearance } from 'Shared/Button';\r\nimport { Left as Prev, Right as Next } from 'Shared/Icon/Arrow';\r\n\r\nexport enum Direction {\r\n Next,\r\n Prev,\r\n}\r\n\r\ntype PropType = {\r\n onClick: (direction: Direction) => void;\r\n direction: Direction;\r\n disabled: boolean;\r\n offset?: boolean;\r\n};\r\n\r\nexport default styled((props: PropType & StyledProps) => {\r\n const { compose, disabled, offset, ...restProps } = props;\r\n const css: Style = {\r\n fontSize: pixelsToUnit(20),\r\n visibility: 'hidden',\r\n position: 'absolute',\r\n backgroundColor: white,\r\n borderRadius: '50%',\r\n padding: { xy: pixelsToUnit(5) },\r\n top: '50%',\r\n userSelect: 'none',\r\n ...transition({ property: 'opacity' }),\r\n ...(restProps.direction === Direction.Next\r\n ? {\r\n right: offset ? '-2.4rem' : 0,\r\n }\r\n : {\r\n left: offset ? '-2.4rem' : 0,\r\n }),\r\n [minTinyMediaQuery]: {\r\n visibility: 'visible',\r\n },\r\n opacity: 0.5,\r\n pointerEvents: 'auto',\r\n ...(!disabled && {\r\n cursor: 'pointer',\r\n ':hover': {\r\n opacity: 0.6,\r\n },\r\n }),\r\n ...(disabled && {\r\n cursor: 'none',\r\n opacity: 0.2,\r\n backgroundColor: 'transparent',\r\n }),\r\n };\r\n\r\n function handleClick() {\r\n restProps.onClick(restProps.direction);\r\n }\r\n\r\n return (\r\n <styled.Div css={compose(css)}>\r\n <Button\r\n variant={ButtonVariant.None}\r\n appearance={ButtonAppearance.Bare}\r\n onClick={handleClick}\r\n noRippleEffect\r\n css={{ backgroundColor: 'transparent', cursor: props.disabled ? 'default' : 'pointer' }}\r\n >\r\n {restProps.direction === Direction.Prev ? <Prev /> : <Next />}\r\n </Button>\r\n </styled.Div>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport * as style from 'Shared/Style';\r\nimport { media } from '@glitz/core';\r\n\r\ntype PropType = React.HTMLAttributes<HTMLDivElement> & {\r\n nbrOfSlides: number;\r\n activeSlideIndex: number;\r\n onSlideIndexClick: (relativeIndex: number) => void;\r\n} & StyledProps;\r\n\r\nconst SlideContainer = styled.div({\r\n position: 'relative',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n});\r\n\r\nconst SlideContainerActive = styled(SlideContainer, {\r\n position: 'absolute',\r\n left: 0,\r\n right: 0,\r\n zIndex: 1,\r\n pointerEvents: 'none',\r\n});\r\n\r\nconst SlideIndex = styled(\r\n ({ isActive, compose, ...restProps }: { isActive: boolean } & StyledProps & React.HTMLAttributes<HTMLDivElement>) => (\r\n <styled.Div\r\n css={compose({\r\n margin: { x: style.pixelsToUnit(5) },\r\n width: style.pixelsToUnit(16),\r\n height: style.pixelsToUnit(16),\r\n border: { y: { x: { radius: '50%' } } },\r\n backgroundColor: style.lightGrey,\r\n cursor: 'pointer',\r\n opacity: 1,\r\n boxShadow: '0 0 0 1px rgba(255,255,255,1)',\r\n ...style.transition({ property: 'opacity' }),\r\n ...(isActive && {\r\n opacity: 0,\r\n cursor: 'default',\r\n }),\r\n })}\r\n {...restProps}\r\n />\r\n ),\r\n);\r\n\r\nconst SlideIndexActive = styled(\r\n ({ isActive, compose, ...restProps }: { isActive: boolean } & StyledProps & React.HTMLAttributes<HTMLDivElement>) => (\r\n <SlideIndex\r\n css={compose({\r\n backgroundColor: theme => theme.primaryColor,\r\n opacity: 0,\r\n transform: 'scale(0.25)',\r\n ...style.transition({ property: ['opacity', 'transform'], duration: '0.5s' }),\r\n ...(isActive && {\r\n opacity: 1,\r\n transform: 'scale(1)',\r\n }),\r\n })}\r\n {...restProps}\r\n isActive={isActive}\r\n />\r\n ),\r\n);\r\n\r\nclass SlideIndexMarkers extends React.PureComponent<PropType> {\r\n onSlideIndexClick = (index: number) => {\r\n const relativeIndex = index - this.props.activeSlideIndex;\r\n this.props.onSlideIndexClick(relativeIndex);\r\n };\r\n render() {\r\n return (\r\n <styled.Div className={this.props.className} css={this.props.compose()}>\r\n <SlideContainer>\r\n {[...Array(this.props.nbrOfSlides).fill(1)].map((x, i) => (\r\n <SlideIndex\r\n key={i}\r\n isActive={this.props.activeSlideIndex === i}\r\n onClick={() => this.onSlideIndexClick(i)}\r\n />\r\n ))}\r\n <SlideContainerActive>\r\n {[...Array(this.props.nbrOfSlides).fill(1)].map((x, i) => (\r\n <SlideIndexActive\r\n key={i}\r\n isActive={this.props.activeSlideIndex === i}\r\n onClick={() => this.onSlideIndexClick(i)}\r\n />\r\n ))}\r\n </SlideContainerActive>\r\n </SlideContainer>\r\n </styled.Div>\r\n );\r\n }\r\n}\r\n\r\nexport default styled(SlideIndexMarkers, {\r\n position: 'absolute',\r\n zIndex: style.ZIndex.Tray,\r\n bottom: style.pixelsToUnit(8),\r\n left: 0,\r\n right: 0,\r\n width: '100%',\r\n ...media('print', {\r\n display: 'none',\r\n }),\r\n});\r\n","import React, { ReactNode } from 'react';\r\n\r\ntype State = {\r\n dimensions: Dimensions;\r\n};\r\ntype Props = {\r\n children?: (args: RenderArgs) => ReactNode;\r\n onDimensionChange?: (dimensions: Dimensions) => void;\r\n};\r\ntype Dimensions = {\r\n width: number;\r\n height: number;\r\n left: number;\r\n right: number;\r\n top: number;\r\n bottom: number;\r\n};\r\ntype RenderArgs = {\r\n dimensions: Dimensions;\r\n elementRef: (el: HTMLElement) => void;\r\n};\r\n\r\nexport default class ElementDimensions extends React.PureComponent<Props, State> {\r\n measureElement: HTMLElement;\r\n mounted = false;\r\n unsubscribeResize = () => {};\r\n\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n dimensions: {\r\n width: null,\r\n height: null,\r\n left: null,\r\n right: null,\r\n top: null,\r\n bottom: null,\r\n },\r\n };\r\n }\r\n getElementDimensions() {\r\n return !!this.measureElement ? this.measureElement.getBoundingClientRect() : this.state.dimensions;\r\n }\r\n componentDidMount() {\r\n const initialDimensions = this.getElementDimensions();\r\n this.onDimensionChange(initialDimensions);\r\n this.setState({ dimensions: initialDimensions });\r\n\r\n window.addEventListener('resize', () => {\r\n const dimensions = this.getElementDimensions();\r\n if (this.state.dimensions !== dimensions) {\r\n this.onDimensionChange(dimensions);\r\n this.setState({ dimensions });\r\n }\r\n });\r\n }\r\n componentWillUnmount() {\r\n this.unsubscribeResize();\r\n }\r\n elementRef = (el: HTMLElement) => {\r\n this.measureElement = el;\r\n };\r\n onDimensionChange = (dimensions: Dimensions) => {\r\n this.props.onDimensionChange && this.props.onDimensionChange(dimensions);\r\n };\r\n render() {\r\n return this.props.children({ dimensions: this.state.dimensions, elementRef: this.elementRef });\r\n }\r\n}\r\n","import React, { ReactNode } from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport SlideIndexMarkers from './SlideIndexMarkers';\r\nimport { Carousel, getAbsoluteIndex, AnimationStyle, Navigation, Direction } from './';\r\nimport ElementDimensions from './ElementDimensions';\r\nimport * as style from 'Shared/Style';\r\n\r\ntype BasePropType = {\r\n height?: string;\r\n children: ReactNode;\r\n};\r\n\r\nconst Base = ({ height, children }: BasePropType) => (\r\n <styled.Div\r\n css={{\r\n position: 'relative',\r\n height: height || 'auto',\r\n }}\r\n >\r\n {children}\r\n </styled.Div>\r\n);\r\n\r\nconst CarouselBase = styled.div({\r\n overflow: 'hidden',\r\n});\r\n\r\nconst ButtonContainer = styled.div({\r\n position: 'absolute',\r\n width: '100%',\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n zIndex: style.ZIndex.SiteBanner,\r\n pointerEvents: 'none',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n});\r\n\r\ntype PropType = {\r\n isHero?: boolean;\r\n continuous?: boolean;\r\n disabled?: boolean;\r\n autoSlideTime?: number;\r\n hideNavigationButtons?: boolean;\r\n hideIndexMarkers?: boolean;\r\n currentSlide?: number;\r\n onSlideChange?: (index: number) => void;\r\n height?: string;\r\n backgroundColor?: string; //We could have used a glitz´ styles for this, but this is easier to follow\r\n slidesPerPage?: number;\r\n navigationOffset?: boolean;\r\n};\r\n\r\ntype StateType = {\r\n currentSlide: number;\r\n};\r\n\r\nexport default class CommonCarousel extends React.Component<PropType, StateType> {\r\n static defaultProps = {\r\n slidesPerPage: 1,\r\n };\r\n\r\n constructor(props: PropType) {\r\n super(props);\r\n\r\n const children = React.Children.toArray(this.props.children);\r\n this.itemCount = children.length;\r\n this.state = {\r\n currentSlide: this.props.currentSlide ? this.props.currentSlide : 0,\r\n };\r\n }\r\n\r\n itemCount: number;\r\n\r\n componentDidMount() {\r\n window.addEventListener('keydown', this.handleKeyPress);\r\n }\r\n componentWillUnmount() {\r\n window.removeEventListener('keydown', this.handleKeyPress);\r\n }\r\n\r\n componentWillReceiveProps(nextProps: PropType) {\r\n const children = React.Children.toArray(this.props.children);\r\n this.itemCount = children.length;\r\n if (nextProps.currentSlide !== this.props.currentSlide) {\r\n this.setState({\r\n currentSlide: nextProps.currentSlide ? nextProps.currentSlide : 0,\r\n });\r\n }\r\n }\r\n\r\n goToSlide = (index: number) => {\r\n if (!this.props.continuous) {\r\n index = Math.min(index, this.itemCount - this.props.slidesPerPage);\r\n index = Math.max(index, 0);\r\n }\r\n this.setState({ currentSlide: index });\r\n this.props.onSlideChange && this.props.onSlideChange(getAbsoluteIndex(index, this.itemCount));\r\n };\r\n\r\n handleKeyPress = (e: KeyboardEvent) => {\r\n if (e.keyCode === 37) {\r\n this.goPrev();\r\n } else if (e.keyCode === 39) {\r\n this.goNext();\r\n }\r\n };\r\n\r\n goPrev = () => {\r\n this.goToSlide(this.state.currentSlide - this.props.slidesPerPage);\r\n };\r\n goNext = () => {\r\n this.goToSlide(this.state.currentSlide + this.props.slidesPerPage);\r\n };\r\n onSlideIndexClick = (relativeIndex: number) => {\r\n this.goToSlide(this.state.currentSlide + relativeIndex);\r\n };\r\n render() {\r\n const { slidesPerPage } = this.props;\r\n const children = React.Children.toArray(this.props.children);\r\n const nbrOfItems = children.length > slidesPerPage ? children.length : slidesPerPage;\r\n const isFirstSlide = this.state.currentSlide === 0;\r\n const isLastSlide = this.state.currentSlide === nbrOfItems - slidesPerPage;\r\n\r\n return (\r\n <Base height={this.props.height}>\r\n <CarouselBase>\r\n <ElementDimensions>\r\n {(dimensionsProp) => (\r\n <Carousel\r\n elementRef={dimensionsProp.elementRef}\r\n carouselWidth={dimensionsProp.dimensions.width}\r\n slidesPerPage={slidesPerPage}\r\n height={this.props.height}\r\n backgroundColor={this.props.backgroundColor}\r\n disabled={this.props.disabled}\r\n currentSlide={this.state.currentSlide}\r\n onSlideChange={(index: number) => {\r\n this.setState({ currentSlide: index });\r\n this.props.onSlideChange && this.props.onSlideChange(getAbsoluteIndex(index, this.itemCount));\r\n }}\r\n continuous={this.props.continuous}\r\n autoSlideTime={this.props.autoSlideTime}\r\n animationStyle={AnimationStyle.Gentle}\r\n >\r\n {children}\r\n </Carousel>\r\n )}\r\n </ElementDimensions>\r\n </CarouselBase>\r\n {!this.props.hideNavigationButtons && !this.props.disabled && children.length > 1 && (\r\n <ButtonContainer>\r\n {this.props.continuous || !isFirstSlide ? (\r\n <Navigation\r\n onClick={this.goPrev}\r\n direction={Direction.Prev}\r\n disabled={false}\r\n offset={this.props.navigationOffset}\r\n />\r\n ) : (\r\n <Navigation\r\n onClick={() => {\r\n return false;\r\n }}\r\n direction={Direction.Prev}\r\n disabled={true}\r\n offset={this.props.navigationOffset}\r\n />\r\n )}\r\n {this.props.continuous || !isLastSlide ? (\r\n <Navigation\r\n disabled={false}\r\n onClick={this.goNext}\r\n direction={Direction.Next}\r\n offset={this.props.navigationOffset}\r\n />\r\n ) : (\r\n <Navigation\r\n disabled={true}\r\n onClick={() => {\r\n return false;\r\n }}\r\n direction={Direction.Next}\r\n offset={this.props.navigationOffset}\r\n />\r\n )}\r\n </ButtonContainer>\r\n )}\r\n {!this.props.hideIndexMarkers && !this.props.disabled && children.length > 1 && (\r\n <SlideIndexMarkers\r\n nbrOfSlides={nbrOfItems}\r\n activeSlideIndex={getAbsoluteIndex(this.state.currentSlide, children.length)}\r\n onSlideIndexClick={this.onSlideIndexClick}\r\n />\r\n )}\r\n </Base>\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { pseudo } from '@glitz/core';\r\nimport Button, { Variant as ButtonVariant, Appearance as ButtonAppearance } from 'Shared/Button';\r\nimport { gamma, delison, silver, scorpion } from 'Shared/Style';\r\n\r\nconst Entry = styled(Button, {\r\n borderRadius: '50%',\r\n width: gamma,\r\n height: gamma,\r\n ...pseudo(':not(:last-child)', {\r\n marginRight: '9px',\r\n }),\r\n});\r\n\r\nconst Svg = styled.svg({\r\n width: delison,\r\n height: delison,\r\n});\r\nconst Circle = styled.circle({\r\n transition: {\r\n property: 'opacity',\r\n duration: '0.5s',\r\n },\r\n});\r\n\r\ntype PropType = {\r\n isCurrent: boolean;\r\n onClick: () => void;\r\n};\r\n\r\nconst SIZE = 100;\r\nconst CENTER = SIZE / 2;\r\nconst BULLET_RADIUS = SIZE * 0.425;\r\n\r\nconst Bullet = (props: PropType) => (\r\n <Entry variant={ButtonVariant.None} appearance={ButtonAppearance.Bare} onClick={props.onClick}>\r\n <Svg viewBox={`0 0 ${SIZE} ${SIZE}`}>\r\n <g>\r\n <Circle r={BULLET_RADIUS} cy={CENTER} cx={CENTER} fill={silver} opacity={1} />\r\n <Circle r={BULLET_RADIUS} cy={CENTER} cx={CENTER} fill={scorpion} opacity={props.isCurrent ? 1 : 0} />\r\n </g>\r\n </Svg>\r\n </Entry>\r\n);\r\n\r\nexport default Bullet;\r\n","export { default as Carousel, getAbsoluteIndex, AnimationStyle } from './Carousel';\r\nexport { default as CommonCarousel } from './CommonCarousel';\r\nexport { default as Bullet } from './Bullet';\r\nexport { default as Navigation, Direction } from './Navigation';\r\n","/**\r\n * @ComponentFor VideoBlock\r\n */\r\nimport React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { EpiProperty, epiPropertyValue } from '@avensia/scope-episerver';\r\nimport VideoBlockType from './VideoBlock.type';\r\nimport VideoSource from './VideoSource.type';\r\nimport AspectRatio, { Ratio } from './../../AspectRatio';\r\nimport padStyled from 'Shared/Blocks/PaddedBlock';\r\nimport { BOX_ITEM_CLASSNAME } from 'Shared/BoxLayout';\r\n\r\ntype PropType = VideoBlockType & StyledProps;\r\n\r\nexport const getVideoUrl = (videoId: string, videoSource: VideoSource) => {\r\n if (videoSource === 'youTube') {\r\n return `//www.youtube.com/embed/${videoId}`;\r\n } else if (videoSource === 'vimeo') {\r\n return `//player.vimeo.com/video/${videoId}`;\r\n }\r\n};\r\n\r\nconst VideoIframe = styled.iframe({\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n height: '100%',\r\n width: '100%',\r\n});\r\n\r\nconst VideoBlock = padStyled((props: PropType) => (\r\n <styled.Div css={props.compose()} className={BOX_ITEM_CLASSNAME}>\r\n {epiPropertyValue(props.header) && <EpiProperty for={props.header} component=\"h2\" />}\r\n <AspectRatio ratio={Ratio.SixteenToNine} css={{ position: 'relative' }}>\r\n <VideoIframe\r\n loading=\"lazy\"\r\n frameBorder=\"0\"\r\n allowFullScreen={epiPropertyValue(props.allowFullscreen)}\r\n src={getVideoUrl(epiPropertyValue(props.videoId), epiPropertyValue(props.videoSource))}\r\n />\r\n </AspectRatio>\r\n {epiPropertyValue(props.description) && <EpiProperty for={props.description} />}\r\n </styled.Div>\r\n));\r\n\r\nexport default VideoBlock;\r\n","var React = require('react');\n\nfunction ZoomIn (props) {\n return React.createElement(\"svg\",props,[React.createElement(\"path\",{\"d\":\"M505.248 472.995L387.776 354.138c28.952-36.294 46.407-82.285 46.407-132.294 0-117.056-94.892-211.948-212.086-211.948-117.195 0-212.086 95.03-212.086 212.087 0 117.056 94.891 211.947 212.086 211.947 50.7 0 97.108-17.731 133.68-47.376l116.5 117.886c4.433 4.71 10.528 7.065 16.485 7.065 5.68 0 11.36-2.078 15.654-6.234 9.142-8.727 9.42-23.134.83-32.277zm-283.151-84.64c-44.468 0-86.303-17.316-117.749-48.762-31.446-31.446-48.762-73.282-48.762-117.61 0-44.468 17.316-86.303 48.762-117.61 31.446-31.446 73.281-48.762 117.749-48.762 44.467 0 86.303 17.316 117.748 48.761 31.446 31.446 48.762 73.282 48.762 117.61 0 44.468-17.316 86.303-48.762 117.61-31.445 31.447-73.28 48.763-117.748 48.763z\",\"key\":0}),React.createElement(\"path\",{\"id\":\"Shape\",\"d\":\"M328.943 233.534c0 4.195-1.533 7.83-4.601 10.893-3.066 3.063-6.696 4.599-10.89 4.599h-61.957v61.954c0 4.194-1.536 7.827-4.599 10.893-3.065 3.066-6.696 4.598-10.89 4.598h-30.98c-4.194 0-7.824-1.533-10.89-4.598-3.066-3.066-4.598-6.699-4.598-10.893v-61.954H127.58c-4.195 0-7.825-1.535-10.89-4.599-3.066-3.062-4.599-6.698-4.599-10.893v-30.98c0-4.194 1.534-7.824 4.599-10.89 3.065-3.065 6.695-4.598 10.89-4.598h61.96v-61.957c0-4.194 1.532-7.824 4.598-10.89 3.066-3.066 6.696-4.599 10.89-4.599h30.98c4.194 0 7.827 1.534 10.89 4.599 3.063 3.066 4.601 6.696 4.601 10.89v61.957h61.954c4.195 0 7.825 1.533 10.89 4.598 3.066 3.066 4.599 6.696 4.599 10.89z\",\"key\":1})]);\n}\n\nZoomIn.defaultProps = {\"width\":\"20\",\"height\":\"20\",\"viewBox\":\"0 0 512 512\"};\n\nmodule.exports = ZoomIn;\n\nZoomIn.default = ZoomIn;\n","var React = require('react');\n\nfunction ZoomOut (props) {\n return React.createElement(\"svg\",props,[React.createElement(\"path\",{\"d\":\"M505.248 472.995L387.776 354.138c28.952-36.294 46.407-82.285 46.407-132.294 0-117.056-94.892-211.948-212.086-211.948-117.195 0-212.086 95.03-212.086 212.087 0 117.056 94.891 211.947 212.086 211.947 50.7 0 97.108-17.731 133.68-47.376l116.5 117.886c4.433 4.71 10.528 7.065 16.485 7.065 5.68 0 11.36-2.078 15.654-6.234 9.142-8.727 9.42-23.134.83-32.277zm-283.151-84.64c-44.468 0-86.303-17.316-117.749-48.762-31.446-31.446-48.762-73.282-48.762-117.61 0-44.468 17.316-86.303 48.762-117.61 31.446-31.446 73.281-48.762 117.749-48.762 44.467 0 86.303 17.316 117.748 48.761 31.446 31.446 48.762 73.282 48.762 117.61 0 44.468-17.316 86.303-48.762 117.61-31.445 31.447-73.28 48.763-117.748 48.763z\",\"key\":0}),React.createElement(\"path\",{\"id\":\"Shape\",\"d\":\"M328.943 233.534c0 4.195-1.533 7.83-4.601 10.893-3.066 3.063-6.696 4.599-10.89 4.599-132.478-.075-97.295 0-185.871 0-4.195 0-7.825-1.535-10.89-4.599-3.066-3.062-4.599-6.698-4.599-10.893v-30.98c0-4.194 1.534-7.824 4.599-10.89 3.065-3.065 6.695-4.598 10.89-4.598 174.394-.195 35.757 0 185.873 0 4.195 0 7.825 1.533 10.89 4.598 3.066 3.066 4.599 6.696 4.599 10.89z\",\"key\":1})]);\n}\n\nZoomOut.defaultProps = {\"width\":\"20\",\"height\":\"20\",\"viewBox\":\"0 0 512 512\"};\n\nmodule.exports = ZoomOut;\n\nZoomOut.default = ZoomOut;\n","var React = require('react');\n\nfunction Email (props) {\n return React.createElement(\"svg\",props,React.createElement(\"g\",{\"id\":\"mail\",\"stroke\":\"none\",\"strokeWidth\":\"1\",\"fill\":\"none\",\"fillRule\":\"evenodd\"},React.createElement(\"path\",{\"d\":\"M1.802 2.646L11 9.085l9.198-6.44A1.258 1.258 0 0019 1.75H3c-.563 0-1.044.38-1.198.896zM1.75 4.44V15c0 .686.564 1.25 1.25 1.25h16c.686 0 1.25-.564 1.25-1.25V4.44l-8.82 6.174a.75.75 0 01-.86 0L1.75 4.44zm20-1.452V15A2.756 2.756 0 0119 17.75H3A2.756 2.756 0 01.25 15V2.988A2.756 2.756 0 013 .25h16a2.756 2.756 0 012.75 2.738z\",\"transform\":\"translate(1 3)\",\"fill\":\"#000\",\"fillRule\":\"nonzero\",\"id\":\"Combined-Shape\"})));\n}\n\nEmail.defaultProps = {\"width\":\"24\",\"height\":\"24\",\"viewBox\":\"0 0 24 24\"};\n\nmodule.exports = Email;\n\nEmail.default = Email;\n","var React = require('react');\n\nfunction IconMeasure (props) {\n return React.createElement(\"svg\",props,React.createElement(\"path\",{\"d\":\"M17.313 6.068h.012v4.992h7.237a.66.66 0 01.66.659v6.267a.659.659 0 01-.66.66H8.747a7.908 7.908 0 01-7.908-7.909V6.124c0-3.275 3.688-5.93 8.237-5.93 4.523 0 8.195 2.624 8.237 5.874zm-.988 2.876c-.641.853-1.564 1.58-2.679 2.116h2.679V8.944zM9.47 11.06c3.87-.143 6.855-2.375 6.855-4.936 0-2.646-3.189-4.942-7.249-4.942S1.827 3.478 1.827 6.124c0 1.582 1.139 3.038 2.921 3.954l.012.006c1.04.533 2.3.881 3.68.964.19.009.38.013.574.012h.456zm-1.072.975c-1.473-.07-2.84-.428-4.075-1.065-.85-.406-1.68-1.05-2.496-1.929v1.696a6.92 6.92 0 006.755 6.918v-1.399c0-.273.224-.494.5-.494s.5.221.5.494v1.4h1.636v-1.4c0-.273.224-.494.5-.494s.5.221.5.494v1.4h1.636v-2.69c0-.273.224-.494.5-.494s.5.22.5.494v2.69h1.636v-1.4c0-.273.223-.494.5-.494.276 0 .5.221.5.494v1.4h1.636v-1.4c0-.273.223-.494.5-.494.276 0 .5.221.5.494v1.4h1.636v-2.69c0-.273.223-.494.5-.494.276 0 .5.22.5.494v2.69h1.47v-5.608H9.488a11.625 11.625 0 01-1.09-.013zm.678-4.263c1.511 0 2.636-.818 2.636-1.648s-1.125-1.647-2.636-1.647c-1.511 0-2.636.818-2.636 1.647 0 .83 1.125 1.648 2.636 1.648zm0 .988c-2.002 0-3.624-1.18-3.624-2.636 0-1.455 1.622-2.636 3.624-2.636S12.7 4.668 12.7 6.124c0 1.456-1.622 2.636-3.624 2.636z\",\"fill\":\"#2E2E2E\"}));\n}\n\nIconMeasure.defaultProps = {\"width\":\"26\",\"height\":\"19\"};\n\nmodule.exports = IconMeasure;\n\nIconMeasure.default = IconMeasure;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"slideIn\":\"_1mrQB-\",\"slideOut\":\"_1dGVhO\",\"slideUp\":\"_1-70mM\",\"slideDown\":\"wWsO1Z\"};","import { YouTubeAPI } from 'Shared/Video/youtube.ts';\r\n\r\nlet youtubeIsInit: Promise<YouTubeAPI>;\r\nexport function ensureYTInit(): Promise<YouTubeAPI> {\r\n if (!youtubeIsInit) {\r\n youtubeIsInit = initYoutube();\r\n }\r\n return youtubeIsInit;\r\n}\r\n\r\nfunction initYoutube(): Promise<YouTubeAPI> {\r\n const iframeApi = new Promise<YouTubeAPI>(resolve => {\r\n const tag = document.createElement('script');\r\n tag.src = 'https://www.youtube.com/iframe_api';\r\n tag.id = 'YTscript';\r\n const firstScriptTag = document.getElementsByTagName('script')[0];\r\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n window['onYouTubeIframeAPIReady'] = () => {\r\n resolve(window['YT']);\r\n };\r\n });\r\n\r\n return iframeApi;\r\n}\r\n","export const enum YoutubeStateTypes {\r\n UNSTARTED = -1,\r\n ENDED = 0,\r\n PLAYING = 1,\r\n PAUSED = 2,\r\n BUFFERING = 3,\r\n CUED = 5,\r\n}\r\nexport interface YouTubeAPI {\r\n Player: { new (elementId: string, options?: Options): YouTubePlayerType };\r\n}\r\n\r\nexport type EventType =\r\n | 'ready'\r\n | 'stateChange'\r\n | 'playbackQualityChange'\r\n | 'playbackRateChange'\r\n | 'error'\r\n | 'apiChange'\r\n | 'volumeChange';\r\n\r\nexport interface Options {\r\n width?: number;\r\n height?: number;\r\n videoId?: string;\r\n playerVars?: {\r\n autoplay?: 0 | 1;\r\n cc_lang_pref?: string;\r\n cc_load_policy?: 1;\r\n color?: 'red' | 'white';\r\n controls?: 0 | 1;\r\n disablekb?: 0 | 1;\r\n enablejsapi?: 0 | 1;\r\n end?: number;\r\n fs?: 0 | 1;\r\n hl?: string;\r\n iv_load_policy?: 1 | 3;\r\n list?: string;\r\n listType?: 'playlist' | 'search' | 'user_uploads';\r\n loop?: 0 | 1;\r\n modestbranding?: 1;\r\n origin?: string;\r\n playlist?: string;\r\n playsinline?: 0 | 1;\r\n rel?: 0 | 1;\r\n start?: number;\r\n widget_referrer?: string;\r\n };\r\n events?: Events;\r\n}\r\nexport interface PlayerEvent {\r\n target: YouTubePlayerType;\r\n}\r\n\r\nexport interface PlayerEventHandler<TEvent extends PlayerEvent> {\r\n (event: TEvent): void;\r\n}\r\nexport interface Events {\r\n onReady?: PlayerEventHandler<PlayerEvent>;\r\n onStateChange?: PlayerEventHandler<OnStateChangeEvent>;\r\n onPlaybackQualityChange?: PlayerEventHandler<OnPlaybackQualityChangeEvent>;\r\n onPlaybackRateChange?: PlayerEventHandler<OnPlaybackRateChangeEvent>;\r\n onError?: PlayerEventHandler<OnErrorEvent>;\r\n onApiChange?: PlayerEventHandler<PlayerEvent>;\r\n}\r\nexport interface OnStateChangeEvent extends PlayerEvent {\r\n data: YoutubeStateTypes;\r\n}\r\n\r\nexport interface OnErrorEvent extends PlayerEvent {\r\n data: PlayerError;\r\n}\r\n\r\nexport type YouTubePlayerType = {\r\n addEventListener: (event: string, listener: Function) => void;\r\n destroy: () => void;\r\n getAvailablePlaybackRates: () => ReadonlyArray<number>;\r\n getAvailableQualityLevels: () => ReadonlyArray<string>;\r\n getCurrentTime: () => number;\r\n getDuration: () => number;\r\n getIframe: () => Object;\r\n getOption: () => any;\r\n getOptions: () => any;\r\n setOption: () => void;\r\n setOptions: () => void;\r\n cuePlaylist: (\r\n playlist: string | ReadonlyArray<string>,\r\n index?: number,\r\n startSeconds?: number,\r\n suggestedQuality?: string,\r\n ) => void;\r\n loadPlaylist: (\r\n playlist: string | ReadonlyArray<string>,\r\n index?: number,\r\n startSeconds?: number,\r\n suggestedQuality?: string,\r\n ) => void;\r\n getPlaylist: () => ReadonlyArray<string>;\r\n getPlaylistIndex: () => number;\r\n getPlaybackQuality: () => string;\r\n getPlaybackRate: () => number;\r\n getPlayerState: () => number;\r\n getVideoEmbedCode: () => string;\r\n getVideoLoadedFraction: () => number;\r\n getVideoUrl: () => string;\r\n getVolume: () => number;\r\n cueVideoById: (videoId: string, startSeconds?: number, suggestedQuality?: string) => void;\r\n cueVideoByUrl: (mediaContentUrl: string, startSeconds?: number, suggestedQuality?: string) => void;\r\n loadVideoByUrl: (mediaContentUrl: string, startSeconds?: number, suggestedQuality?: string) => void;\r\n loadVideoById: (videoId: string, startSeconds?: number, suggestedQuality?: string) => void;\r\n isMuted: () => boolean;\r\n mute: () => void;\r\n nextVideo: () => void;\r\n pauseVideo: () => void;\r\n playVideo: () => void;\r\n playVideoAt: (index: number) => void;\r\n previousVideo: () => void;\r\n removeEventListener: (event: string, listener: Function) => void;\r\n seekTo: (seconds: number, allowSeekAhead: boolean) => void;\r\n setLoop: (loopPlaylists: boolean) => void;\r\n setPlaybackQuality: (suggestedQuality: string) => void;\r\n setPlaybackRate: (suggestedRate: number) => void;\r\n setShuffle: (shufflePlaylist: boolean) => void;\r\n setSize: (width: number, height: number) => Object;\r\n setVolume: (volume: number) => void;\r\n stopVideo: () => void;\r\n unMute: () => void;\r\n};\r\n\r\nexport default YouTubePlayerType;\r\n\r\nexport const enum PlayerError {\r\n InvalidParam = 2,\r\n Html5Error = 5,\r\n VideoNotFound = 100,\r\n EmbeddingNotAllowed = 101,\r\n EmbeddingNotAllowed2 = 150,\r\n}\r\nexport interface OnPlaybackQualityChangeEvent extends PlayerEvent {\r\n data: string;\r\n}\r\nexport interface OnPlaybackRateChangeEvent extends PlayerEvent {\r\n data: number;\r\n}\r\n","import React, { ReactNode } from 'react';\r\nimport { isIOS, Breakpoint } from '@avensia/scope';\r\nimport { styled } from '@glitz/react';\r\nimport {\r\n minTinyMediaQuery,\r\n pixelsToUnit,\r\n} from 'Shared/Style';\r\nimport connect from 'Shared/connect';\r\nimport Icon from 'Shared/Icon/Close';\r\nimport freezeScroll from 'Shared/freeze-scroll';\r\nimport * as style from 'Shared/Style';\r\n\r\n\r\ntype RequiredPropType = {\r\n children: ReactNode;\r\n close: () => void;\r\n};\r\n\r\ntype ConnectStateType = {\r\n currentBreakpoint: number;\r\n};\r\n\r\ntype PropType = RequiredPropType & ConnectStateType;\r\nclass Modal extends React.Component<PropType> {\r\n unfreezeScroll: () => void;\r\n componentDidMount() {\r\n this.scrollFreeze();\r\n if (isIOS()) {\r\n document.body.setAttribute('style', 'position: fixed');\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.scrollFreeze();\r\n if (isIOS()) {\r\n document.body.removeAttribute('style');\r\n }\r\n }\r\n\r\n scrollFreeze() {\r\n if (this.props.currentBreakpoint < Breakpoint.Medium) {\r\n if (this.unfreezeScroll) {\r\n this.unfreezeScroll();\r\n }\r\n this.unfreezeScroll = !this.unfreezeScroll ? freezeScroll() : null;\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <Base>\r\n <Close onClick={this.props.close} />\r\n {this.props.children}\r\n </Base>\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n (state): ConnectStateType => ({\r\n currentBreakpoint: state.currentBreakpoint,\r\n }),\r\n)(Modal);\r\n\r\nconst Base = styled.div({\r\n position: 'fixed',\r\n zIndex: style.ZIndex.Modal,\r\n top: 0, bottom: 0, left: 0, right: 0,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n backgroundColor: style.white,\r\n overflow: 'hidden',\r\n});\r\n\r\nconst Close = styled(Icon, {\r\n display: 'block',\r\n position: 'absolute',\r\n zIndex: style.ZIndex.Overlay,\r\n cursor: 'pointer',\r\n top: pixelsToUnit(10),\r\n right: pixelsToUnit(10),\r\n height: pixelsToUnit(30),\r\n width: pixelsToUnit(30),\r\n [minTinyMediaQuery]: {\r\n top: pixelsToUnit(20),\r\n right: pixelsToUnit(20),\r\n height: pixelsToUnit(40),\r\n width: pixelsToUnit(40),\r\n },\r\n});\r\n\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport connect from 'Shared/connect';\r\nimport {\r\n minMicroMediaQuery,\r\n minSmallMediaQuery,\r\n minMediumMediaQuery,\r\n minHugeMediaQuery,\r\n minLargeMediaQuery,\r\n pixelsToUnit,\r\n} from 'Shared/Style';\r\nimport { getVideoUrl } from 'Shared/Blocks/Video/VideoBlock';\r\nimport { ensureYTInit } from 'Shared/Video/video-helper';\r\nimport YoutubePlayerType, { YouTubeAPI, YoutubeStateTypes } from 'Shared/Video/youtube.ts';\r\n\r\ntype ConnectStateType = {\r\n currentBreakpoint: number;\r\n};\r\n\r\ntype PropTypes = StyledProps &\r\n ConnectStateType & {\r\n key?: string;\r\n index: number;\r\n videoId: string;\r\n options?: string;\r\n isCurrent: boolean;\r\n };\r\ntype StateTypes = {\r\n playerIsReady: boolean;\r\n};\r\nclass ProductMedia extends React.Component<PropTypes, StateTypes> {\r\n player: YoutubePlayerType;\r\n YT: YouTubeAPI;\r\n constructor(props: PropTypes) {\r\n super(props);\r\n this.state = { playerIsReady: false };\r\n }\r\n\r\n async componentDidMount() {\r\n this.YT = await ensureYTInit();\r\n this.initPlayer();\r\n }\r\n\r\n initPlayer = () => {\r\n this.player = new this.YT.Player(`youTube-video-${this.props.index}`, {\r\n events: {\r\n onReady: this.onPlayerReady,\r\n },\r\n });\r\n };\r\n onPlayerReady = () => {\r\n if (this.props.currentBreakpoint < 4) {\r\n this.player.mute();\r\n }\r\n this.setState({ playerIsReady: true });\r\n };\r\n componentDidUpdate(prevProps: PropTypes) {\r\n if (prevProps.isCurrent && !this.props.isCurrent && this.state.playerIsReady) {\r\n this.player.pauseVideo();\r\n }\r\n }\r\n\r\n toggleVideo = () => {\r\n const currentState = this.player.getPlayerState();\r\n if (\r\n currentState === YoutubeStateTypes.UNSTARTED ||\r\n currentState === YoutubeStateTypes.PAUSED ||\r\n currentState === YoutubeStateTypes.ENDED ||\r\n currentState === YoutubeStateTypes.CUED\r\n ) {\r\n this.player.playVideo();\r\n } else {\r\n this.player.pauseVideo();\r\n }\r\n };\r\n\r\n render() {\r\n const isMobile = this.props.currentBreakpoint < 4;\r\n const { index, videoId } = this.props;\r\n return (\r\n <VideoContainer>\r\n <LayerWrapper>\r\n <VideoIframe\r\n id={`youTube-video-${index}`}\r\n frameBorder=\"0\"\r\n allowFullScreen\r\n allow=\"autoplay\"\r\n src={getVideoUrl(videoId, 'youTube') + this.props.options}\r\n loading=\"lazy\"\r\n />\r\n {isMobile && <Layer onClick={this.toggleVideo} />}\r\n </LayerWrapper>\r\n </VideoContainer>\r\n );\r\n }\r\n}\r\nexport default styled(\r\n connect((state) => ({\r\n currentBreakpoint: state.currentBreakpoint,\r\n }))(ProductMedia),\r\n);\r\n\r\nconst Layer = styled.div({\r\n position: 'absolute',\r\n left: 0,\r\n width: '80%',\r\n height: '40%',\r\n top: '25%',\r\n zIndex: 1,\r\n});\r\nconst LayerWrapper = styled.div({\r\n width: '100%',\r\n position: 'relative',\r\n});\r\nconst VideoContainer = styled.div({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n height: '100%',\r\n});\r\n\r\nconst VideoIframe = styled.iframe({\r\n height: '180px',\r\n width: '100%',\r\n [minHugeMediaQuery]: {\r\n height: pixelsToUnit(400),\r\n },\r\n [minLargeMediaQuery]: {\r\n height: pixelsToUnit(350),\r\n },\r\n [minMediumMediaQuery]: {\r\n height: pixelsToUnit(250),\r\n },\r\n [minSmallMediaQuery]: {\r\n height: pixelsToUnit(400),\r\n },\r\n [minMicroMediaQuery]: {\r\n height: pixelsToUnit(220),\r\n },\r\n});\r\n","import React from 'react';\r\nimport { getVideoUrl } from 'Shared/Blocks/Video/VideoBlock';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport connect from 'Shared/connect';\r\nimport { Player } from 'vimeo__player';\r\nimport {\r\n minMicroMediaQuery,\r\n minSmallMediaQuery,\r\n minMediumMediaQuery,\r\n minHugeMediaQuery,\r\n minLargeMediaQuery,\r\n pixelsToUnit,\r\n} from 'Shared/Style';\r\n\r\ntype ConnectStateType = {\r\n currentBreakpoint: number;\r\n};\r\ntype PropTypes = StyledProps &\r\n ConnectStateType & {\r\n key?: string;\r\n index: number;\r\n videoId: string;\r\n options?: string;\r\n isCurrent: boolean;\r\n } & ConnectStateType;\r\n\r\nclass ProductMedia extends React.Component<PropTypes, {}> {\r\n player: Player;\r\n playerRef: HTMLIFrameElement;\r\n\r\n componentDidMount() {\r\n const VimeoPlayer = require('@vimeo/player');\r\n this.player = new VimeoPlayer.default(this.playerRef);\r\n }\r\n\r\n componentDidUpdate(prevProps: PropTypes) {\r\n if (prevProps.isCurrent && !this.props.isCurrent) {\r\n this.player.pause();\r\n }\r\n }\r\n\r\n togglePlayer = () => {\r\n if (this.player) {\r\n this.player.getPaused().then((val) => {\r\n if (val) {\r\n this.player.play();\r\n } else {\r\n this.player.pause();\r\n }\r\n });\r\n }\r\n };\r\n\r\n render() {\r\n const isMobile = this.props.currentBreakpoint < 4;\r\n const { videoId, index } = this.props;\r\n const addMute = isMobile ? `${this.props.options ? '&' : '?'}muted=1` : '';\r\n return (\r\n <VideoContainer>\r\n <LayerWrapper>\r\n <VideoIframe\r\n loading=\"lazy\"\r\n id={`vimeo-video-${index}`}\r\n frameBorder=\"0\"\r\n allowFullScreen\r\n data-allow=\"autoplay\"\r\n src={getVideoUrl(videoId, 'vimeo') + this.props.options + addMute}\r\n ref={(el: HTMLIFrameElement) => {\r\n this.playerRef = el;\r\n }}\r\n />\r\n {isMobile && <Layer onClick={this.togglePlayer} />}\r\n </LayerWrapper>\r\n </VideoContainer>\r\n );\r\n }\r\n}\r\nexport default styled(\r\n connect((state) => ({\r\n currentBreakpoint: state.currentBreakpoint,\r\n }))(ProductMedia),\r\n);\r\n\r\nconst Layer = styled.div({\r\n position: 'absolute',\r\n left: 0,\r\n width: '80%',\r\n height: '50%',\r\n top: '25%',\r\n zIndex: 1,\r\n [minSmallMediaQuery]: {\r\n width: '92%',\r\n height: '70%',\r\n top: '15%',\r\n },\r\n});\r\nconst LayerWrapper = styled.div({\r\n width: '100%',\r\n position: 'relative',\r\n});\r\nconst VideoContainer = styled.div({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n height: '100%',\r\n});\r\n\r\nconst VideoIframe = styled.iframe({\r\n height: '180px',\r\n width: '100%',\r\n [minHugeMediaQuery]: {\r\n height: pixelsToUnit(400),\r\n },\r\n [minLargeMediaQuery]: {\r\n height: pixelsToUnit(350),\r\n },\r\n [minMediumMediaQuery]: {\r\n height: pixelsToUnit(250),\r\n },\r\n [minSmallMediaQuery]: {\r\n height: pixelsToUnit(400),\r\n },\r\n [minMicroMediaQuery]: {\r\n height: pixelsToUnit(200),\r\n },\r\n});\r\n","import factory from './icon';\r\nimport Svg from './glyphs/zoom-in.svg';\r\n\r\nexport default factory(Svg);\r\n","import factory from './icon';\r\nimport Svg from './glyphs/zoom-out.svg';\r\n\r\nexport default factory(Svg);\r\n","import React, { ReactNode } from 'react';\r\nimport { isIOS, isTouch } from '@avensia/scope';\r\nimport * as style from 'Shared/Style';\r\nimport { Style } from '@glitz/type';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport PrismaZoom, { PrismaComponent } from 'react-prismazoom';\r\nimport { pixelsToUnit } from 'Shared/Style';\r\nimport Image, { Preset as ImagePreset } from 'Shared/Image';\r\nimport Button, { Variant as ButtonVariant, Appearance as ButtonAppearance } from 'Shared/Button';\r\nimport IconZoomIn from 'Shared/Icon/ZoomIn';\r\nimport IconZoomOut from 'Shared/Icon/ZoomOut';\r\nimport IconClose from 'Shared/Icon/Close';\r\n\r\ntype PropType = {\r\n imageUrl: string;\r\n cloakedImages?: boolean;\r\n preset?: ImagePreset;\r\n};\r\n\r\ntype StateType = {\r\n zoom: number;\r\n modalOpen: boolean;\r\n};\r\n\r\nexport default class MobileModal extends React.Component<PropType, StateType> {\r\n //Needs to be any, else we get this error when using the ref property:\r\n //Type 'RefObject<PrismaComponent>' is not assignable to type '(string & RefObject<PrismaComponent>) | (((instance: Component<PrismaProps, any, any>) => void) & RefObject<PrismaComponent>) | (RefObject<...> & RefObject<...>)'.\r\n private prismaZoom: any = React.createRef<PrismaComponent>();\r\n\r\n constructor(props: PropType) {\r\n super(props);\r\n this.state = {\r\n zoom: 2,\r\n modalOpen: false,\r\n };\r\n }\r\n\r\n componentWillUnmount() {\r\n document.body.removeAttribute('style');\r\n }\r\n\r\n openModal = () => {\r\n //This is needed for react-prismazoom to calculate the correct container height:\r\n if (isIOS()) {\r\n document.body.setAttribute('style', 'overflow: hidden; height: 100vh; position: fixed');\r\n } else {\r\n document.body.setAttribute('style', 'overflow: hidden; height: 100vh');\r\n }\r\n\r\n this.setState({\r\n modalOpen: true,\r\n });\r\n };\r\n\r\n closeModal = () => {\r\n this.setState({\r\n modalOpen: false,\r\n });\r\n document.body.removeAttribute('style');\r\n };\r\n\r\n onZoomChange = (zoom: number) => {\r\n this.setState({ zoom });\r\n };\r\n\r\n zoomOut = () => {\r\n this.prismaZoom.current.zoomOut(1);\r\n };\r\n\r\n zoomIn = () => {\r\n this.prismaZoom.current.zoomIn(1);\r\n };\r\n\r\n render() {\r\n const { imageUrl, preset } = this.props;\r\n return this.state.modalOpen ? (\r\n <Modal>\r\n <ZoomContainer onClick={this.closeModal}>\r\n <PrismaZoom\r\n minZoom={1}\r\n maxZoom={3}\r\n scrollVelocity={0}\r\n doubleTouchMaxDelay={0}\r\n onZoomChange={this.onZoomChange}\r\n ref={this.prismaZoom}\r\n >\r\n <Image\r\n preset={!imageUrl.includes('.gif') ? preset || ImagePreset.Small : undefined}\r\n src={imageUrl}\r\n css={{ display: 'block' }}\r\n />\r\n </PrismaZoom>\r\n </ZoomContainer>\r\n <ModalIconContainer>\r\n <IconButton onClick={this.zoomOut}>\r\n <IconZoomOut />\r\n </IconButton>\r\n <IconButton onClick={this.zoomIn}>\r\n <IconZoomIn />\r\n </IconButton>\r\n <IconButton onClick={this.closeModal}>\r\n <IconClose />\r\n </IconButton>\r\n </ModalIconContainer>\r\n </Modal>\r\n ) : (\r\n <IconContainer>\r\n <IconButton onClick={this.openModal}>\r\n <IconZoomIn />\r\n </IconButton>\r\n </IconContainer>\r\n );\r\n }\r\n}\r\n\r\nconst Modal = styled.div({\r\n position: 'fixed',\r\n zIndex: style.ZIndex.Modal,\r\n top: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n backgroundColor: style.white,\r\n});\r\n\r\nconst ZoomContainer = styled.div({\r\n position: 'fixed',\r\n top: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n overflow: 'hidden',\r\n});\r\n\r\nconst IconContainer = styled.div({\r\n position: 'absolute',\r\n zIndex: 1,\r\n top: '1rem',\r\n right: '2rem',\r\n height: pixelsToUnit(22),\r\n});\r\n\r\nconst ModalIconContainer = styled.div({\r\n position: 'fixed',\r\n zIndex: style.ZIndex.Modal + 1,\r\n display: 'flex',\r\n top: pixelsToUnit(20),\r\n right: pixelsToUnit(20),\r\n height: pixelsToUnit(22),\r\n});\r\n\r\ntype ButtonPropType = {\r\n onClick: () => void;\r\n children: ReactNode;\r\n};\r\n\r\nconst IconButton = styled((props: ButtonPropType & StyledProps) => {\r\n const { compose, ...restProps } = props;\r\n const css: Style = {\r\n width: pixelsToUnit(40),\r\n height: pixelsToUnit(40),\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: pixelsToUnit(20),\r\n backgroundColor: style.white,\r\n borderRadius: '50%',\r\n padding: { xy: pixelsToUnit(5) },\r\n marginLeft: pixelsToUnit(10),\r\n userSelect: 'none',\r\n cursor: 'pointer',\r\n opacity: 0.3,\r\n ...style.transition({ property: 'opacity' }),\r\n pointerEvents: 'auto',\r\n ...(!isTouch() && {\r\n ':hover': {\r\n opacity: 0.6,\r\n },\r\n }),\r\n };\r\n\r\n function handleClick() {\r\n restProps.onClick();\r\n }\r\n\r\n return (\r\n <styled.Div css={compose(css)}>\r\n <Button variant={ButtonVariant.None} appearance={ButtonAppearance.Bare} onClick={handleClick} noRippleEffect>\r\n {restProps.children}\r\n </Button>\r\n </styled.Div>\r\n );\r\n});\r\n","import React from 'react';\r\nimport connect from 'Shared/connect';\r\nimport { Breakpoint } from '@avensia/scope';\r\nimport Image, { Preset as ImagePreset } from 'Shared/Image';\r\nimport { styled } from '@glitz/react';\r\nimport { getTheme } from 'Shared/Theming';\r\nimport { Theme as ColorTheme } from '@glitz/type';\r\nimport { CommonCarousel } from 'Shared/Carousel';\r\nimport Modal from 'Shared/Modal';\r\nimport { minMediumMediaQuery } from 'Shared/Style';\r\nimport YoutubeVideo from './youtubeVideo';\r\nimport VimeoVideo from './vimeoVideo';\r\nimport MobileModal from './MobileModal';\r\n\r\ntype ConnectedPropType = {\r\n cloakedImages: boolean;\r\n currentBreakpoint: number;\r\n theme: ColorTheme;\r\n};\r\n\r\ntype ProductMediaPropType = {\r\n alt?: string;\r\n imageUrls?: string[];\r\n youTubeIds?: string[];\r\n vimeoIds?: string[];\r\n isCompact?: boolean;\r\n onModalToggle: (isOpen: boolean) => void;\r\n};\r\n\r\ntype PropType = ProductMediaPropType & ConnectedPropType;\r\n\r\ntype StateType = {\r\n currentIndex: number;\r\n modalOpen: boolean;\r\n};\r\n\r\ntype ItemTotals = {\r\n totalImages: number;\r\n totalYoutube: number;\r\n totalVimeo: number;\r\n};\r\n\r\nclass ProductMedia extends React.Component<PropType, StateType> {\r\n constructor(props: PropType) {\r\n super(props);\r\n this.state = {\r\n currentIndex: INITIAL_INDEX,\r\n modalOpen: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n window.addEventListener('keydown', this.handleKeyPress);\r\n }\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener('keydown', this.handleKeyPress);\r\n }\r\n\r\n navigate(newIndex: number) {\r\n this.setState({\r\n currentIndex: newIndex,\r\n });\r\n }\r\n\r\n openModal() {\r\n const isMobile = this.props.currentBreakpoint < 4;\r\n if (!isMobile) {\r\n this.props.onModalToggle(true);\r\n this.setState({\r\n modalOpen: true,\r\n });\r\n }\r\n }\r\n\r\n closeModal() {\r\n this.props.onModalToggle(false);\r\n this.setState({\r\n modalOpen: false,\r\n });\r\n }\r\n\r\n handleKeyPress = (e: KeyboardEvent) => {\r\n if (e.keyCode === 27) {\r\n this.closeModal();\r\n }\r\n };\r\n\r\n itemTotals = (): ItemTotals => {\r\n const { imageUrls, youTubeIds, vimeoIds } = this.props;\r\n const { length: totalImages } = imageUrls || [];\r\n const { length: totalYoutube } = youTubeIds || [];\r\n const { length: totalVimeo } = vimeoIds || [];\r\n return {\r\n totalImages,\r\n totalYoutube,\r\n totalVimeo,\r\n };\r\n };\r\n\r\n renderCarousel() {\r\n const { imageUrls = [], youTubeIds = [], vimeoIds = [] } = this.props;\r\n const isMobile = this.props.currentBreakpoint < 4;\r\n const imageHeight = isMobile ? '22rem' : '550px';\r\n\r\n return (\r\n <Base>\r\n {!this.state.modalOpen && (\r\n <CommonCarousel\r\n autoSlideTime={0}\r\n continuous\r\n height={imageHeight}\r\n currentSlide={this.state.currentIndex}\r\n onSlideChange={(index: number) => {\r\n this.setState({ currentIndex: index });\r\n }}\r\n >\r\n {youTubeIds.map((youTubeId, index) => (\r\n <YoutubeVideo\r\n key={`${index}-youTube`}\r\n index={index}\r\n videoId={youTubeId}\r\n options=\"?rel=0&loop=1&enablejsapi=1&fs=0\"\r\n isCurrent={index === this.state.currentIndex}\r\n />\r\n ))}\r\n {vimeoIds.map((vimeoId, index) => (\r\n <VimeoVideo\r\n key={`${index}-vimeo`}\r\n index={youTubeIds.length + index}\r\n videoId={vimeoId}\r\n options=\"?autoplay=0\"\r\n isCurrent={youTubeIds.length + index === this.state.currentIndex}\r\n />\r\n ))}\r\n {imageUrls.map((imageUrl) => (\r\n <div key={imageUrl} onClick={() => this.openModal()} style={{ cursor: 'zoom-in', height: '22rem' }}>\r\n {this.imageAsset(imageUrl, undefined, imageHeight)}\r\n </div>\r\n ))}\r\n </CommonCarousel>\r\n )}\r\n </Base>\r\n );\r\n }\r\n\r\n renderModal() {\r\n const { imageUrls = [], youTubeIds = [], vimeoIds = [] } = this.props;\r\n\r\n return (\r\n <React.Fragment>\r\n <Modal close={() => this.closeModal()}>\r\n <CommonCarousel\r\n height=\"100vh\"\r\n autoSlideTime={0}\r\n continuous\r\n currentSlide={this.state.currentIndex}\r\n onSlideChange={(index: number) => {\r\n this.setState({ currentIndex: index });\r\n }}\r\n >\r\n {youTubeIds.map((youTubeId, index) => (\r\n <YoutubeVideo\r\n key={`${index}-youTube`}\r\n index={index}\r\n videoId={youTubeId}\r\n options=\"?rel=0&loop=1&enablejsapi=1&fs=0\"\r\n isCurrent={index === this.state.currentIndex}\r\n />\r\n ))}\r\n {vimeoIds.map((vimeoId, index) => (\r\n <VimeoVideo\r\n key={`${index}-vimeo`}\r\n index={youTubeIds.length + index}\r\n videoId={vimeoId}\r\n options=\"?autoplay=0\"\r\n isCurrent={youTubeIds.length + index === this.state.currentIndex}\r\n />\r\n ))}\r\n {imageUrls.map((imageUrl) => (\r\n <div key={imageUrl} style={{ height: '100%', display: 'flex', justifyContent: 'space-around' }}>\r\n {this.imageAsset(imageUrl, this.props.currentBreakpoint)}\r\n </div>\r\n ))}\r\n </CommonCarousel>\r\n </Modal>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n renderMobileModal() {\r\n const imageUrl = this.props.imageUrls[this.state.currentIndex];\r\n return <MobileModal key={this.state.currentIndex} imageUrl={imageUrl} cloakedImages={this.props.cloakedImages} />;\r\n }\r\n\r\n renderSingleAsset() {\r\n if (this.props.youTubeIds.length > 0) {\r\n return <YoutubeVideo index={0} videoId={this.props.youTubeIds[0]} options=\"?enablejsapi=1\" isCurrent />;\r\n } else if (this.props.vimeoIds.length > 0) {\r\n return <VimeoVideo index={0} videoId={this.props.vimeoIds[0]} options=\"?autoplay=0\" isCurrent />;\r\n } else if (this.props.imageUrls.length > 0) {\r\n return this.imageAsset();\r\n }\r\n return null;\r\n }\r\n\r\n imageAsset(imgSrc?: string, preset?: ImagePreset, imageHeight?: string) {\r\n const {\r\n alt,\r\n imageUrls: [firstImageUrl],\r\n } = this.props;\r\n return (\r\n <Image\r\n alt={alt}\r\n preset={!firstImageUrl.includes('.gif') ? preset || ImagePreset.Small : undefined}\r\n src={!!imgSrc ? imgSrc : firstImageUrl}\r\n css={{\r\n width: '100%',\r\n height: imageHeight,\r\n objectFit: 'contain',\r\n }}\r\n />\r\n );\r\n }\r\n\r\n render() {\r\n const isMobile = this.props.currentBreakpoint < Breakpoint.Medium;\r\n return (\r\n <>\r\n {this.state.modalOpen && this.renderModal()}\r\n {isMobile && this.renderMobileModal()}\r\n {this.renderCarousel()}\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n (state): ConnectedPropType => ({\r\n cloakedImages: state.appShellData.cloakProductImages,\r\n currentBreakpoint: state.currentBreakpoint,\r\n theme: getTheme(state.currentTheme),\r\n }),\r\n)(ProductMedia);\r\n\r\nconst INITIAL_INDEX = 0;\r\nconst Base = styled.div({\r\n position: 'relative',\r\n [minMediumMediaQuery]: {\r\n margin: { xy: 0 },\r\n },\r\n});\r\n","import factory from './icon';\r\nimport Svg from './glyphs/email.svg';\r\n\r\nexport default factory(Svg);\r\n","import { styled } from '@glitz/react';\r\nimport * as style from '../Style';\r\n\r\nexport default styled.h2({\r\n fontSize: style.beta,\r\n fontWeight: 'normal',\r\n lineHeight: 'normal',\r\n letterSpacing: '3px',\r\n});\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { translate, isIOS, pathCombine, postJson, isIE, isEdge, Breakpoint } from '@avensia/scope';\r\nimport H2 from 'Shared/Generic/H2';\r\nimport {\r\n minTinyMediaQuery,\r\n minSmallMediaQuery,\r\n pixelsToUnit,\r\n alto,\r\n amaranth,\r\n darkerGray,\r\n thin,\r\n kappa,\r\n sigma,\r\n chateaugreen,\r\n small,\r\n transition,\r\n} from 'Shared/Style';\r\nimport FeedbackButton from 'Shared/Button/Feedback';\r\nimport Input from 'Shared/Fields/Text';\r\nimport { Style } from '@glitz/type';\r\nimport { termsAndConditionPage } from 'Shared/known-urls';\r\nimport Link from 'Shared/Link';\r\nimport connect from 'Shared/connect';\r\nimport CurrentUserTypeBase from 'Account/CurrentUserAccountViewModel.type';\r\nimport { emailPattern } from 'Shared/email-pattern';\r\nimport freezeScroll from 'Shared/freeze-scroll';\r\n\r\nexport type FormDataType = {\r\n productCode: string;\r\n};\r\n\r\ntype ConnectStateType = {\r\n loggedInUser: CurrentUserTypeBase;\r\n currentBreakpoint: number;\r\n};\r\n\r\ntype RequiredPropType = {\r\n pageUrl: string;\r\n productCode: string;\r\n onClose: () => void;\r\n};\r\n\r\ntype StateType = {\r\n email: string;\r\n isInvalid: boolean;\r\n hasError: boolean;\r\n success: boolean;\r\n};\r\n\r\ntype PropType = RequiredPropType & ConnectStateType;\r\n\r\nclass Modal extends React.Component<PropType, StateType> {\r\n unfreezeScroll: () => void;\r\n constructor(props: PropType) {\r\n super(props);\r\n this.state = { email: '', isInvalid: false, hasError: false, success: false };\r\n }\r\n\r\n componentDidMount() {\r\n this.scrollFreeze();\r\n if (isIOS()) {\r\n document.body.setAttribute('style', 'position: fixed');\r\n }\r\n\r\n if (this.props.loggedInUser.isLoggedIn) {\r\n this.setState({ email: this.props.loggedInUser.email });\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.scrollFreeze();\r\n if (isIOS()) {\r\n document.body.removeAttribute('style');\r\n }\r\n }\r\n\r\n scrollFreeze() {\r\n if (this.props.currentBreakpoint < Breakpoint.Medium) {\r\n if (this.unfreezeScroll) {\r\n this.unfreezeScroll();\r\n }\r\n this.unfreezeScroll = !this.unfreezeScroll ? freezeScroll() : null;\r\n }\r\n }\r\n\r\n submitWatchRequest = async () => {\r\n const code = this.props.productCode;\r\n const email = this.state.email;\r\n\r\n try {\r\n const url = pathCombine(this.props.pageUrl, 'AddToWatchList');\r\n const success: boolean = await postJson(url, { code, email });\r\n if (success) {\r\n this.setState(() => ({\r\n email: '',\r\n hasError: false,\r\n success: true,\r\n }));\r\n setTimeout(() => {\r\n this.props.onClose();\r\n }, 2000);\r\n }\r\n else {\r\n this.setState(() => ({\r\n email: email,\r\n hasError: true,\r\n success: false\r\n }));\r\n }\r\n } catch (error) {\r\n this.setState(() => ({\r\n email: '',\r\n hasError: true,\r\n success: false,\r\n }));\r\n return Promise.reject(null);\r\n }\r\n };\r\n\r\n validateInput(input: string) {\r\n this.setState({ isInvalid: false, hasError: false });\r\n const pattern = emailPattern;\r\n const isValid = pattern.test(input);\r\n\r\n return isValid;\r\n }\r\n\r\n inputEmailAddress = (e: React.FormEvent<HTMLInputElement>) => {\r\n const email = (e.target as HTMLInputElement).value;\r\n this.setState({\r\n email,\r\n isInvalid: !this.validateInput(email),\r\n });\r\n };\r\n\r\n render() {\r\n const inputInvalidStyle: Style = {\r\n border: {\r\n xy: {\r\n color: amaranth,\r\n },\r\n },\r\n };\r\n\r\n const buttonSuccessStyle: Style = {\r\n backgroundColor: chateaugreen,\r\n backgroundImage: 'transparent',\r\n pointerEvents: 'none',\r\n };\r\n\r\n return (\r\n <Body>\r\n <Header>{translate('/Product/WatchableProduct/WatchableButtonText')}</Header>\r\n <Container>\r\n <SignupInfo>{translate('/Product/WatchableProduct/WatchableSignupInfo')}</SignupInfo>\r\n <EmailLabel>{translate('/Product/WatchableProduct/Email')} *</EmailLabel>\r\n <Form>\r\n <EmailInput\r\n css={{\r\n ...(this.state.isInvalid && inputInvalidStyle),\r\n ...((isIE() || isEdge()) && {\r\n ':-ms-input-placeholder': { color: alto },\r\n }),\r\n }}\r\n autoComplete=\"email\"\r\n invalid={this.state.isInvalid}\r\n name=\"email\"\r\n placeholder={translate('/Product/WatchableProduct/EmailPlaceholder')}\r\n required\r\n type=\"email\"\r\n value={this.state.email}\r\n onChange={this.inputEmailAddress}\r\n />\r\n <InvalidEmail css={this.state.isInvalid && { opacity: 1 }}>\r\n {translate('/Product/WatchableProduct/IncorrectEmail')}\r\n </InvalidEmail>\r\n <Submit\r\n disabled={this.state.isInvalid || this.state.email === ''}\r\n css={this.state.success && buttonSuccessStyle}\r\n type=\"submit\"\r\n onClick={this.submitWatchRequest}\r\n >\r\n {translate('/Shared/Send')}\r\n </Submit>\r\n {this.state.hasError && <ErrorMessage>{translate('/Product/WatchableProduct/ServerError')}</ErrorMessage>}\r\n </Form>\r\n {termsAndConditionPage() && (\r\n <PrivacyPolicy to={termsAndConditionPage()} target=\"_blank\">\r\n {translate('/Product/WatchableProduct/PrivacyPolicy')}\r\n </PrivacyPolicy>\r\n )}\r\n </Container>\r\n </Body>\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n (state): ConnectStateType => ({\r\n loggedInUser: state.currentUser,\r\n currentBreakpoint: state.currentBreakpoint,\r\n }),\r\n)(Modal);\r\n\r\nconst GUTTER_INIT = 10;\r\nconst GUTTER_TINY = 49;\r\nconst GUTTER_SMALL = 113;\r\n\r\nconst EmailInput = styled(Input, {\r\n border: {\r\n xy: {\r\n style: 'solid',\r\n color: alto,\r\n width: thin,\r\n },\r\n },\r\n padding: {\r\n y: 0,\r\n x: small,\r\n },\r\n textAlign: 'left',\r\n});\r\n\r\nconst Form = styled.form({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n textAlign: 'center',\r\n});\r\n\r\nconst Submit = styled(FeedbackButton, {\r\n letterSpacing: pixelsToUnit(0.8),\r\n margin: {\r\n bottom: small,\r\n },\r\n});\r\n\r\nconst Body = styled.div({\r\n width: `calc(100% - ${GUTTER_INIT * 2}px)`,\r\n margin: {\r\n y: 0,\r\n x: 'auto',\r\n },\r\n textAlign: 'center',\r\n [minTinyMediaQuery]: {\r\n width: `calc(100% - ${GUTTER_TINY * 2}px)`,\r\n },\r\n [minSmallMediaQuery]: {\r\n width: `calc(100% - ${GUTTER_SMALL * 2}px)`,\r\n },\r\n});\r\n\r\nconst Header = styled(H2, {\r\n textAlign: 'center',\r\n textTransform: 'uppercase',\r\n marginBottom: pixelsToUnit(25),\r\n});\r\n\r\nconst SignupInfo = styled.p({\r\n marginBottom: pixelsToUnit(25),\r\n});\r\n\r\nconst EmailLabel = styled.p({\r\n textAlign: 'left',\r\n paddingLeft: small,\r\n});\r\n\r\nconst Container = styled.div({\r\n padding: {\r\n x: small,\r\n },\r\n ':after': {\r\n display: 'block',\r\n content: '\"\"',\r\n height: pixelsToUnit(30),\r\n },\r\n});\r\n\r\nconst ErrorMessage = styled.div({\r\n color: amaranth,\r\n fontSize: sigma,\r\n});\r\n\r\nconst InvalidEmail = styled(ErrorMessage, {\r\n alignSelf: 'flex-start',\r\n opacity: 0,\r\n margin: {\r\n y: pixelsToUnit(5),\r\n },\r\n paddingLeft: small,\r\n ...transition({ property: 'opacity' }),\r\n});\r\n\r\nconst PrivacyPolicy = styled(Link, {\r\n fontSize: kappa,\r\n lineHeight: pixelsToUnit(16),\r\n color: darkerGray,\r\n});\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport {\r\n minMediumMediaQuery,\r\n pixelsToUnit,\r\n thin,\r\n epsilon,\r\n sigma,\r\n lightGrey,\r\n snuff,\r\n kappa,\r\n mega,\r\n minTinyMediaQuery,\r\n} from 'Shared/Style';\r\nimport { Basic } from 'Shared/PageLayout';\r\nimport CloseIcon from 'Shared/Icon/Close';\r\nimport Email from 'Shared/Icon/Email';\r\nimport Panel from 'Shared/Panel';\r\nimport Modal from './Modal';\r\nimport { translate } from '@avensia/scope';\r\n\r\ntype WatchableButtonPropType = {\r\n buttonText: string;\r\n onPanelOpen: () => void;\r\n} & StyledProps;\r\n\r\nexport const WatchableButton = styled((props: WatchableButtonPropType) => (\r\n <Base>\r\n <AddWatch onClick={props.onPanelOpen}>\r\n <ButtonText>{props.buttonText}</ButtonText>\r\n <Wrapper>\r\n <EmailIcon />\r\n </Wrapper>\r\n </AddWatch>\r\n </Base>\r\n));\r\n\r\nexport const WatchableButtonActionbar = styled((props: WatchableButtonPropType) => (\r\n <BaseActionbar>\r\n <AddWatch onClick={props.onPanelOpen}>\r\n <WrapperActionbar>\r\n {translate('/Product/WatchableProduct/WatchableButtonTextMobile')}\r\n </WrapperActionbar>\r\n </AddWatch>\r\n </BaseActionbar>\r\n));\r\n\r\nexport const MobileWatchableButton = styled((props: WatchableButtonPropType) => (\r\n <MobileBase css={props.compose()} onClick={props.onPanelOpen}>\r\n <OutOfStock>{translate('/Product/OutOfStock')}</OutOfStock>\r\n <EmailIcon css={{ paddingLeft: pixelsToUnit(14) }} />\r\n <ButtonText>{props.buttonText}</ButtonText>\r\n </MobileBase>\r\n));\r\n\r\ntype WatchablePanelPropType = {\r\n pageUrl: string;\r\n variationCode: string;\r\n open: boolean;\r\n onPanelClose: () => void;\r\n};\r\n\r\nexport function WatchablePanel(props: WatchablePanelPropType) {\r\n return (\r\n <Panel isOpen={props.open} onClose={props.onPanelClose} maxHeight={MODAL_HEIGHT} maxWidth={MODAL_WIDTH}>\r\n <Close onClick={props.onPanelClose}>\r\n <CloseIcon\r\n css={{\r\n width: pixelsToUnit(40),\r\n height: pixelsToUnit(40),\r\n }}\r\n />\r\n </Close>\r\n <Modal productCode={props.variationCode} pageUrl={props.pageUrl} onClose={props.onPanelClose} />\r\n </Panel>\r\n );\r\n}\r\n\r\nconst Base = styled(Basic, {\r\n textAlign: 'center',\r\n margin: {\r\n xy: 0,\r\n },\r\n flex: {\r\n grow: 1,\r\n basis: 1,\r\n },\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n});\r\n\r\nconst BaseActionbar = styled(Basic, {\r\n backgroundColor: (theme) => theme.buyButtonProductPageMobile,\r\n color: (theme) => theme.buyButtonProductPageMobileText,\r\n borderRadius: pixelsToUnit(5),\r\n width: '30vw',\r\n height: '2.5rem',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n alignSelf: 'center',\r\n fontWeight: 800,\r\n fontSize: pixelsToUnit(25)\r\n});\r\n\r\nconst MobileBase = styled.div({\r\n alignItems: 'center',\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n minHeight: pixelsToUnit(40),\r\n});\r\n\r\nconst Wrapper = styled.div({\r\n height: '3.5rem',\r\n width: '3.5rem',\r\n margin: {\r\n x: pixelsToUnit(0),\r\n y: pixelsToUnit(5),\r\n },\r\n display: 'flex',\r\n alignItems: 'center',\r\n borderRadius: '100%',\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightGrey,\r\n },\r\n },\r\n [minMediumMediaQuery]: {\r\n border: 'none',\r\n margin: {\r\n x: pixelsToUnit(4),\r\n y: pixelsToUnit(6),\r\n },\r\n },\r\n});\r\n\r\nconst WrapperActionbar = styled.div({\r\n margin: {\r\n x: pixelsToUnit(0),\r\n y: pixelsToUnit(5),\r\n },\r\n display: 'flex',\r\n alignItems: 'center',\r\n [minMediumMediaQuery]: {\r\n border: 'none',\r\n margin: {\r\n x: pixelsToUnit(4),\r\n y: pixelsToUnit(6),\r\n },\r\n },\r\n});\r\n\r\nconst MODAL_HEIGHT = pixelsToUnit(520);\r\nconst MODAL_WIDTH = pixelsToUnit(553);\r\n\r\nconst OutOfStock = styled.span({\r\n border: {\r\n right: {\r\n style: 'solid',\r\n width: thin,\r\n color: snuff,\r\n },\r\n },\r\n color: 'red',\r\n fontSize: kappa,\r\n paddingRight: pixelsToUnit(14),\r\n});\r\n\r\nconst ButtonText = styled.span({\r\n fontSize: kappa,\r\n marginRight: pixelsToUnit(5),\r\n display: 'none',\r\n [minTinyMediaQuery]: {\r\n display: 'inline',\r\n },\r\n});\r\n\r\nconst EmailIcon = styled(Email, {\r\n fontSize: mega,\r\n position: 'relative',\r\n height: pixelsToUnit(22),\r\n});\r\n\r\nconst Close = styled.div({\r\n cursor: 'pointer',\r\n textAlign: 'right',\r\n margin: {\r\n top: pixelsToUnit(50),\r\n bottom: pixelsToUnit(20),\r\n right: pixelsToUnit(40),\r\n },\r\n});\r\n\r\nconst AddWatch = styled.div({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n fontSize: sigma,\r\n fontWeight: 'bold',\r\n textTransform: 'uppercase',\r\n letterSpacing: pixelsToUnit(0.7),\r\n whiteSpace: 'nowrap',\r\n width: '100%',\r\n minHeight: pixelsToUnit(50),\r\n [minMediumMediaQuery]: {\r\n fontSize: epsilon,\r\n letterSpacing: pixelsToUnit(0.8),\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightGrey,\r\n },\r\n },\r\n },\r\n});\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { translate, on } from '@avensia/scope';\r\nimport { Variant } from 'Shared/Fields/Select';\r\nimport {\r\n sigma,\r\n pixelsToUnit,\r\n thin,\r\n truncate,\r\n white,\r\n lightSilver,\r\n concrete,\r\n small,\r\n transition,\r\n depth,\r\n large,\r\n} from 'Shared/Style';\r\nimport { Down } from 'Shared/Icon/Arrow';\r\nimport Ul from 'Shared/Generic/Ul';\r\nimport Button, { Appearance as ButtonAppearance, Variant as ButtonVariant } from 'Shared/Button';\r\nimport { MobileWatchableButton } from '../WatchableProduct';\r\nimport { pseudo } from '@glitz/core';\r\n\r\ntype OptionType = {\r\n name: string;\r\n value: string;\r\n woffValue: string;\r\n inStock?: boolean;\r\n};\r\n\r\ntype DesktopPropType = {\r\n value: string;\r\n woffValue: string;\r\n label?: string;\r\n options: OptionType[];\r\n zIndex?: number;\r\n onChangeOption?: (value: string, woffValue: string) => any;\r\n onWatchableOpen?: () => void;\r\n};\r\n\r\ntype StateType = {\r\n open?: boolean;\r\n};\r\n\r\nconst PLACEHOLDER = '-';\r\n\r\nexport class DesktopDropdown extends React.Component<DesktopPropType, StateType> {\r\n unsubscribeBodyClose: () => any;\r\n\r\n constructor(props: DesktopPropType) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: DesktopPropType, prevState: StateType) {\r\n const { open } = this.state;\r\n if (open !== prevState.open) {\r\n if (open) {\r\n this.unsubscribeBodyClose = on('click', () => this.setState({ open: false }));\r\n } else if (this.unsubscribeBodyClose) {\r\n this.unsubscribeBodyClose();\r\n delete this.unsubscribeBodyClose;\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this.unsubscribeBodyClose) {\r\n this.unsubscribeBodyClose();\r\n delete this.unsubscribeBodyClose;\r\n }\r\n }\r\n\r\n toggle = () => this.setState({ open: !this.state.open });\r\n\r\n selectOption(value: string, woffValue: string) {\r\n if (this.props.onChangeOption) {\r\n this.props.onChangeOption(value, woffValue);\r\n }\r\n this.setState({ open: false });\r\n }\r\n\r\n render() {\r\n const variants = this.props.options.map((variant) => ({\r\n text: variant.name,\r\n value: variant.value,\r\n woffValue: variant.woffValue,\r\n inStock: variant.inStock,\r\n }));\r\n\r\n const selected = variants.find((o) => o.value === this.props.value);\r\n\r\n return (\r\n <DesktopBase zIndex={this.props.zIndex}>\r\n <Button appearance={[ButtonAppearance.Bare, ButtonAppearance.Full]} onClick={this.toggle}>\r\n <Content>\r\n <styled.Span>\r\n <styled.Span css={{ opacity: 0.4 }}>{this.props.label}:</styled.Span>{' '}\r\n {selected ? selected.text : PLACEHOLDER}\r\n </styled.Span>\r\n {this.state.open ? <IconUp /> : <IconDown />}\r\n </Content>\r\n </Button>\r\n <Options css={this.state.open && { transform: 'scaleY(1)' }}>\r\n {variants.map((option) => (\r\n <OptionLi key={option.value}>\r\n <Option\r\n variant={ButtonVariant.None}\r\n appearance={[ButtonAppearance.Bare, ButtonAppearance.Full]}\r\n noRippleEffect\r\n onClick={() => this.selectOption(option.value, option.woffValue)}\r\n >\r\n <OptionContent css={{ width: !option.inStock ? '50%' : '100%' }}>{option.text}</OptionContent>\r\n {!option.inStock && (\r\n <MobileWatchableButton\r\n buttonText={translate('/Product/WatchableProduct/WatchableButtonTextMobile')}\r\n onPanelOpen={this.props.onWatchableOpen}\r\n />\r\n )}\r\n </Option>\r\n </OptionLi>\r\n ))}\r\n </Options>\r\n </DesktopBase>\r\n );\r\n }\r\n}\r\n\r\ntype ZIndexPropType = {\r\n children: React.ReactNode;\r\n zIndex?: number;\r\n};\r\n\r\nconst DesktopBase = ({ zIndex, children }: ZIndexPropType) => (\r\n <styled.Div\r\n role=\"listbox\"\r\n css={{\r\n alignItems: 'center',\r\n position: 'relative',\r\n maxWidth: '100%',\r\n textTransform: 'uppercase',\r\n zIndex: zIndex > 0 ? zIndex : 1,\r\n backgroundColor: white,\r\n display: 'block',\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightSilver,\r\n },\r\n },\r\n fontSize: sigma,\r\n letterSpacing: pixelsToUnit(1.3),\r\n margin: {\r\n y: large,\r\n x: 0,\r\n },\r\n width: '100%',\r\n }}\r\n >\r\n {children}\r\n </styled.Div>\r\n);\r\n\r\nconst IconDown = styled(Down, {\r\n width: pixelsToUnit(21),\r\n height: pixelsToUnit(12),\r\n});\r\n\r\nconst IconUp = styled(IconDown, {\r\n transform: 'rotate(180deg)',\r\n});\r\n\r\nconst OptionContent = styled.div({\r\n marginLeft: small,\r\n textAlign: 'left',\r\n width: '50%',\r\n});\r\n\r\nconst Options = styled(Ul, {\r\n fontWeight: 'normal',\r\n position: 'absolute',\r\n top: '100%',\r\n right: 0,\r\n left: 0,\r\n transform: 'scaleY(0)',\r\n transformOrigin: 'center top',\r\n backgroundColor: white,\r\n listStyleType: 'none',\r\n ...transition({ property: 'transform' }),\r\n ...depth(),\r\n});\r\n\r\nconst OptionLi = styled.li({\r\n position: 'relative',\r\n borderBottom: {\r\n width: pixelsToUnit(1),\r\n style: 'solid',\r\n color: '#e4d9eb',\r\n },\r\n padding: {\r\n y: pixelsToUnit(1.5),\r\n },\r\n ...pseudo(':last-child', {\r\n borderBottomStyle: 'none',\r\n }),\r\n ':hover': {\r\n backgroundColor: concrete,\r\n },\r\n});\r\n\r\nconst Option = styled(Button, {\r\n alignItems: 'center',\r\n display: 'flex',\r\n fontSize: sigma,\r\n letterSpacing: pixelsToUnit(1.3),\r\n height: pixelsToUnit(40),\r\n});\r\n\r\nconst Content = styled.div({\r\n alignItems: 'center',\r\n display: 'flex',\r\n fontWeight: 'bold',\r\n justifyContent: 'space-between',\r\n padding: { y: 0, x: pixelsToUnit(20) },\r\n});\r\n\r\ntype MobilePropType = {\r\n value: string;\r\n onPanelOpen: () => void;\r\n};\r\n\r\nexport function MobileDropdown(props: MobilePropType) {\r\n return (\r\n <MobileSelect variant={Variant.None} appearance={ButtonAppearance.Bare} onClick={props.onPanelOpen}>\r\n <Text>{props.value}</Text>\r\n <MobileIconDown />\r\n </MobileSelect>\r\n );\r\n}\r\n\r\nconst MobileSelect = styled(Button, {\r\n alignItems: 'center',\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightSilver,\r\n },\r\n },\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n flex: {\r\n grow: 1,\r\n basis: 1,\r\n },\r\n marginRight: pixelsToUnit(20),\r\n});\r\n\r\nconst Text = styled.span({\r\n fontSize: sigma,\r\n letterSpacing: pixelsToUnit(1.1),\r\n marginLeft: pixelsToUnit(10),\r\n textTransform: 'uppercase',\r\n ...truncate(),\r\n});\r\n\r\nconst MobileIconDown = styled(Down, {\r\n margin: {\r\n top: pixelsToUnit(5),\r\n x: pixelsToUnit(10),\r\n },\r\n width: pixelsToUnit(13),\r\n});\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { pixelsToUnit, transition, sigma, minMediumMediaQuery, minTinyMediaQuery } from 'Shared/Style';\r\nimport Ul from 'Shared/Generic/Ul';\r\nimport Color from 'color';\r\nimport { translate } from '@avensia/scope';\r\n\r\ntype OptionType = {\r\n name: string;\r\n value: string;\r\n inStock?: boolean;\r\n};\r\n\r\ntype DesktopPropType = {\r\n value: string;\r\n label?: string;\r\n options: OptionType[];\r\n zIndex?: number;\r\n onChangeOption?: (name: string, value: string) => any;\r\n onWatchableOpen?: () => void;\r\n};\r\n\r\ntype StateType = {\r\n colorName: string;\r\n};\r\n\r\nexport default class ColorSelector extends React.Component<DesktopPropType, StateType> {\r\n constructor(props: DesktopPropType) {\r\n super(props);\r\n this.state = {\r\n colorName: translate('/TagDesigner/no_color_selected'),\r\n };\r\n }\r\n unsubscribeBodyClose: () => any;\r\n\r\n setColorName = (name: string) => {\r\n this.setState({\r\n colorName: name,\r\n });\r\n };\r\n\r\n selectOption = (name: string, value: string) => {\r\n if (this.props.onChangeOption) {\r\n this.props.onChangeOption(name, value);\r\n }\r\n };\r\n\r\n handlingSelect(value: string, name: string) {\r\n this.setColorName(name);\r\n this.selectOption(name, value);\r\n }\r\n\r\n render() {\r\n const colorName = this.state.colorName;\r\n const variants = this.props.options.map(variant => ({\r\n text: variant.name,\r\n value: variant.value,\r\n inStock: variant.inStock,\r\n }));\r\n\r\n return (\r\n <Base>\r\n {this.props.label && (\r\n <ColorNameContainer>\r\n {this.props.label}:<ColorName>{colorName}</ColorName>\r\n </ColorNameContainer>\r\n )}\r\n <Options>\r\n {variants.map(option => (\r\n <OptionLi key={option.value} onClick={() => this.handlingSelect(option.value, option.text)}>\r\n <Option color={option.value} name={option.text} selected={option.value === this.props.value} />\r\n </OptionLi>\r\n ))}\r\n </Options>\r\n </Base>\r\n );\r\n }\r\n}\r\n\r\nconst Base = styled.div({\r\n margin: {\r\n y: '1rem',\r\n x: 0,\r\n },\r\n});\r\n\r\nconst ColorNameContainer = styled.div({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n fontWeight: 'bold',\r\n fontSize: sigma,\r\n textTransform: 'uppercase',\r\n color: '#ababab',\r\n margin: {\r\n y: '0.5rem',\r\n x: '1.25rem',\r\n },\r\n});\r\n\r\nconst ColorName = styled.div({\r\n color: 'black',\r\n marginLeft: '0.2rem',\r\n});\r\n\r\nconst Options = styled(Ul, {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n justifyContent: 'center',\r\n listStyleType: 'none',\r\n [minMediumMediaQuery]: {\r\n justifyContent: 'space-between',\r\n flexWrap: 'nowrap',\r\n },\r\n});\r\n\r\nconst OptionLi = styled.li({\r\n margin: {\r\n x: '0.2rem',\r\n y: '0.2rem',\r\n },\r\n [minTinyMediaQuery]: {\r\n flexWrap: 'nowrap',\r\n margin: {\r\n x: '0.4rem',\r\n },\r\n },\r\n});\r\n\r\ntype OptionPropType = {\r\n color: string;\r\n name: string;\r\n selected: boolean;\r\n};\r\n\r\nconst Option = ({ color, name, selected }: OptionPropType) => {\r\n const bkgColor = Color(color);\r\n const highlightColor = bkgColor.lighten(0.5);\r\n const borderColor = bkgColor.desaturate(0.1).darken(0.1);\r\n return (\r\n <styled.Div\r\n title={name}\r\n css={{\r\n [minMediumMediaQuery]: { width: pixelsToUnit(42), height: pixelsToUnit(42) },\r\n width: pixelsToUnit(38),\r\n height: pixelsToUnit(38),\r\n borderRadius: '50%',\r\n backgroundColor: bkgColor.string(),\r\n boxShadow: selected ? '3px 3px 7px rgba(0,0,0,0.3)' : 'none',\r\n backgroundImage: `linear-gradient(135deg, ${highlightColor.string()} 0%, ${bkgColor.string()} 100%)`,\r\n border: selected\r\n ? {\r\n xy: {\r\n width: pixelsToUnit(6),\r\n style: 'solid',\r\n color: borderColor.string(),\r\n },\r\n }\r\n : {\r\n xy: {\r\n width: pixelsToUnit(1),\r\n style: 'solid',\r\n color: borderColor.string(),\r\n },\r\n },\r\n cursor: 'pointer',\r\n transform: selected ? 'scale(1.05)' : 'none',\r\n ':hover': {\r\n boxShadow: selected ? '3px 3px 7px rgba(0,0,0,0.3)' : '3px 3px 7px rgba(0,0,0,0.3)',\r\n },\r\n ...transition({ property: ['transform', 'box-shadow'], duration: '.2s' }),\r\n }}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport connect from 'Shared/connect';\r\nimport { updateColor, updateFont, updateText, updateWoffValue } from './action-creators';\r\nimport { ProductDesignerType } from 'Shared/State';\r\nimport { DesktopDropdown } from './dropdown';\r\nimport ColorSelector from './colorSelector';\r\nimport { styled } from '@glitz/react';\r\nimport { sigma, pixelsToUnit, thin, white, lightSilver, large } from 'Shared/Style';\r\nimport DesignTagColorProps from 'Start/DesignTagColorProps.type';\r\nimport DesignTagFontProps from 'Start/DesignTagFontProps.type';\r\nimport { translate } from '@avensia/scope';\r\nimport './style.scss';\r\n\r\ntype ConnectStateType = ProductDesignerType;\r\n\r\ntype AvailableColorsType = {\r\n availableColors: DesignTagColorProps[];\r\n availableFonts: DesignTagFontProps[];\r\n};\r\n\r\ntype ConnectActionType = {\r\n updateColor: (name: string, value: string) => void;\r\n updateFont: (value: string) => void;\r\n updateText: (value: string) => void;\r\n updateWoffValue: (value: string) => void;\r\n};\r\n\r\ntype PropType = ConnectStateType & ConnectActionType & AvailableColorsType;\r\n\r\nconst TextBoxWrapper = styled.div({\r\n margin: {\r\n y: large,\r\n x: 0,\r\n },\r\n width: '100%',\r\n});\r\n\r\nconst TextBox = styled.input({\r\n maxWidth: '100%',\r\n backgroundColor: white,\r\n display: 'block',\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightSilver,\r\n },\r\n },\r\n fontSize: sigma,\r\n letterSpacing: pixelsToUnit(1.3),\r\n padding: {\r\n y: 0,\r\n x: '1.25rem',\r\n },\r\n lineHeight: '50px',\r\n width: '100%',\r\n});\r\n\r\nclass ProductDesignerConfigurator extends React.Component<PropType> {\r\n inputEl: HTMLInputElement;\r\n render() {\r\n const textBoxEmpty: boolean = this.props.text === '';\r\n return (\r\n <styled.Div style={{}}>\r\n <TextBoxWrapper>\r\n <TextBox\r\n type=\"text\"\r\n maxLength={15}\r\n value={this.props.text}\r\n // tslint:disable-next-line: jsx-no-lambda\r\n onChange={(e: { target: { value: string } }) => this.props.updateText(e.target.value)}\r\n // tslint:disable-next-line: jsx-no-lambda\r\n ref={(el: HTMLInputElement) => (this.inputEl = el)}\r\n // tslint:disable-next-line: jsx-no-lambda\r\n onFocus={() => this.inputEl.select()}\r\n css={\r\n textBoxEmpty && {\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: '#ff0000',\r\n },\r\n },\r\n }\r\n }\r\n />\r\n </TextBoxWrapper>\r\n <DesktopDropdown\r\n zIndex={2}\r\n value={this.props.font}\r\n woffValue={this.props.woffValue}\r\n onChangeOption={(value, woffValue) => {\r\n this.props.updateWoffValue(woffValue), this.props.updateFont(value);\r\n }}\r\n label={translate('/TagDesigner/Font')}\r\n options={\r\n this.props.availableFonts\r\n ? this.props.availableFonts\r\n : [\r\n {\r\n name: 'Arial',\r\n value: 'Arial',\r\n woffValue: '',\r\n inStock: true,\r\n },\r\n {\r\n name: 'Times',\r\n value: 'Times new roman',\r\n woffValue: '',\r\n inStock: true,\r\n },\r\n ]\r\n }\r\n />\r\n <ColorSelector\r\n value={this.props.color}\r\n onChangeOption={(name, value) => this.props.updateColor(name, value)}\r\n label={translate('/TagDesigner/TextColor')}\r\n options={\r\n this.props.availableColors\r\n ? this.props.availableColors\r\n : [\r\n {\r\n name: translate('/TagDesigner/White'),\r\n value: '#FFFFFF',\r\n inStock: true,\r\n },\r\n {\r\n name: translate('/TagDesigner/NeonYellow'),\r\n value: '#D7FE07',\r\n inStock: true,\r\n },\r\n {\r\n name: translate('/TagDesigner/NeonOrange'),\r\n value: '#FF8800',\r\n inStock: true,\r\n },\r\n {\r\n name: translate('/TagDesigner/SignalRed'),\r\n value: '#E5002F',\r\n inStock: true,\r\n },\r\n {\r\n name: translate('/TagDesigner/NeonBlue'),\r\n value: '#008CFF',\r\n inStock: true,\r\n },\r\n {\r\n name: translate('/TagDesigner/NeonPink'),\r\n value: '#FF31A9',\r\n inStock: true,\r\n },\r\n {\r\n name: translate('/TagDesigner/GlowInTheDark'),\r\n value: '#87E3A6',\r\n inStock: true,\r\n },\r\n {\r\n name: translate('/TagDesigner/Reflex'),\r\n value: '#AAAAAA',\r\n inStock: true,\r\n },\r\n ]\r\n }\r\n />\r\n </styled.Div>\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n (state): ConnectStateType => ({\r\n colorName: state.productDesigner.colorName,\r\n color: state.productDesigner.color,\r\n font: state.productDesigner.font,\r\n woffValue: state.productDesigner.woffValue,\r\n text: state.productDesigner.text,\r\n }),\r\n (dispatch): ConnectActionType => ({\r\n updateColor(colorName, value) {\r\n return dispatch(updateColor(colorName, value));\r\n },\r\n updateFont(value) {\r\n return dispatch(updateFont(value));\r\n },\r\n updateWoffValue(value) {\r\n return dispatch(updateWoffValue(value));\r\n },\r\n updateText(value) {\r\n return dispatch(updateText(value));\r\n },\r\n }),\r\n)(ProductDesignerConfigurator);\r\n","import React from 'react';\r\nimport connect from 'Shared/connect';\r\nimport { updateColor, updateFont, updateText, updateWoffValue } from './action-creators';\r\nimport { ProductDesignerType } from 'Shared/State';\r\nimport { styled } from '@glitz/react';\r\nimport ProductDesignerConfigurator from './configurator';\r\nimport './style.scss';\r\n\r\ntype ConnectStateType = ProductDesignerType;\r\n\r\ntype ConnectActionType = {\r\n updateColor: (name: string, value: string) => void;\r\n updateFont: (value: string) => void;\r\n updateText: (value: string) => void;\r\n updateWoffValue: (value: string) => void;\r\n};\r\n\r\ntype PropType = ConnectStateType & ConnectActionType;\r\n\r\nclass ProductDesigner extends React.Component<PropType> {\r\n render() {\r\n return (\r\n <styled.Div\r\n style={{\r\n height: '10rem',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <styled.Div\r\n style={{\r\n background: '#000',\r\n lineHeight: '4rem',\r\n width: '100%',\r\n marginLeft: '1rem',\r\n marginRight: '1rem',\r\n textAlign: 'center',\r\n fontSize: '3.5rem',\r\n color: this.props.color,\r\n fontFamily: this.props.woffValue,\r\n border: '2px dashed #777',\r\n borderRadius: '5px',\r\n boxShadow: '0 0 0 4px #000, 2px 1px 6px 4px rgba(10, 10, 0, 0.5)',\r\n }}\r\n >\r\n {this.props.text}\r\n </styled.Div>\r\n </styled.Div>\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n (state): ConnectStateType => ({\r\n colorName: state.productDesigner.colorName,\r\n color: state.productDesigner.color,\r\n font: state.productDesigner.font,\r\n woffValue: state.productDesigner.woffValue,\r\n text: state.productDesigner.text,\r\n }),\r\n (dispatch): ConnectActionType => ({\r\n updateColor(colorName, value) {\r\n return dispatch(updateColor(colorName, value));\r\n },\r\n updateFont(value) {\r\n return dispatch(updateFont(value));\r\n },\r\n updateWoffValue(value) {\r\n return dispatch(updateWoffValue(value));\r\n },\r\n updateText(value) {\r\n return dispatch(updateText(value));\r\n },\r\n }),\r\n)(ProductDesigner);\r\n\r\nexport { ProductDesignerConfigurator };\r\n","import React, { useState } from 'react';\r\nimport { epiPropertyValue } from '@avensia/scope-episerver';\r\nimport Link from 'Shared/Link';\r\nimport UspBullets from './../../Product/ProductDetails/UspBullets';\r\nimport { DiscountTriBadge } from '../../Product/ProductCard/Badge';\r\nimport { styled } from '@glitz/react';\r\nimport {\r\n minMediumMediaQuery,\r\n minLargeMediaQuery,\r\n minSmallMediaQuery,\r\n minTinyMediaQuery,\r\n white,\r\n pixelsToUnit,\r\n} from 'Shared/Style';\r\nimport Check from 'Shared/Icon/Check';\r\nimport { translate } from '@avensia/scope';\r\n\r\ntype RequiredPropType = {\r\n product: any;\r\n handleDeselect: (products: any) => void;\r\n handleReselect: (products: any) => void;\r\n};\r\n\r\ntype PropType = RequiredPropType;\r\n\r\nexport default function CommonPurchaseCombinationProduct(props: PropType) {\r\n const [checked, setChecked] = useState(true);\r\n const productImage = props.product.imageUrls.length > 0 ? props.product.imageUrls[0] : '';\r\n let LimitedBullets: string[] = props.product.bulletPoints;\r\n LimitedBullets = props.product.bulletPoints.slice(0, 5);\r\n const variationCode = epiPropertyValue(props.product.variation.code);\r\n let data = {\r\n code: variationCode,\r\n ticket: props.product.ticket,\r\n currentPrice: props.product.price.current,\r\n originalPrice: props.product.price.original,\r\n };\r\n\r\n const handleCheck = () => {\r\n if (checked) {\r\n setChecked(false);\r\n props.handleDeselect(data);\r\n } else {\r\n setChecked(true);\r\n props.handleReselect(data);\r\n }\r\n };\r\n return (\r\n <ProductOuterContainer>\r\n <ProductContainer>\r\n {props.product.price.discountPercentage > 0 && (\r\n <DiscountTriBadge css={{ left: 0 }}>-{props.product.price.discountPercentage}%</DiscountTriBadge>\r\n )}\r\n <ProductImageContainer>\r\n <ProductImage to={props.product.url}>\r\n <img\r\n alt={props.product.brand}\r\n itemProp=\"image\"\r\n src={productImage}\r\n style={{ mixBlendMode: 'multiply', objectFit: 'contain' }}\r\n />\r\n </ProductImage>\r\n </ProductImageContainer>\r\n <Wrapper>\r\n <NameBulletsContainer>\r\n <ProductName>{epiPropertyValue(props.product.variation.displayName)}</ProductName>\r\n <BulletPoints\r\n bulletPoints={LimitedBullets}\r\n hasValue={props.product.bulletPoints && props.product.bulletPoints.length > 0}\r\n />\r\n </NameBulletsContainer>\r\n <CheckboxContainer>\r\n <CheckboxText>{translate('/Product/ComboProductCheckboxLabel')}</CheckboxText>\r\n <CustomCheckbox onClick={() => handleCheck()}>{checked && <CheckStyled />}</CustomCheckbox>\r\n </CheckboxContainer>\r\n </Wrapper>\r\n </ProductContainer>\r\n </ProductOuterContainer>\r\n );\r\n}\r\n\r\nconst ProductOuterContainer = styled.div({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n [minLargeMediaQuery]: {\r\n flexDirection: 'row',\r\n },\r\n});\r\n\r\nconst ProductContainer = styled.div({\r\n position: 'relative',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '15rem',\r\n width: '9rem',\r\n alignItems: 'center',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n textAlign: 'center',\r\n margin: { xy: '0.3rem' },\r\n padding: { xy: '0.4rem' },\r\n backgroundColor: (theme) => theme.cardBackgroundColor,\r\n boxShadow: (theme) => `0 0.3rem 1rem 0 rgba(${theme.shadowColor}, 0.3)`,\r\n [minTinyMediaQuery]: {\r\n width: '12rem',\r\n },\r\n [minSmallMediaQuery]: {\r\n flexDirection: 'row',\r\n width: '28rem',\r\n },\r\n [minLargeMediaQuery]: {\r\n flexDirection: 'column',\r\n height: '28rem',\r\n width: '16rem',\r\n padding: { xy: '1rem' },\r\n },\r\n});\r\n\r\nconst ProductName = styled.div({\r\n marginTop: pixelsToUnit(5),\r\n fontWeight: 'bold',\r\n textAlign: 'left',\r\n fontSize: '0.7rem',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n WebkitLineClamp: 2,\r\n WebkitBoxOrient: 'vertical',\r\n display: '-webkit-box',\r\n [minSmallMediaQuery]: {\r\n fontSize: '1rem',\r\n },\r\n});\r\n\r\nconst ProductImageContainer = styled.div({\r\n height: '140px',\r\n width: '140px',\r\n [minSmallMediaQuery]: {\r\n height: '180px',\r\n width: '180px',\r\n },\r\n});\r\n\r\nconst ProductImage = styled(Link, {\r\n height: '140px',\r\n display: 'flex',\r\n position: 'relative',\r\n justifyContent: 'center',\r\n width: '140px',\r\n [minSmallMediaQuery]: {\r\n width: '10rem',\r\n height: '10rem',\r\n padding: { xy: '0.5rem' },\r\n },\r\n [minMediumMediaQuery]: {\r\n width: pixelsToUnit(180),\r\n height: pixelsToUnit(180),\r\n },\r\n});\r\n\r\nconst BulletPoints = styled(UspBullets, {\r\n display: 'none',\r\n maxWidth: '15rem',\r\n [minSmallMediaQuery]: {\r\n display: 'block',\r\n },\r\n [minMediumMediaQuery]: {\r\n maxWidth: '20rem',\r\n },\r\n});\r\n\r\nconst NameBulletsContainer = styled.div({\r\n margin: { x: '0.5rem', y: 0 },\r\n [minSmallMediaQuery]: {\r\n width: '12rem',\r\n margin: { x: '1rem', y: 0 },\r\n height: pixelsToUnit(190),\r\n },\r\n [minMediumMediaQuery]: {\r\n width: '14rem',\r\n },\r\n [minLargeMediaQuery]: {\r\n width: '100%',\r\n margin: { x: 0, y: 0 },\r\n },\r\n});\r\n\r\nconst CustomCheckbox = styled.div({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '20px',\r\n height: '20px',\r\n backgroundColor: (theme) => theme.buyButtonProductcardDesktop,\r\n alignSelf: 'center',\r\n [minSmallMediaQuery]: {\r\n width: '25px',\r\n height: '25px',\r\n },\r\n [minMediumMediaQuery]: {\r\n width: '30px',\r\n height: '30px',\r\n },\r\n});\r\n\r\nconst Wrapper = styled.div({\r\n height: pixelsToUnit(80),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'space-between',\r\n [minSmallMediaQuery]: {\r\n height: 'unset',\r\n },\r\n [minLargeMediaQuery]: {\r\n height: '100%',\r\n width: '100%',\r\n },\r\n});\r\n\r\nconst CheckStyled = styled(Check, {\r\n color: white,\r\n});\r\n\r\nconst CheckboxContainer = styled.div({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n marginTop: pixelsToUnit(10),\r\n});\r\n\r\nconst CheckboxText = styled.div({\r\n fontWeight: 'bold',\r\n marginRight: pixelsToUnit(10),\r\n lineHeight: pixelsToUnit(28),\r\n});\r\n","import React, { useState } from 'react';\r\nimport { epiPropertyValue } from '@avensia/scope-episerver';\r\nimport Button from 'Shared/Button';\r\nimport { translate } from '@avensia/scope';\r\nimport CommonPurchaseCombinationViewModelType from 'Product/CommonPurchaseCombination/CommonPurchaseCombinationViewModel.type';\r\nimport { styled } from '@glitz/react';\r\nimport { minMediumMediaQuery, minLargeMediaQuery, minHugeMediaQuery, minSmallMediaQuery, white } from 'Shared/Style';\r\nimport CommonPurchaseCombinationProduct from './CommonPurchaseCombinationProduct';\r\n\r\ntype RequiredPropType = {\r\n combo: CommonPurchaseCombinationViewModelType;\r\n addAllItemsToCart: (products: any) => void;\r\n};\r\n\r\ntype PropType = RequiredPropType;\r\n\r\nexport default function CommonPurchaseCombinationItem(props: PropType) {\r\n let products: any[] = [];\r\n let originalPrices: any[] = [];\r\n const [comboTotal, setComboTotal] = useState(props.combo.price.current);\r\n const [deSelectedItems, setDeselectedItems] = useState([]);\r\n const [selectedItemsCount, setSelectedItemsCount]: any = useState(props.combo.productList.length);\r\n const [deselectedTotalDiscount, setDeselectedTotalDiscount]: any = useState(0);\r\n\r\n const decreaseTotal = (price: any) => {\r\n const copy = comboTotal - price;\r\n setComboTotal(copy);\r\n };\r\n\r\n const increaseTotal = (price: any) => {\r\n const copy = comboTotal + price;\r\n setComboTotal(copy);\r\n };\r\n\r\n const handleDeselect = (data: any) => {\r\n const currentDeselectedTotalDiscount = deselectedTotalDiscount;\r\n const deselectedDiscount = data.originalPrice - data.currentPrice;\r\n const newTotalDiscount = currentDeselectedTotalDiscount + deselectedDiscount;\r\n setDeselectedTotalDiscount(newTotalDiscount);\r\n const deselected = deSelectedItems;\r\n deselected.push(data);\r\n setDeselectedItems(deselected);\r\n decreaseTotal(data.currentPrice);\r\n const diff = props.combo.productList.length - deSelectedItems.length;\r\n setSelectedItemsCount(diff);\r\n };\r\n\r\n const handleReselect = (data: any) => {\r\n const currentDeselectedTotalDiscount = deselectedTotalDiscount;\r\n const deselectedDiscount = data.originalPrice - data.currentPrice;\r\n const newTotalDiscount = currentDeselectedTotalDiscount - deselectedDiscount;\r\n setDeselectedTotalDiscount(newTotalDiscount);\r\n const deselected = deSelectedItems;\r\n deselected.forEach((item) => {\r\n if (item.code === data.code) {\r\n const index = deselected.indexOf(item);\r\n if (index > -1) {\r\n deselected.splice(index, 1);\r\n }\r\n }\r\n });\r\n setDeselectedItems(deselected);\r\n increaseTotal(data.currentPrice);\r\n setSelectedItemsCount(selectedItemsCount + 1);\r\n };\r\n\r\n const handleAddToCart = (item: any) => {\r\n item.forEach((product: any) => {\r\n deSelectedItems.forEach((deselected) => {\r\n if (product.code === deselected.code) {\r\n const index = products.indexOf(product);\r\n if (index > -1) {\r\n products.splice(index, 1);\r\n }\r\n }\r\n });\r\n });\r\n props.addAllItemsToCart(products);\r\n setSelectedItemsCount(selectedItemsCount);\r\n };\r\n\r\n return (\r\n <CombinationOuterContainer>\r\n <CombinationContainer>\r\n {props.combo.productList.map((product: any, j: any) => {\r\n const variationCode = epiPropertyValue(product.variation.code);\r\n\r\n let data = {\r\n code: variationCode,\r\n ticket: product.ticket,\r\n currentPrice: product.price.current,\r\n originalPrice: product.price.original,\r\n };\r\n products.push(data);\r\n const discount = product.price.original - product.price.current;\r\n originalPrices.push(discount);\r\n return (\r\n <React.Fragment key={j}>\r\n <CommonPurchaseCombinationProduct\r\n product={product}\r\n handleDeselect={handleDeselect}\r\n handleReselect={handleReselect}\r\n />\r\n {props.combo.productList.length - 1 !== j && (\r\n <PlusWrapper>\r\n <Plus>+</Plus>\r\n </PlusWrapper>\r\n )}\r\n </React.Fragment>\r\n );\r\n })}\r\n </CombinationContainer>\r\n <EqualTo>=</EqualTo>\r\n <PriceButtonContainer>\r\n <ComboPriceHeader>\r\n {selectedItemsCount === 2\r\n ? translate('/Product/BuyBothFor')\r\n : selectedItemsCount <= 1\r\n ? ''\r\n : translate('/Product/BuyAllFor')}\r\n </ComboPriceHeader>\r\n <ComboPrice>\r\n {comboTotal.toFixed(0)}\r\n {translate('/Product/Currency')}\r\n </ComboPrice>\r\n {originalPrices.reduce(function (a, b) {\r\n return a + b;\r\n }) -\r\n deselectedTotalDiscount >\r\n 0 && (\r\n <SaveSum>\r\n {translate('/Product/AndSave') + ' '}\r\n {originalPrices\r\n .reduce(function (a, b) {\r\n return a + b;\r\n })\r\n .toFixed(0) - deselectedTotalDiscount.toFixed(0)}\r\n {translate('/Product/Currency')}\r\n </SaveSum>\r\n )}\r\n <StyledButton onClick={() => handleAddToCart(products)} disabled={selectedItemsCount < 1}>\r\n {selectedItemsCount === 2\r\n ? translate('/Product/BuyBoth') + ' ' + selectedItemsCount\r\n : selectedItemsCount <= 1\r\n ? translate('/Product/Buy')\r\n : translate('/Product/BuyAll')}\r\n </StyledButton>\r\n </PriceButtonContainer>\r\n </CombinationOuterContainer>\r\n );\r\n}\r\nconst CombinationContainer = styled.div({\r\n [minLargeMediaQuery]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n});\r\n\r\nconst CombinationOuterContainer = styled.div({\r\n width: '100%',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n backgroundColor: 'white',\r\n margin: {\r\n y: '1rem',\r\n x: '1rem',\r\n },\r\n padding: { xy: 0 },\r\n [minHugeMediaQuery]: {\r\n padding: { xy: '2rem' },\r\n margin: {\r\n y: '1rem',\r\n x: 0,\r\n },\r\n },\r\n});\r\n\r\nconst StyledButton = styled(Button, {\r\n width: '7rem',\r\n height: '2.5rem',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n fontSize: '1rem',\r\n lineHeight: '2.5rem',\r\n color: white,\r\n [minSmallMediaQuery]: {\r\n width: '9rem',\r\n height: '3.5rem',\r\n lineHeight: '3.5rem',\r\n },\r\n [minMediumMediaQuery]: {\r\n width: '12rem',\r\n },\r\n});\r\n\r\nconst PriceButtonContainer = styled.div({\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n alignSelf: 'center',\r\n marginLeft: '0.5rem',\r\n [minSmallMediaQuery]: {\r\n margin: 0,\r\n },\r\n});\r\n\r\nconst ComboPriceHeader = styled.div({\r\n fontWeight: 'bold',\r\n fontSize: '0.8rem',\r\n [minSmallMediaQuery]: {\r\n fontSize: '1rem',\r\n },\r\n [minMediumMediaQuery]: {\r\n fontSize: '1.2rem',\r\n },\r\n});\r\n\r\nconst SaveSum = styled(ComboPriceHeader, {\r\n marginBottom: '1rem',\r\n});\r\n\r\nconst ComboPrice = styled.div({\r\n fontSize: '1.8rem',\r\n lineHeight: '2.5rem',\r\n fontWeight: 'bold',\r\n [minSmallMediaQuery]: {\r\n fontSize: '2.6rem',\r\n lineHeight: '3rem',\r\n },\r\n [minMediumMediaQuery]: {\r\n fontSize: '3rem',\r\n lineHeight: '4rem',\r\n },\r\n});\r\n\r\nconst Plus = styled.div({\r\n display: 'flex',\r\n alignItems: 'center',\r\n backgroundColor: (theme) => theme.buyButtonProductcardDesktop,\r\n color: 'white',\r\n borderRadius: '100%',\r\n alignSelf: 'center',\r\n justifyContent: 'center',\r\n width: '2rem',\r\n height: '2rem',\r\n fontSize: '2rem',\r\n [minSmallMediaQuery]: {\r\n width: '3rem',\r\n height: '3rem',\r\n fontSize: '3rem',\r\n padding: { x: '1rem', bottom: 0 },\r\n },\r\n [minMediumMediaQuery]: {\r\n width: '3rem',\r\n height: '3rem',\r\n fontSize: '4rem',\r\n padding: { x: 0, bottom: '0.3rem' },\r\n\r\n [minHugeMediaQuery]: {\r\n margin: { xy: '1rem' },\r\n },\r\n },\r\n});\r\n\r\nconst PlusWrapper = styled.div({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n [minHugeMediaQuery]: {\r\n display: 'block',\r\n },\r\n});\r\n\r\nconst EqualTo = styled(Plus, {\r\n width: '2.5rem',\r\n height: '2.5rem',\r\n fontSize: '2.5rem',\r\n margin: { x: 0, y: 0 },\r\n padding: { x: '1rem', bottom: 0 },\r\n [minSmallMediaQuery]: {\r\n width: '4rem',\r\n height: '4rem',\r\n fontSize: '4rem',\r\n margin: { x: '0.2rem', y: '0.2rem' },\r\n },\r\n [minMediumMediaQuery]: {\r\n width: '3.5rem',\r\n height: '3.5rem',\r\n fontSize: '3.5rem',\r\n },\r\n});\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { pixelsToUnit, minMediumMediaQuery, pageMaxWidth } from 'Shared/Style';\r\nimport { Section } from 'Shared/PageLayout';\r\nimport CommonPurchaseCombinationViewModelType from 'Product/CommonPurchaseCombination/CommonPurchaseCombinationViewModel.type';\r\nimport CommonPurchaseCombinationItem from './CommonPurchaseCombinationItem';\r\n\r\ntype RequiredPropType = {\r\n description?: Scope.XhtmlString;\r\n isCompact: boolean;\r\n commonPurchaseCombinationList: CommonPurchaseCombinationViewModelType[];\r\n addAllItemsToCart: (products: any) => void;\r\n};\r\n\r\ntype PropType = RequiredPropType & {\r\n forwardedRef: React.Ref<HTMLDivElement>;\r\n};\r\n\r\nfunction CommonPurchaseCombination(props: PropType) {\r\n const { commonPurchaseCombinationList } = props;\r\n\r\n return (\r\n <Base>\r\n <Wrapper>\r\n {commonPurchaseCombinationList.map((combo, i) => {\r\n return <CommonPurchaseCombinationItem key={i} combo={combo} addAllItemsToCart={props.addAllItemsToCart} />;\r\n })}\r\n </Wrapper>\r\n </Base>\r\n );\r\n}\r\n\r\nexport default React.forwardRef(function WithForwardedRefMidSection(\r\n props: RequiredPropType,\r\n ref: React.Ref<HTMLDivElement>,\r\n) {\r\n return <CommonPurchaseCombination {...props} forwardedRef={ref} />;\r\n});\r\n\r\nconst Base = styled(Section, {\r\n display: 'flex',\r\n [minMediumMediaQuery]: {\r\n maxWidth: pixelsToUnit(pageMaxWidth),\r\n padding: {\r\n x: 0,\r\n },\r\n },\r\n});\r\n\r\nconst Wrapper = styled.div({\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n width: '100%',\r\n});\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport Link from 'Shared/Link';\r\nimport { thin, minMediumMediaQuery, pixelsToUnit, scorpion, sigma } from 'Shared/Style';\r\nimport { COLOR_TRANSPARENT } from './shared';\r\n\r\ntype PropType = {\r\n brand: string;\r\n brandUrl: string;\r\n};\r\n\r\nconst StyledDiv = styled.div({\r\n display: 'inline-block',\r\n borderBottom: {\r\n width: thin,\r\n style: 'solid',\r\n color: COLOR_TRANSPARENT,\r\n },\r\n fontSize: sigma,\r\n ':hover': {\r\n textDecoration: 'underline',\r\n },\r\n [minMediumMediaQuery]: {\r\n marginBottom: pixelsToUnit(7),\r\n },\r\n});\r\n\r\nconst Brand = (props: PropType) => (\r\n <StyledDiv>\r\n {props.brandUrl ? (\r\n <Link\r\n css={{\r\n color: scorpion,\r\n }}\r\n to={props.brandUrl}\r\n >\r\n {props.brand}\r\n </Link>\r\n ) : (\r\n props.brand\r\n )}\r\n </StyledDiv>\r\n);\r\n\r\nexport default Brand;\r\n","export type ValuePropType = {\r\n hasValue: boolean;\r\n};\r\n\r\nexport type ViewportPropType = {\r\n isCompact?: boolean;\r\n};\r\n\r\nexport const COLOR_TRANSPARENT = 'rgba(79,79,79, 0)';\r\nexport const COLOR_NOT_TRANSPARENT = 'rgba(79,79,79, 1)';\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { minSmallMediaQuery, pixelsToUnit } from 'Shared/Style';\r\n\r\ntype PropType = {\r\n name: string;\r\n};\r\n\r\nconst Name = styled.h1({\r\n fontSize: '1.6rem',\r\n fontWeight: 400,\r\n lineHeight: 'normal',\r\n textTransform: 'uppercase',\r\n [minSmallMediaQuery]: {\r\n marginBottom: pixelsToUnit(6),\r\n fontSize: '1.8rem',\r\n },\r\n});\r\n\r\nexport default (props: PropType) => <Name>{props.name}</Name>;\r\n","import React from 'react';\r\nimport { styled, StyledComponent, StyledProps } from '@glitz/react';\r\n\r\ntype PropType = {\r\n rating: number;\r\n star: StyledComponent<any>;\r\n starOutline: StyledComponent<any>;\r\n} & StyledProps;\r\n\r\nconst RATINGS = [1, 2, 3, 4, 5];\r\nexport default styled((props: PropType) => (\r\n <styled.Div css={props.compose()}>\r\n {RATINGS.map(rating => (rating <= props.rating ? <props.star key={rating} /> : <props.starOutline key={rating} />))}\r\n </styled.Div>\r\n));\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { pseudo } from '@glitz/core';\r\nimport { large, minMediumMediaQuery, pixelsToUnit } from 'Shared/Style';\r\nimport { Star, StarOutline } from 'Shared/Icon/Star';\r\nimport Stars from 'Product/Reviews/Ratings/ReadOnly';\r\n\r\ntype PropType = {\r\n rating: number;\r\n totalReviews: number;\r\n};\r\n\r\nconst StyledStar = styled(Star, {\r\n width: pixelsToUnit(20),\r\n height: pixelsToUnit(19),\r\n ...pseudo(':not(:first-child)', {\r\n marginLeft: pixelsToUnit(10),\r\n }),\r\n [minMediumMediaQuery]: {\r\n ':not(:first-child)': {\r\n marginLeft: pixelsToUnit(5),\r\n },\r\n },\r\n});\r\n\r\nconst StyledStarOutline = styled(StarOutline, {\r\n width: pixelsToUnit(20),\r\n height: pixelsToUnit(19),\r\n ...pseudo(':not(:first-child)', {\r\n marginLeft: pixelsToUnit(15),\r\n }),\r\n [minMediumMediaQuery]: {\r\n ':not(:first-child)': {\r\n marginLeft: pixelsToUnit(5),\r\n },\r\n },\r\n});\r\n\r\nconst Ratings = (props: PropType) => {\r\n return typeof props.rating !== 'undefined' || props.rating !== null ? (\r\n <styled.Div\r\n css={{\r\n margin: {\r\n y: large,\r\n x: 0,\r\n },\r\n }}\r\n >\r\n <Stars\r\n css={{ display: 'inline-block' }}\r\n rating={props.rating}\r\n star={StyledStar}\r\n starOutline={StyledStarOutline}\r\n />\r\n </styled.Div>\r\n ) : null;\r\n};\r\n\r\nexport default Ratings;\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { translate } from '@avensia/scope';\r\nimport { wildwatermelon, gray, pixelsToUnit, minMediumMediaQuery, white, sigma } from 'Shared/Style';\r\nimport Price, { Page as PageType, Type as PriceType, Variant as PriceVariant } from 'Pricing/Price';\r\nimport { ViewportPropType } from './shared';\r\n\r\ntype PricesPropType = {\r\n prices: {\r\n currency: string;\r\n current: number;\r\n discountPercentage: number;\r\n original: number;\r\n history: number;\r\n culture?: string;\r\n };\r\n};\r\n\r\ntype PropType = PricesPropType &\r\n ViewportPropType &\r\n StyledProps & { productActionbarMobile?: boolean; longPrice?: boolean };\r\n\r\nconst PriceWrapper = styled.div({\r\n display: 'flex',\r\n alignItems: 'flex-end',\r\n});\r\n\r\nexport default styled(function Prices(props: PropType) {\r\n const { discountPercentage, currency, current, original, history } = props.prices;\r\n const hasDiscount = current < original;\r\n\r\n const PriceStyle = {\r\n color: props.productActionbarMobile && white,\r\n fontSize: props.productActionbarMobile ? (props.longPrice ? pixelsToUnit(25) : pixelsToUnit(32)) : pixelsToUnit(20),\r\n lineHeight: props.productActionbarMobile && pixelsToUnit(30),\r\n [minMediumMediaQuery]: {\r\n fontSize: pixelsToUnit(35),\r\n },\r\n };\r\n\r\n const DiscountedText = styled.span({\r\n fontSize: pixelsToUnit(10),\r\n color: props.productActionbarMobile ? white : wildwatermelon,\r\n textTransform: 'uppercase',\r\n [minMediumMediaQuery]: {\r\n fontSize: pixelsToUnit(14),\r\n },\r\n });\r\n\r\n const RecommendedPrice = styled(Price, {\r\n color: props.productActionbarMobile ? white : gray,\r\n fontSize: pixelsToUnit(10),\r\n [minMediumMediaQuery]: {\r\n fontSize: pixelsToUnit(14),\r\n },\r\n });\r\n\r\n const RecommendedPriceText = styled.span({\r\n color: props.productActionbarMobile ? white : gray,\r\n marginRight: pixelsToUnit(5),\r\n fontSize: pixelsToUnit(10),\r\n [minMediumMediaQuery]: {\r\n fontSize: pixelsToUnit(14),\r\n },\r\n });\r\n\r\n const HistoryPriceWrapper = styled.div({\r\n color: gray,\r\n fontSize: pixelsToUnit(10),\r\n [minMediumMediaQuery]: {\r\n fontSize: sigma,\r\n },\r\n });\r\n\r\n const historyPriceStyle = styled(props.isCompact ? { color: white } : { color: gray });\r\n\r\n return (\r\n <styled.Div css={props.compose()}>\r\n <Price\r\n current={current}\r\n currency={currency}\r\n variant={props.isCompact ? PriceVariant.Medium : PriceVariant.Huge}\r\n priceType={hasDiscount ? PriceType.New : PriceType.Regular}\r\n currentPage={PageType.ProductDetails}\r\n css={PriceStyle}\r\n />\r\n {hasDiscount && (\r\n <PriceWrapper>\r\n <RecommendedPriceText>{translate('/Product/RecommendedPrice')}</RecommendedPriceText>\r\n <RecommendedPrice\r\n current={original}\r\n currency={currency}\r\n variant={PriceVariant.Small}\r\n priceType={PriceType.Regular}\r\n currentPage={PageType.ProductDetails}\r\n />\r\n {discountPercentage !== 0 && (\r\n <DiscountedText\r\n css={{ marginLeft: pixelsToUnit(5), fontSize: pixelsToUnit(10) }}\r\n >{`(-${discountPercentage}%)`}</DiscountedText>\r\n )}\r\n </PriceWrapper>\r\n )}\r\n {history !== 0 && (\r\n <HistoryPriceWrapper css={historyPriceStyle}>\r\n {translate('/Product/HistoryPrice') + ' '}\r\n <Price current={history} currency={currency} css={historyPriceStyle} />\r\n </HistoryPriceWrapper>\r\n )}\r\n </styled.Div>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { translate } from '@avensia/scope';\r\nimport Html from 'Shared/Partials/PropertyTypes/Html';\r\nimport {\r\n large,\r\n tundora,\r\n sigma,\r\n epsilon,\r\n delta,\r\n gamma,\r\n minMediumMediaQuery,\r\n pixelsToUnit,\r\n transition,\r\n} from 'Shared/Style';\r\nimport { Basic } from 'Shared/PageLayout';\r\n\r\ntype PropType = {\r\n description?: Scope.XhtmlString;\r\n forwardedRef: React.Ref<HTMLDivElement>;\r\n isCompact: boolean;\r\n};\r\n\r\ntype StateType = {\r\n isExpanded: boolean;\r\n height: string | number;\r\n isMounted: boolean;\r\n};\r\n\r\nclass Description extends React.Component<PropType, StateType> {\r\n ref: HTMLDivElement;\r\n constructor(props: PropType) {\r\n super(props);\r\n this.state = {\r\n isExpanded: false,\r\n height: DEFAULT_HEIGHT,\r\n isMounted: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({ isMounted: true });\r\n }\r\n\r\n handleShowMore = () => {\r\n this.setState((prevState) => ({\r\n ...prevState,\r\n isExpanded: true,\r\n height: this.ref.clientHeight,\r\n }));\r\n };\r\n\r\n render() {\r\n const isShowMore = this.props.isCompact && this.state.isMounted && this.ref.clientHeight > this.state.height;\r\n return (\r\n <Base elementRef={this.props.forwardedRef}>\r\n <H2>{translate('/Product/Description/Heading')}</H2>\r\n <Content\r\n css={{\r\n height: isShowMore || this.state.isExpanded ? this.state.height : 'auto',\r\n overflowY: 'hidden',\r\n }}\r\n >\r\n <styled.Div ref={(el: HTMLDivElement) => (this.ref = el)}>\r\n <Html\r\n html={this.props.description.html}\r\n className=\"product-description\"\r\n // tslint:disable-next-line:jsx-no-lambda\r\n component={(innerProps) => <Div {...innerProps} />}\r\n />\r\n </styled.Div>\r\n </Content>\r\n {isShowMore && !this.state.isExpanded && (\r\n <styled.Div onClick={this.handleShowMore}>\r\n <FadeOut />\r\n <ShowMore>{translate('/Product/Description/ShowAll')}</ShowMore>\r\n </styled.Div>\r\n )}\r\n </Base>\r\n );\r\n }\r\n}\r\n\r\nexport default Description;\r\n\r\nconst DEFAULT_HEIGHT = 215;\r\n\r\nconst Base = styled(Basic, {\r\n textAlign: 'center',\r\n marginBottom: pixelsToUnit(50),\r\n [minMediumMediaQuery]: {\r\n textAlign: 'left',\r\n width: '50%',\r\n paddingRight: '2rem',\r\n marginBottom: pixelsToUnit(0),\r\n },\r\n});\r\nconst H2 = styled.h2({\r\n fontSize: delta,\r\n marginBottom: large,\r\n letterSpacing: pixelsToUnit(2),\r\n lineHeight: 'normal',\r\n textTransform: 'uppercase',\r\n [minMediumMediaQuery]: {\r\n fontSize: gamma,\r\n marginBottom: pixelsToUnit(20),\r\n letterSpacing: pixelsToUnit(2.3),\r\n },\r\n});\r\n\r\nconst Div = styled.div({\r\n fontSize: sigma,\r\n color: tundora,\r\n lineHeight: 1.5,\r\n textAlign: 'left',\r\n overflowWrap: 'break-word',\r\n margin: {\r\n x: 'auto',\r\n },\r\n [minMediumMediaQuery]: {\r\n maxWidth: '100%',\r\n fontSize: epsilon,\r\n },\r\n});\r\n\r\nconst Content = styled.div(\r\n transition({\r\n property: 'height',\r\n duration: 100,\r\n }),\r\n);\r\n\r\nconst FadeOut = styled.div({\r\n position: 'relative',\r\n bottom: pixelsToUnit(64),\r\n height: pixelsToUnit(64),\r\n backgroundImage: 'linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100% )',\r\n});\r\nconst ShowMore = styled.div({\r\n marginTop: pixelsToUnit(-50),\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n fontSize: sigma,\r\n});\r\n","import React from 'react';\r\nimport { Style } from '@glitz/type';\r\nimport { styled } from '@glitz/react';\r\nimport { translate } from '@avensia/scope';\r\nimport {\r\n mountainmeadow,\r\n wildwatermelon,\r\n large,\r\n delta,\r\n sigma,\r\n gamma,\r\n epsilon,\r\n minMediumMediaQuery,\r\n pixelsToUnit,\r\n} from 'Shared/Style';\r\nimport { Basic } from 'Shared/PageLayout';\r\nimport IconCheck from 'Shared/Icon/Check';\r\nimport IconRemove from 'Shared/Icon/RemovePlain';\r\nimport QuickFactViewModelType from 'Product/QuickFactViewModel.type';\r\n\r\ntype PropType = {\r\n quickFacts: QuickFactViewModelType[];\r\n};\r\n\r\ntype DisplayFieldsPropType = Array<{\r\n label: string;\r\n value: string | boolean;\r\n}>;\r\n\r\nconst Caption = styled.h2({\r\n fontSize: epsilon,\r\n fontWeight: 'bold',\r\n lineHeight: 'normal',\r\n [minMediumMediaQuery]: {\r\n fontSize: delta,\r\n letterSpacing: pixelsToUnit(0.4),\r\n },\r\n});\r\n\r\nconst Row = styled.div({\r\n display: 'flex',\r\n flexFlow: 'row nowrap',\r\n justifyContent: 'space-between',\r\n margin: {\r\n y: '12px',\r\n x: 0,\r\n },\r\n ':first-of-type': {\r\n marginTop: pixelsToUnit(9),\r\n },\r\n [minMediumMediaQuery]: {\r\n ':first-of-type': {\r\n marginTop: pixelsToUnit(16),\r\n },\r\n },\r\n});\r\n\r\nconst RowData = styled.div({\r\n flex: {\r\n grow: 0,\r\n shrink: 0,\r\n basis: '50%',\r\n },\r\n overflowWrap: 'break-word',\r\n minWidth: 0, // to enable break word in firefox\r\n textAlign: 'right',\r\n fontSize: sigma,\r\n [minMediumMediaQuery]: {\r\n fontSize: epsilon,\r\n },\r\n});\r\n\r\nconst RowHeader = styled(RowData, {\r\n textAlign: 'left',\r\n});\r\n\r\nconst QuickFactsCaption = styled.h2({\r\n fontSize: delta,\r\n marginBottom: large,\r\n letterSpacing: pixelsToUnit(2),\r\n lineHeight: 'normal',\r\n textTransform: 'uppercase',\r\n [minMediumMediaQuery]: {\r\n fontSize: gamma,\r\n marginBottom: pixelsToUnit(20),\r\n letterSpacing: pixelsToUnit(2.3),\r\n },\r\n});\r\n\r\nconst QuickFactsRow = styled.div({\r\n display: 'flex',\r\n textAlign: 'left',\r\n width: '100%',\r\n margin: { y: 0, x: 'auto' },\r\n flexDirection: 'column',\r\n});\r\n\r\nconst Table = styled.div({\r\n flex: {\r\n grow: 1,\r\n shrink: 1,\r\n basis: '47.5%',\r\n },\r\n ':first-child': {\r\n marginBottom: pixelsToUnit(30),\r\n },\r\n [minMediumMediaQuery]: {\r\n ':first-child': {\r\n marginBottom: 0,\r\n },\r\n },\r\n});\r\n\r\nconst Yes = styled(IconCheck, {\r\n color: mountainmeadow,\r\n});\r\n\r\nconst No = styled(IconRemove, {\r\n color: wildwatermelon,\r\n display: 'inline-block',\r\n verticalAlign: 'middle',\r\n});\r\n\r\nconst ColumnGutter = styled.div({\r\n flex: {\r\n grow: 0,\r\n shrink: 0,\r\n basis: '5%',\r\n },\r\n});\r\n\r\nconst getLabel = (key: string) => {\r\n switch (key) {\r\n case 'circumference':\r\n return translate('/Product/QuickFacts/Size/Circumference');\r\n case 'length':\r\n return translate('/Product/QuickFacts/Size/Length');\r\n case 'penetrationlength':\r\n return translate('/Product/QuickFacts/Size/PenetrationLength');\r\n case 'diameter':\r\n return translate('/Product/QuickFacts/Size/Diameter');\r\n case 'diametermax':\r\n return translate('/Product/QuickFacts/Size/DiameterMax');\r\n case 'diametermin':\r\n return translate('/Product/QuickFacts/Size/DiameterMin');\r\n case 'innerdiameter':\r\n return translate('/Product/QuickFacts/Size/InnerDiameter');\r\n case 'elasticity':\r\n return translate('/Product/QuickFacts/Details/Elasticity');\r\n case 'material':\r\n return translate('/Product/QuickFacts/Details/Material');\r\n case 'watersafe':\r\n return translate('/Product/QuickFacts/Details/WaterSafe');\r\n case 'batteriesincluded':\r\n return translate('/Product/QuickFacts/Details/BatteriesIncluded');\r\n case 'batteriesinformationtype':\r\n return translate('/Product/QuickFacts/Details/BatteriesInformationType');\r\n case 'vibration':\r\n return translate('/Product/QuickFacts/Details/Vibration');\r\n case 'rpm':\r\n return translate('/Product/QuickFacts/Details/RPM');\r\n case 'maxnoise':\r\n return translate('/Product/QuickFacts/Details/MaxNoise');\r\n case 'ftalates':\r\n return translate('/Product/QuickFacts/Details/Ftalates');\r\n case 'parabens':\r\n return translate('/Product/QuickFacts/Details/Parabens');\r\n case 'lubricanttype':\r\n return translate('/Product/QuickFacts/Details/LubricantType');\r\n case 'glycerines':\r\n return translate('/Product/QuickFacts/Details/Glycerines');\r\n case 'condomsafe':\r\n return translate('/Product/QuickFacts/Details/CondomSafe');\r\n case 'remotecontroldetails':\r\n return translate('/Product/QuickFacts/Details/RemoteControlDetails');\r\n case 'vibetrait':\r\n return translate('/Product/QuickFacts/Details/VibeTrait');\r\n case 'vibratorfilter':\r\n return translate('/Product/QuickFacts/Details/VibratorFilter');\r\n case 'stiffnes':\r\n return translate('/Product/QuickFacts/Details/Stiffnes');\r\n case 'texture':\r\n return translate('/Product/QuickFacts/Details/Texture');\r\n case 'openings':\r\n return translate('/Product/QuickFacts/Details/Openings');\r\n case 'strapontype':\r\n return translate('/Product/QuickFacts/Details/StrapOnType');\r\n case 'clothestrait':\r\n return translate('/Product/QuickFacts/Details/ClothesTrait');\r\n case 'effect':\r\n return translate('/Product/QuickFacts/Details/Effect');\r\n case 'pussytrait':\r\n return translate('/Product/QuickFacts/Details/PussyTrait');\r\n case 'egg':\r\n return translate('/Product/QuickFacts/Details/Egg');\r\n case 'cockring':\r\n return translate('/Product/QuickFacts/Details/CockRing');\r\n case 'flavour':\r\n return translate('/Product/QuickFacts/Details/Flavour');\r\n case 'glidefunction':\r\n return translate('/Product/QuickFacts/Details/GlideFunction');\r\n case 'whip':\r\n return translate('/Product/QuickFacts/Details/Whip');\r\n case 'shackles':\r\n return translate('/Product/QuickFacts/Details/Shackles');\r\n case 'gag':\r\n return translate('/Product/QuickFacts/Details/Gag');\r\n case 'stockingsincluded':\r\n return translate('/Product/QuickFacts/Details/StockingsIncluded');\r\n case 'pantiesincluded':\r\n return translate('/Product/QuickFacts/Details/PantiesIncluded');\r\n case 'bleaching':\r\n return translate('/Product/QuickFacts/Details/Bleaching');\r\n case 'drycleaning':\r\n return translate('/Product/QuickFacts/Details/DryCleaning');\r\n case 'tumbledryer':\r\n return translate('/Product/QuickFacts/Details/TumbleDryer');\r\n case 'basetype':\r\n return translate('/Product/QuickFacts/Details/BaseType');\r\n case 'fit':\r\n return translate('/Product/QuickFacts/Details/Fit');\r\n case 'washinginstructions':\r\n return translate('/Product/QuickFacts/Details/WashingInstructions');\r\n case 'ironing':\r\n return translate('/Product/QuickFacts/Details/Ironing');\r\n case 'skucode':\r\n return translate('/Product/SKU');\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\nconst Sizes = (props: { sizes: DisplayFieldsPropType }) => (\r\n <Table>\r\n <Caption>{translate('/Product/QuickFacts/Size/Heading')}</Caption>\r\n {props.sizes.map(({ label, value }, index) => (\r\n <Row key={index}>\r\n <RowHeader>{label}</RowHeader>\r\n <RowData>{value}</RowData>\r\n </Row>\r\n ))}\r\n </Table>\r\n);\r\n\r\nconst Details = (props: { details: DisplayFieldsPropType }) => (\r\n <Table>\r\n <Caption>{translate('/Product/QuickFacts/Details/Heading')}</Caption>\r\n {props.details.map(({ label, value }, index) => (\r\n <Row key={index}>\r\n <RowHeader>{label}</RowHeader>\r\n <RowData>{typeof value === 'boolean' ? value ? <Yes /> : <No /> : value}</RowData>\r\n </Row>\r\n ))}\r\n </Table>\r\n);\r\n\r\nconst QUICKFACTS_SIZE = 'size';\r\nconst QUICKFACTS_DETAILS = 'details';\r\n\r\nconst baseCss: Style = {\r\n textAlign: 'center',\r\n [minMediumMediaQuery]: {\r\n textAlign: 'left',\r\n width: '50%',\r\n paddingLeft: '2rem',\r\n },\r\n};\r\n\r\nexport default function QuickFacts(props: PropType) {\r\n const sizes =\r\n !!props.quickFacts.length &&\r\n props.quickFacts\r\n .filter((quickFact) => quickFact.category === QUICKFACTS_SIZE)\r\n .map((size) => ({\r\n label: getLabel(size.id.toLowerCase()),\r\n value: size.value,\r\n }));\r\n\r\n const details =\r\n !!props.quickFacts.length &&\r\n props.quickFacts\r\n .filter((quickFact) => quickFact.category === QUICKFACTS_DETAILS)\r\n .map((detail) => ({\r\n label: getLabel(detail.id.toLowerCase()),\r\n value: detail.type === 'string' ? detail.value : detail.value === 'True',\r\n }));\r\n\r\n return sizes.length > 0 || details.length > 0 ? (\r\n <Basic css={baseCss}>\r\n <QuickFactsCaption>{translate('/Product/QuickFacts/Heading')}</QuickFactsCaption>\r\n <QuickFactsRow>\r\n {sizes.length > 0 && <Sizes sizes={sizes} />}\r\n {sizes.length > 0 && details.length > 0 && <ColumnGutter />}\r\n {details.length > 0 && <Details details={details} />}\r\n </QuickFactsRow>\r\n </Basic>\r\n ) : null;\r\n}\r\n","import factory from './icon';\r\nimport Measure from './glyphs/icon-measure.svg';\r\n\r\nexport default factory(Measure);\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { pseudo } from '@glitz/core';\r\nimport { translate } from '@avensia/scope';\r\nimport SizeGuidePageViewModelType from 'SizeGuide/SizeGuideViewModel.type';\r\nimport IconMeasure from 'Shared/Icon/Measure';\r\nimport {\r\n corduroy,\r\n white,\r\n delta,\r\n epsilon,\r\n theta,\r\n sigma,\r\n minSmallMediaQuery,\r\n minTinyMediaQuery,\r\n minMediumMediaQuery,\r\n pixelsToUnit,\r\n} from 'Shared/Style';\r\nimport Flyout, { Position, Right } from 'Shared/Flyout';\r\nimport Icon from 'Shared/Icon/Close';\r\nimport { COLOR_NOT_TRANSPARENT } from './shared';\r\n\r\ntype SizeGuidePropType = {\r\n sizeGuide: SizeGuidePageViewModelType;\r\n};\r\ntype PropType = SizeGuidePropType;\r\ntype StateType = {\r\n isOpen: boolean;\r\n};\r\n\r\ntype TablePropType = {\r\n sizeHeader: string[];\r\n sizes: string[][];\r\n};\r\n\r\ntype ImagePropType = {\r\n imageUrl: string;\r\n};\r\n\r\ntype ImageStateType = {\r\n loaded: boolean;\r\n};\r\n\r\nconst TABLE_MICRO_GUTTER_WIDTH = 25;\r\nconst TABLE_TINY_GUTTER_WIDTH = 75;\r\nconst TABLE_SMALL_GUTTER_WIDTH = 95;\r\nconst TABLE_COLUMN_WIDTH = 120;\r\n\r\nconst Container = styled.div({\r\n margin: {\r\n y: pixelsToUnit(15),\r\n },\r\n [minMediumMediaQuery]: {\r\n margin: 0,\r\n },\r\n});\r\n\r\nconst Text = styled.div({\r\n borderBottom: {\r\n width: pixelsToUnit(1),\r\n style: 'solid',\r\n color: COLOR_NOT_TRANSPARENT,\r\n },\r\n cursor: 'pointer',\r\n display: 'inline-block',\r\n fontSize: epsilon,\r\n lineHeight: pixelsToUnit(20),\r\n});\r\n\r\nconst Close = styled.div({\r\n padding: { xy: pixelsToUnit(10) },\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n [minMediumMediaQuery]: {\r\n right: pixelsToUnit(10),\r\n top: pixelsToUnit(20),\r\n },\r\n});\r\n\r\nconst StyledIcon = styled(Icon, {\r\n width: pixelsToUnit(40),\r\n height: pixelsToUnit(40),\r\n cursor: 'pointer',\r\n});\r\n\r\nconst Modal = styled.div({});\r\n\r\nconst Body = styled.div({\r\n padding: {\r\n top: pixelsToUnit(15),\r\n x: 0,\r\n },\r\n height: '100%',\r\n [minMediumMediaQuery]: {\r\n padding: {\r\n y: pixelsToUnit(100),\r\n x: 0,\r\n },\r\n },\r\n});\r\n\r\nconst Header = styled.div({\r\n textTransform: 'uppercase',\r\n textAlign: 'center',\r\n fontSize: delta,\r\n letterSpacing: pixelsToUnit(2.7),\r\n color: '#202020',\r\n lineHeight: 'normal',\r\n margin: {\r\n y: pixelsToUnit(6),\r\n x: 0,\r\n },\r\n});\r\n\r\nconst Description = styled(Header, {\r\n fontSize: sigma,\r\n letterSpacing: pixelsToUnit(2.1),\r\n color: '#8b8b8b',\r\n});\r\n\r\nconst TableContainer = styled.div({\r\n maxWidth: 'calc(100% - 20px)',\r\n maxHeight: 'calc(100% - 50px)',\r\n margin: {\r\n top: pixelsToUnit(36),\r\n x: 'auto',\r\n },\r\n overflow: 'auto',\r\n});\r\n\r\nconst ImageContainer = styled.div({\r\n maxWidth: `calc(100% - ${TABLE_MICRO_GUTTER_WIDTH * 2}px)`,\r\n maxHeight: 'calc(100% - 50px)',\r\n margin: {\r\n top: pixelsToUnit(36),\r\n bottom: 0,\r\n x: 'auto',\r\n },\r\n overflow: 'auto',\r\n [minTinyMediaQuery]: {\r\n width: `calc(100% - ${TABLE_TINY_GUTTER_WIDTH * 2}px)`,\r\n },\r\n});\r\n\r\nconst Image = styled.img({\r\n maxWidth: '100%',\r\n height: 'auto',\r\n width: '100%',\r\n});\r\n\r\nconst Table = styled.table({\r\n backgroundColor: (theme) => theme.sizeGuideHeaderBackgroundColor,\r\n backgroundImage: (theme) => theme.sizeGuideHeaderBackgroundImage,\r\n borderCollapse: 'collapse',\r\n tableLayout: 'auto',\r\n width: '100%',\r\n});\r\n\r\nconst TableRow = styled.tr({\r\n lineHeight: pixelsToUnit(20),\r\n ...pseudo(':nth-child(odd)', {\r\n backgroundColor: '#f6f6f6',\r\n }),\r\n ...pseudo(':nth-child(even)', {\r\n backgroundColor: white,\r\n }),\r\n});\r\n\r\nconst TableRowHeader = styled(TableRow, {\r\n lineHeight: pixelsToUnit(23),\r\n ':only-child': {\r\n backgroundColor: 'transparent',\r\n },\r\n});\r\n\r\nconst TableData = styled.td({\r\n width: `${TABLE_COLUMN_WIDTH}px`,\r\n color: corduroy,\r\n fontSize: theta,\r\n letterSpacing: 'normal',\r\n padding: {\r\n y: pixelsToUnit(12),\r\n x: pixelsToUnit(5.5),\r\n },\r\n textAlign: 'left',\r\n ':first-child': {\r\n paddingLeft: pixelsToUnit(10),\r\n },\r\n});\r\n\r\nconst TableHeader = styled(TableData, {\r\n paddingTop: pixelsToUnit(10),\r\n paddingBottom: pixelsToUnit(10),\r\n color: white,\r\n fontSize: epsilon,\r\n letterSpacing: pixelsToUnit(0.5),\r\n});\r\n\r\nclass SizeGuideImage extends React.Component<ImagePropType, ImageStateType> {\r\n state: ImageStateType = {\r\n loaded: false,\r\n };\r\n\r\n handleImageLoaded = () => {\r\n this.setState({\r\n loaded: true,\r\n });\r\n };\r\n\r\n render() {\r\n return (\r\n <ImageContainer>\r\n <Image\r\n css={{ display: this.state.loaded ? 'block' : 'none' }}\r\n src={this.props.imageUrl}\r\n onLoad={this.handleImageLoaded}\r\n />\r\n </ImageContainer>\r\n );\r\n }\r\n}\r\n\r\nclass SizeGuideTable extends React.Component<TablePropType> {\r\n table: HTMLTableElement;\r\n\r\n render() {\r\n return (\r\n this.props.sizeHeader &&\r\n this.props.sizes && (\r\n <TableContainer\r\n css={{\r\n height: 'auto',\r\n }}\r\n >\r\n <Table\r\n // tslint:disable-next-line:jsx-no-lambda\r\n ref={(table: HTMLTableElement) => (this.table = table)}\r\n >\r\n <thead>\r\n <TableRowHeader>\r\n {this.props.sizeHeader.map((header, i) => (\r\n <TableHeader key={header + i}>{header}</TableHeader>\r\n ))}\r\n </TableRowHeader>\r\n </thead>\r\n <tbody>\r\n {this.props.sizes.map((size, i) => (\r\n <TableRow key={size.length + i}>\r\n {size.map((data, i) => (\r\n <TableData key={data + i}>{data}</TableData>\r\n ))}\r\n </TableRow>\r\n ))}\r\n </tbody>\r\n </Table>\r\n </TableContainer>\r\n )\r\n );\r\n }\r\n}\r\n\r\ntype ContentPropType = SizeGuidePropType & {\r\n onClose: () => void;\r\n};\r\n\r\nconst WideRight = styled(Right, {\r\n maxWidth: 'unset',\r\n overflow: 'auto',\r\n width: '100%',\r\n [minMediumMediaQuery]: {\r\n width: pixelsToUnit(800),\r\n },\r\n});\r\n\r\nconst Content = (props: ContentPropType) => (\r\n <Modal>\r\n <Close\r\n css={{\r\n [minSmallMediaQuery]: {\r\n right: props.sizeGuide.imageUrl ? `${TABLE_TINY_GUTTER_WIDTH}px` : `${TABLE_SMALL_GUTTER_WIDTH}px`,\r\n },\r\n }}\r\n >\r\n <StyledIcon onClick={props.onClose} />\r\n </Close>\r\n <Body>\r\n <Header>{props.sizeGuide.title} </Header>\r\n <Description>{props.sizeGuide.description}</Description>\r\n {props.sizeGuide.imageUrl ? (\r\n <SizeGuideImage imageUrl={props.sizeGuide.imageUrl} />\r\n ) : (\r\n <SizeGuideTable sizeHeader={props.sizeGuide.sizeHeader} sizes={props.sizeGuide.sizes} />\r\n )}\r\n </Body>\r\n </Modal>\r\n);\r\n\r\nexport default class SizeGuide extends React.Component<PropType, StateType> {\r\n state = {\r\n isOpen: false,\r\n };\r\n\r\n toggleModal = () =>\r\n this.setState((prevState) => ({\r\n isOpen: !prevState.isOpen,\r\n }));\r\n\r\n render() {\r\n return (\r\n <Container>\r\n <IconMeasure css={{ marginRight: pixelsToUnit(10) }} />\r\n <Text onClick={this.toggleModal}>{translate('/Product/SizeGuide')}</Text>\r\n <Flyout\r\n positionComponent={WideRight}\r\n position={Position.Right}\r\n toggle={this.toggleModal}\r\n open={this.state.isOpen}\r\n >\r\n <Content sizeGuide={this.props.sizeGuide} onClose={this.toggleModal} />\r\n </Flyout>\r\n </Container>\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { small, pixelsToUnit, minMediumMediaQuery, pageMaxWidth } from 'Shared/Style';\r\nimport { Section } from 'Shared/PageLayout';\r\n// import Reviews from 'Product/Reviews';\r\nimport { Description, QuickFacts } from './ProductDetails';\r\nimport ReviewViewModelType from 'Reviews/Models/ReviewViewModel.type';\r\nimport QuickFactViewModelType from 'Product/QuickFactViewModel.type';\r\n\r\ntype ReviewsPropType = {\r\n catalogId: number;\r\n language: string;\r\n productCode: string;\r\n averageRating: number;\r\n topReviews: ReviewViewModelType[];\r\n totalReviews: number;\r\n productPageUrl: string;\r\n isExpandReviews: boolean;\r\n toggleReviewPanel: () => void;\r\n};\r\n\r\ntype RequiredPropType = {\r\n description?: Scope.XhtmlString;\r\n reviews: ReviewsPropType;\r\n quickFacts: QuickFactViewModelType[] | undefined;\r\n isCompact: boolean;\r\n};\r\n\r\ntype PropType = RequiredPropType & {\r\n forwardedRef: React.Ref<HTMLDivElement>;\r\n};\r\n\r\nfunction ProductDescriptionSection(props: PropType) {\r\n const { description, quickFacts, isCompact, forwardedRef } = props;\r\n return (\r\n <Base>\r\n <ProductDetails>\r\n {description && description.html && !!description.html.length && (\r\n <Description description={description} forwardedRef={forwardedRef} isCompact={isCompact} />\r\n )}\r\n {quickFacts.length > 0 && <QuickFacts quickFacts={quickFacts} />}\r\n </ProductDetails>\r\n </Base>\r\n );\r\n}\r\n\r\nexport default React.forwardRef(function WithForwardedRefMidSection(\r\n props: RequiredPropType,\r\n ref: React.Ref<HTMLDivElement>,\r\n) {\r\n return <ProductDescriptionSection {...props} forwardedRef={ref} />;\r\n});\r\n\r\nconst Base = styled(Section, {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginBottom: 0,\r\n padding: {\r\n x: small,\r\n y: small,\r\n },\r\n [minMediumMediaQuery]: {\r\n flexDirection: 'row',\r\n maxWidth: pixelsToUnit(pageMaxWidth),\r\n padding: {\r\n x: 0,\r\n },\r\n },\r\n});\r\n\r\nconst ProductDetails = styled.div({\r\n [minMediumMediaQuery]: {\r\n display: 'flex',\r\n paddingRight: '1.5rem',\r\n paddingLeft: '1rem',\r\n justifyContent: 'space-between',\r\n width: '100%',\r\n },\r\n});\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { pseudo } from '@glitz/core';\r\nimport { translate, isIE } from '@avensia/scope';\r\nimport ReviewViewModelType from 'Reviews/Models/ReviewViewModel.type';\r\nimport {\r\n pixelsToUnit,\r\n black,\r\n sigma,\r\n kappa,\r\n minMicroMediaQuery,\r\n minTinyMediaQuery,\r\n minMediumMediaQuery,\r\n surfCrest,\r\n silverchalice,\r\n small,\r\n} from 'Shared/Style';\r\nimport connect from 'Shared/connect';\r\nimport { Star, StarOutline } from 'Shared/Icon/Star';\r\nimport Ratings from './Ratings/ReadOnly';\r\nimport { Style } from '@glitz/type';\r\nimport { ForExtensive, ForCompact } from 'Shared/Viewport';\r\n\r\ntype ReviewPropType = {\r\n review: ReviewViewModelType;\r\n};\r\n\r\ntype ConnectStateType = {\r\n adminReviewResponseLogo: string;\r\n siteName: string;\r\n};\r\n\r\ntype PropType = ReviewPropType & ConnectStateType & { isModal?: boolean };\r\n\r\nfunction formatDateTime(isoDateTime: string) {\r\n const date = new Date(isoDateTime);\r\n const year = date.getFullYear();\r\n let month: string | number = date.getMonth() + 1;\r\n let dt: string | number = date.getDate();\r\n\r\n if (dt < 10) {\r\n dt = '0' + dt;\r\n }\r\n if (month < 10) {\r\n month = '0' + month;\r\n }\r\n return year + '-' + month + '-' + dt;\r\n}\r\n\r\nconst Box = (props: PropType) => {\r\n const reviewModalStyle: Style = {\r\n [minMediumMediaQuery]: {\r\n flexBasis: props.review.reviewAdminAnswer ? '50%' : 'auto',\r\n },\r\n };\r\n\r\n const reviewStyle: Style = {\r\n flexBasis: props.review.reviewAdminAnswer ? '50%' : 'auto',\r\n };\r\n\r\n const adminResponseStyle: Style = isIE() && {\r\n maxWidth: '100%',\r\n [minMediumMediaQuery]: {\r\n flexBasis: 0,\r\n flexGrow: 1,\r\n },\r\n };\r\n\r\n return (\r\n <Base css={props.isModal ? { width: '100%' } : { width: '100%', [minMediumMediaQuery]: { width: '49%' } }}>\r\n <Review css={props.isModal ? reviewModalStyle : reviewStyle}>\r\n <NameAndRatings>\r\n <Alias>{props.review.aliasName}</Alias>\r\n <Ratings css={{ display: 'inline' }} rating={props.review.rating} star={FullStar} starOutline={DefaultStar} />\r\n <ForCompact>\r\n <CompactDate>\r\n <CreatedText>{translate('/Product/Reviews/Created')}: </CreatedText>\r\n {formatDateTime(props.review.publishDate)}\r\n </CompactDate>\r\n </ForCompact>\r\n </NameAndRatings>\r\n <Text css={isIE() && { maxWidth: '100%' }}>{props.review.text}</Text>\r\n <ForExtensive>\r\n <ExtensiveDate>\r\n <CreatedText>{translate('/Product/Reviews/Created')}: </CreatedText>\r\n {formatDateTime(props.review.publishDate)}\r\n </ExtensiveDate>\r\n </ForExtensive>\r\n </Review>\r\n {props.review.reviewAdminAnswer && (\r\n <Admin css={adminResponseStyle}>\r\n {props.adminReviewResponseLogo ? (\r\n <AdminLogo src={props.adminReviewResponseLogo} alt={props.siteName} />\r\n ) : (\r\n <Label>{`${props.siteName} ${translate('/Product/Reviews/List/Responds')}`}</Label>\r\n )}\r\n <Answer>{props.review.reviewAdminAnswer}</Answer>\r\n </Admin>\r\n )}\r\n </Base>\r\n );\r\n};\r\nexport default connect(\r\n (state): ConnectStateType => ({\r\n adminReviewResponseLogo: state.appShellData.siteSettings.adminReviewResponseLogo?.url,\r\n siteName: state.appShellData.siteName,\r\n }),\r\n)(Box);\r\n\r\nconst Base = styled.div({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n margin: {\r\n top: pixelsToUnit(10),\r\n bottom: pixelsToUnit(20),\r\n },\r\n [minMediumMediaQuery]: {\r\n alignItems: 'flex-start',\r\n flexDirection: 'row',\r\n },\r\n});\r\n\r\nconst Review = styled.div({\r\n alignItems: 'flex-start',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n flexShrink: 0,\r\n [minMediumMediaQuery]: {\r\n flexGrow: 0,\r\n width: '100%',\r\n },\r\n});\r\n\r\nconst NameAndRatings = styled.div({\r\n alignSelf: 'stretch',\r\n display: 'flex',\r\n [minMediumMediaQuery]: {\r\n alignSelf: 'start',\r\n },\r\n});\r\n\r\nconst Name = styled.span({\r\n marginRight: pixelsToUnit(10),\r\n fontSize: sigma,\r\n fontWeight: 'bold',\r\n});\r\n\r\nconst CreatedText = styled.span({\r\n display: 'none',\r\n [minMicroMediaQuery]: {\r\n display: 'inline-block',\r\n },\r\n});\r\n\r\nconst Alias = styled.div({\r\n marginRight: pixelsToUnit(5),\r\n marginTop: pixelsToUnit(3),\r\n fontWeight: 'bold',\r\n width: 'auto',\r\n maxWidth: pixelsToUnit(70),\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n [minTinyMediaQuery]: {\r\n marginRight: pixelsToUnit(10),\r\n maxWidth: '50%',\r\n },\r\n});\r\n\r\nconst ratingsStyled = styled({\r\n width: pixelsToUnit(16),\r\n height: pixelsToUnit(15),\r\n verticalAlign: 'middle',\r\n ...pseudo(':not(:last-child)', {\r\n marginRight: pixelsToUnit(2),\r\n }),\r\n [minTinyMediaQuery]: {\r\n ...pseudo(':not(:last-child)', {\r\n marginRight: pixelsToUnit(4),\r\n }),\r\n },\r\n});\r\n\r\nconst FullStar = ratingsStyled(Star);\r\nconst DefaultStar = ratingsStyled(StarOutline);\r\n\r\nconst Comments = styled.div({\r\n color: black,\r\n fontSize: sigma,\r\n textAlign: 'left',\r\n});\r\n\r\nconst Text = styled(Comments, {\r\n alignSelf: 'stretch',\r\n backgroundColor: (theme) => theme.cardBackgroundColor,\r\n marginTop: pixelsToUnit(8),\r\n padding: {\r\n y: pixelsToUnit(15),\r\n x: pixelsToUnit(22),\r\n },\r\n [minMediumMediaQuery]: {\r\n marginTop: pixelsToUnit(15),\r\n },\r\n});\r\n\r\nconst dateCreatedStyled = styled({\r\n alignSelf: 'flex-end',\r\n color: silverchalice,\r\n fontSize: kappa,\r\n letterSpacing: pixelsToUnit(0.3),\r\n lineHeight: pixelsToUnit(22),\r\n});\r\n\r\nconst ExtensiveDate = dateCreatedStyled(styled.Div, {\r\n marginTop: pixelsToUnit(14),\r\n});\r\n\r\nconst CompactDate = dateCreatedStyled(styled.Div, {\r\n marginLeft: pixelsToUnit(5),\r\n display: 'flex',\r\n flexGrow: 1,\r\n justifyContent: 'flex-end',\r\n [minTinyMediaQuery]: {\r\n marginLeft: pixelsToUnit(10),\r\n },\r\n});\r\n\r\nconst Label = styled(Name, {\r\n ':after': {\r\n content: \"': '\",\r\n },\r\n});\r\n\r\nconst Answer = styled(Comments, {\r\n backgroundColor: surfCrest,\r\n marginTop: pixelsToUnit(14),\r\n padding: {\r\n y: small,\r\n x: pixelsToUnit(20),\r\n },\r\n});\r\n\r\nconst Admin = styled.div({\r\n flexGrow: 1,\r\n flexShrink: 0,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n position: 'relative',\r\n textAlign: 'left',\r\n [minMediumMediaQuery]: {\r\n flexGrow: 1,\r\n flexShrink: 1,\r\n marginTop: pixelsToUnit(90),\r\n marginLeft: pixelsToUnit(20),\r\n },\r\n});\r\n\r\nconst AdminLogo = styled.img({\r\n height: pixelsToUnit(50),\r\n left: pixelsToUnit(-25),\r\n position: 'absolute',\r\n top: pixelsToUnit(-13.5),\r\n});\r\n","import React, { useState } from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport ReviewViewModelType from 'Reviews/Models/ReviewViewModel.type';\r\nimport { pixelsToUnit, minMediumMediaQuery, silverchalice, transition, white } from 'Shared/Style';\r\nimport Box from './Box';\r\nimport { translate } from '@avensia/scope';\r\n\r\ntype PropType = {\r\n list: ReviewViewModelType[];\r\n isReviewModal?: boolean;\r\n};\r\n\r\nexport default (props: PropType) => {\r\n const [dateSortedList, setDateSortedList] = useState(props.list);\r\n const [latestFirst, setLatestFirst] = useState(true);\r\n const [highestFirst, setHighestFirst] = useState(true);\r\n\r\n function toggleSort() {\r\n const sortedList = props.list.slice().sort((a, b) => {\r\n return new Date(a.publishDate).getTime() - new Date(b.publishDate).getTime();\r\n });\r\n if (latestFirst) {\r\n setDateSortedList(sortedList);\r\n setLatestFirst(!latestFirst);\r\n } else if (!latestFirst) {\r\n setDateSortedList(sortedList.reverse());\r\n setLatestFirst(!latestFirst);\r\n }\r\n }\r\n\r\n function toggleSortRating() {\r\n const sortedRatings = props.list.slice().sort((a, b) => {\r\n return a.rating - b.rating;\r\n });\r\n if (highestFirst) {\r\n setDateSortedList(sortedRatings.reverse());\r\n setHighestFirst(!highestFirst);\r\n } else if (!highestFirst) {\r\n setDateSortedList(sortedRatings);\r\n setHighestFirst(!highestFirst);\r\n }\r\n }\r\n\r\n return props.list && props.list.length > 0 ? (\r\n <Base>\r\n {props.list.length > 4 ? (\r\n <SortContainer>\r\n <SortOptions>\r\n <SortLabel>{translate('/Product/Reviews/Sort')}</SortLabel>\r\n <SortDate onClick={toggleSort}>{translate('/Product/Reviews/Date')}</SortDate>\r\n <SortRating onClick={toggleSortRating}>{translate('/Product/Reviews/Rating')}</SortRating>\r\n </SortOptions>\r\n </SortContainer>\r\n ) : (\r\n <div />\r\n )}\r\n {dateSortedList.map((review) => (\r\n <>\r\n <Box key={review.publishDate} review={review} isModal={props.isReviewModal} />\r\n </>\r\n ))}\r\n </Base>\r\n ) : null;\r\n};\r\n\r\nconst Base = styled.div({\r\n height: 'auto',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n width: '100%',\r\n justifyContent: 'space-between',\r\n marginTop: pixelsToUnit(10),\r\n [minMediumMediaQuery]: {\r\n marginTop: pixelsToUnit(10),\r\n },\r\n});\r\n\r\nconst SortContainer = styled.div({\r\n width: '100%',\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n});\r\n\r\nconst SortOptions = styled.div({\r\n display: 'flex',\r\n borderRadius: '17px',\r\n border: {\r\n xy: {\r\n width: '1px',\r\n style: 'solid',\r\n color: silverchalice,\r\n },\r\n },\r\n});\r\n\r\nconst SortButton = styled.div({\r\n padding: { x: pixelsToUnit(20), y: pixelsToUnit(5) },\r\n backgroundColor: white,\r\n cursor: 'pointer',\r\n ...transition({ property: 'background-color', duration: '0.5s' }),\r\n ':hover': { backgroundColor: silverchalice },\r\n});\r\n\r\nconst SortDate = styled(SortButton, {});\r\n\r\nconst SortRating = styled(SortButton, {\r\n borderRadius: '0 15px 15px 0',\r\n});\r\n\r\nconst SortLabel = styled.div({\r\n backgroundColor: silverchalice,\r\n color: white,\r\n borderRadius: '15px 0 0 15px',\r\n padding: { x: pixelsToUnit(20), y: pixelsToUnit(5) },\r\n});\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { minMediumMediaQuery, pixelsToUnit, epsilon, sigma } from 'Shared/Style';\r\nimport { translate } from '@avensia/scope';\r\nimport Button, { Appearance as ButtonAppearance, Variant as ButtonVariant } from 'Shared/Button';\r\n\r\ntype PropType = StyledProps & {\r\n onClick: () => void;\r\n};\r\n\r\nconst AddReview = styled(Button, {\r\n display: 'block',\r\n fontSize: sigma,\r\n letterSpacing: pixelsToUnit(0.7),\r\n margin: {\r\n x: 'auto',\r\n },\r\n padding: {\r\n x: pixelsToUnit(20),\r\n },\r\n whiteSpace: 'nowrap',\r\n textAlign: 'center',\r\n [minMediumMediaQuery]: {\r\n fontSize: epsilon,\r\n letterSpacing: pixelsToUnit(0.8),\r\n padding: {\r\n x: pixelsToUnit(33),\r\n },\r\n },\r\n});\r\n\r\nexport default styled(function AddReviewButton(props: PropType) {\r\n return (\r\n <AddReview\r\n css={props.compose()}\r\n onClick={props.onClick}\r\n appearance={ButtonAppearance.Secondary}\r\n variant={ButtonVariant.Large}\r\n >\r\n {translate('/Product/Reviews/AddReview')}\r\n </AddReview>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { translate, Breakpoint } from '@avensia/scope';\r\nimport { minMediumMediaQuery, thin, pixelsToUnit, delta, large, gamma, medium, black } from 'Shared/Style';\r\nimport Panel from 'Shared/Panel';\r\nimport connect from 'Shared/connect';\r\nimport ReviewViewModelType from 'Reviews/Models/ReviewViewModel.type';\r\nimport Content from './Modal';\r\nimport { openModal, closeModal } from './action-creators';\r\nimport ReviewBoxList from './List';\r\nimport AddReviewButton from './AddReviewButton';\r\n\r\ntype ConnectStateType = {\r\n isOpen: boolean;\r\n currentBreakpoint?: number;\r\n};\r\n\r\ntype ConnectActionType = {\r\n openModal: () => any;\r\n closeModal: () => any;\r\n};\r\n\r\ntype PropType = ConnectStateType &\r\n ConnectActionType & {\r\n catalogId: number;\r\n language: string;\r\n productCode: string;\r\n averageRating: number;\r\n topReviews: ReviewViewModelType[];\r\n totalReviews: number;\r\n productPageUrl?: string;\r\n toggleReviewPanel: () => void;\r\n };\r\n\r\nconst Reviews = (props: PropType & StyledProps) => {\r\n const isMobile = props.currentBreakpoint < Breakpoint.Medium;\r\n\r\n return (\r\n <styled.Div css={props.compose()}>\r\n <HeaderContainer>\r\n <H2>\r\n {translate('/Product/Reviews/Heading')}\r\n <TotalReviews>{props.totalReviews}</TotalReviews>\r\n </H2>\r\n <ShowAllContainer>\r\n {props.totalReviews > props.topReviews.length && (\r\n <ShowAll onClick={props.toggleReviewPanel}>\r\n {isMobile\r\n ? `${translate('/Product/Reviews/ShowAll')} (${props.totalReviews})`\r\n : translate('/Product/Reviews/ShowAll')}\r\n </ShowAll>\r\n )}\r\n </ShowAllContainer>\r\n </HeaderContainer>\r\n <ReviewBoxList list={props.topReviews} isReviewModal={false} />\r\n <AddReviewButton onClick={props.openModal} />\r\n\r\n <Panel isOpen={props.isOpen} maxHeight={MODAL_HEIGHT} maxWidth={MODAL_WIDTH} onClose={props.closeModal}>\r\n <Content\r\n catalogId={props.catalogId}\r\n language={props.language}\r\n productCode={props.productCode}\r\n close={props.closeModal}\r\n />\r\n </Panel>\r\n </styled.Div>\r\n );\r\n};\r\n\r\nexport default styled(\r\n connect(\r\n (state): ConnectStateType => ({\r\n isOpen: state.productReview.isOpen,\r\n currentBreakpoint: state.currentBreakpoint,\r\n }),\r\n (dispatch): ConnectActionType => ({\r\n openModal: () => dispatch(openModal()),\r\n closeModal: () => dispatch(closeModal()),\r\n }),\r\n )(Reviews),\r\n);\r\n\r\nconst MODAL_HEIGHT = pixelsToUnit(748);\r\nconst MODAL_WIDTH = pixelsToUnit(657);\r\nconst H2 = styled.h2({\r\n fontSize: delta,\r\n marginBottom: large,\r\n letterSpacing: pixelsToUnit(2),\r\n lineHeight: 'normal',\r\n textAlign: 'center',\r\n textTransform: 'uppercase',\r\n [minMediumMediaQuery]: {\r\n fontSize: gamma,\r\n marginBottom: pixelsToUnit(20),\r\n marginTop: pixelsToUnit(20),\r\n letterSpacing: pixelsToUnit(2.3),\r\n },\r\n});\r\n\r\nconst TotalReviews = styled.span({\r\n ':before': {\r\n content: \"'('\",\r\n },\r\n ':after': {\r\n content: \"')'\",\r\n },\r\n marginLeft: medium,\r\n});\r\n\r\nconst ShowAll = styled.span({\r\n borderBottom: {\r\n width: thin,\r\n style: 'solid',\r\n color: black,\r\n },\r\n marginBottom: pixelsToUnit(20),\r\n cursor: 'pointer',\r\n [minMediumMediaQuery]: {\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n marginTop: pixelsToUnit(20),\r\n },\r\n});\r\n\r\nconst HeaderContainer = styled.div({\r\n position: 'relative',\r\n width: '100%',\r\n [minMediumMediaQuery]: {},\r\n});\r\n\r\nconst ShowAllContainer = styled.div({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n});\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { small, pixelsToUnit, minMediumMediaQuery, pageMaxWidth, white } from 'Shared/Style';\r\nimport { Section } from 'Shared/PageLayout';\r\nimport Reviews from 'Product/Reviews';\r\nimport ReviewViewModelType from 'Reviews/Models/ReviewViewModel.type';\r\n\r\ntype ReviewsPropType = {\r\n catalogId: number;\r\n language: string;\r\n productCode: string;\r\n averageRating: number;\r\n topReviews: ReviewViewModelType[];\r\n totalReviews: number;\r\n productPageUrl: string;\r\n isExpandReviews: boolean;\r\n toggleReviewPanel: () => void;\r\n};\r\n\r\ntype RequiredPropType = {\r\n reviews: ReviewsPropType;\r\n isCompact: boolean;\r\n};\r\n\r\ntype PropType = RequiredPropType;\r\n\r\nexport default function ReviewSection(props: PropType) {\r\n const { reviews } = props;\r\n return (\r\n <Base>\r\n <ProductReviews {...reviews} />\r\n </Base>\r\n );\r\n}\r\n\r\nconst Base = styled(Section, {\r\n backgroundColor: white,\r\n padding: {\r\n x: small,\r\n y: small,\r\n },\r\n [minMediumMediaQuery]: {\r\n maxWidth: pixelsToUnit(pageMaxWidth),\r\n padding: {\r\n xy: pixelsToUnit(10),\r\n },\r\n },\r\n});\r\n\r\nconst rightColumnStyled = styled({\r\n [minMediumMediaQuery]: {\r\n flexGrow: 0,\r\n flexShrink: 0,\r\n paddingLeft: '1.5rem',\r\n },\r\n});\r\n\r\nconst ProductReviews = rightColumnStyled(Reviews, {\r\n width: '100%',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n justifyContent: 'center',\r\n});\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { replaceState, translate, on } from '@avensia/scope';\r\nimport { Variant } from 'Shared/Fields/Select';\r\nimport { SizeGuide } from './../ProductDetails';\r\nimport SizeGuidePageViewModelType from 'SizeGuide/SizeGuideViewModel.type';\r\nimport VariationLinkViewModelType from 'Product/VariationLinkViewModel.type';\r\nimport {\r\n sigma,\r\n pixelsToUnit,\r\n thick,\r\n thin,\r\n snuff,\r\n truncate,\r\n alto,\r\n white,\r\n lightSilver,\r\n zeta,\r\n ZIndex,\r\n concrete,\r\n small,\r\n transition,\r\n depth,\r\n large,\r\n minTinyMediaQuery,\r\n minMediumMediaQuery,\r\n} from 'Shared/Style';\r\nimport { Down } from 'Shared/Icon/Arrow';\r\nimport Ul from 'Shared/Generic/Ul';\r\nimport RippleEffect, { rippleContainerStyle } from 'Shared/RippleEffect';\r\nimport Button, { Appearance as ButtonAppearance, Variant as ButtonVariant } from 'Shared/Button';\r\nimport Close from 'Shared/Icon/Close';\r\nimport Panel from 'Shared/Panel';\r\nimport { MobileWatchableButton } from '../WatchableProduct';\r\nimport { media, pseudo } from '@glitz/core';\r\n\r\ntype DesktopPropType = {\r\n value: string;\r\n label?: string;\r\n options: VariationLinkViewModelType[];\r\n onChangeOption?: (value: string) => any;\r\n onWatchableOpen?: () => void;\r\n};\r\n\r\ntype StateType = {\r\n open?: boolean;\r\n};\r\n\r\nconst PLACEHOLDER = '-';\r\n\r\nexport class DesktopSelector extends React.Component<DesktopPropType, StateType> {\r\n unsubscribeBodyClose: () => any;\r\n\r\n constructor(props: DesktopPropType) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: DesktopPropType, prevState: StateType) {\r\n const { open } = this.state;\r\n if (open !== prevState.open) {\r\n if (open) {\r\n this.unsubscribeBodyClose = on('click', () => this.setState({ open: false }));\r\n } else if (this.unsubscribeBodyClose) {\r\n this.unsubscribeBodyClose();\r\n delete this.unsubscribeBodyClose;\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this.unsubscribeBodyClose) {\r\n this.unsubscribeBodyClose();\r\n delete this.unsubscribeBodyClose;\r\n }\r\n }\r\n\r\n toggle = () => this.setState({ open: !this.state.open });\r\n\r\n selectOption(value: string) {\r\n if (this.props.onChangeOption) {\r\n this.props.onChangeOption(value);\r\n }\r\n this.setState({ open: false });\r\n }\r\n\r\n render() {\r\n const variants = this.props.options.map((variant) => ({\r\n text: variant.name,\r\n value: variant.url,\r\n inStock: variant.inStock,\r\n }));\r\n\r\n const selected =\r\n variants.find((o) => o.value === this.props.value) ||\r\n variants.find(\r\n (o) =>\r\n o.value.substring(o.value.lastIndexOf('/')) === this.props.value.substring(this.props.value.lastIndexOf('/')),\r\n );\r\n\r\n return (\r\n <DesktopBase role=\"listbox\">\r\n <Button appearance={[ButtonAppearance.Bare, ButtonAppearance.Full]} onClick={this.toggle}>\r\n <Content>\r\n <styled.Span>\r\n <styled.Span css={{ opacity: 0.4 }}>{this.props.label}:</styled.Span>{' '}\r\n {selected ? selected.text : PLACEHOLDER}\r\n </styled.Span>\r\n {this.state.open ? <IconUp /> : <IconDown />}\r\n </Content>\r\n </Button>\r\n <Options css={this.state.open && { transform: 'scaleY(1)' }}>\r\n {variants.map((option) => (\r\n <OptionLi key={option.value}>\r\n <Option\r\n variant={ButtonVariant.None}\r\n appearance={[ButtonAppearance.Bare, ButtonAppearance.Full]}\r\n noRippleEffect\r\n onClick={() => this.selectOption(option.value)}\r\n >\r\n <OptionContent css={{ width: !option.inStock ? '50%' : '100%' }}>{option.text}</OptionContent>\r\n {!option.inStock && (\r\n <MobileWatchableButton\r\n buttonText={translate('/Product/WatchableProduct/WatchableButtonTextMobile')}\r\n onPanelOpen={this.props.onWatchableOpen}\r\n />\r\n )}\r\n </Option>\r\n </OptionLi>\r\n ))}\r\n </Options>\r\n </DesktopBase>\r\n );\r\n }\r\n}\r\n\r\nconst DesktopBase = styled.div({\r\n alignItems: 'center',\r\n position: 'relative',\r\n maxWidth: '100%',\r\n textTransform: 'uppercase',\r\n zIndex: 3,\r\n backgroundColor: white,\r\n display: 'block',\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightSilver,\r\n },\r\n },\r\n fontSize: sigma,\r\n letterSpacing: pixelsToUnit(1.3),\r\n margin: {\r\n y: large,\r\n x: 0,\r\n },\r\n width: '100%',\r\n});\r\n\r\nconst IconDown = styled(Down, {\r\n width: pixelsToUnit(21),\r\n height: pixelsToUnit(12),\r\n});\r\n\r\nconst IconUp = styled(IconDown, {\r\n transform: 'rotate(180deg)',\r\n});\r\n\r\nconst OptionContent = styled.div({\r\n marginLeft: small,\r\n textAlign: 'left',\r\n width: '50%',\r\n});\r\n\r\nconst Options = styled(Ul, {\r\n fontWeight: 'normal',\r\n position: 'absolute',\r\n top: '100%',\r\n right: 0,\r\n left: 0,\r\n transform: 'scaleY(0)',\r\n transformOrigin: 'center top',\r\n backgroundColor: white,\r\n listStyleType: 'none',\r\n ...transition({ property: 'transform' }),\r\n ...depth(),\r\n});\r\n\r\nconst OptionLi = styled.li({\r\n position: 'relative',\r\n borderBottom: {\r\n width: pixelsToUnit(1),\r\n style: 'solid',\r\n color: '#e4d9eb',\r\n },\r\n padding: {\r\n y: pixelsToUnit(1.5),\r\n },\r\n ...pseudo(':last-child', {\r\n borderBottomStyle: 'none',\r\n }),\r\n ':hover': {\r\n backgroundColor: concrete,\r\n },\r\n});\r\n\r\nconst Option = styled(Button, {\r\n alignItems: 'center',\r\n display: 'flex',\r\n fontSize: sigma,\r\n letterSpacing: pixelsToUnit(1.3),\r\n height: pixelsToUnit(40),\r\n});\r\n\r\nconst Content = styled.div({\r\n alignItems: 'center',\r\n display: 'flex',\r\n fontWeight: 'bold',\r\n justifyContent: 'space-between',\r\n padding: { y: 0, x: pixelsToUnit(20) },\r\n});\r\n\r\n\r\n\r\ntype MobilePropType = {\r\n value: string;\r\n onPanelOpen: () => void;\r\n longVariantName?: boolean;\r\n};\r\n\r\nexport function MobileSelector(props: MobilePropType) {\r\n return (\r\n <MobileSelect variant={Variant.None} appearance={ButtonAppearance.Bare} onClick={props.onPanelOpen}>\r\n <MobileIconUp />\r\n <Text css={props.longVariantName && { fontSize: pixelsToUnit(12) }}>{props.value}</Text>\r\n </MobileSelect>\r\n );\r\n}\r\n\r\nexport function MobileSelectorActionbar(props: MobilePropType) {\r\n return (\r\n <MobileSelectActionbar variant={Variant.None} appearance={ButtonAppearance.Bare} onClick={props.onPanelOpen}>\r\n <TextActionbar css={props.longVariantName && { fontSize: pixelsToUnit(12) }}>{props.value}</TextActionbar>\r\n </MobileSelectActionbar>\r\n );\r\n}\r\n\r\nconst MobileSelect = styled(Button, {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifySelf: 'center',\r\n flexDirection: 'column',\r\n borderRadius: '100%',\r\n width: '3.5rem',\r\n height: '3.5rem',\r\n paddingTop: '0.6rem',\r\n marginTop: pixelsToUnit(4),\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightSilver,\r\n },\r\n },\r\n flex: {\r\n grow: 1,\r\n basis: 1,\r\n },\r\n marginRight: pixelsToUnit(5),\r\n [minTinyMediaQuery]: {\r\n marginRight: pixelsToUnit(20),\r\n },\r\n});\r\n\r\nconst MobileSelectActionbar = styled(Button, {\r\n padding: {x: pixelsToUnit(3), y: 0},\r\n minWidth: '2.5rem',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexDirection: 'column',\r\n backgroundColor: (theme) => theme.buyButtonProductPageMobileText,\r\n color: white,\r\n marginRight: pixelsToUnit(5),\r\n border: {\r\n xy: {\r\n width: thick,\r\n style: 'solid',\r\n color: white,\r\n },\r\n },\r\n [minTinyMediaQuery]: {\r\n marginRight: pixelsToUnit(20),\r\n },\r\n});\r\n\r\nconst Text = styled.span({\r\n textTransform: 'uppercase',\r\n fontSize: pixelsToUnit(20),\r\n lineHeight: '2.2rem',\r\n ...truncate(),\r\n});\r\n\r\nconst TextActionbar = styled(Text,{\r\n fontSize: pixelsToUnit(25),\r\n fontWeight: 800,\r\n lineHeight: 'unset',\r\n});\r\n\r\nconst MobileIconUp = styled(Down, {\r\n position: 'absolute',\r\n top: '0.5rem',\r\n left: '0.65rem',\r\n transform: 'rotate(180deg)',\r\n fontSize: pixelsToUnit(5),\r\n marginTop: pixelsToUnit(2),\r\n color: lightSilver,\r\n margin: {\r\n x: pixelsToUnit(10),\r\n },\r\n width: pixelsToUnit(13),\r\n});\r\n\r\ntype PanelPropType = {\r\n value: {\r\n name: string;\r\n code: string;\r\n };\r\n options: VariationLinkViewModelType[];\r\n open: boolean;\r\n onPanelClose: () => void;\r\n sizeguide: SizeGuidePageViewModelType;\r\n onWatchableOpen?: () => void;\r\n};\r\n\r\nexport function VariantPanel(props: PanelPropType) {\r\n return (\r\n <Panel\r\n css={{ backgroundColor: 'rgba(255, 255, 255, 0.8)' }}\r\n isOpen={props.open}\r\n maxHeight=\"100%\"\r\n maxWidth=\"100%\"\r\n onClose={props.onPanelClose}\r\n >\r\n <CompactBase>\r\n <TopBase>\r\n {!!props.sizeguide && (\r\n <SizeGuideWrapper>\r\n <SizeGuide sizeGuide={props.sizeguide} />\r\n </SizeGuideWrapper>\r\n )}\r\n </TopBase>\r\n <PanelBase>\r\n <Header>\r\n <Heading>{translate('/Product/WatchableProduct/ChooseVariant')}</Heading>\r\n\r\n <ActionButton onClick={props.onPanelClose} variant={ButtonVariant.None} appearance={ButtonAppearance.Bare}>\r\n <Close />\r\n </ActionButton>\r\n </Header>\r\n <VariantList bare>\r\n {props.options.map((variant) => {\r\n const isCurrent = props.value.code === variant.code;\r\n return (\r\n <PanelItem\r\n css={{\r\n cursor: isCurrent ? 'default' : 'pointer',\r\n backgroundColor: isCurrent ? alto : white,\r\n }}\r\n key={variant.code}\r\n variant={variant}\r\n onItemClick={isCurrent ? undefined : replaceState}\r\n onWatchableOpen={props.onWatchableOpen}\r\n />\r\n );\r\n })}\r\n </VariantList>\r\n </PanelBase>\r\n </CompactBase>\r\n </Panel>\r\n );\r\n}\r\n\r\ntype PanelItemPropType = {\r\n variant: VariationLinkViewModelType;\r\n onItemClick: (variantUrl: string) => void | undefined;\r\n onWatchableOpen: () => void;\r\n} & StyledProps;\r\n\r\nconst PanelItem = styled((props: PanelItemPropType) => {\r\n return (\r\n <RippleEffect>\r\n {(ripples: Array<React.ReactElement<any>>, push: (e: React.MouseEvent<HTMLElement>) => Promise<void>) => (\r\n <Li\r\n css={props.compose(rippleContainerStyle)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n onClick={(e) => {\r\n push(e);\r\n }}\r\n >\r\n <Item\r\n // tslint:disable-next-line:jsx-no-lambda\r\n onClick={(e) => {\r\n setTimeout(() => {\r\n if (props.onItemClick) {\r\n props.onItemClick(props.variant.url);\r\n }\r\n }, 250);\r\n }}\r\n >\r\n {props.variant.name}\r\n </Item>\r\n {!props.variant.inStock && (\r\n <CustomMobileButton\r\n buttonText={translate('/Product/WatchableProduct/WatchableButtonTextMobile')}\r\n onPanelOpen={props.onWatchableOpen}\r\n />\r\n )}\r\n {ripples}\r\n </Li>\r\n )}\r\n </RippleEffect>\r\n );\r\n});\r\n\r\nconst VariantList = styled(Ul, {\r\n overflowY: 'auto',\r\n});\r\n\r\nconst Li = styled.li({\r\n alignItems: 'center',\r\n display: 'flex',\r\n borderBottom: {\r\n width: thin,\r\n style: 'solid',\r\n color: snuff,\r\n },\r\n height: pixelsToUnit(50),\r\n padding: {\r\n x: pixelsToUnit(20),\r\n y: pixelsToUnit(12),\r\n },\r\n});\r\n\r\nconst Item = styled.span({\r\n flexGrow: 1,\r\n textTransform: 'uppercase',\r\n ...truncate(),\r\n});\r\n\r\nconst CompactBase = styled.div({\r\n height: '100%',\r\n position: 'fixed',\r\n top: 0,\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n zIndex: ZIndex.Panel,\r\n});\r\n\r\nconst TopBase = styled.div({\r\n position: 'relative',\r\n display: 'flex',\r\n flexGrow: 1,\r\n});\r\n\r\nconst PanelBase = styled.div({\r\n backgroundColor: theme => theme.productMobileActionbar,\r\n minHeight: '50%',\r\n maxHeight: '80%',\r\n position: 'static',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n [minMediumMediaQuery]: {\r\n backgroundColor: white,\r\n },\r\n});\r\n\r\nconst Header = styled.header({\r\n alignItems: 'center',\r\n backgroundColor: (theme) => theme.productMobileActionbar,\r\n color: white,\r\n display: 'flex',\r\n flexShrink: 0,\r\n height: pixelsToUnit(50),\r\n paddingLeft: pixelsToUnit(20),\r\n ...media(minMediumMediaQuery, {\r\n color: (theme) => theme.cardBackgroundColor,\r\n }),\r\n});\r\n\r\nconst Heading = styled.div({\r\n flexGrow: 1,\r\n fontSize: zeta,\r\n fontWeight: 'bold',\r\n textTransform: 'uppercase',\r\n});\r\n\r\nconst ActionButton = styled(Button, {\r\n paddingRight: pixelsToUnit(20),\r\n});\r\n\r\nconst CustomMobileButton = styled(MobileWatchableButton, {\r\n flexGrow: 0,\r\n});\r\n\r\nconst SizeGuideWrapper = styled.div({\r\n position: 'absolute',\r\n bottom: 0,\r\n right: pixelsToUnit(10),\r\n});\r\n","import React, { useState, useLayoutEffect, useRef } from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { translate } from '@avensia/scope';\r\nimport PriceViewModelType from 'Pricing/PriceViewModel.type';\r\nimport { Prices } from 'Product/ProductDetails';\r\nimport AddToCart from 'Product/ProductAddToCart';\r\nimport { MobileSelectorActionbar as VariantSelector } from 'Product/ProductDetails/VariantSelector';\r\nimport { Variant } from 'Shared/Button';\r\nimport { lightSilver, pixelsToUnit, kappa, thin, animation, minTinyMediaQuery, white, thick } from 'Shared/Style';\r\nimport Link from 'Shared/Link';\r\nimport { WatchableButtonActionbar } from '../WatchableProduct';\r\nimport { StyleOrStyleArray } from '@glitz/type';\r\nimport ProductLinkViewModel from 'Product/ProductLinkViewModel.type';\r\nimport { slideUp, slideDown } from '../keyframes.scss';\r\nimport CloseIcon from 'Shared/Icon/Close';\r\n\r\ntype PropType = {\r\n code: string;\r\n ticket: string;\r\n inStock: boolean;\r\n price: PriceViewModelType;\r\n productLinks: ProductLinkViewModel[];\r\n selfProductLink: ProductLinkViewModel;\r\n variantName: string | undefined;\r\n promotionName: string;\r\n campaignCategoryPageUrl: string;\r\n onVariantPanelOpen: () => void | undefined;\r\n onWatchablePanelOpen: () => void | undefined;\r\n addToCart: () => Promise<void>;\r\n};\r\n\r\nconst Base = styled.div({\r\n backgroundColor: (theme) => theme.productMobileActionbar,\r\n padding: { x: 0, y: pixelsToUnit(10) },\r\n display: 'flex',\r\n justifyContent: 'center',\r\n width: '100vw',\r\n borderTop: {\r\n style: 'solid',\r\n color: lightSilver,\r\n width: thin,\r\n },\r\n});\r\n\r\nconst Wrapper = styled.div({\r\n width: '100%',\r\n maxWidth: '40rem',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n padding: {\r\n x: '1rem',\r\n y: 0,\r\n },\r\n});\r\n\r\nconst ProductPrices = styled(Prices, {\r\n flexDirection: 'column',\r\n display: 'flex',\r\n flexGrow: 1,\r\n justifyContent: 'flex-start',\r\n});\r\n\r\nconst ProductLinksMenu = styled.div({\r\n position: 'absolute',\r\n left: 0,\r\n opacity: 0,\r\n width: '100%',\r\n zIndex: -2,\r\n backgroundColor: (theme) => theme.productMobileActionbar,\r\n paddingBottom: '2rem',\r\n});\r\n\r\nconst ProductLinkItemContainer = styled.div({\r\n display: 'flex',\r\n justifyContent: 'left',\r\n marginTop: '0.3rem',\r\n});\r\n\r\nconst ProductLinksMenuTopBar = styled.div({\r\n height: '2rem',\r\n width: '100%',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n backgroundColor: 'white',\r\n border: {\r\n y: {\r\n width: thin,\r\n style: 'solid',\r\n color: 'lightgray',\r\n },\r\n },\r\n});\r\n\r\nconst ProductLinksMenuTitle = styled.div({\r\n display: 'flex',\r\n fontWeight: 'bold',\r\n textTransform: 'uppercase',\r\n lineHeight: '2rem',\r\n});\r\n\r\nconst ProductLinkItemWrapper = styled.div({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '3.5rem',\r\n height: '3.5rem',\r\n marginTop: '0.2rem',\r\n backgroundColor: 'white',\r\n borderRadius: pixelsToUnit(5),\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightSilver,\r\n },\r\n },\r\n});\r\n\r\nconst ProductLinkItem = styled(Link, {\r\n width: '3.4rem',\r\n height: '3.4rem',\r\n borderRadius: pixelsToUnit(5),\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightSilver,\r\n },\r\n },\r\n});\r\n\r\nconst ProductLinkItemThumb = styled(ProductLinkItem, {\r\n borderRadius: 0,\r\n width: '3.5rem',\r\n height: '3.5rem',\r\n margin: { xy: '0.2rem' },\r\n});\r\n\r\nexport default function ProductActionbar(props: PropType) {\r\n const watchableButtonProps = {\r\n buttonText: translate('/Product/WatchableProduct/WatchableButtonTextMobile'),\r\n onPanelOpen: props.onWatchablePanelOpen,\r\n };\r\n\r\n const longPrice = props.price.current.toString().length > 3;\r\n\r\n const longVariantName = props.variantName && props.variantName.length > 3;\r\n\r\n const [isProductLinkPanelOpen, setIsProductLinkPanelOpen] = useState(false);\r\n const mobileActionButtonStyle: StyleOrStyleArray = {\r\n backgroundColor: (theme) => theme.buyButtonProductPageMobile,\r\n color: (theme) => theme.buyButtonProductPageMobileText,\r\n maxWidth: '30vw',\r\n height: '2.5rem',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n alignSelf: 'center',\r\n fontWeight: 800,\r\n fontSize: longVariantName ? pixelsToUnit(20) : pixelsToUnit(25),\r\n };\r\n const [height, setHeight] = useState(0);\r\n const ref = useRef(null);\r\n\r\n useLayoutEffect(() => {\r\n if (!!props.productLinks) {\r\n setHeight(ref.current.clientHeight);\r\n }\r\n }, []);\r\n\r\n const ProductLinksMenuUp: StyleOrStyleArray = {\r\n ...animation({\r\n name: slideUp,\r\n duration: '0.4s',\r\n fillMode: 'both',\r\n }),\r\n top: -height - 35,\r\n };\r\n\r\n const ProductLinksMenuDown: StyleOrStyleArray = {\r\n ...animation({\r\n name: slideDown,\r\n duration: '0.4s',\r\n fillMode: 'both',\r\n }),\r\n top: -height - 35,\r\n };\r\n\r\n function toggleColorPanel() {\r\n setIsProductLinkPanelOpen(!isProductLinkPanelOpen);\r\n }\r\n\r\n return (\r\n <Base>\r\n {props.productLinks && (\r\n <ProductLinksMenu css={isProductLinkPanelOpen ? ProductLinksMenuUp : ProductLinksMenuDown}>\r\n <ProductLinksMenuTopBar>\r\n <styled.Div css={centerContentStyle}>\r\n {props.productLinks[0].linkDisplayType === 'color' ? (\r\n <ProductLinksMenuTitle css={{ width: '100%', justifyContent: 'space-between' }}>\r\n {translate('/Product/Colors')}\r\n <div onClick={toggleColorPanel}>\r\n <CloseIcon />\r\n </div>\r\n </ProductLinksMenuTitle>\r\n ) : (\r\n <ProductLinksMenuTitle>{translate('/Product/Variants')}</ProductLinksMenuTitle>\r\n )}\r\n </styled.Div>\r\n </ProductLinksMenuTopBar>\r\n <styled.Div css={{ width: '100%', display: 'flex', justifyContent: 'center' }} ref={ref}>\r\n <ProductLinkItemContainer css={leftContentStyle}>\r\n {props.productLinks.map((item: ProductLinkViewModel) => (\r\n <>\r\n {item.linkDisplayType === 'color' ? (\r\n <div\r\n style={{\r\n width: pixelsToUnit(80),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <ProductLinkItemWrapper>\r\n <ProductLinkItem\r\n key={item.url}\r\n to={item.url}\r\n css={{ backgroundColor: '#' + item.linkDisplayValue }}\r\n ></ProductLinkItem>\r\n </ProductLinkItemWrapper>\r\n <div style={{ color: white }}>{item.tooltip}</div>\r\n </div>\r\n ) : (\r\n <ProductLinkItemThumb key={item.url} to={item.url}>\r\n <ThumbImage src={item.linkDisplayValue} />\r\n </ProductLinkItemThumb>\r\n )}\r\n </>\r\n ))}\r\n </ProductLinkItemContainer>\r\n </styled.Div>\r\n </ProductLinksMenu>\r\n )}\r\n <Wrapper>\r\n <TextSection>\r\n <>{!props.inStock && <OutOfStockText>{translate('/Product/OutOfStock')}</OutOfStockText>}</>\r\n <ProductPrices prices={props.price} longPrice={longPrice} isCompact productActionbarMobile />\r\n </TextSection>\r\n <ButtonSection>\r\n {props.productLinks && (\r\n <LinkMenuButton onClick={toggleColorPanel}>\r\n {props.productLinks[0].linkDisplayType === 'color' ? (\r\n <CenterColor css={{ backgroundColor: '#' + props.selfProductLink.linkDisplayValue }}></CenterColor>\r\n ) : (\r\n <CurrentLinkThumb src={props.selfProductLink.linkDisplayValue}></CurrentLinkThumb>\r\n )}\r\n </LinkMenuButton>\r\n )}\r\n {props.variantName && (\r\n <VariantSelector\r\n longVariantName={longVariantName}\r\n value={props.variantName}\r\n onPanelOpen={props.onVariantPanelOpen}\r\n />\r\n )}\r\n {props.inStock ? (\r\n <AddCart\r\n css={mobileActionButtonStyle}\r\n variant={Variant.Medium}\r\n disabled={!props.inStock}\r\n addToCart={props.addToCart}\r\n >\r\n {translate('/Product/BuyActionbarMobile')}\r\n </AddCart>\r\n ) : (\r\n <WatchableButtonActionbar {...watchableButtonProps}>\r\n {translate('/Product/WatchableProduct/WatchableButtonText')}\r\n </WatchableButtonActionbar>\r\n )}\r\n </ButtonSection>\r\n </Wrapper>\r\n </Base>\r\n );\r\n}\r\n\r\nconst centerContentStyle: StyleOrStyleArray = {\r\n maxWidth: '40rem',\r\n display: 'flex',\r\n width: '100%',\r\n justifyContent: 'space-between',\r\n padding: { x: '1rem', y: 0 },\r\n backgroundColor: (theme) => theme.productMobileActionbar,\r\n color: white,\r\n};\r\n\r\nconst leftContentStyle: StyleOrStyleArray = {\r\n maxWidth: '40rem',\r\n display: 'flex',\r\n width: '100%',\r\n padding: { x: '0.7rem', y: 0 },\r\n flexWrap: 'wrap',\r\n justifyContent: 'center',\r\n};\r\n\r\nconst TextSection = styled.div({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignSelf: 'center',\r\n});\r\n\r\nconst ButtonSection = styled.div({\r\n display: 'flex',\r\n width: '50vw',\r\n justifyContent: 'flex-end',\r\n});\r\n\r\nconst LinkMenuButtonBase = styled.div({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n});\r\n\r\nconst LinkMenuButton = styled(LinkMenuButtonBase, {\r\n width: '2.5rem',\r\n marginRight: pixelsToUnit(5),\r\n borderRadius: pixelsToUnit(5),\r\n border: {\r\n xy: {\r\n width: thick,\r\n style: 'solid',\r\n color: white,\r\n },\r\n },\r\n [minTinyMediaQuery]: {\r\n marginRight: pixelsToUnit(20),\r\n },\r\n});\r\n\r\nconst CenterColor = styled(LinkMenuButtonBase, {\r\n height: '100%',\r\n width: '100%',\r\n borderRadius: pixelsToUnit(3),\r\n});\r\n\r\nconst CurrentLinkThumb = styled.img({\r\n height: '2rem',\r\n width: '2rem',\r\n borderRadius: '100%',\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightSilver,\r\n },\r\n },\r\n});\r\n\r\nconst ThumbImage = styled.img({});\r\n\r\nconst AddCart = styled(AddToCart, {\r\n maxWidth: '30vw',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n flex: {\r\n grow: 1,\r\n basis: 1,\r\n },\r\n});\r\n\r\nconst OutOfStockText = styled.span({\r\n display: 'flex',\r\n alignItems: 'center',\r\n fontSize: kappa,\r\n letterSpacing: pixelsToUnit(0.3),\r\n lineHeight: pixelsToUnit(16),\r\n color: white,\r\n});\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { translate } from '@avensia/scope';\r\nimport Products, { Layout } from 'Product/ProductCard/List';\r\nimport EsalesProductForList from '../../../Esales/Models/EsalesProductForList.type';\r\nimport { delta, omega, pixelsToUnit, minMediumMediaQuery, epsilon, minTinyMediaQuery } from 'Shared/Style';\r\n\r\ntype PropType = {\r\n relatedProducts: EsalesProductForList[];\r\n};\r\n\r\nconst Base = styled.section({\r\n padding: {\r\n x: pixelsToUnit(15),\r\n },\r\n});\r\n\r\nconst ResponsiveH2 = styled.h2({\r\n fontSize: epsilon,\r\n textAlign: 'center',\r\n letterSpacing: pixelsToUnit(1.61),\r\n margin: {\r\n bottom: pixelsToUnit(28),\r\n },\r\n [minTinyMediaQuery]: {\r\n fontSize: delta,\r\n },\r\n [minMediumMediaQuery]: {\r\n letterSpacing: pixelsToUnit(3.2),\r\n fontSize: omega,\r\n },\r\n});\r\n\r\nexport default (props: PropType) => (\r\n <Base>\r\n <ResponsiveH2>{translate('/Product/RelatedProducts')}</ResponsiveH2>\r\n <Products products={props.relatedProducts} layout={Layout.Block} />\r\n </Base>\r\n);\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { translate } from '@avensia/scope';\r\nimport Products, { Layout } from 'Product/ProductCard/List';\r\nimport EsalesProductForList from '../../../Esales/Models/EsalesProductForList.type';\r\nimport { delta, omega, pixelsToUnit, minMediumMediaQuery } from 'Shared/Style';\r\n\r\ntype PropType = {\r\n recentlyViewed: EsalesProductForList[];\r\n};\r\n\r\nconst Base = styled.section({\r\n padding: {\r\n x: pixelsToUnit(15),\r\n },\r\n});\r\n\r\nconst ResponsiveH2 = styled.h2({\r\n fontSize: delta,\r\n textAlign: 'center',\r\n textTransform: 'uppercase',\r\n letterSpacing: pixelsToUnit(3.2),\r\n margin: {\r\n bottom: pixelsToUnit(28),\r\n },\r\n [minMediumMediaQuery]: {\r\n fontSize: omega,\r\n },\r\n});\r\n\r\nexport default (props: PropType) => (\r\n <Base>\r\n <ResponsiveH2>{translate('/Product/RecentlyViewed')}</ResponsiveH2>\r\n <Products products={props.recentlyViewed} layout={Layout.Block} />\r\n </Base>\r\n);\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport ReviewViewModelType from 'Reviews/Models/ReviewViewModel.type';\r\nimport Panel from 'Shared/Panel';\r\nimport Icon from 'Shared/Icon/Close';\r\nimport { pixelsToUnit, minMediumMediaQuery, minLargeMediaQuery } from 'Shared/Style';\r\nimport List from './../List';\r\nimport AverageRating, { Spacing, Size } from '../../ProductDetails/AverageRating';\r\nimport { translate } from '@avensia/scope';\r\nimport AddReviewButton from '../AddReviewButton';\r\nimport { openModal, closeModal } from '../action-creators';\r\nimport connect from 'Shared/connect';\r\n\r\ntype ConnectActionType = {\r\n openModal: () => any;\r\n closeModal: () => any;\r\n};\r\n\r\ntype ConnectStateType = {\r\n isOpen: boolean;\r\n currentBreakpoint?: number;\r\n};\r\n\r\ntype PropType = ConnectActionType & {\r\n list: ReviewViewModelType[];\r\n isExpandReviews: boolean;\r\n closeReviews: () => void;\r\n showMore: (fetchingDone: () => void) => void;\r\n averageRating: number;\r\n isCompact: boolean;\r\n totalReview: number;\r\n isModalList?: boolean;\r\n isReviewModal?: boolean;\r\n};\r\n\r\ntype OwnState = {\r\n loading: boolean;\r\n};\r\n\r\nconst MODAL_HEIGHT = '748px';\r\nconst MODAL_WIDTH = '657px';\r\nclass ViewAllReviews extends React.Component<PropType, OwnState> {\r\n ref = React.createRef<HTMLDivElement>();\r\n constructor(props: PropType) {\r\n super(props);\r\n this.state = {\r\n loading: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.getMoreReviews();\r\n }\r\n\r\n getMoreReviews = () => {\r\n if (!this.state.loading) {\r\n this.setState({ loading: true }, () => this.props.showMore(() => this.setState({ loading: false })));\r\n }\r\n };\r\n\r\n closeReviewsOpenSubmitOwnReview = () => {\r\n this.props.closeReviews();\r\n setTimeout(() => this.props.openModal(), 200);\r\n };\r\n\r\n betweenRange = (x: number, min: number, max: number) => {\r\n return x >= min && x <= max;\r\n };\r\n\r\n handleScroll = (e: React.UIEvent) => {\r\n const bottom = this.betweenRange(\r\n e.currentTarget.scrollHeight - e.currentTarget.scrollTop,\r\n e.currentTarget.clientHeight - 2,\r\n e.currentTarget.clientHeight + 2,\r\n );\r\n if (bottom && this.props.list.length < this.props.totalReview) {\r\n this.getMoreReviews();\r\n }\r\n };\r\n\r\n render() {\r\n return (\r\n <Panel\r\n isOpen={this.props.isExpandReviews}\r\n maxHeight={MODAL_HEIGHT}\r\n maxWidth={MODAL_WIDTH}\r\n onClose={this.props.closeReviews}\r\n >\r\n <Close css={this.props.isCompact && { top: pixelsToUnit(35) }} onClick={this.props.closeReviews}>\r\n <StyledIcon />\r\n </Close>\r\n <Heading>\r\n <HeadingText css={this.props.isCompact && { margin: { y: pixelsToUnit(5) } }}>\r\n {this.props.isCompact\r\n ? `${translate('/Product/Reviews/Heading')} (${this.props.totalReview})`\r\n : `${this.props.totalReview} ${translate('/Product/Reviews/Heading')}`}\r\n </HeadingText>\r\n <AverageRating\r\n average={this.props.averageRating}\r\n spacing={this.props.isCompact ? Spacing.Medium : Spacing.Wide}\r\n size={this.props.isCompact ? Size.Large : Size.Huge}\r\n />\r\n </Heading>\r\n <ReviewsList onScroll={this.handleScroll}>\r\n <List key={this.props.list.length} list={this.props.list} isReviewModal={true} />\r\n </ReviewsList>\r\n <ButtonWrapper>\r\n <AddReviewButton onClick={this.closeReviewsOpenSubmitOwnReview} />\r\n </ButtonWrapper>\r\n </Panel>\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n (state): ConnectStateType => ({\r\n isOpen: state.productReview.isOpen,\r\n currentBreakpoint: state.currentBreakpoint,\r\n }),\r\n (dispatch): ConnectActionType => ({\r\n openModal: () => dispatch(openModal()),\r\n closeModal: () => dispatch(closeModal()),\r\n }),\r\n)(ViewAllReviews);\r\n\r\nconst Close = styled.div({\r\n position: 'absolute',\r\n top: pixelsToUnit(40),\r\n bottom: pixelsToUnit(20),\r\n right: pixelsToUnit(20),\r\n cursor: 'pointer',\r\n height: 'fit-content',\r\n [minMediumMediaQuery]: {\r\n right: pixelsToUnit(40),\r\n },\r\n});\r\n\r\nconst StyledIcon = styled(Icon, {\r\n width: pixelsToUnit(25),\r\n height: pixelsToUnit(25),\r\n [minLargeMediaQuery]: {\r\n width: pixelsToUnit(40),\r\n height: pixelsToUnit(40),\r\n },\r\n});\r\n\r\nconst ButtonWrapper = styled.div({\r\n marginBottom: '1rem',\r\n});\r\n\r\nconst ReviewsList = styled.div({\r\n height: `calc(100% - ${pixelsToUnit(120)})`,\r\n width: `calc(100% - ${pixelsToUnit(10)})`,\r\n padding: {\r\n x: pixelsToUnit(15),\r\n },\r\n margin: {\r\n x: 'auto',\r\n y: pixelsToUnit(20),\r\n },\r\n overflow: 'auto',\r\n [minMediumMediaQuery]: {\r\n marginTop: 0,\r\n padding: {\r\n x: pixelsToUnit(40),\r\n },\r\n },\r\n});\r\n\r\nconst Heading = styled.div({\r\n width: '100%',\r\n textAlign: 'center',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'flex-end',\r\n paddingBottom: pixelsToUnit(16),\r\n height: pixelsToUnit(105),\r\n [minLargeMediaQuery]: {\r\n height: pixelsToUnit(120),\r\n },\r\n});\r\n\r\nconst HeadingText = styled.h1({\r\n textTransform: 'uppercase',\r\n letterSpacing: pixelsToUnit(2),\r\n fontSize: pixelsToUnit(18),\r\n fontWeight: 'bold',\r\n lineHeight: '100%',\r\n marginBottom: pixelsToUnit(10),\r\n [minLargeMediaQuery]: {\r\n fontSize: pixelsToUnit(26),\r\n right: pixelsToUnit(40),\r\n },\r\n});\r\n","import React from 'react';\r\nimport connect from 'Shared/connect';\r\nimport { styled } from '@glitz/react';\r\nimport { pixelsToUnit, thin, minMediumMediaQuery, minLargeMediaQuery, lightBlack, black } from 'Shared/Style';\r\nimport { translate } from '@avensia/scope';\r\nimport Image, { Preset as ImagePreset, Ratio as ImageRatio } from 'Shared/Image/Ratio';\r\nimport Link from 'Shared/Link';\r\nimport Price, { Type as PriceType } from 'Pricing/Price';\r\nimport GwpListViewModelType from './GwpListViewModel.type';\r\n\r\ntype ConnectedPropType = {\r\n cloakedImages: boolean;\r\n};\r\n\r\ntype GiftWithPurchaseType = {\r\n gwpFreePromotion: GwpListViewModelType;\r\n};\r\n\r\ntype PropType = GiftWithPurchaseType & ConnectedPropType;\r\n\r\nfunction GwpFreeItem(props: PropType) {\r\n const { gwpFreePromotion } = props;\r\n const { giftItem } = gwpFreePromotion;\r\n\r\n return (\r\n <PromotionContainer>\r\n <FreeItemTitle>{translate('/Product/GiftWithPurchase/Title')}</FreeItemTitle>\r\n <ImageAndInfoContainer>\r\n <PhotoContainer>\r\n <Link to={giftItem.url}>\r\n <ImageStyled\r\n preset={!giftItem.image.includes('.gif') ? ImagePreset.Tiny : undefined}\r\n ratio={ImageRatio.OneToOne}\r\n src={giftItem.image}\r\n />\r\n </Link>\r\n </PhotoContainer>\r\n <ItemDetailsContainer>\r\n <PromotionDescriptionText>{gwpFreePromotion.promotionConditionDescription}</PromotionDescriptionText>\r\n <Link to={giftItem.url}>\r\n <ProductNameText>{giftItem.displayName}</ProductNameText>\r\n </Link>\r\n <p>\r\n {translate('/Product/GiftWithPurchase/PriceLabel')} \r\n <PriceValue\r\n current={giftItem.price.original}\r\n currency={giftItem.price.currency}\r\n priceType={PriceType.Regular}\r\n />\r\n </p>\r\n </ItemDetailsContainer>\r\n </ImageAndInfoContainer>\r\n </PromotionContainer>\r\n );\r\n}\r\n\r\nexport default connect((state) => ({\r\n cloakedImages: state.appShellData.cloakProductImages,\r\n}))(GwpFreeItem);\r\n\r\nconst PromotionContainer = styled.div({\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: '#cccccc',\r\n },\r\n },\r\n margin: {\r\n x: pixelsToUnit(10),\r\n y: pixelsToUnit(20),\r\n },\r\n position: 'relative',\r\n // flexFlow: 'row nowrap',\r\n [minMediumMediaQuery]: {\r\n margin: {\r\n x: pixelsToUnit(0),\r\n y: 0,\r\n },\r\n },\r\n});\r\n\r\nconst ImageAndInfoContainer = styled.div({\r\n display: 'flex',\r\n});\r\n\r\nconst ItemDetailsContainer = styled.div({\r\n display: 'flex',\r\n alignSelf: 'center',\r\n flexFlow: 'column',\r\n flexBasis: '100%',\r\n marginLeft: pixelsToUnit(20),\r\n textAlign: 'left',\r\n [minMediumMediaQuery]: {\r\n marginLeft: pixelsToUnit(20),\r\n justifyContent: 'center',\r\n },\r\n});\r\n\r\nconst PhotoContainer = styled.div({\r\n flexGrow: 1,\r\n});\r\n\r\nconst FreeItemTitle = styled.p({\r\n backgroundColor: (theme) => theme.campaignBackgroundColor,\r\n color: black,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n fontWeight: 'bold',\r\n lineHeight: pixelsToUnit(33),\r\n letterSpacing: pixelsToUnit(2.2),\r\n fontSize: pixelsToUnit(14),\r\n textAlign: 'center',\r\n [minMediumMediaQuery]: {\r\n top: 0,\r\n position: 'relative',\r\n textAlign: 'left',\r\n fontSize: pixelsToUnit(16),\r\n },\r\n [minLargeMediaQuery]: {\r\n fontSize: pixelsToUnit(18),\r\n },\r\n});\r\n\r\nconst PromotionDescriptionText = styled.p({\r\n fontSize: pixelsToUnit(16),\r\n lineHeight: pixelsToUnit(20),\r\n color: lightBlack,\r\n marginTop: pixelsToUnit(0),\r\n});\r\n\r\nconst ProductNameText = styled.p({\r\n fontWeight: 'bold',\r\n color: lightBlack,\r\n});\r\n\r\nconst PriceValue = styled(Price, {\r\n fontWeight: 'bold',\r\n});\r\n\r\nconst ImageStyled = styled(Image, {\r\n width: pixelsToUnit(100),\r\n height: 'auto',\r\n [minMediumMediaQuery]: {\r\n width: pixelsToUnit(100),\r\n },\r\n});\r\n","/**\r\n * @ComponentFor VariationViewModel\r\n */\r\nimport React from 'react';\r\nimport { Style } from '@glitz/type';\r\nimport { styled } from '@glitz/react';\r\nimport { translate, Breakpoint, scrollTo, isIE, replaceState } from '@avensia/scope';\r\nimport { epiPropertyValue, ContentArea } from '@avensia/scope-episerver';\r\nimport Image, { Ratio } from 'Shared/Image/Ratio';\r\nimport Link from 'Shared/Link';\r\nimport { CacheItem } from '@avensia/scope/CurrentPage/cache';\r\nimport { addToCart } from 'Cart/action-creators';\r\nimport { getReviews, initializeReviews } from './Reviews/action-creators';\r\nimport { Basic, Layout as PageLayout, Appearance } from 'Shared/PageLayout';\r\nimport { Actionbar } from 'SiteLayout/Tray';\r\nimport VariationViewModelType from './VariationViewModel.type';\r\nimport ProductLinkViewModelType from './ProductLinkViewModel.type';\r\nimport linkDisplayType from './LinkDisplayType.type';\r\nimport connect from 'Shared/connect';\r\nimport Viewport from 'Shared/Viewport';\r\nimport ProductMedia from './ProductMedia';\r\nimport ProductDesigner, { ProductDesignerConfigurator } from './ProductDesigner';\r\nimport Cross from 'Shared/Icon/RemovePlain';\r\nimport { prepareVariationName } from 'Shared/variation-helper';\r\nimport {\r\n minTinyMediaQuery,\r\n minMediumMediaQuery,\r\n minHugeMediaQuery,\r\n pixelsToUnit,\r\n kappa,\r\n white,\r\n medium,\r\n zeta,\r\n eta,\r\n omega,\r\n epsilon,\r\n large,\r\n delta,\r\n darkerGray,\r\n sunsetOrange,\r\n thin,\r\n small,\r\n lightSilver,\r\n animation,\r\n transition,\r\n ZIndex,\r\n wildwatermelon,\r\n depth,\r\n sigma,\r\n} from 'Shared/Style';\r\n\r\nimport CommonPurchaseCombination from './CommonPurchaseCombination/CommonPurchaseCombination';\r\nimport ProductDescriptionSection from './ProductDescriptionSection';\r\nimport ReviewSection from './ReviewSection';\r\nimport Breadcrumbs from 'Shared/Breadcrumbs';\r\nimport { Variant } from 'Shared/Button';\r\nimport Icon from 'Shared/Icon/Cart';\r\nimport { Theme } from 'Shared/Theming';\r\nimport { Brand, ProductName, Prices, UspBullets, SizeGuide } from './ProductDetails';\r\nimport ProductActionbar from './ProductActionbar';\r\nimport { DesktopSelector as VariantSelector, VariantPanel } from './ProductDetails/VariantSelector';\r\nimport AverageRating, { Spacing, Size } from './ProductDetails/AverageRating';\r\nimport AddToCart from './ProductAddToCart';\r\nimport ProductRelated from './ProductRelated';\r\nimport ProductRecentlyViewed from './ProductRecentlyViewed';\r\nimport { Check } from 'Shared/Icon/Check-Thin';\r\nimport ViewAllReviews from './Reviews/ViewAll';\r\nimport { WatchableButton, WatchablePanel } from './WatchableProduct';\r\nimport ReviewViewModelType from 'Reviews/Models/ReviewViewModel.type';\r\nimport { COLOR_NOT_TRANSPARENT } from './ProductDetails/shared';\r\nimport ReviewViewModel from 'Reviews/Models/ReviewViewModel.type';\r\nimport GwpFreeItem from './GiftWithPurchase/';\r\nimport { ProductDesignerType } from 'Shared/State';\r\nimport { DiscountTriBadge } from 'Product/ProductCard/Badge';\r\nimport { Down } from 'Shared/Icon/Arrow';\r\n\r\ntype ConnectStateType = {\r\n currentTheme: string;\r\n currentBreakpoint: number;\r\n allReviews: ReviewViewModelType[];\r\n reviewsPage: number;\r\n productReviewId: string;\r\n designTagProperties: ProductDesignerType;\r\n};\r\n\r\ntype ConnectActionType = {\r\n addToCart: (\r\n code: string,\r\n quantity: number,\r\n ticket: string,\r\n designTagProperties: ProductDesignerType,\r\n ) => Promise<void>;\r\n getReviews: (url: string, id: string, page: number) => Promise<void>;\r\n initializeReviews: (id: string, reviews: ReviewViewModel[], page: number, totalCount: number) => Promise<void>;\r\n};\r\n\r\ntype PropType = VariationViewModelType &\r\n ProductLinkViewModelType &\r\n linkDisplayType &\r\n CacheItem &\r\n ConnectStateType &\r\n ConnectActionType;\r\n\r\ntype StateType = {\r\n isPanelOpen: boolean;\r\n isWatchablePanelOpen: boolean;\r\n isExpandReviews: boolean;\r\n isFullscreenViewCarouselOpen: boolean;\r\n isColorPanelOpen: boolean;\r\n};\r\n\r\nconst Base = styled(Basic, {\r\n position: 'relative',\r\n});\r\n\r\nconst UspContainer = styled.div({\r\n display: 'flex',\r\n marginBottom: pixelsToUnit(10),\r\n});\r\n\r\nconst ImageContainer = styled.div({\r\n minWidth: pixelsToUnit(45),\r\n minHeight: pixelsToUnit(45),\r\n marginRight: pixelsToUnit(7),\r\n});\r\n\r\nconst MarginContainer = styled(Basic, {\r\n margin: {\r\n x: '1rem',\r\n y: 0,\r\n },\r\n [minHugeMediaQuery]: {\r\n margin: {\r\n x: 0,\r\n y: 0,\r\n },\r\n },\r\n});\r\n\r\nconst Wrapper = styled.div({\r\n backgroundColor: white,\r\n});\r\n\r\nconst PercentDiscountBadge = styled.div({\r\n position: 'absolute',\r\n color: white,\r\n borderRadius: '100%',\r\n left: '1rem',\r\n width: pixelsToUnit(60),\r\n height: pixelsToUnit(60),\r\n backgroundColor: (theme) => theme.discountBadgeColor,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n zIndex: ZIndex.Tray,\r\n fontWeight: 'bold',\r\n fontSize: pixelsToUnit(22),\r\n});\r\n\r\nconst LastBreadcrumb = styled(Breadcrumbs, {\r\n fontSize: sigma,\r\n color: (theme) => theme.textColor,\r\n});\r\n\r\nconst CustomBreadcrumbs = styled(Breadcrumbs, {\r\n fontSize: eta,\r\n letterSpacing: pixelsToUnit(0.2),\r\n margin: {\r\n y: pixelsToUnit(10),\r\n x: 0,\r\n },\r\n textAlign: 'center',\r\n [minMediumMediaQuery]: {\r\n fontSize: kappa,\r\n marginLeft: pixelsToUnit(20),\r\n textAlign: 'left',\r\n },\r\n});\r\n\r\nconst Campaign = styled.div({\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n justifyContent: 'center',\r\n marginTop: pixelsToUnit(5),\r\n color: wildwatermelon,\r\n textAlign: 'center',\r\n fontWeight: 700,\r\n fontSize: eta,\r\n textTransform: 'uppercase',\r\n letterSpacing: pixelsToUnit(0.9),\r\n ':hover': {\r\n textDecoration: 'underline',\r\n },\r\n [minTinyMediaQuery]: {\r\n fontSize: kappa,\r\n letterSpacing: pixelsToUnit(1.1),\r\n },\r\n [minMediumMediaQuery]: {\r\n justifyContent: 'flex-start',\r\n },\r\n});\r\n\r\nconst SameDayDelivery = styled.div({\r\n textAlign: 'center',\r\n letterSpacing: pixelsToUnit(0.3),\r\n fontSize: zeta,\r\n marginTop: pixelsToUnit(14),\r\n [minMediumMediaQuery]: {\r\n color: darkerGray,\r\n },\r\n});\r\n\r\nconst IconCart = styled(Icon, {\r\n position: 'relative',\r\n top: pixelsToUnit(-1),\r\n left: pixelsToUnit(-5),\r\n height: pixelsToUnit(22),\r\n});\r\n\r\nconst AddCart = styled(AddToCart, {\r\n paddingTop: pixelsToUnit(8),\r\n lineHeight: 0,\r\n fontSize: delta,\r\n margin: {\r\n y: large,\r\n },\r\n});\r\n\r\nconst IconWrap = styled.div({\r\n paddingBottom: pixelsToUnit(8),\r\n});\r\n\r\nconst DescriptionAndSizeGuide = styled.div({\r\n alignItems: 'flex-end',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n marginBottom: large,\r\n});\r\n\r\nconst AverageContainer = styled.div({\r\n display: 'block',\r\n margin: {\r\n y: pixelsToUnit(16),\r\n x: 0,\r\n },\r\n [minMediumMediaQuery]: {\r\n display: 'flex',\r\n },\r\n});\r\n\r\nconst LastBreadCrumbBrandContainer = styled.div({\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n width: '100%',\r\n marginLeft: pixelsToUnit(-5),\r\n});\r\n\r\nconst TotalReviews = styled.div({\r\n fontSize: zeta,\r\n marginTop: pixelsToUnit(10),\r\n [minMediumMediaQuery]: {\r\n fontSize: epsilon,\r\n margin: {\r\n left: medium,\r\n top: 0,\r\n },\r\n },\r\n});\r\n\r\nconst DetailsUsp = styled.div({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: { x: 0, y: '0.5rem' },\r\n backgroundColor: (theme) => theme.cardBackgroundColor,\r\n [minTinyMediaQuery]: {\r\n justifyContent: 'space-around',\r\n flexDirection: 'row',\r\n },\r\n});\r\n\r\nconst DetailsUspVxn = styled.div({});\r\n\r\nconst UspItem = styled.span({\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n fontSize: zeta,\r\n [minTinyMediaQuery]: {\r\n letterSpacing: pixelsToUnit(0.3),\r\n },\r\n});\r\n\r\nconst UspItemText = styled.span({\r\n textAlign: 'left',\r\n [minTinyMediaQuery]: {\r\n textAlign: 'center',\r\n },\r\n});\r\n\r\nconst BrandAndStockSection = styled.div({\r\n display: 'flex',\r\n width: '100%',\r\n justifyContent: 'space-between',\r\n});\r\n\r\nconst ProductDescriptionSectionWrapper = styled.div({\r\n backgroundColor: white,\r\n margin: {\r\n x: 0,\r\n y: '1rem',\r\n },\r\n [minMediumMediaQuery]: {\r\n padding: {\r\n xy: '1rem',\r\n },\r\n },\r\n});\r\n\r\nconst Header = styled.h1({\r\n textAlign: 'center',\r\n fontSize: '1rem',\r\n fontWeight: 'bold',\r\n letterSpacing: pixelsToUnit(1.6),\r\n textTransform: 'uppercase',\r\n [minMediumMediaQuery]: {\r\n fontSize: omega,\r\n },\r\n});\r\n\r\nconst Stock = styled.span({\r\n textAlign: 'center',\r\n fontSize: kappa,\r\n fontWeight: 'bold',\r\n width: '100%',\r\n letterSpacing: pixelsToUnit(0.3),\r\n lineHeight: pixelsToUnit(17),\r\n [minMediumMediaQuery]: {\r\n textAlign: 'end',\r\n },\r\n});\r\n\r\nconst CheckIcon = styled(Check, {\r\n marginRight: pixelsToUnit(5),\r\n});\r\n\r\nconst WatchableHelperInfo = styled.p({\r\n color: sunsetOrange,\r\n fontSize: epsilon,\r\n lineHeight: pixelsToUnit(22),\r\n textAlign: 'left',\r\n margin: {\r\n y: pixelsToUnit(10),\r\n },\r\n});\r\n\r\nconst Span = styled.span({\r\n lineHeight: pixelsToUnit(20),\r\n marginLeft: pixelsToUnit(5),\r\n marginRight: pixelsToUnit(5),\r\n});\r\n\r\nconst ShowReviews = styled.div({\r\n borderBottom: {\r\n width: thin,\r\n style: 'solid',\r\n color: COLOR_NOT_TRANSPARENT,\r\n },\r\n cursor: 'pointer',\r\n display: 'inline-block',\r\n fontSize: epsilon,\r\n lineHeight: pixelsToUnit(20),\r\n});\r\n\r\nconst ReadMore = styled.div({\r\n cursor: 'pointer',\r\n lineHeight: pixelsToUnit(20),\r\n margin: {\r\n y: small,\r\n },\r\n textDecoration: 'underline',\r\n [minMediumMediaQuery]: {\r\n margin: 0,\r\n },\r\n});\r\n\r\nconst BulletReviewWrapper = styled.div({\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n flexDirection: 'column-reverse',\r\n margin: { x: 0, y: '0.5rem' },\r\n [minTinyMediaQuery]: {\r\n flexDirection: 'row',\r\n },\r\n});\r\n\r\nconst Details = styled.div({\r\n margin: { x: 'auto', y: 0 },\r\n maxWidth: pixelsToUnit(655),\r\n padding: {\r\n xy: small,\r\n },\r\n});\r\n\r\nconst ProductLinksMenuWrapper = styled.div({\r\n width: '100%',\r\n height: '100%',\r\n});\r\n\r\nconst CurrentProductLink = styled.div({\r\n width: '2rem',\r\n height: '2rem',\r\n borderRadius: '100%',\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: 'lightgray',\r\n },\r\n },\r\n});\r\n\r\nconst ProductLinksContainer = styled.div({\r\n position: 'relative',\r\n height: '3.3rem',\r\n display: 'flex',\r\n justifyContent: 'left',\r\n alignItems: 'center',\r\n paddingRight: pixelsToUnit(18),\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: lightSilver,\r\n },\r\n },\r\n});\r\n\r\nconst ProductLinkWrapper = styled.div({\r\n margin: { xy: pixelsToUnit(5) },\r\n width: pixelsToUnit(180),\r\n display: 'flex',\r\n alignItems: 'center',\r\n});\r\n\r\nconst ColorName = styled.div({});\r\n\r\nconst ProductLinksMenu = styled.div({\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n width: '100%',\r\n height: '100%',\r\n ...animation({\r\n name: {\r\n from: {\r\n opacity: 0,\r\n },\r\n to: {\r\n opacity: 1,\r\n },\r\n },\r\n duration: '0.5s',\r\n fillMode: 'both',\r\n }),\r\n});\r\n\r\nconst ProductLinkItem = styled(Link, {\r\n width: '1.5rem',\r\n height: '1.5rem',\r\n borderRadius: '100%',\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: 'lightgray',\r\n },\r\n },\r\n ...transition({ property: 'all', duration: '0.2s', willChange: true, timingFunction: 'ease' }),\r\n ':hover': {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n});\r\n\r\nconst ProductLinkItemThumb = styled(Link, {\r\n margin: { xy: pixelsToUnit(3) },\r\n ...transition({ property: 'all', duration: '0.2s', willChange: true, timingFunction: 'ease' }),\r\n ':hover': {\r\n transform: 'scale(1.15, 1.15)',\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: 'lightgray',\r\n },\r\n },\r\n },\r\n});\r\n\r\nconst ProductLinkItemWrapper = styled.div({\r\n height: pixelsToUnit(35),\r\n width: pixelsToUnit(35),\r\n backgroundColor: 'white',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n marginRight: '0.3rem',\r\n borderRadius: '100%',\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: 'lightgray',\r\n },\r\n },\r\n ...transition({ property: 'all', duration: '0.5s', willChange: true, timingFunction: 'ease' }),\r\n ':hover': {\r\n backgroundColor: 'lightgray',\r\n },\r\n});\r\n\r\nconst ProductLinkItemWrapperCurrent = styled(ProductLinkItemWrapper, {\r\n backgroundColor: 'lightgray',\r\n});\r\n\r\nconst ProductLinkItemWrapperCurrentThumb = styled.div({\r\n border: {\r\n xy: {\r\n width: thin,\r\n style: 'solid',\r\n color: 'lightgray',\r\n },\r\n },\r\n height: '3.3rem',\r\n width: '3.3rem',\r\n ...transition({ property: 'all', duration: '0.2s', willChange: true, timingFunction: 'ease' }),\r\n ':hover': {\r\n transform: 'scale(1.15, 1.15)',\r\n backgroundColor: 'white',\r\n },\r\n});\r\n\r\nconst ProductNameSmall = styled.div({\r\n fontSize: pixelsToUnit(17),\r\n fontWeight: 400,\r\n textTransform: 'uppercase',\r\n});\r\n\r\nconst ProductLinksTitle = styled.div({\r\n textTransform: 'uppercase',\r\n opacity: 0.4,\r\n fontSize: pixelsToUnit(14),\r\n fontWeight: 'bold',\r\n marginRight: pixelsToUnit(10),\r\n paddingLeft: pixelsToUnit(20),\r\n});\r\n\r\nconst ColorMenuButton = styled.div({});\r\n\r\nconst DownStyled = styled(Down, {\r\n padding: { xy: pixelsToUnit(2) },\r\n});\r\n\r\nconst UpStyled = styled(DownStyled, {\r\n transform: 'rotate(180deg)',\r\n});\r\n\r\nconst ProductLinksColorWrapper = styled.div({\r\n zIndex: ZIndex.Tray,\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n position: 'absolute',\r\n top: '100%',\r\n right: 0,\r\n left: 0,\r\n transform: 'scaleY(0)',\r\n transformOrigin: 'center top',\r\n backgroundColor: white,\r\n listStyleType: 'none',\r\n ...transition({ property: 'transform' }),\r\n ...depth(),\r\n});\r\n\r\n// Note that this component is used both on the product page and on the search page\r\n// when there's only one result\r\nclass Product extends React.Component<PropType, StateType> {\r\n productDescriptionRef: React.RefObject<HTMLDivElement>;\r\n constructor(props: PropType) {\r\n super(props);\r\n this.state = {\r\n isPanelOpen: false,\r\n isExpandReviews: false,\r\n isWatchablePanelOpen: false,\r\n isFullscreenViewCarouselOpen: false,\r\n isColorPanelOpen: false,\r\n };\r\n this.productDescriptionRef = React.createRef();\r\n }\r\n\r\n toggleproductInfoPosition = (isOpen: boolean) => {\r\n this.setState({ isFullscreenViewCarouselOpen: isOpen });\r\n };\r\n\r\n scrollToDescription = async () => {\r\n if (this.productDescriptionRef) {\r\n const headerOffsetHeight = 130;\r\n const descriptionScrollDuration = 350;\r\n const totalOffset = document.body.getBoundingClientRect().top + headerOffsetHeight;\r\n const { top } = this.productDescriptionRef.current.getBoundingClientRect();\r\n\r\n if (this.props.currentBreakpoint >= Breakpoint.Medium) {\r\n let headerOffsetTop = 91;\r\n if (isIE()) {\r\n const legacyBrowserBannerWarningHeight = 24;\r\n headerOffsetTop = headerOffsetTop + legacyBrowserBannerWarningHeight;\r\n }\r\n if (window.pageYOffset <= headerOffsetTop) {\r\n const headerScrollDuration = 30;\r\n await scrollTo(headerOffsetTop, headerScrollDuration);\r\n }\r\n window.requestAnimationFrame(() => {\r\n if (!isIE()) {\r\n window.dispatchEvent(new Event('scroll'));\r\n } else {\r\n const event = document.createEvent('Event');\r\n event.initEvent('scroll', false, true);\r\n window.dispatchEvent(event);\r\n }\r\n });\r\n }\r\n await scrollTo(top - totalOffset, descriptionScrollDuration);\r\n }\r\n };\r\n\r\n openVariantPanel = () => this.setState({ isPanelOpen: true });\r\n closeVariantPanel = () => this.setState({ isPanelOpen: false });\r\n openWatchablePanel = () => this.setState({ isWatchablePanelOpen: true });\r\n closeWatchablePanel = () => this.setState({ isWatchablePanelOpen: false });\r\n\r\n toggleReviewPanel = () => {\r\n this.setState({\r\n isExpandReviews: !this.state.isExpandReviews,\r\n });\r\n };\r\n\r\n toggleColorSelect = () => {\r\n this.setState({\r\n isColorPanelOpen: !this.state.isColorPanelOpen,\r\n });\r\n };\r\n\r\n showMore = (fetchingDone: () => void) => {\r\n if (this.props.allReviews && this.props.totalReviews > this.props.allReviews.length) {\r\n this.props.getReviews(this.props.url, this.props.productCode, this.props.reviewsPage + 1).then(fetchingDone);\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n this.props.initializeReviews(this.props.productCode, this.props.topReviews, 1, this.props.totalReviews);\r\n }\r\n\r\n addItemToCart = () => {\r\n if (this.props.displayTagDesigner && this.props.designTagProperties.text === '') {\r\n return null;\r\n }\r\n return this.props.addToCart(\r\n epiPropertyValue(this.props.variation.code),\r\n 1,\r\n this.props.ticket,\r\n this.props.displayTagDesigner ? this.props.designTagProperties : null,\r\n );\r\n };\r\n\r\n addAllItemsToCart = (products: any[]) => {\r\n Promise.all(products.map((product) => this.props.addToCart(product.code, 1, product.ticket, null)));\r\n };\r\n\r\n render() {\r\n const {\r\n variation,\r\n price,\r\n ticket,\r\n variations = [],\r\n name,\r\n imageUrls = [],\r\n youTubeIds = [],\r\n vimeoIds = [],\r\n brand,\r\n brandUrl,\r\n description,\r\n bulletPoints,\r\n catalogId,\r\n language,\r\n productCode,\r\n averageRating,\r\n inStock,\r\n hasPromotion,\r\n promotionNames = [],\r\n productRecommendations = [],\r\n recentlyViewed = [],\r\n totalReviews,\r\n sizeGuide,\r\n hasMultipleVariants,\r\n sku,\r\n url,\r\n campaignCategoryPageUrl,\r\n productUspDelivery,\r\n productUspGuarantee,\r\n productUspReturn,\r\n productUspDeliveryVxn,\r\n productUspDeliveryVxnTitle,\r\n productUspDiscreetVxn,\r\n productUspDiscreetVxnTitle,\r\n iconExpressDelivery,\r\n iconDiscreet,\r\n imageContentBlock,\r\n gwpPromotionGift,\r\n displayTagDesigner,\r\n designTagColors,\r\n designTagFonts,\r\n productLinks = [],\r\n selfProductLink,\r\n contentBlocks,\r\n variantPromotions,\r\n } = this.props;\r\n const { isColorPanelOpen } = this.state;\r\n const productName = prepareVariationName(this.props.$cache === 'partial' ? variation.displayName : name);\r\n const variantName = this.props.$cache === 'partial' ? '-' : prepareVariationName(variation.displayName);\r\n const code = epiPropertyValue(variation.code);\r\n const reviews = {\r\n catalogId,\r\n language,\r\n productCode,\r\n averageRating,\r\n topReviews: this.props.topReviews || [],\r\n totalReviews,\r\n productPageUrl: url,\r\n isExpandReviews: this.state.isExpandReviews,\r\n toggleReviewPanel: this.toggleReviewPanel,\r\n };\r\n\r\n const IsVxnSite =\r\n !this.props.currentTheme.startsWith('dog') &&\r\n !this.props.currentTheme.startsWith('cli') &&\r\n !this.props.currentTheme.startsWith('lac') &&\r\n !this.props.currentTheme.startsWith('party');\r\n\r\n const watchableButtonProps = {\r\n buttonText: translate('/Product/WatchableProduct/WatchableButtonText'),\r\n onPanelOpen: this.openWatchablePanel,\r\n };\r\n\r\n const skuCode = {\r\n id: 'SKUCode',\r\n category: 'details',\r\n type: 'string',\r\n value: sku,\r\n };\r\n\r\n const quickFacts = this.props.quickFacts ? [...this.props.quickFacts, skuCode] : [skuCode];\r\n\r\n const CampaignNode = (\r\n <div>\r\n <Campaign>\r\n {translate('/Product/IncludedInCampaign') + ' :'}\r\n {!!variantPromotions &&\r\n variantPromotions.map((item, i) => (\r\n <Link to={!!item.promotionUrl ? item.promotionUrl : campaignCategoryPageUrl}>{item.promotionName}</Link>\r\n ))}\r\n </Campaign>\r\n </div>\r\n );\r\n\r\n const averageRatingsNode = (\r\n <AverageContainer>\r\n <AverageRating average={averageRating} spacing={Spacing.Normal} size={Size.Huge} />\r\n {!this.state.isFullscreenViewCarouselOpen && (\r\n <TotalReviews>\r\n {totalReviews > 0 ? (\r\n <ShowReviews onClick={this.toggleReviewPanel}>{`${totalReviews} ${translate(\r\n '/Product/Reviews/Heading',\r\n ).toLowerCase()}`}</ShowReviews>\r\n ) : (\r\n translate('/Product/Reviews/NoReviews')\r\n )}\r\n </TotalReviews>\r\n )}\r\n </AverageContainer>\r\n );\r\n\r\n const desktopDetails = (\r\n <React.Fragment>\r\n <Details\r\n css={{\r\n paddingBottom: pixelsToUnit(15),\r\n marginTop: '2rem',\r\n ...(this.state.isFullscreenViewCarouselOpen &&\r\n !this.state.isFullscreenViewCarouselOpen &&\r\n this.props.currentBreakpoint > Breakpoint.Large && {\r\n position: 'fixed',\r\n top: '3rem',\r\n right: '2.5rem',\r\n zIndex: 20,\r\n maxWidth: pixelsToUnit(480),\r\n backgroundColor: 'rgba(255,255,255,0.7)',\r\n backdropFilter: 'blur(5px)',\r\n boxShadow: (theme) => `0 0 1rem rgba(${theme.shadowColor}, 0.3)`,\r\n borderRadius: '0.5rem',\r\n }),\r\n }}\r\n >\r\n <BrandAndStockSection>\r\n {!this.state.isFullscreenViewCarouselOpen && (\r\n <LastBreadCrumbBrandContainer>\r\n <LastBreadcrumb breadcrumbs={this.props.breadcrumbs} isSliced />\r\n <Span>{'-'}</Span>\r\n <Brand brand={brand} brandUrl={brandUrl} />\r\n </LastBreadCrumbBrandContainer>\r\n )}\r\n {this.props.inStock && (\r\n <Stock>\r\n <CheckIcon />\r\n {translate('/Product/InStockForDelivery')}\r\n </Stock>\r\n )}\r\n </BrandAndStockSection>\r\n <ProductName name={productName} />\r\n {hasPromotion && CampaignNode}\r\n {averageRatingsNode}\r\n <Prices\r\n css={{\r\n display: 'flex',\r\n flex: { direction: 'column', grow: 1, wrap: 'wrap' },\r\n margin: {\r\n y: large,\r\n x: 0,\r\n },\r\n }}\r\n prices={price}\r\n />\r\n <UspBullets hasValue={bulletPoints && bulletPoints.length > 0} bulletPoints={bulletPoints} />\r\n {!this.state.isFullscreenViewCarouselOpen && (\r\n <DescriptionAndSizeGuide>\r\n {description && <ReadMore onClick={this.scrollToDescription}>{translate('/Product/ReadMore')}</ReadMore>}\r\n {sizeGuide && <SizeGuide sizeGuide={sizeGuide} />}\r\n </DescriptionAndSizeGuide>\r\n )}\r\n {productLinks && (\r\n <ProductLinksContainer>\r\n {productLinks[0].linkDisplayType === 'color' ? (\r\n <ProductLinksTitle>{translate('/Product/Colors')}:</ProductLinksTitle>\r\n ) : (\r\n <ProductLinksTitle>{translate('/Product/Variants')}:</ProductLinksTitle>\r\n )}\r\n <ProductLinksMenuWrapper>\r\n <ProductLinksMenu>\r\n {productLinks[0].linkDisplayType === 'color' ? (\r\n <ProductLinkItemWrapperCurrent title={selfProductLink.tooltip}>\r\n <CurrentProductLink\r\n css={{ backgroundColor: '#' + selfProductLink.linkDisplayValue }}\r\n ></CurrentProductLink>\r\n </ProductLinkItemWrapperCurrent>\r\n ) : (\r\n <ProductLinkItemWrapperCurrentThumb>\r\n <img src={selfProductLink.linkDisplayValue} style={{ opacity: 0.5 }} />\r\n </ProductLinkItemWrapperCurrentThumb>\r\n )}\r\n <ColorMenuButton onClick={this.toggleColorSelect}>\r\n {isColorPanelOpen ? <UpStyled /> : <DownStyled />}\r\n </ColorMenuButton>\r\n </ProductLinksMenu>\r\n </ProductLinksMenuWrapper>\r\n <ProductLinksColorWrapper css={isColorPanelOpen && { transform: 'scaleY(1)' }}>\r\n {productLinks &&\r\n productLinks.map((item) => (\r\n <ProductLinkWrapper>\r\n {item.linkDisplayType === 'color' ? (\r\n <ProductLinkItemWrapper title={item.tooltip}>\r\n <ProductLinkItem to={item.url} css={{ backgroundColor: '#' + item.linkDisplayValue }} />\r\n </ProductLinkItemWrapper>\r\n ) : (\r\n <ProductLinkItemThumb to={item.url}>\r\n <img src={item.linkDisplayValue} />\r\n </ProductLinkItemThumb>\r\n )}\r\n <ColorName>{item.tooltip}</ColorName>\r\n </ProductLinkWrapper>\r\n ))}\r\n </ProductLinksColorWrapper>\r\n </ProductLinksContainer>\r\n )}\r\n {hasMultipleVariants && (\r\n <VariantSelector\r\n label={translate('/Product/Size')}\r\n value={url}\r\n options={variations}\r\n onChangeOption={replaceState}\r\n onWatchableOpen={this.openWatchablePanel}\r\n />\r\n )}\r\n {displayTagDesigner && (\r\n <ProductDesignerConfigurator availableColors={designTagColors} availableFonts={designTagFonts} />\r\n )}\r\n {inStock ? (\r\n <AddCart addToCart={this.addItemToCart} variant={Variant.Medium}>\r\n <IconWrap>\r\n <IconCart />\r\n {this.props.currentTheme === Theme.DoggieDefault\r\n ? translate('/Cart/BuyDoggie')\r\n : translate('/Cart/BuyDesktop')}\r\n </IconWrap>\r\n </AddCart>\r\n ) : (\r\n <React.Fragment>\r\n <WatchableHelperInfo>{translate('/Product/WatchableProduct/WatchableHelperInfo')}</WatchableHelperInfo>\r\n <WatchableButton {...watchableButtonProps} />\r\n </React.Fragment>\r\n )}\r\n {IsVxnSite\r\n ? (productUspDeliveryVxn || productUspDiscreetVxn) && (\r\n <DetailsUspVxn>\r\n {productUspDiscreetVxn && (\r\n <UspContainer>\r\n <ImageContainer>\r\n <Image\r\n src={iconDiscreet}\r\n title={'discreet parcel'}\r\n alt={'discreet parcel'}\r\n ratio={Ratio.OneToOne}\r\n />\r\n </ImageContainer>\r\n <styled.Div css={{ fontSize: zeta, textAlign: 'left' }}>\r\n <b>{productUspDiscreetVxnTitle}</b>\r\n {productUspDiscreetVxn}\r\n </styled.Div>\r\n </UspContainer>\r\n )}\r\n {productUspDeliveryVxn && (\r\n <UspContainer>\r\n <ImageContainer>\r\n <Image\r\n src={iconExpressDelivery}\r\n title={'express delivery'}\r\n alt={'express delivery'}\r\n ratio={Ratio.OneToOne}\r\n />\r\n </ImageContainer>\r\n <styled.Div css={{ fontSize: zeta, textAlign: 'left' }}>\r\n <b>{productUspDeliveryVxnTitle}</b>\r\n {productUspDeliveryVxn}\r\n </styled.Div>\r\n </UspContainer>\r\n )}\r\n </DetailsUspVxn>\r\n )\r\n : (productUspDelivery || productUspReturn || productUspGuarantee) && (\r\n <DetailsUsp>\r\n {productUspDelivery && (\r\n <UspItem>\r\n <CheckIcon />\r\n {productUspDelivery}\r\n </UspItem>\r\n )}\r\n {productUspReturn && (\r\n <UspItem>\r\n <CheckIcon />\r\n {productUspReturn}\r\n </UspItem>\r\n )}\r\n {productUspGuarantee && (\r\n <UspItem>\r\n <CheckIcon />\r\n {productUspGuarantee}\r\n </UspItem>\r\n )}\r\n </DetailsUsp>\r\n )}\r\n\r\n <SameDayDelivery>{translate('/Product/SameDayDelivery')}</SameDayDelivery>\r\n </Details>\r\n </React.Fragment>\r\n );\r\n\r\n const mobileDetails = (\r\n <Details css={{ paddingTop: 0, paddingBottom: pixelsToUnit(10) }}>\r\n <BulletReviewWrapper>\r\n <UspBullets\r\n css={{ marginTop: '1rem', marginBottom: '1rem' }}\r\n hasValue={bulletPoints && bulletPoints.length > 0}\r\n bulletPoints={bulletPoints}\r\n isCompact\r\n />\r\n {averageRatingsNode}\r\n </BulletReviewWrapper>\r\n {sizeGuide && <SizeGuide sizeGuide={sizeGuide} />}\r\n {IsVxnSite\r\n ? (productUspDiscreetVxn || productUspDeliveryVxn) && (\r\n <DetailsUspVxn>\r\n {productUspDiscreetVxn && (\r\n <UspContainer>\r\n <ImageContainer>\r\n <Image\r\n src={iconDiscreet}\r\n title={'discreet parcel'}\r\n alt={'discreet parcel'}\r\n ratio={Ratio.OneToOne}\r\n />\r\n </ImageContainer>\r\n <styled.Div css={{ fontSize: zeta, textAlign: 'left' }}>\r\n <b>{productUspDiscreetVxnTitle}</b>\r\n {productUspDiscreetVxn}\r\n </styled.Div>\r\n </UspContainer>\r\n )}\r\n {productUspDeliveryVxn && (\r\n <UspContainer>\r\n <ImageContainer>\r\n <Image\r\n src={iconExpressDelivery}\r\n title={'express delivery'}\r\n alt={'express delivery'}\r\n ratio={Ratio.OneToOne}\r\n />\r\n </ImageContainer>\r\n <styled.Div css={{ fontSize: zeta, textAlign: 'left' }}>\r\n <b>{productUspDeliveryVxnTitle}</b>\r\n {productUspDeliveryVxn}\r\n </styled.Div>\r\n </UspContainer>\r\n )}\r\n </DetailsUspVxn>\r\n )\r\n : (productUspDelivery || productUspReturn || productUspGuarantee) && (\r\n <DetailsUsp>\r\n {productUspDelivery && (\r\n <UspItem>\r\n <CheckIcon />\r\n <UspItemText>{productUspDelivery}</UspItemText>\r\n </UspItem>\r\n )}\r\n {productUspReturn && (\r\n <UspItem>\r\n <CheckIcon />\r\n <UspItemText>{productUspReturn}</UspItemText>\r\n </UspItem>\r\n )}\r\n {productUspGuarantee && (\r\n <UspItem>\r\n <CheckIcon />\r\n <UspItemText>{productUspGuarantee}</UspItemText>\r\n </UspItem>\r\n )}\r\n </DetailsUsp>\r\n )}\r\n\r\n {inStock && !IsVxnSite && (\r\n <SameDayDelivery\r\n css={{\r\n marginTop: pixelsToUnit(5),\r\n fontSize: kappa,\r\n }}\r\n >\r\n {translate('/Product/SameDayDelivery')}kaka\r\n </SameDayDelivery>\r\n )}\r\n </Details>\r\n );\r\n\r\n const detailsDesktopStyle: Style = {\r\n maxWidth: pixelsToUnit(570),\r\n margin: {\r\n y: 0,\r\n x: 'auto',\r\n },\r\n };\r\n\r\n const detailsMobileStyle: Style = {\r\n textAlign: 'center',\r\n };\r\n\r\n const stockAndPromos: Style = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n };\r\n\r\n return (\r\n <Viewport>\r\n {(isCompact: boolean) => (\r\n <Base css={isCompact && { backgroundColor: white }} appearance={Appearance.Full}>\r\n <CustomBreadcrumbs breadcrumbs={this.props.breadcrumbs} />\r\n <Basic>\r\n <MarginContainer>\r\n <Wrapper>\r\n <Basic layout={PageLayout.OneToOne}>\r\n {isCompact ? (\r\n <styled.Div css={detailsMobileStyle}>\r\n <styled.Div css={stockAndPromos}>\r\n {this.props.inStock ? (\r\n <Stock>\r\n <CheckIcon />\r\n {translate('/Product/InStockForDelivery')}\r\n </Stock>\r\n ) : (\r\n <Stock>\r\n <Cross css={{ color: 'red', paddingTop: '0.2rem' }} />\r\n {translate('/Product/OutOfStock')}\r\n </Stock>\r\n )}\r\n {hasPromotion && CampaignNode}\r\n </styled.Div>\r\n {!displayTagDesigner && price.discountPercentage > 0 && (\r\n <>\r\n {IsVxnSite ? (\r\n <DiscountTriBadge>{'-' + price.discountPercentage + '%'}</DiscountTriBadge>\r\n ) : (\r\n <PercentDiscountBadge>{'-' + price.discountPercentage + '%'}</PercentDiscountBadge>\r\n )}\r\n </>\r\n )}\r\n <styled.Div css={{ paddingTop: pixelsToUnit(10) }}>\r\n {!this.state.isFullscreenViewCarouselOpen && (\r\n <LastBreadCrumbBrandContainer\r\n css={{ justifyContent: 'center', fontSize: zeta, color: (theme) => theme.textColor }}\r\n >\r\n <LastBreadcrumb\r\n css={{ color: (theme) => theme.textColor }}\r\n breadcrumbs={this.props.breadcrumbs}\r\n isSliced\r\n />\r\n <Span>{'-'}</Span>\r\n <Brand brand={brand} brandUrl={brandUrl} />\r\n </LastBreadCrumbBrandContainer>\r\n )}\r\n\r\n <styled.Div css={{ paddingRight: pixelsToUnit(35), paddingLeft: pixelsToUnit(35) }}>\r\n {productName.length > 30 ? (\r\n <ProductNameSmall>{productName}</ProductNameSmall>\r\n ) : (\r\n <ProductName name={productName} />\r\n )}\r\n </styled.Div>\r\n </styled.Div>\r\n {(!!imageUrls.length || !!youTubeIds.length || !!vimeoIds.length) && (\r\n <Base>\r\n <ProductMedia\r\n onModalToggle={this.toggleproductInfoPosition}\r\n imageUrls={imageUrls}\r\n youTubeIds={youTubeIds}\r\n vimeoIds={vimeoIds}\r\n alt={name}\r\n isCompact={isCompact}\r\n />\r\n {displayTagDesigner && <ProductDesigner />}\r\n {displayTagDesigner && (\r\n <ProductDesignerConfigurator\r\n availableColors={designTagColors}\r\n availableFonts={designTagFonts}\r\n />\r\n )}\r\n {!!gwpPromotionGift && (\r\n <Wrapper>\r\n <GwpFreeItem gwpFreePromotion={gwpPromotionGift} />\r\n </Wrapper>\r\n )}\r\n </Base>\r\n )}\r\n </styled.Div>\r\n ) : (\r\n (!!imageUrls.length || !!youTubeIds.length || !!vimeoIds.length) && (\r\n <Base>\r\n {!displayTagDesigner && price.discountPercentage > 0 && (\r\n <>\r\n {IsVxnSite ? (\r\n <DiscountTriBadge>{'-' + price.discountPercentage + '%'}</DiscountTriBadge>\r\n ) : (\r\n <PercentDiscountBadge>{'-' + price.discountPercentage + '%'}</PercentDiscountBadge>\r\n )}\r\n </>\r\n )}\r\n {displayTagDesigner && <ProductDesigner />}\r\n <ProductMedia\r\n onModalToggle={this.toggleproductInfoPosition}\r\n imageUrls={imageUrls}\r\n youTubeIds={youTubeIds}\r\n vimeoIds={vimeoIds}\r\n alt={name}\r\n />\r\n {!!gwpPromotionGift && (\r\n <Wrapper>\r\n <GwpFreeItem gwpFreePromotion={gwpPromotionGift} />\r\n </Wrapper>\r\n )}\r\n </Base>\r\n )\r\n )}\r\n <styled.Div css={isCompact ? detailsMobileStyle : detailsDesktopStyle}>\r\n {isCompact ? mobileDetails : desktopDetails}\r\n </styled.Div>\r\n </Basic>\r\n </Wrapper>\r\n <ContentArea {...imageContentBlock} />\r\n <ProductDescriptionSectionWrapper>\r\n <ProductDescriptionSection\r\n ref={this.productDescriptionRef}\r\n description={description}\r\n reviews={reviews}\r\n quickFacts={quickFacts}\r\n isCompact={isCompact}\r\n />\r\n </ProductDescriptionSectionWrapper>\r\n <ContentArea {...contentBlocks} />\r\n <ReviewSection reviews={reviews} isCompact={isCompact} />\r\n </MarginContainer>\r\n {this.props.commonPurchaseCombinationList && this.props.commonPurchaseCombinationList.length > 0 && (\r\n <React.Fragment>\r\n <Header>{translate('/Product/RecommendedProducts')}</Header>\r\n <CommonPurchaseCombination\r\n isCompact={isCompact}\r\n commonPurchaseCombinationList={this.props.commonPurchaseCombinationList}\r\n addAllItemsToCart={this.addAllItemsToCart}\r\n />\r\n </React.Fragment>\r\n )}\r\n {productRecommendations.length > 0 && <ProductRelated relatedProducts={productRecommendations} />}\r\n {!isCompact && recentlyViewed.length > 0 && <ProductRecentlyViewed recentlyViewed={recentlyViewed} />}\r\n </Basic>\r\n {isCompact && code && price && (\r\n <Actionbar>\r\n <ProductActionbar\r\n price={price}\r\n productLinks={productLinks}\r\n selfProductLink={selfProductLink}\r\n variantName={hasMultipleVariants ? variantName : undefined}\r\n onVariantPanelOpen={hasMultipleVariants ? this.openVariantPanel : undefined}\r\n onWatchablePanelOpen={this.openWatchablePanel}\r\n code={code}\r\n ticket={ticket}\r\n inStock={inStock}\r\n addToCart={this.addItemToCart}\r\n promotionName={hasPromotion && promotionNames.length ? promotionNames[0] : ''}\r\n campaignCategoryPageUrl={campaignCategoryPageUrl}\r\n />\r\n </Actionbar>\r\n )}\r\n {isCompact && hasMultipleVariants && (\r\n <VariantPanel\r\n open={this.state.isPanelOpen}\r\n value={{\r\n name: variantName,\r\n code,\r\n }}\r\n options={variations}\r\n onPanelClose={this.closeVariantPanel}\r\n sizeguide={sizeGuide}\r\n onWatchableOpen={this.openWatchablePanel}\r\n />\r\n )}\r\n <ViewAllReviews\r\n list={\r\n this.props.productReviewId === this.props.productCode && this.props.allReviews\r\n ? this.props.allReviews\r\n : reviews.topReviews\r\n }\r\n isExpandReviews={this.state.isExpandReviews}\r\n closeReviews={this.toggleReviewPanel}\r\n showMore={this.showMore}\r\n averageRating={averageRating}\r\n isCompact={isCompact}\r\n totalReview={this.props.totalReviews}\r\n isModalList={true}\r\n />\r\n <WatchablePanel\r\n pageUrl={this.props.canonicalUrl}\r\n variationCode={code}\r\n open={this.state.isWatchablePanelOpen}\r\n onPanelClose={this.closeWatchablePanel}\r\n />\r\n </Base>\r\n )}\r\n </Viewport>\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n (state): ConnectStateType => ({\r\n currentTheme: state.currentTheme,\r\n currentBreakpoint: state.currentBreakpoint,\r\n allReviews: state.productReview.allReviews,\r\n reviewsPage: state.productReview.page,\r\n productReviewId: state.productReview.id,\r\n designTagProperties: state.productDesigner,\r\n }),\r\n (dispatch): ConnectActionType => ({\r\n addToCart(code, quantity, ticket, designTagProperties) {\r\n return dispatch(addToCart(code, quantity, ticket, 'Produktlista', false, designTagProperties));\r\n },\r\n getReviews(url, id, page) {\r\n return dispatch(getReviews(url, id, page));\r\n },\r\n initializeReviews(id, reviews, page, totalCount) {\r\n return dispatch(initializeReviews(id, reviews, page, totalCount));\r\n },\r\n }),\r\n)(Product);\r\n"],"sourceRoot":""}