{"version":3,"sources":["webpack:///./src/components/_pages/Families/Families.styled.js","webpack:///./src/components/_pages/Families/Families.js","webpack:///./src/redux/bikes/selectors.js","webpack:///./src/constants/bikes.js","webpack:///./src/assets/icons/arrow-down.svg","webpack:///./src/assets/icons/chevron-right.svg","webpack:///./src/hooks/usePrevious.js","webpack:///./src/helpers/routing.js","webpack:///./src/components/Tray/Tray.styled.js","webpack:///./src/components/_utility/Container.js","webpack:///./src/assets/icons/minus.svg","webpack:///./src/components/_utility/BackgroundImage/ResponsiveImage.js","webpack:///./src/components/_utility/Breadcrumb/Breadcrumb.js","webpack:///./src/assets/icons/reset.svg","webpack:///./src/assets/icons/filters.svg","webpack:///./src/components/BikeFilters/BikeFilters.styled.js","webpack:///./src/components/_form/RangeSlider/RangeSlider.styled.js","webpack:///./src/components/_form/RangeSlider/RangeSlider.js","webpack:///./src/components/BikeFilters/FilterDialog.styled.js","webpack:///./src/components/BikeFilters/FilterDialog.js","webpack:///./src/components/BikeFilters/FilterCard.js","webpack:///./src/components/BikeFilters/ActiveFilters.styled.js","webpack:///./src/components/BikeFilters/ActiveFilters.js","webpack:///./src/assets/icons/grid-view.svg","webpack:///./src/assets/icons/list-view.svg","webpack:///./src/helpers/analytics.js","webpack:///./src/components/BikeFilters/ViewAndSort.styled.js","webpack:///./src/components/BikeFilters/ViewAndSort.js","webpack:///./src/components/BikeFilters/BikeFilters.js","webpack:///./src/components/NotificationStrip/NotificationStrip.styled.js","webpack:///./src/components/NotificationStrip/NotificationStrip.js","webpack:///./src/components/Hero/Hero.styled.js","webpack:///./src/components/_utility/BackgroundImage/BackgroundImage.styled.js","webpack:///./src/components/_utility/BackgroundImage/BackgroundImage.js","webpack:///./src/components/Hero/Hero.js","webpack:///./src/components/_utility/NoResults/NoResults.styled.js","webpack:///./src/components/_utility/NoResults/NewResults.js","webpack:///./src/components/_cards/BikeCard/BikeCard.styled.js","webpack:///./src/components/_cards/BikeCard/BikeCard.js","webpack:///./src/components/FeatureBlock/FeatureBlock.styled.js","webpack:///./src/components/FeatureBlock/FeatureBlock.js"],"names":["Wrap","styled","div","NoResultsWrap","minBp","Families","genreId","useState","loadingBikes","setLoadingBikes","loadingFamilies","setLoadingFamilies","loadingHero","setLoadingHero","families","setFamilies","hero","setHero","currentGenre","useSelector","genreSelector","find","genre","id","dispatch","useDispatch","count","getFeatureCardCount","useEffect","a","request","res","data","bikes","setError","fetchFamilies","getContentBasePath","fetchGenreContent","familyPromises","map","family","Promise","resolve","cards","all","familiesWithCards","setFeatureCards","features","type","fetchBikes","Loader","Hero","buttons","label","to","white","title","heroTitle","image","heroImage","viewHidden","fluid","hasFilters","isFamilyPage","FeatureBlock","key","name","description","intro","familyCards","Breadcrumb","additionalLinks","text","siteLink","activeFilterSelector","createSelector","state","activeFilterId","getBikeFilter","filterKey","filters","bikeFilter","getFilters","isFilterSet","filterIndex","filter","min","from","max","choice","Boolean","areFiltersSet","Object","values","some","getFiltersOpen","filtersOpen","getBikesView","view","getFilterChoices","reduce","prevFilterChoices","getPriceFilter","app","bikeFilters","priceFilter","priceFilterIndex","indexOf","filterBikes","filterChoices","bike","length","tags","every","tag","includes","filterBikesByPrice","price","bikesSelector","results","page","sort","selectedSortOption","sortOptions","sortOption","filteredResults","sortFunction","resultsVisible","slice","filteredCount","getFeatureCards","entries","prevFeatures","featureId","filteredFeatures","prevCount","getBikesSort","styles","props","xmlns","width","height","viewBox","d","fill","usePrevious","value","ref","useRef","current","useNavigate","basepath","basepathSelector","substr","args","_navigate","Container","section","theme","hideOnDesktop","isScrolling","heights","tray","mobile","tablet","desktop","BoxShadow","PrevNextStyles","css","nextBtn","isLastStep","financeHidden","PrevNextButton","Button","buttonStyles","PrevNextLinkA","LinkButton","PrevNextText","span","isMac","ConfigOptionsContainer","trayModalOpen","ConfigOptionsCloseButton","button","FinanceOptionsContainer","ConfigOptionsStyles","ConfigOptions","disabled","ConfigOptionsLink","ConfigOptionsLinkA","ConfigOptionsHeader","ConfigOptionsTitle","fonts","dinDemi","ConfigOptionsLabelWrapper","dinRegular","ConfigOptionsModalButton","hidden","ConfigOptionsBackButton","ConfigOptionsBackButtonWrapper","InfoButton","FinanceOptionWrap","monthlyBreakdown","PriceOptionsLabelWrapper","Icon","img","Price","PriceWrapper","GarageCount","FinanceButton","FinanceLabel","ResponsiveImage","mobileLarge","tabletLarge","alt","window","objectFitPolyfill","picturefill","media","breakpoints","srcSet","encodeURI","mobileEnd","src","data-object-fit","loading","A","OL","ol","maxBp","hybridBreadcrumb","breadcrumbSelector","concat","breadcrumbEl","document","querySelector","activeFilter","createElement","classList","add","body","appendChild","style","display","getViewportWidth","createPortal","vocab","typeof","onClick","setActiveFilter","link","index","isCurrentPage","linkProps","LinkEl","Fragment","property","href","url","Link","dangerouslySetInnerHTML","__html","home","aria-hidden","className","content","ActiveFiltersOuter","hideOnMobile","visible","filterOpen","FilterCards","Card","active","CardIcon","CardWrap","TitleBar","CloseButton","ApplyButtonWrapper","ApplyButton","ResultsBar","ResultsCount","ResetButton","ChevronRightIcon","_ChevronRightIcon","RefineResults","RefineResultsInner","FilterButton","FiltersBody","Outer","Circle","HandleWrap","left","Handle","Tooltip","RangeSlider","onDecreaseQuantity","onIncreaseQuantity","canDecrease","canIncrease","data-testid","marks","20","40","100","step","handle","handleProps","offset","role","aria-valuemin","aria-valuemax","aria-valuenow","tabindex","Label","Dialog","hasButton","DialogHeader","FilterTitle","h3","Description","RangeDescription","ClickCatch","BackButton","OptionsWrap","DescriptionWrap","DialogBody","FilterIcon","ResetFilterButton","ScrollIndicator","Range","pushToDataLayer","useDataLayer","bikeFilterFrom","bikeFilterTo","floor","ceiling","fromValue","parseInt","toValue","fromText","toText","fromIndex","toIndex","prevMarks","factory","val","toLowerCase","onChange","configuratorFilter","setFilterRange","Choice","Radio","checked","setFilterChoice","isWhite","option","FilterDialog","icon","scrollIndicatorVisible","setScrollIndicatorVisible","filtersSelector","filterSet","dialogBodyRef","FilterBody","slider","options","dialogBodyEl","setTimeout","scrollTop","isIOS","scrollHeight","getBoundingClientRect","addEventListener","el","getImageBaseUrl","resetFilter","FilterCard","onSelectCard","children","thin","Option","Close","RangeLabel","ChoiceLabel","choiceId","ActiveFilters","filtersState","activeFilters","filterState","sendGaEvent","action","ga","ViewWrap","LabelWrap","IconWrap","SelectWrap","Select","select","ViewAndSort","bikeView","sortValue","getLabel","useLabel","setToGrid","setView","removeEventListener","tabIndex","event","setSort","target","BikeFilters","isGenrePage","openFilterIndex","filtersSet","bikeCardCount","featureCardCount","previousFiltersOpen","handleSelectCard","filterId","bodyNoScroll","remove","closeFiltersOnOrientationChange","closeFiltersModal","clearFilters","applyFilters","openFiltersModal","Message","CTA","primary","NotificationStrip","NotificationStripPortal","userEmail","localStorage","getItem","configurations","getConfigurations","notificationStripEl","parentNode","insertBefore","setConfigurations","fetchConfigurations","ContentWrap","Title","h2","ButtonWrapper","HeroButtonStyle","whiteBackground","colors","HeroButton","HeroLinkButton","HeroImageWrapper","BackgroundImageContainer","BackgroundImageWrapper","BackgroundImage","srcSmall","srcMedium","srcLarge","noMargin","p","NoResults","_Link","isListingsPage","listView","ImageWrap","Image","Content","Name","h4","RichText","Actions","Divider","Action","ActionLink","MainContent","AdditionalContent","DetailedDescription","BikeCard","thumbnail","priceLocalised","pricePrefixText","detailDescription","About","Hairline","Bikes","BikeScroller","cardCount","Gutter","_BikeCard","ViewButton","variant","racingYellow","racingYellowDark","scrollerRef","ctaColour","navigate","buttonRef","noDefaultStyles","renderer","_scrollerRef","elementRef","onUpdate","contains","bottom","card"],"mappings":"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","file":"d4aeab627c0fdec6fae1.js","sourcesContent":["import React from 'react';\nimport styled from 'styled-components';\nimport { minBp } from 'src/lib/theme';\n\nexport const Wrap = styled.div`\n padding-bottom: 40px;\n`;\n\nexport const NoResultsWrap = styled.div`\n margin: 0 30px;\n\n @media ${minBp('tabletLarge')} {\n margin: 0 100px;\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { genreSelector } from 'src/redux/app/selectors';\nimport FeatureBlock from 'components/FeatureBlock/FeatureBlock';\nimport Hero from 'components/Hero/Hero';\nimport request from 'helpers/request';\nimport Breadcrumb from 'components/_utility/Breadcrumb/Breadcrumb';\nimport { getContentBasePath } from 'helpers/utilities';\nimport { setError } from 'src/redux/app/actions';\nimport NoResults from 'components/_utility/NoResults/NewResults';\nimport { setFeatureCards } from 'src/redux/bikes/actions';\nimport Loader from 'components/_utility/Loader/Loader';\nimport { getFeatureCardCount } from 'src/redux/bikes/selectors';\nimport { Wrap, NoResultsWrap } from './Families.styled';\n\nconst Families = ({ genreId }) => {\n const [loadingBikes, setLoadingBikes] = useState(true);\n const [loadingFamilies, setLoadingFamilies] = useState(true);\n const [loadingHero, setLoadingHero] = useState(true);\n const [families, setFamilies] = useState([]);\n const [hero, setHero] = useState({});\n const genres = useSelector(genreSelector);\n const currentGenre = genres.find(genre => genre.id === genreId);\n const dispatch = useDispatch();\n const count = useSelector(getFeatureCardCount('family'));\n\n useEffect(() => {\n const fetchFamilies = async () => {\n try {\n const res = await request(`/api/configurator/bikes/families?genre=${genreId}`);\n\n setFamilies(res.data.bikes);\n setLoadingFamilies(false);\n } catch (ex) {\n dispatch(setError(ex));\n }\n };\n\n fetchFamilies();\n\n const fetchGenreContent = async () => {\n try {\n const res = await request(`${getContentBasePath()}?genre=${genreId}`);\n\n setHero(res.data.hero);\n setLoadingHero(false);\n } catch (ex) {\n dispatch(setError(ex));\n }\n };\n\n fetchGenreContent();\n }, [dispatch, genreId]);\n\n useEffect(() => {\n const fetchBikes = async () => {\n try {\n const familyPromises = families.map(\n async family =>\n new Promise(async resolve => {\n const res = await request(`/api/configurator/bikes/models?family=${family.id}`);\n resolve({ id: family.id, cards: res.data.bikes });\n })\n );\n const familiesWithCards = await Promise.all(familyPromises);\n\n dispatch(setFeatureCards({ features: familiesWithCards, type: 'family' }));\n\n setLoadingBikes(false);\n } catch (ex) {\n dispatch(setError(ex));\n }\n };\n\n fetchBikes();\n }, [families]);\n\n if (loadingBikes || loadingFamilies || loadingHero || typeof count !== 'number') {\n return <Loader />;\n }\n\n return (\n <>\n <Hero\n buttons={[{ id: 'viewall', label: 'viewAllButton', to: '/bikes', white: true }]}\n title={hero.heroTitle}\n image={hero.heroImage}\n viewHidden\n fluid\n hasFilters\n isFamilyPage\n />\n <Wrap>\n {count ? (\n families.map(family => (\n <FeatureBlock\n key={family.id}\n id={family.id}\n title={family.name}\n description={family.intro}\n familyCards={false}\n />\n ))\n ) : (\n <NoResultsWrap>\n <NoResults />\n </NoResultsWrap>\n )}\n </Wrap>\n <Breadcrumb\n additionalLinks={\n currentGenre\n ? [\n {\n text: currentGenre.title,\n siteLink: false,\n },\n ]\n : []\n }\n />\n </>\n );\n};\n\nexport default Families;\n","import { createSelector } from 'reselect';\nimport { BIKES_PER_PAGE } from 'src/constants/bikes';\nimport sortOptions from 'src/config/sortOptions.config';\n\nexport const activeFilterSelector = createSelector(\n state => state.bikes.activeFilterId,\n activeFilterId => activeFilterId\n);\n\nexport const getBikeFilter = filterKey =>\n createSelector(\n state => state.bikes.filters[filterKey],\n bikeFilter => bikeFilter\n );\n\nexport const getBikeFilterFrom = filterKey =>\n createSelector(\n state => state.bikes.filters[filterKey].from,\n from => from\n );\n\nexport const getBikeFilterTo = filterKey =>\n createSelector(\n state => state.bikes.filters[filterKey].to,\n to => to\n );\n\nexport const getFilters = createSelector(\n state => state.bikes.filters,\n filters => filters\n);\n\nexport const isFilterSet = filterIndex =>\n createSelector(\n state => state.bikes.filters[filterIndex],\n filter => {\n if (filter.min) {\n return filter.min !== filter.from || filter.max !== filter.to;\n }\n\n if (filter.choice) {\n return Boolean(filter.choice);\n }\n\n return false;\n }\n );\n\nexport const areFiltersSet = createSelector(\n state => state.bikes.filters,\n filters =>\n Object.values(filters).some(filter => {\n if (typeof filter.min !== 'undefined') {\n return filter.min !== filter.from || filter.max !== filter.to;\n }\n\n if (typeof filter.choice !== 'undefined') {\n return Boolean(filter.choice);\n }\n\n return false;\n })\n);\n\nexport const getFiltersOpen = createSelector(\n state => state.bikes.filtersOpen,\n filtersOpen => filtersOpen\n);\n\nexport const getBikesView = createSelector(\n state => state.bikes.view,\n view => view\n);\n\nexport const getFilterChoices = createSelector(\n state => state.bikes.filters,\n filters =>\n Object.values(filters).reduce((prevFilterChoices, filter) => {\n if (!filter.choice) {\n return prevFilterChoices;\n }\n\n return [...prevFilterChoices, filter.choice];\n }, [])\n);\n\nexport const getPriceFilter = createSelector(\n state => state.app.data.filters,\n state => state.bikes.filters,\n (filters, bikeFilters) => {\n const priceFilter = filters.find(filter => filter.type === 'slider');\n\n if (!priceFilter) {\n return null;\n }\n\n const priceFilterIndex = filters.indexOf(priceFilter);\n\n return {\n ...priceFilter,\n ...bikeFilters[priceFilterIndex],\n };\n }\n);\n\nconst filterBikes = filterChoices => bike => {\n if (!filterChoices.length) {\n return true;\n }\n\n return bike.tags && filterChoices.every(tag => bike.tags.includes(tag));\n};\n\nconst filterBikesByPrice = filter => bike =>\n !filter || (bike.price >= filter.from && bike.price <= filter.to) || !bike.price;\n\nexport const bikesSelector = createSelector(\n state => state.bikes.results,\n state => state.bikes.page,\n state => state.bikes.sort,\n getFilterChoices,\n getPriceFilter,\n (bikes, page, sort, filterChoices, priceFilter) => {\n const selectedSortOption = sortOptions.find(sortOption => sortOption.id === sort);\n\n const filteredResults = bikes\n .filter(filterBikes(filterChoices))\n .filter(filterBikesByPrice(priceFilter))\n .sort(selectedSortOption ? selectedSortOption.sortFunction : () => 0);\n\n const resultsVisible = filteredResults.slice(0, page * BIKES_PER_PAGE);\n\n return {\n count: bikes.length,\n filteredCount: filteredResults.length,\n results: resultsVisible,\n };\n }\n);\n\nexport const getFeatureCards = type =>\n createSelector(\n state => state.bikes[type === 'genre' ? 'genreCards' : 'familyCards'],\n state => state.bikes.sort,\n getFilterChoices,\n getPriceFilter,\n (features, sort, filterChoices, priceFilter) => {\n const selectedSortOption = sortOptions.find(sortOption => sortOption.id === sort);\n\n return Object.entries(features).reduce(\n (prevFeatures, [featureId, cards]) => ({\n ...prevFeatures,\n [featureId]: cards\n .filter(filterBikes(filterChoices))\n .filter(filterBikesByPrice(priceFilter))\n .sort(selectedSortOption ? selectedSortOption.sortFunction : () => 0),\n }),\n {}\n );\n }\n );\n\nexport const getFeatureCardCount = type =>\n createSelector(getFeatureCards(type), filteredFeatures => {\n if (!Object.entries(filteredFeatures).length) {\n return null;\n }\n\n return Object.entries(filteredFeatures).reduce((prevCount, [featureId, cards]) => prevCount + cards.length, 0);\n });\n\nexport const getBikesSort = createSelector(\n state => state.bikes.sort,\n sort => sort\n);\n","export const BIKES_PER_PAGE = 8;\n","import React from \"react\";\nexport default (({\n styles = {},\n ...props\n}) => <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" {...props}><path d=\"M15 4h2v20.063l6.781-6.781 1.438 1.438-8.5 8.5-.719.688-.719-.688-8.5-8.5 1.438-1.438L15 24.063V4z\" /></svg>);","import React from \"react\";\nexport default (({\n styles = {},\n ...props\n}) => <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 32 32\" {...props}><path d=\"M12.969 4.281l11 11 .688.719-.688.719-11 11-1.438-1.438L21.812 16 11.531 5.719z\" fill=\"#fff\" /></svg>);","import React, { useRef, useEffect } from 'react';\n\nconst usePrevious = value => {\n const ref = useRef();\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n};\n\nexport default usePrevious;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { navigate as _navigate } from '@reach/router';\nimport { basepathSelector } from 'src/redux/app/selectors';\n\nexport const useNavigate = () => {\n let basepath = useSelector(basepathSelector);\n\n if (basepath[basepath.length - 1] === '/') {\n basepath = basepath.substr(0, basepath.length - 1);\n }\n\n return (to, ...args) => _navigate(basepath + to, ...args);\n};\n","import React from 'react';\nimport styled, { css } from 'styled-components';\nimport Button, { buttonStyles, LinkButton } from 'components/Button/Button';\n\nimport { minBp } from '../../lib/theme';\n\nexport const Container = styled.section`\n ${({ theme, hideOnDesktop, isScrolling }) => `\n display: flex;\n align-items: center;\n height: ${theme.heights.tray.mobile}px;\n z-index: 102;\n width: 100%;\n position: fixed;\n bottom: 0;\n transition: height 0.3s ease;\n height: ${isScrolling ? '34px' : '70px'};\n \n\n @media ${minBp('tablet')} {\n transition: unset;\n height: ${theme.heights.tray.tablet}px;\n }\n\n @media ${minBp('tabletLarge')} {\n height: ${theme.heights.tray.desktop}px;\n display: ${hideOnDesktop ? 'none' : 'flex'};\n }\n `}\n`;\n\nexport const BoxShadow = styled.div`\n height: 20px;\n top: -20px;\n position: absolute;\n width: 100%;\n background: linear-gradient(-180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.15) 100%);\n pointer-events: none;\n\n @media ${minBp('desktop')} {\n height: 30px;\n top: -30px;\n }\n`;\n\nexport const PrevNextStyles = css`\n ${({ nextBtn, isLastStep, financeHidden }) => `\n background: ${nextBtn ? '#cd192d' : '#a7a9ac'};\n color: ${nextBtn ? '#fff' : '#000'};\n height: 100%;\n align-items: center;\n justify-content: center;\n flex-grow: 1;\n cursor: pointer;\n margin: 0;\n flex-basis: 0;\n line-height: 1.15;\n padding: 2px 22px 0;\n text-align: left;\n min-width: ${isLastStep ? '50%' : '140px'};\n // min-width: ${isLastStep || financeHidden ? '120px' : '60px'};\n // max-width: ${isLastStep || financeHidden ? '120px' : '60px'};\n\n @media ${minBp('additional.mobile')} {\n min-width: ${isLastStep ? '50%' : '160px'};\n }\n\n @media ${minBp('tablet')} {\n max-width: none;\n }\n\n &:hover,\n &:focus {\n background: ${nextBtn ? '#8F111F' : '#8E9093'}\n }\n\n &:disabled {\n background: #a7a9ac;\n cursor: not-allowed;\n opacity: 1;\n }\n\n ${!nextBtn && 'display: none'}\n\n @media ${minBp('desktop')} {\n padding: 2px 30px 0;\n text-align: center;\n ${!nextBtn && 'display: flex'};\n }\n `}\n`;\n\nexport const PrevNextButton = styled(Button)`\n ${buttonStyles}\n ${PrevNextStyles}\n`;\n\nexport const PrevNextLink = styled(LinkButton)`\n ${buttonStyles}\n ${PrevNextStyles}\n display: flex;\n background: #cd192d;\n color: #fff;\n\n &:hover,\n &:focus {\n background: #8f111f;\n }\n\n svg {\n margin-left: 5px;\n width: 15px;\n min-width: 15px;\n\n @media ${minBp('tablet')} {\n margin-left: 0;\n width: 16px;\n }\n }\n`;\n\nexport const PrevNextLinkA = styled.a`\n ${buttonStyles}\n ${PrevNextStyles}\n display: flex;\n background: #cd192d;\n color: #fff;\n\n @media ${minBp('additional.mobile')} {\n padding: 2px 30px 0;\n }\n\n &:hover,\n &:focus {\n background: #8f111f;\n }\n\n svg {\n margin-left: 5px;\n width: 15px;\n min-width: 15px;\n\n @media ${minBp('tablet')} {\n margin-left: 0;\n width: 16px;\n }\n }\n`;\n\nexport const PrevNextText = styled.span`\n ${({ nextBtn, isMac, isLastStep, financeHidden }) => `\n display: flex;\n align-items: center;\n\n @media ${minBp('desktop')} {\n margin: 0 8px;\n }\n\n span {\n display: inline-block;\n // display: ${isLastStep || financeHidden ? 'inline-block' : 'none'};\n margin-right: ${isLastStep || financeHidden ? '8px' : 0};\n\n @media ${minBp('tablet')} {\n display: inline;\n margin: 0;\n } \n }\n\n svg {\n position: relative;\n top: auto;\n bottom: ${isMac ? '1px' : '2px'};\n width: 10px;\n height: 10px;\n vertical-align: middle;\n\n @media ${minBp('tablet')} {\n margin-right: ${nextBtn ? '0' : '5px'};\n margin-left: ${nextBtn ? '5px' : '0px'};\n }\n\n @media ${minBp('desktop')} { \n top: auto;\n bottom: ${isMac ? '1px' : '2px'};\n }\n }\n`}\n`;\n\nexport const ConfigOptionsContainer = styled.div`\n ${({ trayModalOpen }) => `\n display: ${trayModalOpen ? 'flex' : 'none'};\n flex-direction: column;\n position: fixed;\n top: 0;\n background: #fff;\n width: 100%;\n z-index: 11;\n height: 100%;\n\n @media ${minBp('desktop')} {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: relative;\n top: auto;\n flex-grow: 2;\n height: 100%;\n width: auto;\n z-index: 2;\n }\n `}\n`;\n\nexport const ConfigOptionsCloseButton = styled.button`\n background: transparent;\n border: none;\n padding: 10px;\n position: absolute;\n top: 12px;\n right: 18px;\n`;\n\nexport const FinanceOptionsContainer = styled.div`\n ${({ theme, financeHidden }) => `\n display: flex;\n flex-grow: 1;\n height: 100%;\n align-items: center;\n background-color: #000;\n color: #fff;\n\n @media ${minBp('tablet')} {\n flex-grow: 0.5;\n min-width: ${financeHidden ? '225px' : '450px'};\n }\n `}\n`;\n\nexport const ConfigOptionsStyles = css`\n display: flex;\n flex-direction: row;\n align-items: center;\n background: #fff;\n font-size: 14px;\n text-decoration: none;\n color: #585a5f;\n height: 50px;\n margin: 0 30px;\n cursor: pointer;\n border-top: 1px solid transparent;\n border-bottom: 1px solid #e0e0e0;\n border-left: 1px solid transparent;\n border-right: none;\n position: relative;\n padding: 0;\n\n @media ${minBp('desktop')} {\n border-right: 1px solid #e0e0e0;\n flex: 1;\n margin: 0;\n }\n\n svg {\n position: absolute;\n right: 30px;\n\n @media ${minBp('desktop')} {\n position: static;\n }\n\n path {\n fill: #000;\n }\n }\n\n @media ${minBp('desktop')} {\n flex-direction: column;\n height: 100%;\n flex-grow: 1;\n justify-content: center;\n\n svg {\n display: none;\n }\n }\n`;\n\nexport const ConfigOptions = styled.button`\n ${ConfigOptionsStyles}\n\n ${({ disabled }) =>\n disabled\n ? `\n opacity: 0.5;\n pointer-events: none;\n cursor: default;\n `\n : ``}\n`;\n\nexport const ConfigOptionsLink = styled(LinkButton)`\n ${ConfigOptionsStyles}\n\n text-transform: none;\n justify-content: flex-start;\n\n :focus-visible {\n outline: auto 1px Highlight;\n outline: auto 1px -webkit-focus-ring-color;\n outline-offset: 0;\n }\n\n @media ${minBp('desktop')} {\n padding: 0;\n }\n`;\n\nexport const ConfigOptionsLinkA = styled.a`\n ${ConfigOptionsStyles}\n\n text-transform: none;\n justify-content: flex-start;\n\n :focus-visible {\n outline: auto 1px Highlight;\n outline: auto 1px -webkit-focus-ring-color;\n outline-offset: 0;\n }\n\n @media ${minBp('desktop')} {\n padding: 0px;\n }\n`;\n\nexport const ConfigOptionsHeader = styled.div`\n background-color: #a7a9ac;\n padding: 21px 30px 17px;\n margin-bottom: 33px;\n\n @media ${minBp('desktop')} {\n display: none;\n }\n`;\n\nexport const ConfigOptionsTitle = styled.span`\n margin: 0;\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n font-size: 17px;\n font-weight: 500;\n text-transform: uppercase;\n line-height: 22px;\n color: #000;\n`;\n\nexport const ConfigOptionsLabelWrapper = styled.span`\n font-family: ${({ theme }) => theme.fonts.dinRegular};\n display: block;\n margin-left: 20px;\n font-size: 16px;\n\n @media ${minBp('desktop')} {\n margin-left: 0;\n }\n`;\n\nexport const ConfigOptionsModalButton = styled.button`\n background: #a7a9ac;\n height: 100%;\n flex-grow: 1;\n display: ${({ hidden }) => (hidden ? 'none' : 'flex')};\n flex-direction: row;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n text-decoration: none;\n color: #585a5f;\n border: none;\n max-width: 40px;\n margin: 0;\n\n @media ${minBp('additional.mobile')} {\n max-width: 60px;\n }\n\n @media ${minBp('tablet')} {\n flex-grow: 0.4;\n max-width: 150px;\n }\n\n @media ${minBp('desktop')} {\n display: none;\n flex-grow: 1;\n }\n`;\n\nexport const ConfigOptionsBackButton = styled.button`\n ${buttonStyles}\n ${PrevNextStyles}\n\n max-width: none;\n display: block;\n background: #cd192d;\n height: 60px;\n color: #fff;\n width: 100%;\n\n &:hover,\n &:focus {\n background: #8f111f;\n }\n\n @media ${minBp('desktop')} {\n display: none;\n }\n`;\n\nexport const ConfigOptionsBackButtonWrapper = styled.div`\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n\n ${ConfigOptionsBackButton} {\n text-align: center;\n }\n`;\n\nexport const InfoButton = styled.button`\n margin-right: 12px;\n padding: 0;\n background: transparent;\n border: none;\n cursor: pointer;\n\n svg {\n pointer-events: none;\n vertical-align: middle;\n width: 20px;\n height: 20px;\n }\n\n @media ${minBp('tablet')} {\n margin-right: 14px;\n }\n\n @media ${minBp('tabletLarge')} {\n svg {\n width: 24px;\n height: 24px;\n }\n }\n`;\n\nexport const FinanceOptionWrap = styled.div`\n ${({ monthlyBreakdown, financeHidden }) => `\n // display: ${monthlyBreakdown ? 'none' : 'flex'};\n // align-items: center;\n font-size: 14px;\n height: 100%;\n text-decoration: none;\n color: #fff;\n flex: 1;\n // padding: 0 8px 0 16px;\n appearance: none;\n text-align: left;\n border: 0;\n background: transparent;\n\n &:not(:last-child) {\n border-right: 1px solid #4c4c4c;\n }\n\n @media ${minBp('tablet')} {\n // display: flex;\n // flex-direction: row;\n // justify-content: flex-start;\n // align-items: center;\n // padding: 0 16px 0 32px;\n }\n\n @media ${minBp('tabletLarge')} {\n // padding-left: 16px;\n // max-width: ${financeHidden ? '100%' : '50%'};\n max-width: 100%;\n // justify-content: center;\n }\n `}\n`;\n\nexport const PriceOptionsLabelWrapper = styled(ConfigOptionsLabelWrapper)`\n font-size: 12px;\n margin: 0;\n\n @media ${minBp('tabletLarge')} {\n font-size: 14px;\n }\n`;\n\nexport const FinanceOptionsLabelWrapper = styled(ConfigOptionsLabelWrapper)`\n font-size: 12px;\n margin: 0;\n\n svg {\n width: 8px;\n height: 7px;\n display: inline-block;\n vertical-align: middle;\n position: absolute;\n right: 0;\n top: 3px;\n margin: 0;\n\n path {\n fill: white;\n }\n }\n\n @media ${minBp('tabletLarge')} {\n font-size: 14px;\n }\n`;\n\nexport const Icon = styled.img`\n height: 32px;\n width: 32px;\n`;\n\nexport const Price = styled.span`\n color: #fff;\n font-size: 15px;\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n margin-top: 2px;\n line-height: 1;\n\n @media ${minBp('tablet')} {\n font-size: 17px;\n display: flex;\n align-items: center;\n font-family: ${({ theme }) => theme.fonts.dinRegular};\n }\n\n @media ${minBp('desktop')} {\n font-size: 22px;\n }\n`;\n\nexport const PriceWrapper = styled.div`\n ${({ theme }) => `\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n position: relative;\n margin: 0 auto;\n padding: 0 10px;\n `}\n`;\n\nexport const FinanceWrapper = styled.div`\n ${({ theme }) => ` \n display: flex;\n align-items: center;\n position: relative;\n\n & > svg {\n width: 18px;\n height: 23px;\n margin-right: 8px;\n\n path {\n fill: white;\n }\n }\n\n @media ${minBp('tablet')} {\n & > svg {\n margin-right: 15px;\n }\n }\n `}\n`;\n\nexport const GarageCount = styled.div`\n left: 25px;\n top: 4px;\n font-size: 12px;\n width: 20px;\n height: 20px;\n line-height: 20px;\n background: red;\n color: white;\n position: absolute;\n border-radius: 50%;\n padding: 0;\n\n @media ${minBp('desktop')} {\n top: 5px;\n left: 50%;\n width: 25px;\n height: 25px;\n line-height: 25px;\n font-size: inherit;\n }\n`;\n\nexport const FinanceButton = styled.button`\n font-family: inherit;\n font-size: inherit;\n color: white;\n padding: 0;\n background: transparent;\n border: 0;\n text-align: left;\n display: flex;\n flex-direction: column;\n`;\n\nexport const FinanceLabel = styled.span`\n text-decoration: underline;\n font-size: 12px;\n color: white;\n margin-top: 2px;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst Container = styled.div`\n max-width: 1180px;\n margin: 0 auto;\n position: relative;\n`;\n\nexport default Container;\n","import React from \"react\";\nexport default (({\n styles = {},\n ...props\n}) => <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" {...props}><path d=\"M5 15h22v2H5v-2z\" /></svg>);","import React, { useEffect } from 'react';\n// TODO: Null checks and tests\n\nimport theme from 'src/lib/theme';\nimport 'objectFitPolyfill';\nimport 'picturefill';\n\nconst ResponsiveImage = ({ mobile, mobileLarge, tablet, tabletLarge, desktop, alt }) => {\n useEffect(() => {\n window.objectFitPolyfill();\n window.picturefill();\n }, []);\n\n return (\n <picture>\n {desktop ? (\n <source media={`(min-width: ${theme.breakpoints.desktop}px)`} srcSet={window.encodeURI(desktop)} />\n ) : null}\n {tabletLarge ? (\n <source media={`(min-width: ${theme.breakpoints.tabletLarge}px)`} srcSet={window.encodeURI(tabletLarge)} />\n ) : null}\n {tablet ? (\n <source media={`(min-width: ${theme.breakpoints.tablet}px)`} srcSet={window.encodeURI(tablet)} />\n ) : null}\n {mobileLarge ? (\n <source media={`(min-width: ${theme.breakpoints.mobileEnd}px)`} srcSet={window.encodeURI(mobileLarge)} />\n ) : null}\n <img\n srcSet={window.encodeURI(mobile || mobileLarge || tablet || tabletLarge || desktop)}\n src={window.encodeURI(mobile || mobileLarge || tablet || tabletLarge || desktop)}\n alt={alt}\n data-object-fit\n loading=\"lazy\"\n />\n </picture>\n );\n};\n\nexport default ResponsiveImage;\n","import React, { Fragment, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { createPortal } from 'react-dom';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { breadcrumbSelector } from 'src/redux/app/selectors';\nimport { activeFilterSelector, getFiltersOpen } from 'src/redux/bikes/selectors';\nimport theme, { maxBp } from 'src/lib/theme';\nimport { setActiveFilter } from 'src/redux/bikes/actions';\nimport { getViewportWidth } from 'helpers/utilities';\nimport Link from '../Link/Link';\n\nconst A = styled.a``;\n\nconst OL = styled.ol`\n @media ${maxBp('tabletLarge')} {\n li {\n display: none !important;\n }\n\n li:nth-child(-n + 2) {\n display: inline-block !important;\n }\n\n li:nth-child(2) {\n i {\n display: none;\n }\n }\n }\n`;\n\nconst Breadcrumb = ({ additionalLinks = [] }) => {\n const breadcrumb = useSelector(breadcrumbSelector);\n const hybridBreadcrumb = (breadcrumb || []).concat(additionalLinks);\n let breadcrumbEl = document.querySelector('.breadcrumb');\n const activeFilter = useSelector(activeFilterSelector);\n const dispatch = useDispatch();\n const filtersOpen = useSelector(getFiltersOpen);\n\n if (!breadcrumbEl) {\n breadcrumbEl = document.createElement('div');\n breadcrumbEl.classList.add('breadcrumb');\n document.body.appendChild(breadcrumbEl);\n }\n\n breadcrumbEl.style.display = 'block';\n breadcrumbEl.classList.add('configurator');\n\n if (filtersOpen && getViewportWidth() <= theme.breakpoints.tablet) {\n breadcrumbEl.style.display = 'none';\n }\n\n const handleBreadcrumbClick = () => {\n if (typeof activeFilter === 'number') {\n dispatch(setActiveFilter(null));\n }\n };\n\n return (\n <>\n {createPortal(\n <OL vocab=\"http://schema.org/\" typeof=\"BreadcrumbList\" onClick={handleBreadcrumbClick}>\n {hybridBreadcrumb.map((link, index) => {\n const isCurrentPage = index + 1 === hybridBreadcrumb.length;\n const linkProps = {};\n let LinkEl = Fragment;\n\n if (!isCurrentPage) {\n if (link.siteLink) {\n linkProps.property = 'item';\n linkProps.typeof = 'WebPage';\n linkProps.href = link.url;\n LinkEl = A;\n } else {\n linkProps.to = link.url;\n LinkEl = Link;\n }\n }\n\n return (\n <li key={`${link.url}_${link.text}`} property=\"itemListElement\" typeof=\"ListItem\">\n <LinkEl {...linkProps}>\n {typeof link.text === 'string' ? (\n <span property=\"name\" dangerouslySetInnerHTML={{ __html: link.text }}></span>\n ) : (\n <span property=\"name\">{link.text}</span>\n )}\n {link.home ? <i aria-hidden=\"true\" className=\"icon icon--home\"></i> : null}\n {index + 1 !== hybridBreadcrumb.length ? (\n <i aria-hidden=\"true\" className=\"icon icon--chevron-right\"></i>\n ) : null}\n </LinkEl>\n <meta property=\"position\" content={index + 1} />\n </li>\n );\n })}\n </OL>,\n breadcrumbEl\n )}\n </>\n );\n};\n\nexport default Breadcrumb;\n","import React from \"react\";\nexport default (({\n styles = {},\n ...props\n}) => <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" {...props}><path d=\"M12.781 5.281l-8 8-.688.719.688.719 8 8 1.438-1.438L7.938 15h13.063c2.754 0 5 2.246 5 5v7h2v-7c0-3.844-3.156-7-7-7H7.938l6.281-6.281z\" /></svg>);","import React from \"react\";\nexport default (({\n styles = {},\n ...props\n}) => <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" {...props}><path d=\"M15 5c-1.293 0-2.395.844-2.813 2H3.999v2h8.188c.418 1.156 1.52 2 2.813 2s2.395-.844 2.813-2h10.188V7H17.813c-.418-1.156-1.52-2-2.813-2zm0 2c.563 0 1 .438 1 1s-.438 1-1 1c-.563 0-1-.438-1-1s.438-1 1-1zm7 6c-1.293 0-2.395.844-2.813 2H3.999v2h15.188c.418 1.156 1.52 2 2.813 2s2.395-.844 2.813-2h3.188v-2h-3.188c-.418-1.156-1.52-2-2.813-2zm0 2c.563 0 1 .438 1 1s-.438 1-1 1c-.563 0-1-.438-1-1s.438-1 1-1zm-11 6c-1.293 0-2.395.844-2.813 2H3.999v2h4.188c.418 1.156 1.52 2 2.813 2s2.395-.844 2.813-2h14.188v-2H13.813c-.418-1.156-1.52-2-2.813-2zm0 2c.563 0 1 .438 1 1s-.438 1-1 1c-.563 0-1-.438-1-1s.438-1 1-1z\" /></svg>);","import React from 'react';\nimport styled from 'styled-components';\nimport { minBp, maxBp } from 'src/lib/theme';\nimport { ConfigOptionsBackButtonWrapper, ConfigOptionsBackButton } from 'components/Tray/Tray.styled';\nimport _ChevronRightIcon from 'src/assets/icons/chevron-right.svg';\nimport Container from 'components/_utility/Container';\n\nexport const ActiveFiltersOuter = styled.div`\n ${({ hideOnMobile }) => `\n flex: 1;\n display: ${hideOnMobile ? 'none' : 'block'};\n\n @media ${minBp('tabletLarge')} {\n display: block;\n }\n `}\n`;\n\nexport const Wrap = styled.div`\n ${({ visible, filterOpen }) => ` \n position: fixed;\n top: 0;\n left: 0;\n background-color: white;\n width: 100%;\n z-index: 100;\n padding: 60px 0 60px;\n height: calc(100% - 60px);\n margin-top: 60px;\n display: ${visible ? 'flex' : 'none'};\n flex-direction: column;\n\n @media ${minBp('tabletLarge')} {\n position: absolute;\n width: 100%;\n bottom: 100px;\n top: auto;\n left: auto;\n background-color: transparent;\n height: auto;\n z-index: 2;\n padding: 0;\n display: block;\n }\n\n ${ActiveFiltersOuter} {\n @media ${minBp('tabletLarge')} {\n display: none; \n }\n }\n `}\n`;\n\nexport const FilterCards = styled.div`\n display: flex;\n flex-direction: column;\n\n @media ${minBp('tabletLarge')} {\n flex-direction: row;\n justify-content: center;\n }\n`;\n\nexport const Card = styled.div`\n ${({ active }) => `\n display: flex;\n font-size: 16px;\n padding: 9px 0;\n border-bottom: 1px solid #e0e0e0;\n margin-bottom: 4px;\n position: relative;\n align-items: center;\n\n @media ${minBp('additional.mobile')} {\n padding: 12px 0;\n }\n\n @media ${minBp('tabletLarge')} {\n margin: 0 30px;\n width: 160px;\n height: 160px;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background-color: ${active ? 'black' : 'white'};\n color: ${active ? 'white' : 'black'};\n box-shadow: 0 0 32px 0 rgba(0, 0, 0, 0.1);\n font-size: 14px;\n cursor: pointer;\n padding: 0;\n border: 0;\n }\n `}\n`;\n\nexport const CardIcon = styled.div`\n ${({ active }) => `\n svg {\n margin: 0 18px 0 0;\n vertical-align: middle;\n position: relative;\n bottom: 2px;\n width: 32px;\n height: 32px;\n }\n\n @media ${minBp('additional.mobile')} {\n svg {\n width: 35px;\n height: 35px;\n }\n }\n\n @media ${minBp('tabletLarge')} {\n svg {\n margin: 0 0 15px;\n vertical-align: middle;\n width: 60px;\n height: 60px;\n position: relative;\n right: auto;\n bottom: auto;\n\n path {\n fill: ${active ? 'white' : 'black'};\n }\n }\n }\n `}\n`;\n\nexport const CardWrap = styled.div`\n ${({ active }) => `\n position: relative;\n\n @media ${minBp('tabletLarge')} {\n z-index: ${active ? 11 : 12};\n }\n `}\n`;\n\nexport const TitleBar = styled.div`\n font-weight: 500;\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n font-size: 17px;\n background-color: #eeeeee;\n text-transform: uppercase;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n line-height: 1;\n height: 60px;\n display: flex;\n align-items: center;\n padding: 4px 24px 0;\n position: absolute;\n\n @media ${minBp('tabletLarge')} {\n display: none;\n }\n`;\n\nexport const CloseButton = styled.button`\n position: absolute;\n top: 16px;\n right: 20px;\n appearance: none;\n border: 0;\n background-color: transparent;\n width: 30px;\n height: 30px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n width: 18px;\n height: 18px;\n }\n`;\n\nexport const ApplyButtonWrapper = styled(ConfigOptionsBackButtonWrapper)`\n @media ${minBp('tabletLarge')} {\n display: none;\n }\n`;\n\nexport const ApplyButton = styled(ConfigOptionsBackButton)``;\n\nexport const ResultsBar = styled.div`\n padding-top: 18px;\n display: flex;\n justify-content: space-between;\n border-top: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n\n @media ${minBp('tabletLarge')} {\n display: none;\n }\n`;\n\nexport const ResultsCount = styled.div`\n font-size: 16px;\n color: #000;\n position: relative;\n top: 2px;\n`;\n\nexport const ResetButton = styled.button`\n appearance: none;\n border: 0;\n border-radius: 4px;\n padding: 5px 7px;\n font-size: 12px;\n background-color: #eaeaea;\n color: #585a5f;\n\n svg {\n width: 14px;\n height: 14px;\n vertical-align: middle;\n position: relative;\n bottom: 2px;\n margin-right: 3px;\n\n path {\n fill: #585a5f;\n }\n }\n`;\n\nexport const ChevronRightIcon = styled(_ChevronRightIcon)`\n vertical-align: middle;\n width: 16px;\n height: 16px;\n position: absolute;\n right: 4px;\n margin: 0;\n\n path {\n fill: #000;\n }\n\n @media ${minBp('tabletLarge')} {\n display: none;\n }\n`;\n\nexport const RefineResults = styled.div`\n ${({ filterOpen }) => `\n padding: 25px 30px 0;\n display: flex;\n\n @media ${minBp('tabletLarge')} {\n position: absolute;\n left: 0;\n bottom: 0;\n width: 100%;\n z-index: ${filterOpen ? 1 : 3};\n padding: 0;\n }\n `}\n`;\n\nexport const RefineResultsInner = styled(Container)`\n ${({ fluid }) => `\n display: flex;\n width: 100%;\n\n @media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {\n padding: ${fluid ? '0' : '0 16px !important'};\n }\n\n @media ${minBp('tabletLarge')} {\n ${\n fluid\n ? `\n max-width: 100%;\n padding-right: 70px;\n `\n : `\n padding: 0 30px;\n `\n }\n }\n\n @media ${minBp('desktop')} {\n ${\n fluid\n ? `\n padding: 0 70px 0 0;\n `\n : `\n padding: 0;\n `\n }\n }\n `}\n`;\n\nexport const FilterButton = styled.button`\n appearance: none;\n border: 1px solid #000;\n padding: 10px 15px;\n color: #000;\n background: transparent;\n width: 100%;\n text-align: left;\n font-family: inherit;\n font-size: inherit;\n position: relative;\n margin-right: 4px;\n flex: 1;\n min-width: calc(50% - 4px);\n height: 40px;\n font-size: 16px;\n\n svg {\n position: absolute;\n top: 0;\n right: 0;\n width: 20px;\n height: 20px;\n top: 8px;\n right: 15px;\n\n path {\n fill: #000;\n }\n }\n\n @media ${minBp('tabletLarge')} {\n display: none;\n }\n`;\n\nexport const FiltersBody = styled.div`\n padding: 26px;\n flex: 1;\n height: calc(100% - 60px);\n overflow: auto;\n\n @media ${minBp('tabletLarge')} {\n padding: 0;\n flex: none;\n height: auto;\n overflow: visible;\n }\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { minBp } from 'src/lib/theme';\n\nexport const Outer = styled.div`\n display: flex;\n height: 61px;\n margin: 8px 0;\n\n .rc-slider {\n position: relative;\n height: 2px;\n width: 100%;\n border-radius: 0;\n -ms-touch-action: none;\n touch-action: none;\n box-sizing: border-box;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n top: 12px;\n border-left: 4px solid #bfbfbf;\n border-right: 4px solid #bfbfbf;\n\n @media ${minBp('tabletLarge')} {\n border-left: 4px solid #515151;\n border-right: 4px solid #515151;\n }\n }\n\n .rc-slider-rail {\n position: absolute;\n width: 100%;\n background-color: #bfbfbf;\n height: 2px;\n border-radius: 0px;\n\n @media ${minBp('tabletLarge')} {\n background-color: #515151;\n }\n }\n\n .rc-slider-track {\n position: absolute;\n left: 0;\n height: 2px;\n border-radius: 0px;\n background-color: #000;\n\n @media ${minBp('tabletLarge')} {\n background-color: #fff;\n }\n }\n\n .rc-slider-step {\n position: absolute;\n width: 100%;\n height: 4px;\n background: transparent;\n }\n\n .rc-slider-dot {\n position: absolute;\n bottom: -2px;\n margin-left: -4px;\n width: 8px;\n height: 8px;\n border: 2px solid #e9e9e9;\n background-color: #fff;\n cursor: pointer;\n border-radius: 50%;\n vertical-align: middle;\n display: none;\n\n &-active {\n border-color: #96dbfa;\n }\n }\n\n .rc-slider-handle {\n position: absolute;\n width: 8px;\n height: 8px;\n cursor: pointer;\n cursor: -webkit-grab;\n margin-top: -3px;\n cursor: grab;\n border-radius: 50%;\n border: 0;\n background-color: #000;\n -ms-touch-action: pan-x;\n touch-action: pan-x;\n\n @media ${minBp('tabletLarge')} {\n background-color: #fff;\n }\n }\n\n .rc-slider-mark {\n position: absolute;\n top: 18px;\n left: 0;\n width: 100%;\n font-size: 12px;\n }\n\n .rc-slider-mark-text {\n position: absolute;\n display: inline-block;\n vertical-align: middle;\n text-align: center;\n cursor: pointer;\n color: #999;\n display: none;\n\n &-active {\n color: #666;\n }\n }\n`;\n\nexport const Circle = styled.button`\n appearance: none;\n background-color: transparent;\n width: 26px;\n height: 26px;\n min-width: 26px;\n min-height: 26px;\n max-width: 26px;\n max-height: 26px;\n border-radius: 50%;\n border: 2px solid #000;\n position: relative;\n cursor: pointer;\n padding: 0;\n\n &:disabled {\n opacity: 0.5;\n cursor: default;\n }\n\n svg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 18px;\n height: 18px;\n\n path {\n fill: #000;\n }\n }\n\n @media ${minBp('tabletLarge')} {\n border: 2px solid white;\n\n svg {\n path {\n fill: white;\n }\n }\n }\n`;\n\nexport const HandleWrap = styled.div`\n ${({ left = 0 }) => `\n left: ${left}%;\n right: auto;\n position: relative;\n `}\n`;\n\nexport const Handle = styled.div`\n position: absolute;\n width: 8px;\n height: 8px;\n cursor: pointer;\n cursor: -webkit-grab;\n margin-top: -3px;\n cursor: grab;\n border-radius: 50%;\n border: 0;\n background-color: #fff;\n -ms-touch-action: pan-x;\n touch-action: pan-x;\n transform: translateX(-50%);\n`;\n\nexport const Tooltip = styled.div`\n width: 40px;\n height: 25px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 500;\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n font-size: 12px;\n position: absolute;\n left: 0;\n transform: translateX(-50%);\n top: 26px;\n background-color: #000;\n border-radius: 4px;\n cursor: pointer;\n cursor: -webkit-grab;\n color: white;\n\n &:after {\n content: ' ';\n position: absolute;\n top: -6px;\n left: 50%;\n transform: translateX(-50%);\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 0 6px 6px 6px;\n border-color: transparent transparent #000 transparent;\n }\n\n @media ${minBp('tabletLarge')} {\n background-color: white;\n color: #000;\n\n &:after {\n border-color: transparent transparent white transparent;\n }\n }\n`;\n","import React from 'react';\nimport Minus from 'src/assets/icons/minus.svg';\nimport Plus from 'src/assets/icons/plus.svg';\nimport Range from 'rc-slider/lib/Range';\nimport Label from 'src/components/_utility/Label';\nimport { Outer, Tooltip, Circle, Handle, HandleWrap } from './RangeSlider.styled';\n\nconst RangeSlider = ({ onDecreaseQuantity, onIncreaseQuantity, canDecrease, canIncrease, ...props }) => (\n <Outer>\n <Circle data-testid=\"rangeMin\" disabled={!canDecrease} onClick={onDecreaseQuantity}>\n <Minus />\n </Circle>\n <Range\n marks={{ 20: 20, 40: 40, 100: 100 }}\n step={null}\n {...props}\n handle={handleProps => (\n <HandleWrap left={handleProps.offset}>\n <Handle role=\"slider\" aria-valuemin={0} aria-valuemax={0} aria-valuenow={0} tabindex={0} {...handleProps} />\n <Tooltip>{handleProps.index === 0 ? <Label name=\"fromLabel\" /> : <Label name=\"toLabel\" />}</Tooltip>\n </HandleWrap>\n )}\n />\n <Circle data-testid=\"rangeMax\" disabled={!canIncrease} onClick={onIncreaseQuantity}>\n <Plus />\n </Circle>\n </Outer>\n);\n\nexport default RangeSlider;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { minBp } from 'src/lib/theme';\nimport { TitleBar } from './BikeFilters.styled';\n\nexport const Dialog = styled.div`\n ${({ hasButton }) => ` \n position: fixed;\n top: 60px;\n left: 0;\n height: calc(100% - 60px);\n width: 100%;\n background-color: white;\n z-index: 101;\n padding: 84px 26px ${hasButton ? '78px' : '26px'};\n\n @media ${minBp('tabletLarge')} {\n position: absolute;\n width: 390px;\n height: auto;\n border-radius: 4px;\n background-color: rgba(0, 0, 0, 0.9);\n padding: 18px 24px;\n top: calc(100% + 12px);\n z-index: 1;\n cursor: default;\n font-size: 14px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 11;\n\n &:after {\n content: ' ';\n position: absolute;\n top: -12px;\n left: 50%;\n transform: translateX(-50%);\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 0 12px 12px 12px;\n border-color: transparent transparent rgba(0, 0, 0, 0.9) transparent;\n }\n }\n `}\n`;\n\nexport const DialogHeader = styled(TitleBar)`\n @media ${minBp('tabletLarge')} {\n display: none;\n }\n`;\n\nexport const FilterTitle = styled.h3`\n color: #000;\n font-weight: 500;\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n font-size: inherit;\n margin: 0 0 5px;\n\n @media ${minBp('tabletLarge')} {\n margin: 0 0 10px;\n color: white;\n font-size: inherit;\n text-transform: normal;\n background-color: transparent;\n }\n`;\n\nexport const Choices = styled.div``;\n\nexport const Description = styled.div`\n margin-top: 12px;\n color: #8d8e90;\n\n @media ${minBp('tabletLarge')} {\n margin-top: 10px;\n }\n`;\n\nexport const RangeDescription = styled.div`\n color: #8d8e90;\n margin-bottom: 12px;\n\n span {\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n font-weight: 500;\n color: #000;\n }\n\n @media ${minBp('tabletLarge')} {\n span {\n color: white;\n }\n }\n`;\n\nexport const ClickCatch = styled.div`\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 10;\n`;\n\nexport const BackButton = styled.div`\n padding: 5px;\n position: relative;\n bottom: 1px;\n left: -5px;\n\n svg {\n width: 16px;\n height: 16px;\n vertical-align: middle;\n\n path {\n fill: #585a5f;\n }\n }\n`;\n\nexport const OptionsWrap = styled.div``;\n\nexport const DescriptionWrap = styled.div`\n border-bottom: 1px solid #e0e0e0;\n margin-bottom: 20px;\n padding-bottom: 17px;\n\n @media ${minBp('tabletLarge')} {\n border: 0;\n margin: 0;\n padding: 0;\n }\n`;\n\nexport const DialogBody = styled.div`\n display: flex;\n flex-direction: column-reverse;\n max-height: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n\n @media ${minBp('tabletLarge')} {\n flex-direction: column;\n overflow-y: hidden;\n }\n`;\n\nexport const FilterIcon = styled.div`\n position: relative;\n\n svg {\n vertical-align: middle;\n width: 32px;\n height: 32px;\n }\n\n @media ${minBp('tabletLarge')} {\n display: none;\n }\n`;\n\nexport const ResetFilterButton = styled.button`\n appearance: none;\n border: 0;\n border-radius: 4px;\n padding: 5px 7px;\n font-size: 12px;\n background-color: #eaeaea;\n color: #585a5f;\n position: absolute;\n bottom: 3px;\n right: 0;\n\n svg {\n width: 14px;\n height: 14px;\n vertical-align: middle;\n position: relative;\n bottom: 2px;\n margin-right: 3px;\n\n path {\n fill: #585a5f;\n }\n }\n`;\n\nexport const ScrollIndicator = styled.div`\n position: absolute;\n bottom: 0px;\n left: 0;\n width: 100%;\n height: 25px;\n padding: 3px;\n background-color: #eeeeee;\n\n svg {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n width: 20px;\n height: 20px;\n\n path {\n fill: #585a5f;\n }\n }\n`;\n","import React, { Fragment, useRef, useEffect, useState } from 'react';\nimport SVG from 'react-inlinesvg';\nimport { useSelector, useDispatch } from 'react-redux';\nimport Label from 'src/components/_utility/Label';\nimport Radio from 'components/_form/Radio/Radio';\nimport RangeSlider from 'components/_form/RangeSlider/RangeSlider';\nimport { setFilterChoice, setFilterRange, setActiveFilter, resetFilter } from 'src/redux/bikes/actions';\nimport BackIcon from 'src/assets/icons/chevron-left.svg';\nimport { filtersSelector } from 'src/redux/app/selectors';\nimport { getBikeFilter, isFilterSet } from 'src/redux/bikes/selectors';\nimport { getImageBaseUrl } from 'helpers/request';\nimport ResetIcon from 'src/assets/icons/reset.svg';\nimport ArrowDown from 'src/assets/icons/arrow-down.svg';\nimport { isIOS } from 'helpers/utilities';\nimport useDataLayer from 'src/hooks/useDataLayer';\nimport {\n ClickCatch,\n Dialog,\n DialogHeader,\n Description,\n RangeDescription,\n BackButton,\n OptionsWrap,\n FilterTitle,\n DialogBody,\n DescriptionWrap,\n FilterIcon,\n ResetFilterButton,\n ScrollIndicator,\n} from './FilterDialog.styled';\n\nconst Range = ({ filterIndex, bikeFilter }) => {\n const dispatch = useDispatch();\n const pushToDataLayer = useDataLayer();\n\n const { from: bikeFilterFrom, to: bikeFilterTo, min: floor, max: ceiling } = useSelector(getBikeFilter(filterIndex));\n\n const fromValue = bikeFilter.values.find(value => parseInt(value.value, 10) === bikeFilterFrom);\n const toValue = bikeFilter.values.find(value => parseInt(value.value, 10) === bikeFilterTo);\n const fromText = fromValue.text;\n const toText = toValue.text;\n const fromIndex = bikeFilter.values.indexOf(fromValue);\n const toIndex = bikeFilter.values.indexOf(toValue);\n\n const canIncrease = bikeFilterTo < ceiling;\n const canDecrease = bikeFilterFrom > floor;\n\n const handleIncrease = () => {\n dispatch(\n setFilterRange({\n filter: filterIndex,\n to: parseInt(bikeFilter.values[toIndex + 1].value, 10),\n from: bikeFilterFrom,\n })\n );\n };\n\n const handleDecrease = () => {\n dispatch(\n setFilterRange({\n filter: filterIndex,\n from: parseInt(bikeFilter.values[fromIndex - 1].value, 10),\n to: bikeFilterTo,\n })\n );\n };\n\n const marks = bikeFilter.values.reduce((prevMarks, filter) => {\n prevMarks[parseInt(filter.value, 10)] = parseInt(filter.value, 10);\n\n return prevMarks;\n }, {});\n\n return (\n <Fragment>\n <RangeDescription>\n <Label name=\"fromLabel\" /> <span>{fromText}</span> <Label name=\"toLabel\" factory={val => val.toLowerCase()} />{' '}\n <span>{toText}</span>\n </RangeDescription>\n <RangeSlider\n min={floor}\n max={ceiling}\n value={[bikeFilterFrom, bikeFilterTo]}\n onChange={([from, to]) => {\n pushToDataLayer(`configuratorFilter${filterIndex + 1}`, {\n configuratorFilter: `${from}-${to}`,\n });\n dispatch(setFilterRange({ filter: filterIndex, from, to }));\n }}\n step={null}\n marks={marks}\n onDecreaseQuantity={handleDecrease}\n onIncreaseQuantity={handleIncrease}\n canDecrease={canDecrease}\n canIncrease={canIncrease}\n />\n </Fragment>\n );\n};\n\nconst Choice = ({ filterIndex, values = [] }) => {\n const dispatch = useDispatch();\n const pushToDataLayer = useDataLayer();\n const { choice } = useSelector(getBikeFilter(filterIndex));\n\n return (\n <Fragment>\n <Radio\n id={`${filterIndex}-show-all`}\n label=\"showAllLabel\"\n data-testid=\"showAll\"\n checked={!choice}\n onChange={() => {\n pushToDataLayer(`configuratorFilter${filterIndex + 1}`, {\n configuratorFilter: 'Show all',\n });\n dispatch(setFilterChoice({ filter: filterIndex, choice: null }));\n }}\n isWhite\n />\n {values.map(option => (\n <Radio\n id={option.value}\n key={option.value}\n data-testid={option.value}\n label={option.text}\n checked={choice === option.value}\n onChange={() => {\n pushToDataLayer(`configuratorFilter${filterIndex + 1}`, {\n configuratorFilter: option.text,\n });\n dispatch(setFilterChoice({ filter: filterIndex, choice: option.value }));\n }}\n isWhite\n />\n ))}\n </Fragment>\n );\n};\n\nconst FilterDialog = ({ filterIndex, title, description, type, values, icon }) => {\n const [scrollIndicatorVisible, setScrollIndicatorVisible] = useState(false);\n const dispatch = useDispatch();\n const filters = useSelector(filtersSelector);\n const filterSet = useSelector(isFilterSet(filterIndex));\n const bikeFilter = filters[filterIndex];\n const dialogBodyRef = useRef();\n\n const componentSwitch = {\n slider: Range,\n options: Choice,\n };\n const FilterBody = componentSwitch[type];\n\n useEffect(() => {\n const dialogBodyEl = dialogBodyRef.current;\n\n setTimeout(() => {\n dialogBodyEl.scrollTop = isIOS() ? -(dialogBodyEl.scrollHeight - dialogBodyEl.getBoundingClientRect().height) : 0;\n });\n\n const handleDialogBodyScroll = () => {\n const getScrollTop = el => {\n if (isIOS()) {\n return el.scrollTop + el.scrollHeight - el.getBoundingClientRect().height;\n }\n\n return el.scrollTop;\n };\n\n setScrollIndicatorVisible(\n getScrollTop(dialogBodyEl) + dialogBodyEl.getBoundingClientRect().height < dialogBodyEl.scrollHeight\n );\n };\n\n dialogBodyEl.addEventListener('scroll', handleDialogBodyScroll);\n }, []);\n\n return (\n <>\n <ClickCatch data-testid=\"clickCatch\" onClick={() => dispatch(setActiveFilter(null))} />\n <Dialog>\n <DialogHeader>\n <BackButton data-testid=\"backButton\" onClick={() => dispatch(setActiveFilter(null))}>\n <BackIcon />\n </BackButton>\n {title}\n </DialogHeader>\n <DialogBody ref={dialogBodyRef}>\n <OptionsWrap>\n <FilterTitle>{title}</FilterTitle>\n {FilterBody ? <FilterBody filterIndex={filterIndex} bikeFilter={bikeFilter} values={values} /> : null}\n </OptionsWrap>\n <DescriptionWrap>\n <FilterIcon>\n <SVG src={getImageBaseUrl() + icon} alt={title} />\n {filterSet ? (\n <ResetFilterButton data-testid=\"resetFilter\" onClick={() => dispatch(resetFilter(filterIndex))}>\n <ResetIcon></ResetIcon>\n <Label name=\"resetFilterLabel\" />\n </ResetFilterButton>\n ) : null}\n </FilterIcon>\n {description ? <Description>{description}</Description> : null}\n </DescriptionWrap>\n </DialogBody>\n {scrollIndicatorVisible ? (\n <ScrollIndicator>\n <ArrowDown />\n </ScrollIndicator>\n ) : null}\n </Dialog>\n </>\n );\n};\n\nexport default FilterDialog;\n","import React from 'react';\nimport SVG from 'react-inlinesvg';\nimport { getImageBaseUrl } from 'helpers/request';\nimport { Card, CardWrap, ChevronRightIcon, CardIcon } from './BikeFilters.styled';\nimport FilterDialog from './FilterDialog';\n\nconst FilterCard = ({ index, title, active, icon, type, values, description, onSelectCard, children }) => (\n <CardWrap active={active}>\n <Card active={active} onClick={() => (active ? onSelectCard(null) : onSelectCard(index))} thin>\n {icon ? (\n <CardIcon active={active}>\n <SVG src={getImageBaseUrl() + icon} alt={title} />\n </CardIcon>\n ) : null}\n {title}\n {children}\n <ChevronRightIcon />\n </Card>\n {active ? (\n <FilterDialog\n filterIndex={index}\n type={type}\n title={title}\n description={description}\n values={values}\n icon={icon}\n />\n ) : null}\n </CardWrap>\n);\n\nexport default FilterCard;\n","import React from 'react';\nimport styled from 'styled-components';\nimport Container from 'components/_utility/Container';\nimport { minBp } from 'src/lib/theme';\n\nexport const Wrap = styled(Container)`\n ${({ fluid }) => `\n width: 100%;\n flex: 1;\n padding: 10px 0;\n\n @media ${minBp('tabletLarge')} {\n flex: 1;\n padding: 0;\n\n ${\n fluid\n ? `\n max-width: 100%;\n padding-left: 100px;\n\n @media ${minBp('desktop')} {\n padding-left: 100px;\n }\n `\n : ``\n }\n }\n `}\n`;\n\nexport const Option = styled.div`\n appearance: none;\n display: inline-flex;\n border-radius: 4px;\n background-color: #2a2a2a;\n color: white;\n border: 0;\n font-size: 12px;\n padding: 2px 6px 0 6px;\n line-height: 1;\n height: 24px;\n align-items: center;\n justify-content: center;\n margin: 0 6px 6px 0;\n cursor: pointer;\n\n @media ${minBp('tabletLarge')} {\n height: 32px;\n font-size: 16px;\n }\n`;\n\nexport const Close = styled.button`\n appearance: none;\n margin-right: 4px;\n background: transparent;\n width: 16px;\n height: 16px;\n border: 0;\n padding: 0;\n pointer-events: none;\n font-size: 12px;\n\n svg {\n height: 16px;\n width: 16px;\n vertical-align: middle;\n position: relative;\n bottom: 1px;\n\n path {\n fill: white;\n }\n }\n`;\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { getFilters } from 'src/redux/bikes/selectors';\nimport Label from 'components/_utility/Label';\nimport CloseIcon from 'src/assets/icons/close.svg';\nimport { filtersSelector } from 'src/redux/app/selectors';\nimport { resetFilter } from 'src/redux/bikes/actions';\nimport { Wrap, Option, Close } from './ActiveFilters.styled';\n\nconst RangeLabel = ({ from, to, values }) => {\n const fromValue = values.find(value => parseInt(value.value, 10) === from);\n const toValue = values.find(value => parseInt(value.value, 10) === to);\n const fromText = fromValue.text;\n const toText = toValue.text;\n\n return (\n <>\n {fromText} <Label name=\"toLabel\" factory={label => label.toLowerCase()} /> {toText}\n </>\n );\n};\n\nconst ChoiceLabel = ({ choice: choiceId, values }) => {\n const choice = values.find(value => value.value === choiceId);\n\n return <>{choice.text}</>;\n};\n\nconst ActiveFilters = ({ fluid }) => {\n const dispatch = useDispatch();\n const filters = useSelector(filtersSelector);\n const filtersState = useSelector(getFilters);\n\n const activeFilters = filters\n .map((filter, index) => {\n const filterState = filtersState[index];\n\n if (\n !filterState ||\n (filter.type === 'options' && !filterState.choice) ||\n (filter.type === 'slider' && filterState.from === filterState.min && filterState.to === filterState.max)\n ) {\n return null;\n }\n\n return { index, ...filter, ...filterState };\n })\n .filter(filter => filter);\n\n return (\n <Wrap fluid={fluid}>\n {activeFilters.map(activeFilter => (\n <Option key={activeFilter.index} onClick={() => dispatch(resetFilter(activeFilter.index))}>\n <Close>\n <CloseIcon />\n </Close>\n {activeFilter.type === 'slider' ? <RangeLabel {...activeFilter} /> : <ChoiceLabel {...activeFilter} />}\n </Option>\n ))}\n </Wrap>\n );\n};\n\nexport default ActiveFilters;\n","import React from \"react\";\nexport default (({\n styles = {},\n ...props\n}) => <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" {...props}><path d=\"M5 5v22h22V5zm2 2h5v5H7zm7 0h4v5h-4zm6 0h5v5h-5zM7 14h5v4H7zm7 0h4v4h-4zm6 0h5v4h-5zM7 20h5v5H7zm7 0h4v5h-4zm6 0h5v5h-5z\" /></svg>);","import React from \"react\";\nexport default (({\n styles = {},\n ...props\n}) => <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" {...props}><path d=\"M4 5v6h6V5zm2 2h2v2H6zm6 0v2h15V7zm-8 6v6h6v-6zm2 2h2v2H6zm6 0v2h15v-2zm-8 6v6h6v-6zm2 2h2v2H6zm6 0v2h15v-2z\" /></svg>);","export const sendGaEvent = (action, label) => window.ga('send', 'event', 'Configurator', action, label);\n","import React from 'react';\nimport styled from 'styled-components';\nimport { minBp } from 'src/lib/theme';\n\nexport const ViewWrap = styled.div`\n display: none;\n\n @media ${minBp('tabletLarge')} {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n z-index: 1;\n }\n`;\n\nexport const LabelWrap = styled.div`\n margin-right: 10px;\n color: #000;\n`;\n\nexport const IconWrap = styled.div`\n ${({ active }) => `\n cursor: pointer;\n\n &:not(:last-of-type) {\n margin-right: 4px;\n }\n\n svg {\n path {\n fill: ${active ? '#000' : '#c1c1c1'};\n }\n }\n `}\n`;\n\nexport const SelectWrap = styled.div`\n border: 1px solid #000;\n position: relative;\n margin-left: 4px;\n flex: 1;\n min-width: 50%;\n\n svg {\n position: absolute;\n top: 10px;\n right: 8px;\n width: 16px;\n height: 16px;\n pointer-events: none;\n }\n\n @media ${minBp('tabletLarge')} {\n min-width: 140px;\n flex: none;\n margin-left: 20px;\n\n svg {\n top: 12px;\n }\n }\n`;\n\nexport const Select = styled.select`\n appearance: none;\n border: 0;\n border-radius: 0;\n padding: 10px 35px 8px 15px;\n margin: 0;\n color: #000;\n background: transparent;\n width: 100%;\n text-align: left;\n font-family: inherit;\n font-size: 16px;\n\n &:focus {\n border: 0;\n outline: 2px auto #9ecaed;\n outline: 2px auto -webkit-focus-ring-color;\n outline-offset: 5px;\n transition: none;\n }\n`;\n","import React, { useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport Label from 'src/components/_utility/Label';\nimport GridView from 'src/assets/icons/grid-view.svg';\nimport ListView from 'src/assets/icons/list-view.svg';\nimport { getBikesView, getBikesSort } from 'src/redux/bikes/selectors';\nimport { setView, setSort } from 'src/redux/bikes/actions';\nimport ArrowDown from 'src/assets/icons/arrow-down.svg';\nimport sortOptions from 'src/config/sortOptions.config';\nimport useLabel from 'src/hooks/useLabel';\nimport { sendGaEvent } from 'helpers/analytics';\nimport { getViewportWidth } from 'helpers/utilities';\nimport theme from 'src/lib/theme';\nimport { ViewWrap, IconWrap, LabelWrap, SelectWrap, Select } from './ViewAndSort.styled';\n\nconst ViewAndSort = ({ viewHidden }) => {\n const dispatch = useDispatch();\n const bikeView = useSelector(getBikesView);\n const sortValue = useSelector(getBikesSort);\n const getLabel = useLabel();\n\n useEffect(() => {\n const setToGrid = () => {\n if (getViewportWidth() < theme.breakpoints.tabletLarge) {\n dispatch(setView('grid'));\n }\n };\n\n window.addEventListener('resize', setToGrid);\n\n return () => window.removeEventListener('resize', setToGrid);\n }, []);\n\n return (\n <>\n <ViewWrap>\n {!viewHidden ? (\n <>\n <LabelWrap>\n <Label name=\"viewLabel\" />\n </LabelWrap>\n <IconWrap\n active={bikeView === 'grid'}\n onClick={() => [dispatch(setView('grid')), sendGaEvent('View', 'Grid')]}\n >\n <GridView />\n </IconWrap>\n <IconWrap\n active={bikeView === 'list'}\n onClick={() => [dispatch(setView('list')), sendGaEvent('View', 'List')]}\n >\n <ListView />\n </IconWrap>\n </>\n ) : null}\n </ViewWrap>\n <SelectWrap>\n <Select\n tabIndex=\"0\"\n value={sortValue}\n onChange={event => [dispatch(setSort(event.target.value)), sendGaEvent('Sort By', event.target.value)]}\n >\n <option value=\"\" disabled>\n {getLabel('sortByLabel')}\n </option>\n {sortOptions.map(sortOption => (\n <option key={sortOption.id} value={sortOption.id}>\n {getLabel(sortOption.label)}\n </option>\n ))}\n </Select>\n <ArrowDown />\n </SelectWrap>\n </>\n );\n};\n\nexport default ViewAndSort;\n","import React, { Fragment, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport {\n activeFilterSelector,\n areFiltersSet,\n getFiltersOpen,\n bikesSelector,\n getFeatureCardCount,\n} from 'src/redux/bikes/selectors';\nimport {\n setActiveFilter,\n clearFilters,\n openFiltersModal,\n closeFiltersModal,\n applyFilters,\n} from 'src/redux/bikes/actions';\nimport { filtersSelector } from 'src/redux/app/selectors';\nimport CloseIcon from 'src/assets/icons/close.svg';\nimport ResetIcon from 'src/assets/icons/reset.svg';\nimport FiltersIcon from 'src/assets/icons/filters.svg';\nimport Label from 'components/_utility/Label';\nimport { bodyNoScroll } from 'helpers/utilities';\nimport usePrevious from 'src/hooks/usePrevious';\nimport {\n Wrap,\n FilterCards,\n TitleBar,\n CloseButton,\n ApplyButtonWrapper,\n ApplyButton,\n ResultsBar,\n ResultsCount,\n ResetButton,\n RefineResults,\n RefineResultsInner,\n FilterButton,\n ActiveFiltersOuter,\n FiltersBody,\n} from './BikeFilters.styled';\nimport FilterCard from './FilterCard';\nimport ActiveFilters from './ActiveFilters';\nimport ViewAndSort from './ViewAndSort';\n\nconst BikeFilters = ({ fluid, viewHidden = false, isFamilyPage = false, isGenrePage = false }) => {\n const dispatch = useDispatch();\n const filters = useSelector(filtersSelector);\n const openFilterIndex = useSelector(activeFilterSelector);\n const filtersSet = useSelector(areFiltersSet);\n const filtersOpen = useSelector(getFiltersOpen);\n const { filteredCount: bikeCardCount } = useSelector(bikesSelector);\n const featureCardCount = useSelector(getFeatureCardCount(isFamilyPage ? 'family' : 'genre'));\n const previousFiltersOpen = usePrevious(filtersOpen);\n const count = isFamilyPage || isGenrePage ? featureCardCount : bikeCardCount;\n\n const handleSelectCard = filterId => dispatch(setActiveFilter(filterId));\n\n const filterOpen = typeof openFilterIndex === 'number';\n\n useEffect(() => {\n if (filtersOpen) {\n bodyNoScroll.add();\n }\n\n if (!filtersOpen && previousFiltersOpen) {\n bodyNoScroll.remove();\n }\n }, [filtersOpen, previousFiltersOpen]);\n\n useEffect(() => {\n const closeFiltersOnOrientationChange = () => {\n if (filtersOpen) {\n handleSelectCard(null);\n bodyNoScroll.remove();\n }\n };\n\n window.addEventListener('resize', closeFiltersOnOrientationChange);\n\n return () => window.removeEventListener('resize', closeFiltersOnOrientationChange);\n });\n\n return (\n <Fragment>\n <Wrap visible={filtersOpen} filterOpen={filterOpen}>\n <TitleBar>\n <Label name=\"filtersLabel\" />\n <CloseButton data-testid=\"closeFiltersBtn\" onClick={() => dispatch(closeFiltersModal())}>\n <CloseIcon />\n </CloseButton>\n </TitleBar>\n <FiltersBody>\n <FilterCards>\n {filters.map((filter, index) => {\n const active = index === openFilterIndex;\n\n return (\n <FilterCard {...filter} key={index} index={index} onSelectCard={handleSelectCard} active={active} />\n ); // Used index as key here, as confident order of this array won't change\n })}\n </FilterCards>\n <ActiveFiltersOuter>\n <ActiveFilters fluid={fluid} />\n </ActiveFiltersOuter>\n {filtersSet ? (\n <ResultsBar>\n <ResultsCount>\n <strong>{count}</strong> <Label name=\"resultsLabel\" />\n </ResultsCount>\n <ResetButton data-testid=\"clearFiltersBtn\" onClick={() => dispatch(clearFilters())}>\n <ResetIcon></ResetIcon>\n <Label name=\"clearFiltersLabel\" />\n </ResetButton>\n </ResultsBar>\n ) : null}\n </FiltersBody>\n <ApplyButtonWrapper>\n <ApplyButton onClick={() => dispatch(applyFilters())}>\n <Label name=\"applyFiltersLabel\" />\n </ApplyButton>\n </ApplyButtonWrapper>\n </Wrap>\n <RefineResults filterOpen={filterOpen}>\n <RefineResultsInner fluid={fluid}>\n <ActiveFiltersOuter hideOnMobile>\n <ActiveFilters fluid={fluid} />\n </ActiveFiltersOuter>\n <FilterButton onClick={() => dispatch(openFiltersModal())} data-testid=\"openFiltersBtn\">\n <Label name=\"filtersLabel\" />\n <FiltersIcon></FiltersIcon>\n </FilterButton>\n <ViewAndSort viewHidden={viewHidden}></ViewAndSort>\n </RefineResultsInner>\n </RefineResults>\n </Fragment>\n );\n};\n\nexport default BikeFilters;\n","import React from 'react';\nimport styled, { keyframes } from 'styled-components';\nimport Link from 'components/_utility/Link/Link';\nimport { minBp } from '../../lib/theme';\n// Stop styled-components passing primary prop into Link\nconst _Link = ({ primary, ...props }) => <Link {...props} />; // eslint-disable-line\n\nexport const Wrap = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: #fff;\n width: 100%;\n padding: 10px 30px;\n height: 60px;\n`;\n\nexport const Message = styled.span`\n color: #585a5f;\n font-size: 12px;\n text-align: center;\n display: inline-block;\n\n @media ${minBp('tablet')} {\n font-size: 15px;\n }\n`;\n\nexport const CTA = styled(_Link)`\n color: #000;\n text-transform: uppercase;\n display: inline-block;\n font-weight: 700;\n font-size: 12px;\n text-decoration: none;\n position: relative;\n margin-left: 4px;\n\n @media ${minBp('tablet')} {\n font-size: 15px;\n }\n\n svg {\n height: 12px;\n width: 12px;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n right: -15px;\n\n @media ${minBp('tablet')} {\n height: 15px;\n width: 15px;\n }\n\n path {\n fill: #000;\n }\n }\n`;\n","import React, { useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Label from 'components/_utility/Label';\nimport ChevronRight from 'src/assets/icons/chevron-right.svg';\n\nimport { getConfigurations } from 'src/redux/garage/selectors';\nimport { setConfigurations } from 'src/redux/garage/actions';\nimport request from 'helpers/request';\nimport { Wrap, Message, CTA } from './NotificationStrip.styled';\n\nconst NotificationStrip = () => (\n <Wrap>\n <Message>\n <Label name=\"previouslySavedBikesLabel\" />\n <CTA to=\"/garage\">\n <Label name=\"myGarageLabel\" /> <ChevronRight />\n </CTA>\n </Message>\n </Wrap>\n);\n\nexport const NotificationStripPortal = () => {\n const dispatch = useDispatch();\n const userEmail = window.localStorage.getItem('garageEmailAddress');\n const configurations = useSelector(getConfigurations);\n let notificationStripEl = document.querySelector('.notification-strip');\n const breadcrumbEl = document.querySelector('.breadcrumb');\n\n if (!notificationStripEl && breadcrumbEl?.parentNode) {\n notificationStripEl = document.createElement('div');\n breadcrumbEl.parentNode.insertBefore(notificationStripEl, breadcrumbEl);\n }\n\n useEffect(() => {\n if (!userEmail) {\n return;\n }\n\n const fetchConfigurations = async () => {\n const { data } = await request(`/api/configurator/garage?user=${userEmail}`);\n\n dispatch(setConfigurations(data ? data.configurations : []));\n };\n\n fetchConfigurations();\n }, [dispatch, userEmail]);\n\n return (userEmail && configurations.length && createPortal(<NotificationStrip />, notificationStripEl)) || null;\n};\n\nexport default NotificationStrip;\n","import React from 'react';\nimport styled, { css } from 'styled-components';\nimport Button, { LinkButton } from 'components/Button/Button';\nimport { minBp } from '../../lib/theme';\n\nexport const Outer = styled.div`\n position: relative;\n z-index: 3;\n\n @media ${minBp('tabletLarge')} {\n padding-bottom: 160px;\n }\n`;\n\nexport const Container = styled.div`\n ${({ theme, hasFilters }) => `\n height: 214px;\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-wrap: wrap;\n\n @media ${minBp('mobileEnd')} {\n height: 500px;\n }\n\n @media ${minBp('tabletLarge')} {\n ${\n hasFilters\n ? `\n padding-bottom: 40px;\n `\n : ``\n }\n }\n `}\n`;\n\nexport const ContentWrap = styled.div`\n ${({ theme }) => `\n display: flex;\n flex-direction: column;\n padding: 0 30px;\n min-height: 200px;\n justify-content: center;\n height: 100%;\n width: 100%;\n position: relative;\n\n @media ${minBp('tabletLarge')} {\n padding: 0;\n }\n `}\n`;\n\nexport const Title = styled.h2`\n display: flex;\n justify-content: center;\n font-weight: 500;\n text-transform: uppercase;\n width: 100%;\n text-align: center;\n margin-bottom: 18px;\n font-size: 32px;\n line-height: 32px;\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n color: #fff;\n position: relative;\n\n @media ${minBp('tablet')} {\n font-size: 50px;\n line-height: 50px;\n }\n\n @media ${minBp('tabletLarge')} {\n font-size: 80px;\n line-height: 80px;\n\n &:not(:last-of-type) {\n margin-bottom: 40px;\n }\n }\n`;\n\nexport const ButtonWrapper = styled.div`\n ${({ theme }) => `\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n position: absolute;\n top: 65%;\n left: 50%;\n transform: translateX(-50%);\n width: 100%;\n\n @media ${minBp('tablet')} { \n top: 60%;\n width: auto;\n min-width: 500px;\n }\n\n @media ${minBp('tabletLarge')} {\n flex-wrap: nowrap;\n top: inherit;\n left: inherit;\n transform: none;\n width: 100%;\n position: relative;\n }\n `}\n`;\n\nexport const HeroButtonStyle = css`\n ${({ whiteBackground, theme }) => `\n display: flex;\n flex-basis: calc(50% - 8px);\n margin: 4px;\n height: 32px;\n padding: 2px 0 0;\n font-size: 12px;\n text-transform: uppercase;\n justify-content: center;\n cursor: pointer;\n white-space: nowrap;\n\n &:focus {\n color: ${theme.colors.buttons.default};\n background-color: ${theme.colors.buttons.white};\n }\n\n @media ${minBp('tabletLarge')} {\n height: 40px;\n margin: 0 20px;\n flex-basis: calc(50% - 20px);\n font-size: 17px;\n padding: 11px 20px 8px;\n max-width: 271px;\n }\n\n ${whiteBackground &&\n `color: ${theme.colors.buttons.default};\n background-color: ${theme.colors.buttons.white};\n\n &:focus {\n color: ${theme.colors.buttons.white};\n background-color: ${theme.colors.buttons.default};\n }`}\n `}\n`;\n\nconst _Button = ({ whiteBackground, ...props }) => <Button {...props} />;\n\nexport const HeroButton = styled(_Button)`\n ${HeroButtonStyle};\n`;\n\nconst _LinkButton = ({ whiteBackground, ...props }) => <LinkButton {...props} />;\n\nexport const HeroLinkButton = styled(_LinkButton)`\n ${HeroButtonStyle};\n`;\n\nexport const HeroImageWrapper = styled.div`\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background-color: #585a5f;\n`;\n\nexport const HeroImage = styled.div``;\n","import React from 'react';\nimport styled from 'styled-components';\n\nexport const BackgroundImageContainer = styled.div`\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n`;\n\nexport const BackgroundImageWrapper = styled.div`\n height: 100%;\n width: 100%;\n position: absolute;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n`;\n","import React, { useEffect } from 'react';\n// TODO: Null checks and tests\n\nimport ResponsiveImage from './ResponsiveImage';\n\nimport 'objectFitPolyfill';\n\nimport { BackgroundImageContainer, BackgroundImageWrapper } from './BackgroundImage.styled';\n\nconst BackgroundImage = ({ mobile, tablet, tabletLarge, desktop, alt }) => {\n useEffect(() => {\n window.objectFitPolyfill();\n }, []);\n\n return (\n <BackgroundImageContainer>\n <BackgroundImageWrapper>\n <ResponsiveImage\n mobile={mobile}\n tablet={tablet}\n tabletLarge={tabletLarge}\n desktop={desktop}\n alt={alt}\n data-object-fit\n />\n </BackgroundImageWrapper>\n </BackgroundImageContainer>\n );\n};\n\nexport default BackgroundImage;\n","import React from 'react';\n\nimport Label from 'components/_utility/Label';\nimport { getImageBaseUrl } from 'helpers/request';\nimport BikeFilters from 'src/components/BikeFilters/BikeFilters';\n\nimport { NotificationStripPortal } from 'components/NotificationStrip/NotificationStrip';\nimport {\n Outer,\n Container,\n ContentWrap,\n Title,\n ButtonWrapper,\n HeroButton,\n HeroImageWrapper,\n HeroLinkButton,\n} from './Hero.styled';\n\nimport BackgroundImage from '../_utility/BackgroundImage/BackgroundImage';\n\nconst Hero = ({\n buttons = [],\n title,\n image,\n fluid,\n viewHidden,\n hasFilters,\n isFamilyPage = false,\n isGenrePage = false,\n}) => (\n <>\n <NotificationStripPortal />\n <Outer>\n <Container hasFilters={hasFilters}>\n <HeroImageWrapper>\n {image ? (\n <BackgroundImage\n mobile={getImageBaseUrl() + image.srcSmall}\n tablet={getImageBaseUrl() + image.srcMedium}\n tabletLarge={getImageBaseUrl() + image.srcLarge}\n alt={image.alt}\n />\n ) : null}\n </HeroImageWrapper>\n <ContentWrap>\n <Title noMargin={buttons.length === 0}>{title}</Title>\n {buttons.length ? (\n <ButtonWrapper>\n {buttons.map(({ white = true, ...button }) =>\n button.to ? (\n <HeroLinkButton to={button.to} key={button.id} whiteBackground={white}>\n <Label name={button.label} />\n </HeroLinkButton>\n ) : (\n <HeroButton whiteBackground={white} key={button.id} onClick={button.onClick}>\n <Label name={button.label} />\n </HeroButton>\n )\n )}\n </ButtonWrapper>\n ) : null}\n </ContentWrap>\n </Container>\n <BikeFilters fluid={fluid} viewHidden={viewHidden} isFamilyPage={isFamilyPage} isGenrePage={isGenrePage} />\n </Outer>\n </>\n);\n\nexport default Hero;\n","import React from 'react';\nimport styled from 'styled-components';\n\nexport const Wrap = styled.div`\n margin: 30px 0;\n`;\n\nexport const Title = styled.h3``;\n\nexport const Description = styled.p``;\n","import React from 'react';\nimport Label from 'components/_utility/Label';\nimport { Wrap, Title, Description } from './NoResults.styled';\n\nconst NoResults = () => (\n <Wrap>\n <Title>\n <Label name=\"noResultsTitle\"></Label>\n </Title>\n <Description>\n <Label name=\"noResultsText\"></Label>\n </Description>\n </Wrap>\n);\n\nexport default NoResults;\n","import React from 'react';\nimport styled from 'styled-components';\nimport Link from 'components/_utility/Link/Link';\nimport RichText from 'components/_utility/RichText/RichText';\nimport { minBp } from 'src/lib/theme';\n\n// Stop styled-components passing primary prop into Link\nconst _Link = ({ primary, ...props }) => <Link {...props} />; // eslint-disable-line\n\nexport const Wrap = styled.div`\n ${({ isListingsPage, listView }) => `\n background-color: white;\n box-shadow: 0 0 32px 0 rgba(0, 0, 0, 0.1);\n width: 100%;\n animation-name: fadeIn;\n animation-duration: 0.5s;\n animation-fill-mode: forwards;\n will-change: opacity;\n opacity: 0;\n display: flex;\n flex-direction: column;\n\n @media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {\n display: block;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n }\n\n ${\n isListingsPage\n ? `\n @media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {\n max-width: calc(25% - 32px);\n margin: 0 16px 32px;\n\n ${\n listView\n ? ` \n max-width: 100%;\n margin: 0 0 32px;\n display: flex;\n `\n : ``\n }\n }\n\n `\n : ``\n }\n\n ${\n listView\n ? `\n @media ${minBp('tabletLarge')} {\n height: 215px;\n margin-bottom: 32px;\n flex-direction: row;\n }\n `\n : ``\n }\n `}\n`;\n\nexport const ImageWrap = styled(_Link)`\n ${({ listView }) => `\n border-bottom: ${listView ? 'none' : '1px solid #e0e0e0'};\n height: ${listView ? 'auto' : '150px'};\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n ${\n listView\n ? `\n @media ${minBp('tabletLarge')} {\n flex: 1;\n border-right: 1px solid #e0e0e0;\n }\n `\n : ``\n }\n `}\n`;\n\nexport const Image = styled.img`\n display: block;\n max-height: 110px;\n`;\n\nexport const Content = styled.div`\n ${({ isListingsPage, listView }) => ` \n padding: ${isListingsPage ? '35px 35px 30px' : '35px'};\n height: ${isListingsPage ? 'auto' : '250px'};\n overflow: hidden;\n flex: 1;\n\n @media ${minBp('tabletLarge')} {\n height: 250px;\n }\n\n ${\n listView\n ? `\n @media ${minBp('tabletLarge')} {\n height: auto;\n border-right: 1px solid #e0e0e0;\n padding: 30px 50px;\n }\n `\n : ``\n }\n `}\n`;\n\nexport const Name = styled.h4`\n ${({ listView }) => `\n text-transform: uppercase;\n text-align: ${listView ? 'left' : 'center'};\n margin-bottom: 10px;\n `}\n`;\n\nexport const Price = styled.div`\n ${({ listView }) => `\n text-align: ${listView ? 'left' : 'center'};\n font-weight: 500;\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n color: black;\n margin-bottom: 5px;\n `}\n`;\n\nexport const Description = styled(RichText)`\n ${({ isListingsPage }) => ` \n font-size: 14px;\n max-height: 92px;\n display: ${isListingsPage ? 'none' : 'block'};\n\n @media ${minBp('tabletLarge')} {\n display: block;\n }\n\n ul {\n margin: 0;\n padding: 0;\n padding-left: 16px;\n }\n\n li {\n padding: 3px 0;\n }\n `}\n`;\n\nexport const Actions = styled.div`\n border-top: 1px solid #e0e0e0;\n padding: 10px 0;\n display: flex;\n`;\n\nexport const Divider = styled.div`\n width: 1px;\n height: 43px;\n background-color: #e0e0e0;\n`;\n\nexport const Action = styled(_Link)`\n font-family: ${({ theme }) => theme.fonts.dinRegular};\n height: 43px;\n display: flex;\n justify-content: center;\n align-items: center;\n text-transform: uppercase;\n flex: 1;\n appearance: none;\n color: black;\n font-size: 15px;\n background-color: white;\n border: 0;\n cursor: pointer;\n text-decoration: none;\n text-align: center;\n\n ${({ primary, theme }) =>\n primary\n ? `\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n color: ${theme.colors.buttons.primary};\n font-weight: 500;\n `\n : ``}\n\n &:focus {\n background-color: #fafafa;\n }\n`;\n\nexport const ActionLink = styled.a`\n font-family: ${({ theme }) => theme.fonts.dinRegular};\n height: 43px;\n display: flex;\n justify-content: center;\n align-items: center;\n text-transform: uppercase;\n flex: 1;\n appearance: none;\n color: black;\n font-size: 15px;\n background-color: white;\n border: 0;\n cursor: pointer;\n text-decoration: none;\n text-align: center;\n\n ${({ primary, theme }) =>\n primary\n ? `\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n color: ${theme.colors.buttons.primary};\n font-weight: 500;\n `\n : ``}\n\n &:focus {\n background-color: #fafafa;\n }\n`;\n\nexport const MainContent = styled.div`\n ${({ listView }) => `\n flex: 1;\n\n ${\n listView\n ? `\n @media ${minBp('tabletLarge')} {\n display: flex;\n flex: 2;\n }\n `\n : ``\n }\n `}\n`;\n\nexport const AdditionalContent = styled.div`\n ${({ listView }) => `\n ${\n listView\n ? `\n @media ${minBp('tabletLarge')} {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n `\n : ``\n }\n `}\n`;\n\nexport const DetailedDescription = styled.div`\n ${({ listView }) => `\n display: none;\n\n ${\n listView\n ? `\n @media ${minBp('tabletLarge')} {\n display: block;\n flex: 1;\n padding: 30px 50px;\n font-size: 14px;\n line-height: 1.375;\n }\n `\n : ``\n }\n `}\n`;\n","import React from 'react';\nimport Label from 'components/_utility/Label';\nimport { getImageBaseUrl } from 'helpers/request';\nimport fetchGoal from 'helpers/goals';\nimport { getGoalId } from 'src/redux/app/selectors';\nimport { useSelector } from 'react-redux';\n\nimport {\n Wrap,\n ImageWrap,\n Image,\n Content,\n Name,\n Price,\n Description,\n Actions,\n Action,\n ActionLink,\n Divider,\n MainContent,\n AdditionalContent,\n DetailedDescription,\n} from './BikeCard.styled';\n\nexport const BikeCard = ({\n className,\n bike: { id, name, thumbnail, priceLocalised, pricePrefixText, description, detailDescription, url },\n family = false,\n isListingsPage = false,\n listView = false,\n ...props\n}) => {\n return (\n <Wrap className={className} isListingsPage={isListingsPage} listView={listView} {...props}>\n <MainContent listView={listView}>\n <ImageWrap to={family ? `/bikes/family/${id}` : `/bike/${id}/configure`} listView={listView}>\n {thumbnail ? <Image src={getImageBaseUrl() + thumbnail.src} alt={thumbnail.alt} /> : null}\n </ImageWrap>\n <Content isListingsPage={isListingsPage} listView={listView}>\n <Name dangerouslySetInnerHTML={{ __html: name }} listView={listView} />\n <Price listView={listView}>\n {pricePrefixText || <Label name=\"fromLabel\" />} {priceLocalised}\n </Price>\n <Description dangerouslySetInnerHTML={{ __html: description }} isListingsPage={isListingsPage} />\n </Content>\n </MainContent>\n <AdditionalContent listView={listView}>\n <DetailedDescription\n listView={listView}\n dangerouslySetInnerHTML={{ __html: detailDescription }}\n ></DetailedDescription>\n <Actions>\n <Action onClick to={family ? `/bikes/family/${id}` : `/bike/${id}/configure`} primary>\n <Label name=\"configureLabel\" />\n </Action>\n <Divider />\n <ActionLink href={url}>\n <Label name=\"viewDetailsLabel\" />\n </ActionLink>\n </Actions>\n </AdditionalContent>\n </Wrap>\n );\n};\n\nexport default BikeCard;\n","import React from 'react';\nimport styled from 'styled-components';\nimport _BikeCard from 'components/_cards/BikeCard/BikeCard';\nimport RichText from 'components/_utility/RichText/RichText';\nimport Button from '../Button/Button';\nimport { minBp } from '../../lib/theme';\n\nexport const Wrap = styled.div`\n margin: 20px 0 0;\n position: relative;\n\n ${({ hasButton }) =>\n hasButton\n ? `\n margin: 20px 0 60px;\n `\n : ``}\n\n @media ${minBp('tabletLarge')} {\n margin: 0 0 60px;\n }\n`;\n\nexport const About = styled.div`\n z-index: 2;\n height: 100%;\n width: 100%;\n padding: 20px 30px 10px;\n\n @media ${minBp('tabletLarge')} {\n position: absolute;\n height: 576px;\n width: 460px;\n padding: 70px 100px 0 100px;\n background: white;\n overflow: hidden;\n }\n`;\n\nexport const Hairline = styled.div`\n width: 1px;\n background: #f1f1f1;\n height: 504px;\n position: absolute;\n top: 20px;\n right: 0;\n`;\n\nexport const Description = styled(RichText)`\n line-height: 1.375;\n display: none;\n\n @media ${minBp('tabletLarge')} {\n display: block;\n }\n`;\n\nexport const Bikes = styled.div`\n height: 544px;\n margin-top: -20px;\n\n @media ${minBp('tabletLarge')} {\n margin-top: 0;\n }\n\n .ScrollbarsCustom {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .ScrollbarsCustom-Wrapper {\n position: absolute;\n top: 0px;\n left: 0px;\n bottom: 10px;\n right: 0px;\n overflow: hidden;\n }\n\n .ScrollbarsCustom-Scroller {\n position: absolute;\n top: 0px;\n left: 0px;\n bottom: 0px;\n right: 0px;\n overflow: scroll hidden;\n margin-bottom: -15px;\n }\n\n .ScrollbarsCustom-Content {\n box-sizing: border-box;\n padding: 0.05px;\n min-height: 100%;\n min-width: 100%;\n }\n\n .ScrollbarsCustom-Track.ScrollbarsCustom-TrackX {\n position: absolute;\n overflow: hidden;\n border-radius: 4px;\n background: #dddddd;\n user-select: none;\n height: 10px;\n bottom: 20px;\n left: 30px;\n width: calc(100% - 60px);\n\n @media ${minBp('tabletLarge')} {\n width: calc(100% - 532px);\n bottom: 0px;\n left: 498px;\n }\n }\n\n .ScrollbarsCustom-Thumb.ScrollbarsCustom-ThumbX {\n touch-action: none;\n cursor: pointer;\n border-radius: 4px;\n background: #585a5f;\n height: 100%;\n width: 1245.69px;\n transform: translateX(0px);\n }\n`;\n\nexport const BikeScroller = styled.div`\n ${({ cardCount = 0 }) => `\n display: -ms-grid;\n display: grid;\n padding: 30px 30px 20px;\n grid-gap: 32px;\n grid-auto-flow: column;\n grid-auto-rows: 464px;\n grid-auto-columns: 259px;\n -ms-grid-columns: (259px)[${cardCount}];\n\n @media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {\n display: flex;\n }\n\n @media ${minBp('additional.mobile')} {\n grid-auto-columns: 271px;\n -ms-grid-columns: (271px)[${cardCount}];\n }\n\n @media ${minBp('tabletLarge')} {\n padding: 40px 40px 0 40px;\n padding-left: 500px;\n }\n `}\n`;\n\nexport const Gutter = styled.div`\n width: 1px;\n`;\n\nexport const BikeCard = styled(_BikeCard)`\n @media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {\n min-width: 271px;\n width: 271px;\n max-width: 271px;\n margin-right: 32px;\n }\n`;\n\nexport const ViewButton = styled(Button)`\n margin-top: 15px;\n background-color: ${({ theme }) => theme.colors.buttons.default};\n color: white;\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n font-size: 17px;\n font-weight: 500;\n text-transform: uppercase;\n text-decoration: none;\n position: absolute;\n bottom: 0px;\n z-index: 1;\n\n @media ${minBp('tabletLarge')} {\n position: static;\n bottom: auto;\n }\n\n ${({ variant, theme }) => {\n if (variant === 'btn--style-y') {\n return `\n background-color: ${theme.colors.buttons.racingYellow};\n color: black;\n \n &:hover:not(:disabled) {\n background-color: ${theme.colors.buttons.racingYellowDark};\n border-color: ${theme.colors.buttons.racingYellow};\n outline-color: ${theme.colors.buttons.racingYellowDark};\n color: black;\n }\n \n &:focus {\n background-color: ${theme.colors.buttons.racingYellow};\n border-color: ${theme.colors.buttons.racingYellowDark};\n color: white;\n }\n `;\n }\n }}\n`;\n\nexport const Title = styled.h3`\n text-transform: uppercase;\n font-size: 24px;\n font-family: ${({ theme }) => theme.fonts.dinDemi};\n font-weight: 500;\n margin-bottom: 7px;\n\n @media ${minBp('tabletLarge')} {\n font-size: 35px;\n margin-bottom: 15px;\n }\n`;\n","import React, { useRef } from 'react';\nimport Scrollbar from 'react-scrollbars-custom';\nimport Label from 'components/_utility/Label';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { getFeatureCards } from 'src/redux/bikes/selectors';\nimport { setFeatureCards } from 'src/redux/bikes/actions';\nimport { useNavigate } from 'helpers/routing';\nimport {\n Wrap,\n About,\n Description,\n ViewButton,\n Bikes,\n BikeScroller,\n BikeCard,\n Title,\n Gutter,\n Hairline,\n} from './FeatureBlock.styled';\n\nconst FeatureBlock = ({ id, title, description, familyCards = true, ctaColour }) => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const features = useSelector(getFeatureCards(familyCards ? 'genre' : 'family'));\n const cards = features[id];\n const buttonRef = useRef();\n let scrollerRef;\n\n if (!cards || !cards.length) {\n return null;\n }\n\n return (\n <Wrap hasButton={familyCards}>\n <About>\n <Title>{title}</Title>\n <Description\n dangerouslySetInnerHTML={{\n __html: description,\n }}\n />\n {familyCards ? (\n <ViewButton\n variant={ctaColour}\n ref={buttonRef}\n onClick={() => {\n navigate(`/families/${id}`);\n }}\n >\n <Label name=\"viewCollectionButton\" />\n </ViewButton>\n ) : null}\n <Hairline />\n </About>\n <Bikes>\n <Scrollbar\n noDefaultStyles\n renderer={({ elementRef: _scrollerRef, ...props }) => (\n <div\n ref={ref => {\n scrollerRef = ref;\n return _scrollerRef(ref);\n }}\n {...props}\n ></div>\n )}\n onUpdate={() => {\n if (scrollerRef.classList.contains('trackXVisible') && !scrollerRef.classList.contains('trackMounted')) {\n scrollerRef.classList.add('trackMounted');\n\n if (buttonRef.current) {\n buttonRef.current.style.bottom = '-40px';\n }\n }\n }}\n >\n <BikeScroller cardCount={cards.length}>\n {cards.map(card => (\n <BikeCard key={card.id} bike={card} family={familyCards} />\n ))}\n {cards.length > 1 ? <Gutter></Gutter> : null}\n </BikeScroller>\n </Scrollbar>\n </Bikes>\n </Wrap>\n );\n};\n\nexport default FeatureBlock;\n"],"sourceRoot":""}