{"version":3,"sources":["webpack:///./src/components/_cards/PlaceholderBikeCard/PlaceholderBikeCard.styled.js","webpack:///./src/components/_cards/PlaceholderBikeCard/PlaceholderBikeCard.js","webpack:///./src/components/BikeGrid/BikeGrid.styled.js","webpack:///./src/components/BikeGrid/BikeGrid.js","webpack:///./src/components/_pages/Bikes/Bikes.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/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"],"names":["Wrap","styled","div","TextPlaceholder","width","fluid","height","marginBottom","ImageWrap","Image","img","Content","isListingsPage","minBp","Name","h4","Price","theme","fonts","dinDemi","Description","Actions","Divider","Action","dinRegular","primary","colors","buttons","PlaceholderBikeCard","className","Container","listView","ButtonWrap","maxBp","BikeGrid","familyId","dispatch","useDispatch","useSelector","bikesSelector","filteredCount","bikes","results","isListView","getBikesView","useState","loading","setLoading","loadingAdditional","setLoadingAdditional","useEffect","a","url","request","res","setResults","data","setError","fetchBikes","currentFamilyName","length","family","Label","name","Array","fill","map","_","index","key","Loader","data-testid","bike","BikeCard","id","Button","onClick","setTimeout","loadMore","disabled","wide","Breadcrumb","additionalLinks","text","siteLink","Bikes","familyHero","setFamilyHero","hero","heroSelector","bikeButtons","getContentBasePath","fetchFamilyContent","push","label","to","white","title","heroTitle","image","heroImage","Hero","hasFilters","activeFilterSelector","createSelector","state","activeFilterId","getBikeFilter","filterKey","filters","bikeFilter","getFilters","isFilterSet","filterIndex","filter","min","from","max","choice","Boolean","areFiltersSet","Object","values","some","getFiltersOpen","filtersOpen","view","getFilterChoices","reduce","prevFilterChoices","getPriceFilter","app","bikeFilters","priceFilter","find","type","priceFilterIndex","indexOf","filterBikes","filterChoices","tags","every","tag","includes","filterBikesByPrice","price","page","sort","selectedSortOption","sortOptions","sortOption","filteredResults","sortFunction","resultsVisible","slice","count","getFeatureCards","features","entries","prevFeatures","featureId","cards","getFeatureCardCount","filteredFeatures","prevCount","getBikesSort","styles","props","xmlns","viewBox","d","usePrevious","value","ref","useRef","current","section","hideOnDesktop","isScrolling","heights","tray","mobile","tablet","desktop","BoxShadow","PrevNextStyles","css","nextBtn","isLastStep","financeHidden","PrevNextButton","buttonStyles","PrevNextLinkA","LinkButton","PrevNextText","span","isMac","ConfigOptionsContainer","trayModalOpen","ConfigOptionsCloseButton","button","FinanceOptionsContainer","ConfigOptionsStyles","ConfigOptions","ConfigOptionsLink","ConfigOptionsLinkA","ConfigOptionsHeader","ConfigOptionsTitle","ConfigOptionsLabelWrapper","ConfigOptionsModalButton","hidden","ConfigOptionsBackButton","ConfigOptionsBackButtonWrapper","InfoButton","FinanceOptionWrap","monthlyBreakdown","PriceOptionsLabelWrapper","Icon","PriceWrapper","GarageCount","FinanceButton","FinanceLabel","ResponsiveImage","mobileLarge","tabletLarge","alt","window","objectFitPolyfill","picturefill","media","breakpoints","srcSet","encodeURI","mobileEnd","src","data-object-fit","A","OL","ol","hybridBreadcrumb","breadcrumbSelector","concat","breadcrumbEl","document","querySelector","activeFilter","createElement","classList","add","body","appendChild","style","display","getViewportWidth","createPortal","vocab","typeof","setActiveFilter","link","isCurrentPage","linkProps","LinkEl","Fragment","property","href","Link","dangerouslySetInnerHTML","__html","home","aria-hidden","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","marks","20","40","100","step","handle","handleProps","offset","role","aria-valuemin","aria-valuemax","aria-valuenow","tabindex","Dialog","hasButton","DialogHeader","FilterTitle","h3","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","description","icon","scrollIndicatorVisible","setScrollIndicatorVisible","filtersSelector","filterSet","dialogBodyRef","FilterBody","slider","options","dialogBodyEl","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","viewHidden","bikeView","sortValue","getLabel","useLabel","setToGrid","setView","removeEventListener","tabIndex","event","setSort","target","BikeFilters","isFamilyPage","isGenrePage","openFilterIndex","filtersSet","bikeCardCount","featureCardCount","previousFiltersOpen","handleSelectCard","filterId","bodyNoScroll","remove","closeFiltersOnOrientationChange","closeFiltersModal","clearFilters","applyFilters","openFiltersModal","Message","CTA","NotificationStrip","NotificationStripPortal","userEmail","localStorage","getItem","configurations","getConfigurations","notificationStripEl","parentNode","insertBefore","setConfigurations","fetchConfigurations","ContentWrap","Title","h2","ButtonWrapper","HeroButtonStyle","whiteBackground","HeroButton","HeroLinkButton","HeroImageWrapper","BackgroundImageContainer","BackgroundImageWrapper","BackgroundImage","srcSmall","srcMedium","srcLarge","noMargin","p","NoResults","_Link","RichText","ActionLink","MainContent","AdditionalContent","DetailedDescription","thumbnail","priceLocalised","pricePrefixText","detailDescription"],"mappings":"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","file":"3ff43e2f1a4c870fda41.js","sourcesContent":["import React from 'react';\nimport styled from 'styled-components';\nimport Link from 'components/_utility/Link/Link';\nimport { minBp } from 'src/lib/theme';\n\nexport const Wrap = styled.div`\n  background-color: #eee;\n  box-shadow: 0 0 40px 0 rgba(0, 0, 0, 0.1);\n  width: 100%;\n`;\n\nexport const TextPlaceholder = styled.div`\n  width: ${({ width = 0, fluid }) => (fluid ? '100%' : `${width}px`)};\n  height: ${({ height = 5 }) => height}px;\n  background-color: #e0e0e0;\n  display: ${({ fluid }) => (fluid ? 'block' : 'inline-block')};\n  margin-bottom: ${({ marginBottom = 0 }) => marginBottom}px;\n`;\n\nexport const ImageWrap = styled.div`\n  border-bottom: 1px solid #e0e0e0;\n  height: 150px;\n  padding: 20px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n`;\n\nexport const Image = styled.img`\n  display: block;\n  max-height: 110px;\n`;\n\nexport const Content = styled.div`\n  padding: 35px;\n  height: ${({ isListingsPage }) => (isListingsPage ? '115px' : '250px')};\n\n  @media ${minBp('tabletLarge')} {\n    height: 250px;\n  }\n`;\n\nexport const Name = styled.h4`\n  text-transform: uppercase;\n  text-align: center;\n  margin-bottom: 10px;\n`;\n\nexport const Price = styled.div`\n  text-align: center;\n  font-weight: 500;\n  font-family: ${({ theme }) => theme.fonts.dinDemi};\n  color: black;\n  margin-bottom: 5px;\n`;\n\nexport const Finance = styled.div`\n  margin-bottom: 12px;\n  font-size: 14px;\n  text-align: center;\n`;\n\nexport const Description = styled.div`\n  ${({ isListingsPage }) => `  \n    font-size: 14px;\n    max-height: 92px;\n    overflow: auto;\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\n// Stop styled-components passing primary prop into Link\nconst _Link = ({ primary, ...props }) => <Link {...props} />; // eslint-disable-line\n\nexport const Action = styled.div`\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: transparent;\n  border: 0;\n  cursor: pointer;\n  text-decoration: none;\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","import React from 'react';\nimport {\n  Wrap,\n  ImageWrap,\n  Image,\n  Content,\n  Name,\n  Price,\n  Finance,\n  Description,\n  Actions,\n  Action,\n  Divider,\n  TextPlaceholder,\n} from './PlaceholderBikeCard.styled';\n\nexport const PlaceholderBikeCard = ({ className, isListingsPage }) => (\n  <Wrap className={className}>\n    <ImageWrap>\n      <Image />\n    </ImageWrap>\n    <Content isListingsPage={isListingsPage}>\n      <Name>\n        <TextPlaceholder width={150} height={22} />\n      </Name>\n      <Price>\n        <TextPlaceholder width={100} height={16} />\n      </Price>\n      <Description isListingsPage={isListingsPage}>\n        <TextPlaceholder height={10} marginBottom={10} fluid />\n        <TextPlaceholder height={10} marginBottom={10} fluid />\n        <TextPlaceholder height={10} marginBottom={10} fluid />\n        <TextPlaceholder height={10} fluid />\n      </Description>\n    </Content>\n    <Actions>\n      <Action>\n        <TextPlaceholder width={80} height={15} />\n      </Action>\n      <Divider />\n      <Action>\n        <TextPlaceholder width={80} height={15} />\n      </Action>\n    </Actions>\n  </Wrap>\n);\n\nexport default PlaceholderBikeCard;\n","import React from 'react';\nimport styled from 'styled-components';\nimport Container from 'components/_utility/Container';\nimport { minBp, maxBp } from 'lib/theme';\n\nexport const Wrap = styled(Container)`\n  ${({ listView }) => `\n    display: grid;\n    padding: 32px;\n    grid-gap: 32px;\n    grid-template-columns: 1fr;\n\n    @media ${minBp('tablet')} {\n      grid-template-columns: 1fr 1fr;\n    }\n\n    @media ${minBp('tabletLarge')} {\n      grid-template-columns: 1fr 1fr 1fr;\n      grid-auto-rows: 464px;\n    }\n\n    @media (min-width: 1244px) {\n      padding: 32px 0;\n    }\n\n    @media ${minBp('desktop')} {\n      grid-template-columns: 1fr 1fr 1fr 1fr;\n    }\n\n    @media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {\n      display: flex;\n      flex-wrap: wrap;\n    }\n    \n    ${\n      listView\n        ? `\n      display: flex;\n      flex-direction: column;\n    `\n        : ``\n    }\n  `}\n`;\n\nexport const ButtonWrap = styled.div`\n  padding: 8px 32px 60px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n\n  button {\n    @media ${maxBp('mobileEnd')} {\n      width: 100%;\n    }\n  }\n`;\n","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport BikeCard from 'components/_cards/BikeCard/BikeCard';\nimport Button from 'components/Button/Button';\nimport PlaceholderBikeCard from 'components/_cards/PlaceholderBikeCard/PlaceholderBikeCard';\nimport Loader from 'components/_utility/Loader/Loader';\nimport request from 'helpers/request';\nimport Label from 'components/_utility/Label';\nimport Breadcrumb from 'components/_utility/Breadcrumb/Breadcrumb';\nimport { setResults, loadMore } from 'src/redux/bikes/actions';\nimport { bikesSelector, getBikesView } from 'src/redux/bikes/selectors';\nimport { setError } from 'src/redux/app/actions';\nimport NoResults from 'components/_utility/NoResults/NewResults';\nimport { Wrap, ButtonWrap } from './BikeGrid.styled';\n\nconst BikeGrid = ({ familyId }) => {\n  const dispatch = useDispatch();\n\n  const { filteredCount, results: bikes } = useSelector(bikesSelector);\n  const bikeView = useSelector(getBikesView);\n  const isListView = bikeView === 'list';\n\n  const [loading, setLoading] = useState(true);\n  const [loadingAdditional, setLoadingAdditional] = useState(true);\n\n  useEffect(() => {\n    const fetchBikes = async () => {\n      setLoading(true);\n\n      let url = '/api/configurator/bikes/models';\n\n      if (familyId) {\n        url += `?family=${familyId}`;\n      }\n\n      try {\n        const res = await request(url);\n\n        dispatch(setResults(res.data.bikes));\n        setLoading(false);\n        setLoadingAdditional(false);\n      } catch (ex) {\n        dispatch(setError(ex));\n      }\n    };\n\n    fetchBikes();\n  }, [dispatch, familyId]);\n\n  const currentFamilyName = familyId && bikes.length ? bikes[0].family : <Label name=\"configureLabel\" />;\n\n  return (\n    <>\n      {loading ? (\n        <>\n          <Wrap listView={isListView}>\n            {new Array(8).fill().map((_, index) => (\n              <PlaceholderBikeCard key={index} isListingsPage listView={isListView} />\n            ))}\n          </Wrap>\n          <Loader />\n        </>\n      ) : (\n        <Wrap data-testid=\"bikecards\" listView={isListView}>\n          {bikes.length ? (\n            bikes.map(bike => (\n              <BikeCard data-testid=\"bikecard\" key={bike.id} bike={bike} listView={isListView} isListingsPage />\n            ))\n          ) : (\n            <NoResults />\n          )}\n        </Wrap>\n      )}\n      <ButtonWrap>\n        {bikes.length < filteredCount ? (\n          <Button\n            onClick={() => {\n              setLoadingAdditional(true);\n\n              setTimeout(() => [dispatch(loadMore()), setLoadingAdditional(false)], 100);\n            }}\n            disabled={loadingAdditional}\n            wide\n          >\n            {loadingAdditional ? <Label name=\"loadingLabel\"></Label> : <Label name=\"loadMoreLabel\"></Label>}\n          </Button>\n        ) : null}\n      </ButtonWrap>\n      <Breadcrumb\n        additionalLinks={[\n          familyId\n            ? {\n                text: currentFamilyName,\n                siteLink: false,\n              }\n            : {\n                text: <Label name=\"viewAllButton\" />,\n                siteLink: false,\n              },\n        ]}\n      />\n    </>\n  );\n};\n\nexport default BikeGrid;\n","import React, { useEffect, useState } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport request from 'helpers/request';\nimport { getContentBasePath } from 'helpers/utilities';\nimport { heroSelector } from 'src/redux/app/selectors';\n\nimport Hero from 'components/Hero/Hero';\nimport BikeGrid from 'components/BikeGrid/BikeGrid';\nimport { setError } from 'src/redux/app/actions';\n\nconst Bikes = ({ familyId }) => {\n  const [familyHero, setFamilyHero] = useState({});\n  const hero = useSelector(heroSelector);\n  const dispatch = useDispatch();\n\n  const bikeButtons = [];\n\n  useEffect(() => {\n    if (familyId) {\n      const fetchFamilyContent = async () => {\n        try {\n          const res = await request(`${getContentBasePath()}?family=${familyId}`);\n\n          setFamilyHero(res.data.hero);\n        } catch (ex) {\n          dispatch(setError(ex));\n        }\n      };\n\n      fetchFamilyContent();\n    }\n  }, [dispatch, familyId]);\n\n  if (familyId) {\n    bikeButtons.push({\n      id: 'viewall',\n      label: 'viewAllButton',\n      to: '/bikes',\n      white: true,\n    });\n  }\n\n  const title = familyId ? familyHero.heroTitle : hero.title;\n  const image = familyId ? familyHero.heroImage : hero.image;\n\n  return (\n    <>\n      <Hero buttons={bikeButtons} title={title} image={image} hasFilters />\n      <BikeGrid familyId={familyId} />\n    </>\n  );\n};\n\nexport default Bikes;\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 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"],"sourceRoot":""}