{"version":3,"sources":["utils/style-utils.tsx","services/history-tracker.tsx","redux/document/types.tsx","redux/document/document.reducer.tsx","redux/apartment-search/apartment-search.reducer.tsx","redux/ui/ui.reducer.tsx","utils/apartment-search/address-types.tsx","redux/sagas/apartment-search.sagas.tsx","redux/sagas/ui.sagas.tsx","redux/sagas/index.tsx","serviceWorker.js","faLibrary.tsx","index.tsx","redux/index.tsx","utils/validators.tsx","components/TabSwitcher/index.tsx","utils/apartment-search/default-query.tsx","redux/ui/ui.actions.tsx","components/Agent/AgentImage.tsx","components/Form/MultiButtonSelect/styles.js","components/Form/MultiButtonSelect/index.tsx","components/Buttons/index.tsx","redux/ui/types.tsx","redux/apartment-search/types.tsx","utils/string-utils.tsx","services/search.service.tsx","components/Buttons/CtaButton/index.tsx","components/Info/Phone.tsx","components/Info/Email.tsx","components/ApartmentBlock/index.tsx","redux/sagas/saga.types.tsx","utils/building-types.tsx","components/Logos/LogoHorizontal.tsx","../assets/images/brand-identity/icons/flat.svg","../assets/images/brand-identity/icons/house.svg","../assets/images/brand-identity/icons/rowhouse.svg","../assets/images/brand-identity/icons/cabin.svg","../assets/images/brand-identity/icons/lot.svg","components/PropertyCarousel/placeholder.tsx","components/Form/Checkbox/styles.js","components/Form/Checkbox/index.tsx","components/DropdownSelect/styles.js","components/Agent/ContactForm/styles.js","components/PropertyCarousel/index.tsx","components/Logos/LogoStacked.tsx","utils/property-track.ts","components/Front/ApartmentBubbles/styles.js","components/Front/ApartmentBubbles/index.tsx","components/Front/RecommendationPercentage/styles.js","components/Front/RecommendationPercentage/index.tsx","utils/apartment.tsx","redux/apartment-search/apartment-search.selectors.tsx","redux/apartment-search/apartment-search.actions.tsx","components/Search/ApartmentSearch/index.tsx","components/Form/TextInput/styles.js","components/Front/SectionLifts/styles.js","components/RandomAgent/index.tsx","components/Front/SectionLifts/index.tsx","components/Front/MoreAboutKm/styles.js","components/Front/MoreAboutKm/index.tsx","components/Search/ApartmentSearchBlock/styles.js","components/Search/ApartmentSearchBlock/index.tsx","components/Search/AgencySearch/styles.js","components/Search/AgencySearch/agency-carousel.tsx","components/Search/AgencySearch/agency-map.tsx","components/Search/AgencySearch/index.tsx","components/Search/AgentSearchSimple/styles.js","components/Search/AgentSearchSimple/index.tsx","pages/FrontPage/SearchTabs.tsx","pages/FrontPage/index.tsx","services/contact.service.tsx","components/Form/ContactFormAgentOrAgency/index.tsx","hooks/use-parallax.tsx","components/Agent/Skills.tsx","components/Agent/SocialMediaButtons.tsx","components/Agent/SoldProperties.tsx","components/Agent/SoldPropertiesCarousel/styles.js","components/Agent/SoldPropertiesCarousel/index.tsx","components/WhyKm/styles.js","components/WhyKm/index.tsx","components/ArticleCards/styles.js","components/ArticleCards/index.tsx","components/Buttons/TextButton/index.js","components/Search/AddressSearch/suggestion-categories.tsx","components/Search/AddressSearch/styles.js","components/Search/AddressSearch/index.tsx","components/AgentList/AgentListItem/styles.js","components/AgentList/AgentListItem/index.tsx","hooks/use-on-screen.tsx","services/agent-search.service.tsx","components/Search/AddressSearchResults/styles.js","components/Search/AddressSearchResults/index.tsx","services/agency-search.service.tsx","components/Agent/PropertiesOnSale/index.tsx","components/CookieConsent/styles.js","components/CookieConsent/index.tsx","components/ApartmentGrid/styles.js","components/ApartmentGrid/index.tsx","components/AgentList/styles.js","components/AgentList/index.tsx","components/SiteHeader/NavigationCityList/styles.js","components/SiteHeader/NavigationCityList/index.tsx","components/Search/PropertyKeySearch/styles.js","components/Search/PropertyKeySearch/index.tsx","components/Grid/index.js","utils/index.tsx","hooks/use-localstorage.tsx","components/DropdownSelect/index.tsx","utils/dataLayerPush.tsx","../assets/images/brand-identity/icons/office.svg","../assets/images/brand-identity/icons/ranch.svg","components/Form/TextInput/index.tsx","components/CheckboxSelect/styles.js","components/CheckboxSelect/index.tsx","components/Search/ApartmentSearch/PriceRange/styles.js","components/Search/ApartmentSearch/PriceRange/index.tsx","components/Search/ApartmentSearch/AreaRange/index.tsx","components/Search/ApartmentSearch/YearRange/index.tsx","mainRoutes.tsx","globalStyle.js","components/Logos/logo.tsx","../assets/images/brand-identity/icons/new.svg","../assets/images/brand-identity/icons/garage.svg","../assets/images/brand-identity/icons/other.svg","../assets/images/brand-identity/graphics/footer-bg.svg","../assets/images/brand-identity/graphics/footer-bg-desktop.svg","../assets/images/brand-identity/logos/km-logo-horizontal.png","../assets/images/brand-identity/logos/km-logo-stacked.png","../assets/images/km-2019/back-to-top.svg","components/SiteHeader/styles.js","components/SiteHeader/NavigationItems.tsx","components/SiteHeader/index.tsx","pages/NotFoundPage/styles.js","pages/NotFoundPage/index.tsx","components/SiteFooter/FooterItems.tsx","components/SiteFooter/index.tsx","utils/apartment-search/selections.tsx","components/SiteFooter/styles.js","components/Form/ContactFormAgentOrAgency/styles.js","pages/FrontPage/styles.js","components/ApartmentBlock/styles.js","components/PropertyCarousel/styles.js","components/Image/index.tsx","components/Form/form-styles.js"],"names":["grid","gutter","gutterSmall","narrowWidth","width","fix","value","decimalPlaces","arguments","length","undefined","Number","toFixed","lineHeight","fontSizeInPixels","lineHeightInPixels","lh","emSpacing","emValue","hexToRGB","hex","alpha","replace","m","r","g","b","result","exec","M","R","G","B","rgbString","concat","parseInt","colors","beige","1","2","3","4","blue","5","coral","greenBasic","greenBright","6","greenDark","grey","7","violet","white","color","family","hue","console","warn","breakpoints","xxs","xs","xsm","sm","smd","md","ml","lg","lgx","xl","xxl","iPadHorizontal","media","Object","keys","reduce","accumulator","label","css","boxShadow","almostNormal","basic","huge","hugeLight","largeLight","largeLightHovered","normal","wide","wideActive","wideShifted","baseFont","fontFamily","base","condensed","textStyles","AInline","FormPlaceholderText","H1","H2","H3","H3Condensed","H4","H5","MediumText","MicroText","MicroTextCaps","P","PLarge","PMedium","PSmall","PSmallCondensed","TextLinkSecondary","buttons","ctaLink","textLinkPrimary","textLinkWithColor","clr","hoverClr","ribbonColors","ribbonPercentages","ribbonSizes","sizes","prev","i","l","p","push","getRibbonSizes","ribbon","map","join","size","stripUnit","fluidSize","property","minVw","maxVw","minValue","maxValue","fluidBgSize","isValid","item","isFuture","quarantineUntil","trackHistory","key","preventEmit","hasWindow","currentStorageObj","getHistory","newStorageObj","assign","window","localStorage","setItem","JSON","stringify","emitChanges","error","log","field","getItem","parsed","parse","event","CustomEvent","detail","dispatchEvent","isInQuarantine","quarantine","path","location","pathname","split","validQuarantine","isEmpty","filter","findIndex","setQuarantine","city","aWeekFromNow","addDays","Date","toString","quarantineItem","INIT","customizer","objValue","srcValue","Array","isArray","defaultState","state","action","type","data","cloneDeep","mergeWith","$$loading","initialState","addresses","constraints","areaType","isLoading","limit","defaultQuery","query","rental","results","searched","selections","areaTypes","selectableAreaTypes","conditions","selectableConditions","features","selectableFeatures","houseTypes","selectableHouseTypes","newConstruction","selectableNewConstruction","rooms","selectableRooms","valueListing","selectableValueListing","skip","sort","sortOrder","checkForSearchPageChange","isLanding","history","replaceState","e","chooseTitle","payload","title","document","includes","isRental","ADD_SELECTION","REMOVE_SELECTION","ADD_CONSTRAINT","slot","RESET_SELECTIONS","SET_RENTAL","max","maxRentalPrice","maxSalePrice","min","minRentalPrice","minSalePrice","ADD_ADDRESSES","ADD_QUERY","ADD_SORT","order","LOAD_MORE_PROPERTIES","LOAD_MORE_PROPERTIES_REJECTED","LOAD_MORE_PROPERTIES_FULFILLED","SAVE_TO_LOCALSTORAGE","matches","rest","__rest","version","GET_PROPERTIES_PENDING","GET_PROPERTIES_REJECTED","GET_PROPERTIES_FULLFILLED","SET_STATE_FOR_LANDING_PAGE","hoverDisabled","DISABLE_HOVER","ENABLE_HOVER","addressTypes","address","county","district","municipality","postcode","region","storeLimit","afterSearchTermsChanged","scroll","scrollToTop","selectionSort","a","has","localeCompare","catchAddConstraintAction","takeLatest","SAGA_ADD_CONSTRAINT","addConstraintAction","_ref","put","addConstraint","createQuery","addQuery","getProperties","catchAddSelectionAction","SAGA_ADD_SELECTION","addSelectionAction","_ref2","selection","single","stateSelections","select","getRooms","getHouseTypes","getConditions","getFeatures","getNewConstruction","getValueListing","getSelectionsFromState","foundSelection","filteredStateSelections","s","newSelection","selected","returnSelections","newSelections","addSelection","catchResetSelectionsAction","SAGA_RESET_SELECTIONS","resetSelectionsAction","resetSelections","catchSetRentalAction","SAGA_SET_RENTAL","setRentalAction","_ref3","setRental","catchAddAddressAction","SAGA_ADD_ADDRESSES","addAddressAction","_ref4","addAddresses","catchAddSortAction","SAGA_ADD_SORT","addSortAction","_ref5","addSort","catchGetPropertiesAction","SAGA_GET_PROPERTIES","getPropertiesAction","_ref6","initial","cancelSave","getLimit","catchLoadMoreAction","SAGA_LOAD_MORE","loadMoreAction","LOAD_MORE_PROPERTIES_PENDING","stateResults","getApartmentSearch","newSkip","response","call","searchService","fetchProperties","newLimit","loadMore","SAGA_CANCEL_QUERY","isSelected","selectedRental","getRental","selectedRooms","selectedHouseTypes","selectedFeatures","selectedNewConstruction","selectedValueListing","selectedConditions","selectedAddresses","getAddresses","selectedConstraints","getConstraints","getSort","featureItems","feature","addressItems","addr","conditionQuery","condition","groupType","house","room","delay","ms","Promise","res","setTimeout","delayMs","dataLayerPush","conversionDetails","lastKey","sessionStorage","targetElem","querySelector","top","height","getBoundingClientRect","innerHeight","targetOffset","scrollTo","smooth","duration","removeItem","race","cancel","take","getPropertiesForLandingPageAction","_ref7","searchData","selectedAddress","parsedValue","getAddressQuery","types","getHouseTypesForQuery","getNewConstructionForQuery","getValueListingForQuery","setStateForLandingPage","catchGetPropertiesForLandingPageAction","SAGA_GET_PROPERTIES_FOR_LANDING_PAGE","rootSaga","fork","disableHoverAction","enableAfter","body","classList","add","disableHover","SAGA_ENABLE_HOVER","catchDisableHoverAction","SAGA_DISABLE_HOVER","enableHoverAction","remove","enableHover","catchEnableHoverAction","init","setNavigatingAction","setNavigatingFinishedAction","hash","target","getElementById","scrollMore","catchNavigateAction","catchNavigateEnd","Boolean","hostname","match","library","faAngleDown","faAngleRight","faArrowUp","faCheck","faCheckSquare","faEnvelope","faEye","faFacebook","faFacebookF","faFacebookSquare","faHome","faInfoCircle","faInstagram","faLinkedinIn","faMapMarkerAlt","faMinus","faMinusCircle","faPen","faPhone","faPlay","faPlus","faPlusCircle","faPrint","faSearch","faSeedling","faStar","faStars","faThumbsUp","faTimes","faTwitter","faUser","faUsers","faYoutube","farAngleDown","farAngleLeft","farAngleRight","farAngleUp","farCheck","farCircleNotch","farExpand","farImage","farSpinnerThird","farSquare","farTimes","fasTimes","composeEnhancers","compose","sagaMiddleware","createSagaMiddleware","createBrowserHistory","basename","middleWares","routerMiddleware","store","createStore","combineReducers","router","connectRouter","apartmentSearch","ui","reducers","applyMiddleware","wake","mode","assetPath","deploymentCount","run","showLoader","resolve","hideLoader","loadedEvent","Event","createEvent","initEvent","domainRegex","getDomain","url","isExternalLink","href","isScrollLink","elem","getAttribute","isUrlWithHash","handleHashAnchorsClick","anchors","anchor","isExternal","startsWithHash","test","isCurrentPathname","search","open","id","extra","targetElement","extraPx","assetUrls","onBodyClick","clickPath","el","tagName","parentElement","composedPath","isPressingMetaKey","metaKey","pathAnchors","isAdmin","preventDefault","scrollAnchors","hashAnchors","stopPropagation","scrollAnchor","elemSelector","scrollToElement","startsWith","substr","extraSpace","offsetTop","navigator","onLine","showOfflineToast","indexOf","isAssetUrl","contains","opensToNewTab","then","addEventListener","loadTimeout","listen","__awaiter","clearTimeout","loading","axios","get","headers","Accept","validateStatus","toast","hideAfter","onClick","hide","position","status","$$error","name","metaTitle","meta","responseWake","wakeExternalRedirect","redirectUrl","documentTitle","reload","params","URLSearchParams","validParams","forEach","validParamName","set","validParamsString","newUrl","dispatch","component","nameSort","trackProperty","hasOwnProperty","message","updateOnlineStatus","root","renderMethod","hydrate","render","innerHTML","loadableReady","React","createElement","Provider","ConnectedRouter","Routes","serviceWorker","ready","registration","unregister","isValidPostcode","pcode","validators","string","email","required","firstName","lastName","phone","postCode","propertyID","array","streetAddress","getSchema","fields","shape","object","context","createContext","activeTab","activeUrl","baseUrl","changeTab","renderHidden","Consumer","Tab","props","children","useContext","className","TabPanel","whenActive","hidden","TabSwitcher","saveID","currentUrl","tabs","initialTab","savedTab","saveTab","useLocalStorage","setActiveUrl","useState","savedValue","initiallyActiveTab","index","tab","entries","tabUrl","tUrl","endsWith","setActiveTab","newTab","currentTab","memo","maxArea","maxYearBuilt","minArea","minYearBuilt","sagaDisableHover","AgentImage","agent","degrees","halfBodyImageName","halfBodyImagePath","imageName","imagePath","halfBody","restProps","alt","backupSrc","getAssetUrl","src","Image","itemProp","imageWithSize","fallbackSrc","thumb","SelectionButton","styled","BaseButton","withConfig","componentId","active","disabled","_templateObject","_taggedTemplateLiteral","MultiButtonSelect","PureComponent","constructor","super","this","sel","defaults","toggleSelection","bind","reset","setState","useRedux","onSelection","newSelected","splice","hasError","selectedFound","button","truncate","str","slice","stripTags","htmlString","capitalizeFirst","charAt","toUpperCase","getYoutubeID","CancelToken","API","fetchAPI","source","request","cancelToken","token","CANCEL","api","queryObjects","queryString","arrayFormat","q","encodeURIComponent","CTA","submitting","CtaButton","text","FaIcon","icon","spin","cleanPhone","trim","telPhone","Phone","_a","withIcon","phones","track","Fragment","ph","tph","Email","to","toHtml","namePart","domainPart","ApartmentBlock","ref","useRef","smallValueListing","small","lazy","openInNew","canonicalPath","images","onlineOffer","openHouses","rentInfo","roomTypes","salesPriceUnencumbered","price","showArea","videoPresentationUrl","useEffect","CSS","supports","current","img","style","display","cssText","image","useMemo","getImageUrl","getMainImage","imageAlt","futureOpenHouses","oh","isOpenHouseInFuture","nextOpenHouse","getOpenHouseDate","nextOpenHouseObject","getImageSrc","getImageThumbSrc","ThemeProvider","theme","AptBlock","NavLink","AptBlockImage","AptBlockValueListing","aria-label","backgroundImage","AptBlockIcons","AptBlockIcon","AptBlockOpenHouse","liveDemonstration","weekday","date","month","startHours","startMins","AptBlockInfo","Address","Size","dangerouslySetInnerHTML","__html","filterXSS","RoomTypes","Price","NumberFormat","rentPerMonth","displayType","thousandSeparator","suffix","SAGA_REMOVE_SELECTION","SAGA_ADD_QUERY","buildingTypes","cabin","flat","garage","lot","office","ranch","rowhouse","other","buildingTypeIcons","resolveTypeText","findKey","arr","resolveIcon","LogoHorizontal","asSvg","fill","viewBox","xmlns","d","logo","module","exports","PropertyCarouselPlaceholder","Carousel","PlaceholderSlides","PlaceholderSlide","CB","span","Checkbox","onChange","checked","handleChange","htmlFor","DdSelectWrapper","div","attrs","DdSelectToggle","DdSelectContent","FormHeader","AgentInfo","ImageBubble","_templateObject2","PropertyCarousel","slideCount","loop","swiperOptionsBase","grabCursor","navigation","nextEl","prevEl","pagination","swiperOptionsOne","slidesPerGroup","slidesPerView","spaceBetween","swiperOptionsTwo","450","freeMode","580","860","1920","swiperOptionsThree","1130","swiperOptionsFourOrMore","1300","CarouselHeader","CarouselTitle","CarouselButtons","Swiper","swiperOptions","count","getSwiperOptions","LogoStacked","propertyTrack","agencyInfo","livingArea","roomAmount","agencyKey","companyName","marketingName","priceField","iconMap","kerrostaloasunnot","omakotitalot","uudiskohteet","newConst","tontit","Bubbles","Bubble","aptType","withRouter","stats","useDispatch","statistics","searchByType","sagaResetSelections","sagaAddSelection","housetypeSelection","RecommendationBlock","RecommendationPercentage","Text","multiline","placeholder","getAddressString","doc","isMain","isNormal","mainImage","getFloorPlan","dataUrl","createDeepEqualSelector","createSelectorCreator","defaultMemoize","isEqual","apartmentSearchSelector","_ref8","_ref9","_ref10","_ref12","kmPropertySearch","sagaAddConstraint","sagaSetRental","sagaAddAddresses","sagaAddSort","sagaLoadMore","sagaGetInitialProperties","sagaGetPropertiesForLandingPage","ApartmentSearchConsumer","mapDispatchToProps","sagaInit","ApartmentSearchContainer","connect","itemsWithSelections","area","hasSelectedAreaRange","hasSelectedConditions","hasSelectedFeatures","hasSelectedHousetype","hasSelectedNewConstruction","hasSelectedPriceRange","hasSelectedRooms","hasSelectedValueListing","year","hasSelectedYearRange","FormGroup","StyledInput","input","LiftsContainer","_templateObject3","SectionLift","_templateObject4","_templateObject5","SectionLiftContent","SectionLiftPreview","h4","Link","RandomAgent","setAgent","isSubscribed","agents","getAgent","SectionLifts","agentCount","ashiMaxYear","Wrapper","Container","srcSet","More","AboutContent","CityList","Columns","Column","toArray","obj","MoreAboutKm","cityList","expanded","setExpanded","arrayOfCityObjects","cities","arrayOfArrays","idx","urls","TextButton","toggle","SearchBlockContainer","SearchBlockSelections","SearchButton","SearchButtonContainer","_templateObject6","SearchBlockHeader","_templateObject7","RentalSelect","_templateObject8","RadioSelector","_templateObject9","_templateObject10","_templateObject11","_templateObject12","_templateObject13","Group","_templateObject14","_templateObject15","_templateObject16","_templateObject17","_templateObject18","_templateObject19","_templateObject20","_templateObject21","_templateObject22","_templateObject23","_templateObject24","_templateObject25","_templateObject26","_templateObject27","_templateObject28","_templateObject29","_templateObject30","_templateObject31","_templateObject32","_templateObject33","GroupTitle","MainSelections","_templateObject34","SearchBlockFooter","_templateObject35","ExtraSelections","_templateObject36","_templateObject37","_templateObject38","ButtonBase","ExtraToggle","_templateObject39","EmptySelections","ApartmentSearchBlock","addressRef","extraOpen","setExtraOpen","setSubmitting","handleInputChange","debounce","extras","PropertyKeySearch","AddressSearch","isProperty","onSelect","Dropdown","buttonText","housetypeButtonText","CheckboxSelect","PriceRange","f","v","AreaRange","YearRange","toggleExtras","isOpen","clsx","hasSelectionsFromExtras","doReset","doSearch","ApartmentSearchBlockWrapper","ApartmentSearch","MapContainer","AgencyMapContainer","pulse","keyframes","AgencyMapLoader","AgencyMapInfo","SearchArea","CarouselArea","SpecificSearch","PostcodeSearch","form","AgencyBlock","AgencyTitle","AgencyAddress","AgencyContact","QuickLinks","swiperConfig","320","650","768","1120","1360","mousewheel","AgencyCarousel","forwardRef","agencies","Slide","centerOfFinland","lat","lng","GoogleApiWrapper","LoadingContainer","apiKey","language","google","markers","onMarkerClicked","forcedBounds","infoVisible","setInfoVisible","mapBounds","setMapBounds","mapRef","bounds","maps","LatLngBounds","extend","LatLng","getNorthEast","getSouthWest","equals","extendPoint1","extendPoint2","onMarkerClick","Map","zoom","initialCenter","mapCenter","Marker","Point","scaledSize","quickLinks","AgencySearch","setAgencies","markerPoints","setMarkerPoints","setForcedBounds","isValidForm","setValidForm","carouselRef","postcodeRef","isRendering","agencySearchService","fetchAgencies","parseAgencies","locations","agencyDocuments","coordinates","responsibleFor","urlParts","zIndex","latitude","longitude","getSwiper","swiper","updateSwiper","update","slideTo","flashActive","slideToLoop","wrapperEl","AgencyMap","onSubmit","agenciesInRange","orderedAgencies","agencyMarkers","firstAgency","historyTracker","focusPostcodeAreas","TextInput","as","link","agenciesInArea","focusArea","fetched","first","withLink","SearchForm","Footer","Results","NoResults","AgentSearchSimple","setAgents","isSubmitting","setFetched","nameRef","onBlur","formData","agentSearchService","fetchAgents","firstAgent","homeAgency","animationDuration","maxWidth","AgentList","SearchTabs","FrontHeroTabs","TabButtons","TabContent","SimpleAgentSearch","HeroImage","makeSrcSet","ext","aspectRatio","FrontPageContainer","campaignImageFolder","frontHeroCampaignButtonLink","frontHeroMode","heroTheme","RecentlyAddedApartments","properties","propertyStatistics","useParallax","speed","padding","background","margin","Input","defaultValue","fontSize","whiteSpace","FrontHero","FrontHeroContent","Editor","CampaignLink","backgroundColor","minWidth","ApartmentBubblesContainer","ApartmentBubbles","SuggestedApartments","ApartmentGrid","Articles","ArticleCards","articles","ArticlesMain","WhyKm","agencyCityList","getSubject","subjects","0","analyticsEvents","baseSend","wakeTestEmail","post","subjectIndex","doApartmentContact","subject","doBasicContact","doDownloadContact","validationSchema","Formik","default","ErrorMessage","FormPlaceholder","Placeholder","FormColumns","FormColumn","PlaceholderInput","PlaceholderTextarea","PlaceholderGdpr","PlaceholderButton","ContactFormAgentOrAgency","agency","disableIfPropNotDefined","thankYouMessage","isSubmitted","setSubmitted","initialValues","contactSubmitTimeout","FormWrapper","FormContainer","Suspense","fallback","doSubmit","values","resetForm","onPropMissing","submitUrl","contactService","handleBlur","handleSubmit","noValidate","InputGroup","msg","FormError","Textarea","ThankYouMessage","GdprLink","parallax","selector","options","disabledBb","resizeTm","onResize","destroy","innerWidth","refresh","rellax","removeEventListener","AgentSkills","SomeButton","icons","facebook","instagram","linkedin","twitter","youtube","SocialMediaButtons","accounts","rel","getIcon","SoldProperties","Block","BlockType","BlockInfo","Title","SaleDate","PreBlockContent","SoldPropertiesCarousel","totalCount","setProperties","agentKey","last","lotAreaType","num","toLowerCase","buildingType","isLot","buildingTypeFormatted","CarouselPlaceholder","lotArea","saleDateFormatted","roomtypes","getRoomTypesHtml","WhyKmContent","WhyKmIntro","WhyKmBubbles","full","WhyKmBubble","withIntro","Cards","Card","hasImage","TextPreview","ImageContainer","ReadMore","tile_image","hasNotImage","getTextPreview","articleContent","leadParagraph","description","tallest","setTallest","makeSameHeight","elems","items","calculateTallestTitle","querySelectorAll","articlesToShow","withImages","articlesWithImages","articlesWithoutImages","canonicalUrl","urlPart","suggestionCategories","SearchInput","SelectedAddresses","SelectedTitle","AddressGroup","AddressGroupTitle","AddressGroupItem","categories","createRef","inputRef","initialPlaceholder","resultsOpen","parseAddressSuggestions","getAddressSuggestionsCount","setSearchTerm","checkForClickOutside","addAddressSelection","removeAddressSelection","setOpen","createSelectedAddressGroups","createPlaceholder","onFocus","suggestions","suggestionCategory","addressType","addressTypeName","j","suggestion","category","getAddressByAssignedIndex","isSearching","timestamp","getMilliseconds","extraParams","exists","newAddresses","addressGroups","acc","typeName","groups","addressGroupArray","group","componentDidMount","componentDidUpdate","prevProps","componentWillUnmount","autoComplete","AddressSearchResults","onSelectedAddress","time","wiggle","Item","ItemHeader","ItemFooter","AgentRecommendation","AgentPortrait","AgentName","h5","AgentTitle","AgentExtraTitle","AgentAgency","AgentPhone","AgentEmail","AgentListItem","agentImageSize","extraTitle","recommendationPercentage","itemScope","itemType","handleClick","useOnScreen","rootMargin","onlyOnce","isIntersecting","setIntersecting","observer","IntersectionObserver","entry","unobserve","observe","getAgentsByHouseType","restParams","getAgentsByNameAreaOrDegrees","getAgentByKey","SearchResults","Category","CategoryTitle","CategoryValues","CategoryItem","Component","keysToWatch","currentIndex","onKeyDown","scrollToActiveElement","newIndex","itemTop","bottom","itemBottom","container","containerTop","containerBottom","scrollTop","getSnapshotBeforeUpdate","prevState","snapshot","random","PropertiesOnSale","CookieConsentWrapper","CookieConsentContent","cookieConsentTitle","cookieConsentPageFor","cookieConsentText","storedValue","setStoredValue","visible","setVisible","forceHidden","setForceHidden","sendConsentInfo","hasConsent","cookieConsent","screen","availWidth","isPopup","wrapper","clientHeight","hideConsentElements","ApartmentGridWrapper","ApartmentGridContainer","AgentListItems","openToNewTab","onItemClick","CityListContainer","CityListHeader","CityListGroups","CityListGroupTitle","CityListGroup","NavigationCityListContainer","inputPlaceholder","cityTuples","toPairs","buttonRef","maxLength","letter","itemValues","createLinks","nextProps","KeySearch","buttonHtml","keyRef","propertyKey","gradient","narrow","NarrowContainer","withoutPadding","documentElement","pos","lastIndexOf","removeNonNumeric","allowedVirtualUrls","hasValidVirtualPresentation","domain","getSeconds","sec","usec","$date","$numberLong","weekdays","end","endSecs","getOpenHouseText","remoteUrl","onlyValues","withEnding","start","startSecs","startDate","endDate","getDay","getDate","getMonth","getFullYear","sHours","getHours","sMins","getMinutes","eHours","eMins","endHours","endMins","hasCookieConsent","initialValue","valueToStore","Function","storageObj","updated","toJSON","ddOpen","forceState","newState","toggleDd","dataObj","afterText","extraClass","labelAfter","CheckBoxWrapper","activeSelections","DividerDash","light","vertical","getSellingPrice","useSelector","setMinValue","setMaxValue","limitLength","newMin","newMax","onKeyUp","AdminPage","loadable","resolved","chunkName","isReady","__webpack_modules__","importAsync","requireAsync","requireSync","__webpack_require__","AgencyPage","AgencyPriceList","AgencySearchPage","AgentPage","AgentSearchPage","ApartmentPricingPage","AreaListingPage","AreaPage","ArticleListingPage","ArticlePage","AgentOwnArticle","BulletinsPage","BuyorderPage","BuyordersPage","CampaignContentPage","CampaignSpring2023","CareersPage","CompaniesPage","ContactPage","CookieConsentPage","DanskeChatPage","DanskeFormPage","DanskeSimpleFormPage","DeveloperPage","GdprAgencyPage","GdprPage","HeadstartCancelPage","HeadstartExtendPage","HeadstartPage","HomeSearchPage","HomevisitPage","InfoDisplayPage","LivingPage","MultiAgencyPage","OnlineOfferCancelPage","OnlineOfferPropertyPage","PropertyBrochurePage","PropertyPage","RentalFormPage","SearchPage","SellingPage","TextContentPage","ThinkingPage","components","FrontPage","NotFound","contentComponents","aluesivu","kampanjasisalto","kiinteistovalittajasivu","kohde","myymalasivu","tietosuoja","classNameComponents","routeResolver","page","renderClassComponent","isPage","shortClassName","msMaxTouchPoints","useCookieModal","noCookieConsent","Route","GlobalStyle","Headroom","onPin","onUnpin","SiteHeader","Switch","exact","DynamicRoute","resolver","SiteFooter","border","clip","overflow","stdDeviation","in2","operator","Logo","CookieConsent","createGlobalStyle","noText","HeaderWrapper","header","isLight","HeaderContainer","Navigation","nav","NavLogo","MobileNavLogo","NavSpacer","NavItem","NavItemDropdown","NavItemDropdownTitle","NavLinksSecondary","NavLinksTertiary","NavLinksColumn","Burger","doSpin","ExpanderButton","NavDimmer","QuickLinksContainer","navLinks","secondary","links","tertiary","lightHeaderComponents","SiteHeaderContainer","navOpen","setNavOpen","openedSubnav","setOpenedSubnav","navRef","headerRef","toggleNav","closeNav","disableBodyScroll","clearAllBodyScrollLocks","setVH","getWindowSize","setProperty","onScroll","hh","pageYOffset","getRenderClassComponent","isLightPage","linkElem","throttle","navigationItems","toggleSubnav","NavigationCityList","sID","sTitle","sHref","tTitle","tLinks","tID","tlID","tlTitle","tlHref","Hero","picture","HeroContainer","HeroContent","CtaLinks","HeroPicture","footerMainLinks","currentYear","FooterTop","BackToTop","Spacer","FooterLinkGroups","LinkGroup","LinkGroupTitle","linkTitle","LogoAndLinks","FooterLogo","FooterLogoStacked","SomeLinks","selectableSorting","footer","bg","bgDesktop","backToTop","getColor","h2","imageSrc","setSrc","onError","setAttribute","onerror","onLoad","textarea","PlaceholderSelectable","isActive","PlaceholderText"],"mappings":"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","file":"assets/js/main.chunk.js?cb=c782bedcaaa76d28296f","sourcesContent":["import styled, { css } from \"styled-components\";\n\nexport const grid = {\n\tgutter: 40,\n\tgutterSmall: 30,\n\tnarrowWidth: 926,\n\twidth: 1404,\n};\n\nexport const letterSpacing = (photoshopValue: number, toPixels?: boolean): string => {\n\tconst letterTrackingValue: number = 1000;\n\n\tif (toPixels) {\n\t\treturn `${(photoshopValue / letterTrackingValue) * 16}px`;\n\t}\n\n\treturn `${photoshopValue / letterTrackingValue}em`;\n};\n\nexport const fix = (value: number, decimalPlaces: number = 3): number => Number(value.toFixed(decimalPlaces));\n\nexport const lineHeight = (fontSizeInPixels: number, lineHeightInPixels: number): number => {\n\tconst lh = fix(lineHeightInPixels / fontSizeInPixels);\n\treturn Number(lh);\n};\n\nexport const emSpacing = (emValue: number): string => fix(emValue * 16, 2) + \"px\";\n\nexport const responsiveSize = (min: number, max: number, minScreen: number = 300, maxScreen: number = 1920): string => {\n\treturn `calc(${min}px + (${max} - ${min}) * ((100vw - ${minScreen}px) / (${maxScreen} - ${minScreen})))`;\n};\n\nexport const hexToRGB = (hex: string, alpha?: number) => {\n\t// Expand shorthand form (e.g. \"03F\") to full form (e.g. \"0033FF\")\n\tconst shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n\n\thex = hex.replace(shorthandRegex, (m, r, g, b) => {\n\t\treturn r + r + g + g + b + b;\n\t});\n\n\tconst result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\tconst [M, R, G, B] = result;\n\tconst rgbString = `rgba(${parseInt(R, 16)}, ${parseInt(G, 16)}, ${parseInt(B, 16)}, ${alpha ? alpha : 1})`;\n\n\treturn result ? rgbString : null;\n};\n\nexport const colors = {\n\tbeige: {\n\t\t1: \"#E1C8AF\" /* KM accent beige 1 */,\n\t\t2: \"#EBD7C3\" /* KM accent beige 2 */,\n\t\t3: \"#F0E6D7\" /* KM accent beige 3 */,\n\t\t4: \"#F7F1EB\" /* KM accent beige 4 */,\n\t},\n\tblue: {\n\t\t1: \"#78B4DC\" /* KM accent blue 1 */,\n\t\t2: \"#9BC8E6\" /* KM accent blue 2 */,\n\t\t3: \"#BEDCF0\" /* KM accent blue 3 */,\n\t\t4: \"#DCEBF5\" /* KM accent blue 4 */,\n\t\t5: \"#EDF4F9\" /* KM accent blue 4, 50% */,\n\t},\n\tcoral: {\n\t\t1: \"#FF9187\" /* KM accent coral 1 */,\n\t\t2: \"#FFAFA5\" /* KM accent coral 2 */,\n\t\t3: \"#FFC8C3\" /* KM accent coral 3 */,\n\t\t4: \"#FFE1E1\" /* KM accent coral 4 */,\n\t},\n\tgreenBasic: {\n\t\t1: \"#00A050\" /* KM basic 1 */,\n\t\t2: \"#41B97D\" /* KM basic 2 */,\n\t\t3: \"#82D2AA\" /* KM basic 3 */,\n\t\t4: \"#BEE6D2\" /* KM basic 4 */,\n\t},\n\tgreenBright: {\n\t\t1: \"#23D278\" /* KM bright 1 */,\n\t\t2: \"#5ADC9B\" /* KM bright 2 */,\n\t\t3: \"#91EBBE\" /* KM bright 3 */,\n\t\t4: \"#C8F5DC\" /* KM bright 4 */,\n\t\t5: \"#ECFCF3\" /* KM bright 5 */,\n\t\t6: \"#F1FCF6\" /* KM bright 6 */,\n\t},\n\tgreenDark: {\n\t\t1: \"#006450\" /* KM dark 1 */,\n\t\t2: \"#418C7D\" /* KM dark 2 */,\n\t\t3: \"#82B4AA\" /* KM dark 3 */,\n\t\t4: \"#BED7D2\" /* KM dark 4 */,\n\t},\n\tgrey: {\n\t\t1: \"#3D3D3D\" /* KM grey 1 */,\n\t\t2: \"#6D6D6D\" /* KM grey 2 */,\n\t\t3: \"#9E9E9E\" /* KM grey 3 */,\n\t\t4: \"#CECECE\" /* KM grey 4 */,\n\t\t5: \"#E0E0E0\" /* TBD Gray 5 */,\n\t\t6: \"#F2F2F2\" /* TBD Gray 6 */,\n\t\t7: \"#FAFAFA\" /* TBD Gray 7 */,\n\t},\n\tviolet: {\n\t\t1: \"#8C50B4\" /* KM accent violet 1 */,\n\t\t2: \"#AA7DC8\" /* KM accent violet 2 */,\n\t\t3: \"#C8AADC\" /* KM accent violet 3 */,\n\t\t4: \"#E1D2EB\" /* KM accent violet 4 */,\n\t},\n\twhite: \"#FFFFFF\",\n};\n\nexport const color = (family: string, hue?: number) => {\n\tif (family === \"gray\") {\n\t\tfamily = \"grey\";\n\t}\n\tif (!colors[family]) {\n\t\tconsole.warn(\"Tried to use undefined color family: \", family, \" returning Grey 1\");\n\t\treturn colors.grey[\"1\"];\n\t}\n\n\tif (!hue) {\n\t\treturn colors[family];\n\t}\n\n\tif (!colors[family][hue]) {\n\t\tconsole.warn(`Tried to use undefined color hue: ${hue}, from family: ${family}, ' returning ${family} 1`);\n\t\treturn colors[family][\"1\"];\n\t}\n\n\treturn colors[family][hue];\n};\n\nexport const breakpoints = {\n\txxs: \"0px\",\n\txs: \"320px\",\n\txsm: \"520px\",\n\tsm: \"576px\",\n\tsmd: \"650px\",\n\tmd: \"768px\",\n\tml: \"850px\",\n\tlg: \"992px\",\n\tlgx: \"1120px\",\n\txl: \"1200px\",\n\txxl: \"1320px\",\n\n\tiPadHorizontal: \"1140px\",\n};\n\nexport const media = Object.keys(breakpoints).reduce((accumulator, label) => {\n\taccumulator[label] = (...args) => css`\n\t\t@media (min-width: ${breakpoints[label]}) {\n\t\t\t${css(...args)};\n\t\t}\n\t`;\n\treturn accumulator;\n}, {});\n\nexport const boxShadow = {\n\talmostNormal: \"0px 0px 10px rgba(0, 0, 0, 0.1)\",\n\tbasic: \"0px 4px 4px rgba(0, 0, 0, 0.1)\",\n\thuge: \"0px 5px 30px rgba(0, 0, 0, 0.1)\",\n\thugeLight: \"0px 5px 30px rgba(0, 0, 0, 0.05)\",\n\tlargeLight: \"0px 6px 20px rgba(0, 0, 0, 0.05)\",\n\tlargeLightHovered: \"0px 12px 40px -10px rgba(0, 0, 0, 0.05)\",\n\tnormal: \"0px 0px 10px rgba(0, 0, 0, 0.1)\",\n\twide: \"0px 0px 20px rgba(0, 0, 0, 0.1)\",\n\twideActive: \"0px 0px 10px rgba(0, 0, 0, 0.1)\",\n\twideShifted: \"0px 4px 20px rgba(0, 0, 0, 0.1)\",\n};\n\nconst baseFont = `'GT Walsheim', 'Helvetica', Arial, sans-serif`;\n\nexport const fontFamily = {\n\tbase: baseFont,\n\tcondensed: \"'GT Walsheim Condensed', \" + baseFont,\n};\n\nexport const textStyles = {\n\tAInline: css`\n\t\tbackground-blend-mode: multiply;\n\t\tbackground-image: linear-gradient(to right, #bff3e0 0%, #bff3e0 100%);\n\t\tbackground-position: 0 90%;\n\t\tbackground-repeat: repeat-x;\n\t\tbackground-size: 100% 4px;\n\t\tcolor: ${color(\"grey\", 1)};\n\t\ttext-decoration: none;\n\t\ttransition: background-size 150ms;\n\n\t\t&:hover {\n\t\t\tbackground-size: 100% 100%;\n\t\t}\n\t`,\n\tFormPlaceholderText: css`\n\t\tfont-family: ${fontFamily.condensed};\n\t\tfont-size: 16px;\n\t\tfont-style: normal;\n\t\tfont-weight: normal;\n\t\tletter-spacing: ${emSpacing(0.02)};\n\t\tline-height: ${lineHeight(16, 18)};\n\t`,\n\tH1: css`\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tfont-size: 28px;\n\t\tfont-style: normal;\n\t\tfont-weight: 500;\n\t\tletter-spacing: 0;\n\t\tline-height: ${lineHeight(28, 32)};\n\n\t\t@media (min-width: 768px) {\n\t\t\tfont-size: 36px;\n\t\t\tline-height: ${lineHeight(36, 41)};\n\t\t}\n\n\t\t@media (min-width: 1140px) {\n\t\t\tfont-size: 40px;\n\t\t\tline-height: ${lineHeight(40, 46)};\n\t\t}\n\t`,\n\tH2: css`\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tfont-size: 25px;\n\t\tfont-style: normal;\n\t\tfont-weight: 500;\n\t\tline-height: ${lineHeight(25, 29)};\n\t\tmargin-bottom: 30px;\n\n\t\t@media (min-width: 768px) {\n\t\t\tfont-size: 26px;\n\t\t\tline-height: ${lineHeight(26, 30)};\n\t\t}\n\n\t\t@media (min-width: 1140px) {\n\t\t\tfont-size: 30px;\n\t\t\tline-height: ${lineHeight(30, 34)};\n\t\t\tmargin-bottom: 40px;\n\t\t}\n\t`,\n\tH3: css`\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tfont-family: ${fontFamily.base};\n\t\tfont-size: 22px;\n\t\tfont-style: normal;\n\t\tfont-weight: 500;\n\t\tline-height: ${lineHeight(22, 25)};\n\n\t\t@media (min-width: 768px) {\n\t\t\tfont-size: 22px;\n\t\t\tline-height: ${lineHeight(22, 25)};\n\t\t}\n\n\t\t@media (min-width: 1140px) {\n\t\t\tfont-size: 24px;\n\t\t\tline-height: ${lineHeight(24, 27)};\n\t\t}\n\t`,\n\tH3Condensed: css`\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tfont-family: ${fontFamily.condensed};\n\t\tfont-feature-settings: \"tnum\" on, \"lnum\" on;\n\t\tfont-size: 22px;\n\t\tfont-style: normal;\n\t\tfont-weight: 500;\n\t\tline-height: ${lineHeight(22, 25)};\n\t\tletter-spacing: ${emSpacing(0.01)};\n\n\t\t@media (min-width: 768px) {\n\t\t\tfont-size: 22px;\n\t\t\tline-height: ${lineHeight(22, 25)};\n\t\t}\n\n\t\t@media (min-width: 1140px) {\n\t\t\tfont-size: 24px;\n\t\t\tline-height: ${lineHeight(24, 27)};\n\t\t}\n\t`,\n\tH4: css`\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tfont-family: ${fontFamily.base};\n\t\tfont-size: 20px;\n\t\tfont-style: normal;\n\t\tfont-weight: 500;\n\t\tline-height: ${lineHeight(20, 25)};\n\t\tmargin: 15px 0;\n\n\t\t@media (min-width: 768px) {\n\t\t\tmargin: 20px 0;\n\t\t}\n\n\t\t@media (min-width: 992px) {\n\t\t\tmargin: 25px 0;\n\t\t}\n\t`,\n\tH5: css`\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tfont-family: ${fontFamily.base};\n\t\tfont-size: 18px;\n\t\tfont-style: normal;\n\t\tfont-weight: 500;\n\t\tline-height: ${lineHeight(18, 22)};\n\t\tmargin: 15px 0;\n\n\t\t@media (min-width: 768px) {\n\t\t\tmargin: 20px 0;\n\t\t}\n\n\t\t@media (min-width: 992px) {\n\t\t\tmargin: 25px 0;\n\t\t}\n\t`,\n\tMediumText: css`\n\t\tfont-family: ${fontFamily.base};\n\t\tfont-size: 17px;\n\t\tfont-style: normal;\n\t\tfont-weight: 500;\n\t`,\n\tMicroText: css`\n\t\tfont-weight: normal;\n\t\tfont-size: 14px;\n\t\tline-height: ${lineHeight(14, 18)};\n\t`,\n\tMicroTextCaps: css`\n\t\tfont-weight: bold;\n\t\tfont-size: 13px;\n\t\tletter-spacing: ${emSpacing(0.03)};\n\t\tline-height: ${lineHeight(13, 18)};\n\t\ttext-transform: uppercase;\n\t`,\n\tP: css`\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tfont-size: 17px;\n\t\tfont-style: normal;\n\t\tfont-weight: normal;\n\t\tline-height: ${lineHeight(17, 25)};\n\t`,\n\tPLarge: css`\n\t\tfont-size: 17px;\n\t\tline-height: ${lineHeight(17, 25)};\n\n\t\t@media (min-width: 768px) {\n\t\t\tfont-size: 24px;\n\t\t\tline-height: ${lineHeight(24, 36)};\n\t\t}\n\t`,\n\tPMedium: css`\n\t\tfont-size: 17px;\n\t\tline-height: ${lineHeight(17, 25)};\n\n\t\t@media (min-width: 768px) {\n\t\t\tfont-size: 20px;\n\t\t\tline-height: ${lineHeight(20, 32)};\n\t\t}\n\t`,\n\tPSmall: css`\n\t\tfont-family: ${fontFamily.base};\n\t\tfont-size: 17px;\n\t\tline-height: ${lineHeight(17, 25)};\n\t`,\n\tPSmallCondensed: css`\n\t\tfont-family: ${fontFamily.condensed};\n\t\tfont-size: 17px;\n\t\tline-height: ${lineHeight(17, 25)};\n\t`,\n\tTextLinkSecondary: css`\n\t\tfont-family: ${fontFamily.condensed};\n\t\tfont-size: 16px;\n\t\tfont-weight: normal;\n\t\tletter-spacing: ${emSpacing(0.02)};\n\t\tline-height: ${lineHeight(16, 18)};\n\t`,\n};\n\nexport const buttons = {\n\tctaLink: css`\n\t\tbackground: ${color(\"greenBright\", 1)};\n\t\tborder: 0;\n\t\tborder-radius: 4px;\n\t\tcolor: ${color(\"white\")};\n\t\tcursor: pointer;\n\t\t${textStyles.PSmall};\n\t\tfont-weight: bold;\n\t\tline-height: 1;\n\t\tletter-spacing: ${emSpacing(0.07)};\n\t\tpadding: 16px 16px 15px;\n\t\ttext-align: center;\n\t\ttext-decoration: none;\n\t\ttext-transform: uppercase;\n\t\ttransform: scale(1);\n\t\ttransition: transform 150ms, background-color 150ms;\n\n\t\t@media (min-width: 1140px) {\n\t\t\tfont-size: 16px;\n\t\t}\n\n\t\t&:active {\n\t\t\ttransform: scale(0.96);\n\t\t}\n\n\t\t&:hover {\n\t\t\tbackground-color: #40b880;\n\t\t}\n\t`,\n\ttextLinkPrimary: css`\n\t\t-webkit-appearance: none;\n\t\t-moz-appearance: none;\n\t\tborder: 0;\n\t\tbackground: rgba(255, 255, 255, 0);\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t\tcursor: pointer;\n\t\tfont-family: ${fontFamily.base};\n\t\tfont-size: 16px;\n\t\tfont-weight: bold;\n\t\tletter-spacing: ${emSpacing(0.07)};\n\t\tline-height: normal;\n\t\toutline: 0;\n\t\tpadding: 0;\n\t\ttext-align: left;\n\t\ttext-decoration: none;\n\t\ttext-transform: uppercase;\n\t\ttransition: color 150ms;\n\n\t\t&::after {\n\t\t\tcontent: \"\\u2192\";\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-left: 5px;\n\t\t\ttransform: translateX(0px);\n\t\t\ttransition: transform 150ms;\n\t\t\tvertical-align: center;\n\t\t}\n\n\t\t&:hover {\n\t\t\tcolor: ${color(\"greenBright\", 2)};\n\n\t\t\t&::after {\n\t\t\t\ttransform: translateX(5px);\n\t\t\t}\n\t\t}\n\t`,\n\ttextLinkWithColor: (clr: string, hoverClr: string = clr) => css`\n\t\t-webkit-appearance: none;\n\t\t-moz-appearance: none;\n\t\tborder: 0;\n\t\tbackground: rgba(255, 255, 255, 0);\n\t\tcolor: ${clr};\n\t\tcursor: pointer;\n\t\tfont-family: ${fontFamily.base};\n\t\tfont-size: 16px;\n\t\tfont-weight: bold;\n\t\tletter-spacing: ${emSpacing(0.07)};\n\t\tline-height: normal;\n\t\toutline: 0;\n\t\tpadding: 0;\n\t\ttext-align: left;\n\t\ttext-decoration: none;\n\t\ttext-transform: uppercase;\n\t\ttransition: color 150ms;\n\n\t\t&::after {\n\t\t\tcontent: \"\\u2192\";\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-left: 5px;\n\t\t\ttransform: translateX(0px);\n\t\t\ttransition: transform 150ms;\n\t\t\tvertical-align: center;\n\t\t}\n\n\t\t&:hover {\n\t\t\tcolor: ${hoverClr};\n\n\t\t\t&::after {\n\t\t\t\ttransform: translateX(5px);\n\t\t\t}\n\t\t}\n\t`,\n};\n\nconst ribbonColors = [\n\tcolor(\"greenBright\", 4),\n\tcolor(\"beige\", 1),\n\tcolor(\"greenBasic\", 1),\n\tcolor(\"greenDark\", 2),\n\tcolor(\"greenDark\", 1),\n\tcolor(\"beige\", 1),\n\tcolor(\"greenBasic\", 1),\n\tcolor(\"greenBright\", 2),\n\tcolor(\"beige\", 1),\n\tcolor(\"greenDark\", 1),\n\tcolor(\"greenBasic\", 1),\n\tcolor(\"greenBright\", 4),\n];\n\nconst makeGradient = (clr: string) => `linear-gradient(${clr}, ${clr})`;\nconst makeSize = (size: string) => `${size}% 100%`;\n\nconst ribbonPercentages = [10.64, 8.81, 7.89, 3.56, 8.26, 6.42, 6.61, 11.19, 8.44, 3.3, 9.54, 15.05];\n\nfunction getRibbonSizes() {\n\tconst sizes = [];\n\tlet prev = 0;\n\tfor (let i = 0, l = ribbonPercentages.length; i < l; i++) {\n\t\tconst p = ribbonPercentages[i];\n\t\tif (i === l - 1) {\n\t\t\tsizes.push(100);\n\t\t\treturn sizes;\n\t\t}\n\n\t\tsizes.push(fix(prev + p));\n\t\tprev += p;\n\t}\n\treturn sizes;\n}\n\nexport const ribbonSizes = getRibbonSizes();\n\nexport const ribbon = css`\n\tbackground-image: ${ribbonColors.map(makeGradient).join(\", \")};\n\tbackground-size: ${ribbonSizes.map(makeSize).join(\", \")};\n\tbackground-repeat: no-repeat;\n`;\n\nfunction stripUnit(value) {\n\treturn parseInt(value, 10);\n}\n\nexport const fluidSize = (property, minVw, maxVw, minValue, maxValue) => {\n\treturn `\n\t\t${property}: ${minValue};\n\n\t\t@media screen and (min-width: ${minVw}) {\n\t\t\t${property}: calc(${minValue} + ${stripUnit(maxValue) - stripUnit(minValue)} * (100vw - ${minVw}) / ${stripUnit(maxVw) -\n\t\tstripUnit(minVw)});\n\t\t}\n\n\t\t@media screen and (min-width: ${maxVw}) {\n\t\t\t${property}: ${maxValue};\n\t\t}\n\t`;\n};\n\nexport const fluidBgSize = (property, minVw, maxVw, minValue, maxValue) => {\n\treturn `\n\t\t${property}: ${minValue} ${minValue};\n\n\t\t@media screen and (min-width: ${minVw}) {\n\t\t\t${property}: calc(${minValue} + ${stripUnit(maxValue) - stripUnit(minValue)} * (100vw - ${minVw}) / ${stripUnit(maxVw) -\n\tstripUnit(minVw)}) calc(${minValue} + ${stripUnit(maxValue) - stripUnit(minValue)} * (100vw - ${minVw}) / ${stripUnit(maxVw) -\n\tstripUnit(minVw)});\n\t\t}\n\n\t\t@media screen and (min-width: ${maxVw}) {\n\t\t\t${property}: ${maxValue} ${maxValue};\n\t\t}\n\t`;\n};\n","import { hasWindow } from \"@utils\";\nimport isFuture from \"date-fns/is_future\";\nimport addDays from \"date-fns/add_days\";\nimport findIndex from \"lodash-es/findIndex\";\nimport isEmpty from \"lodash-es/isEmpty\";\n\nconst historyKey: string = \"__wake_hist\";\n\nexport type HistoryField = \"buyer-county\" | \"buyer-postcode\" | \"seller-county\" | \"seller-postcode\" | \"quarantine\";\n\nconst isValid = (item: IQuarantineItem): boolean => item && isFuture(parseInt(item.quarantineUntil, 10));\nconst getQuarantine = (): IQuarantineItem[] => getHistory(\"quarantine\") || [];\n\n/* Shape of the history object\n{\n\t\"buyer-county\": \"Espoo\",\n\t\"buyer-postcode\": \"02280\",\n\t\"seller-county\": \"Espoo\",\n\t\"seller-postcode\": \"02270\",\n\t\"quarantine\": [{ path: \"etsi-kiinteistonvalittaja\", quarantineUntil: \"1561979567000\" }, ...]\n} */\n\ninterface IQuarantineItem {\n\tpath: string;\n\tquarantineUntil: string;\n}\n\nconst trackHistory = (key: HistoryField, value: string | number | IQuarantineItem[], preventEmit: boolean = false) => {\n\tif (!hasWindow) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst currentStorageObj = getHistory();\n\t\tconst newStorageObj = {\n\t\t\t...currentStorageObj,\n\t\t\t[key]: value,\n\t\t};\n\n\t\twindow.localStorage.setItem(historyKey, JSON.stringify(newStorageObj));\n\n\t\tif (!preventEmit) {\n\t\t\temitChanges(key, value);\n\t\t}\n\t} catch (error) {\n\t\tconsole.log(`Failed to SET localstorage item ${key} with value ${value}:`, error);\n\t}\n};\n\nconst getHistory = (field?: HistoryField) => {\n\tif (!hasWindow) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst item = window.localStorage.getItem(historyKey);\n\t\tconst parsed = item ? JSON.parse(item) : {};\n\n\t\tif (field) {\n\t\t\tif (parsed[field]) {\n\t\t\t\treturn parsed[field];\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn parsed;\n\t} catch (error) {\n\t\tconsole.log(`Failed to GET localstorage item ${historyKey}:`, error);\n\t\treturn {};\n\t}\n};\n\nconst isInQuarantine = (): boolean => {\n\tif (!hasWindow) {\n\t\treturn false;\n\t}\n\n\tconst { quarantine } = getHistory();\n\tconst path = location.pathname.split(\"/\")[1];\n\tconst validQuarantine = !isEmpty(quarantine) ? quarantine.filter(isValid) : [];\n\tconst pathIndexInQuarantine = findIndex(validQuarantine, [\"path\", path]);\n\n\treturn pathIndexInQuarantine !== -1;\n};\n\nconst emitChanges = (key: HistoryField, value: string | number | IQuarantineItem[]) => {\n\tif (!hasWindow) {\n\t\treturn;\n\t}\n\n\tconst event = new CustomEvent(\"historyTrackUpdate\", {\n\t\tdetail: {\n\t\t\t[key]: value,\n\t\t},\n\t});\n\n\twindow.dispatchEvent(event);\n};\n\nconst setQuarantine = (city?: string) => {\n\tif (!hasWindow) {\n\t\treturn;\n\t}\n\n\tconst path = location.pathname.split(\"/\")[1];\n\tconst aWeekFromNow = addDays(new Date(), 7).toString();\n\n\tconst quarantineItem: IQuarantineItem = {\n\t\tpath,\n\t\tquarantineUntil: Date.parse(aWeekFromNow).toString(),\n\t};\n\n\tconst currentQuarantine = getQuarantine().filter(isValid);\n\tconst quarantine = [...currentQuarantine, quarantineItem];\n\n\ttrackHistory(\"quarantine\", quarantine);\n};\n\nexport default {\n\tgetHistory,\n\tisInQuarantine,\n\tsetQuarantine,\n\ttrackHistory,\n};\n","export const INIT: string = 'DOCUMENT/INIT';\nexport const CHANGE: string = 'DOCUMENT/CHANGE';\nexport const NAVIGATE: string = 'DOCUMENT/NAVIGATE';","import cloneDeep from \"lodash-es/cloneDeep\";\nimport mergeWith from \"lodash-es/mergeWith\";\n\nfunction customizer(objValue, srcValue) {\n\tif (Array.isArray(objValue)) {\n\t\treturn srcValue;\n\t}\n}\nimport { CHANGE, INIT, NAVIGATE } from \"@redux/document/types\";\n\nexport interface IDocument {\n\t_id?: { $oid: string };\n\tdocumentID?: string;\n\tclassName?: string;\n\t[key: string]: any;\n}\n\nconst defaultState = {};\n\nexport default function(state: IDocument = defaultState, action: IAction) {\n\tswitch (action.type) {\n\t\tcase INIT:\n\t\t\treturn {\n\t\t\t\t...defaultState,\n\t\t\t\t...action.data,\n\t\t\t};\n\n\t\tcase CHANGE:\n\t\t\tstate = cloneDeep(state);\n\t\t\tmergeWith(state, action.data, customizer);\n\t\t\treturn state;\n\n\t\tcase NAVIGATE:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t$$loading: true,\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n","import {\n\tINIT,\n\tADD_SELECTION,\n\tREMOVE_SELECTION,\n\tADD_CONSTRAINT,\n\tRESET_SELECTIONS,\n\tSET_RENTAL,\n\tADD_ADDRESSES,\n\tADD_QUERY,\n\tADD_SORT,\n\tGET_PROPERTIES_PENDING,\n\tGET_PROPERTIES_FULLFILLED,\n\tGET_PROPERTIES_REJECTED,\n\tLOAD_MORE_PROPERTIES,\n\tLOAD_MORE_PROPERTIES_FULFILLED,\n\tLOAD_MORE_PROPERTIES_REJECTED,\n\tSAVE_TO_LOCALSTORAGE,\n\tSET_STATE_FOR_LANDING_PAGE,\n} from \"@redux/apartment-search/types\";\n\nimport { hasWindow } from \"@utils\";\nimport defaultQuery from \"@utils/apartment-search/default-query\";\n\nimport {\n\tISelection,\n\tselectableAreaTypes,\n\tselectableConditions,\n\tselectableFeatures,\n\tselectableHouseTypes,\n\tselectableNewConstruction,\n\tselectableValueListing,\n\tselectableRooms,\n} from \"@utils/apartment-search/selections\";\n\nexport interface IApartmentSearchSelections {\n\tareaTypes: ISelection[];\n\tconditions: ISelection[];\n\tfeatures: ISelection[];\n\thouseTypes: ISelection[];\n\tnewConstruction: ISelection[];\n\trooms: ISelection[];\n\tvalueListing: ISelection[];\n}\n\nexport interface IApartmentSearchConstraints {\n\tmin?: number;\n\tmax?: number;\n\tminArea?: number | string;\n\tmaxArea?: number | string;\n\tminYearBuilt?: number | string;\n\tmaxYearBuilt?: number | string;\n\tareaType?: string;\n}\n\nexport interface IAddress {\n\taddressTypeName?: string;\n\tindex?: number;\n\tquery?: {\n\t\taddress?: any;\n\t\tcity?: string;\n\t\tdistrict?: string;\n\t\tmunicipality?: string;\n\t\t[key: string]: any;\n\t};\n\ttype?: string;\n\tvalue?: string;\n}\n\nexport interface IApartmentSearch {\n\taddresses?: IAddress[];\n\tconstraints: IApartmentSearchConstraints;\n\tisLoading: boolean;\n\tquery: IApartmentQuery;\n\trental: boolean;\n\tresults: IProperty[];\n\tsearched: boolean;\n\tselections: IApartmentSearchSelections;\n\t[key: string]: any;\n}\n\nconst initialState: IApartmentSearch = {\n\taddresses: [],\n\tconstraints: {\n\t\tareaType: \"living\",\n\t},\n\tisLoading: false,\n\tlimit: defaultQuery.limit,\n\tquery: {\n\t\t...defaultQuery,\n\t},\n\trental: false,\n\tresults: [],\n\tsearched: false,\n\tselections: {\n\t\tareaTypes: [...selectableAreaTypes],\n\t\tconditions: [...selectableConditions],\n\t\tfeatures: [...selectableFeatures],\n\t\thouseTypes: [...selectableHouseTypes],\n\t\tnewConstruction: [...selectableNewConstruction],\n\t\trooms: [...selectableRooms],\n\t\tvalueListing: [...selectableValueListing],\n\t},\n\tskip: 0,\n\tsort: defaultQuery.sort,\n\tsortOrder: defaultQuery.sortOrder,\n};\n\nconst checkForSearchPageChange = (state: IApartmentSearch) => {\n\tif (hasWindow && location.pathname !== \"/haku\" && state.isLanding) {\n\t\ttry {\n\t\t\thistory.replaceState(null, null, \"/haku\");\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n};\n\nconst chooseTitle = (payload: any) => {\n\ttry {\n\t\tif (hasWindow) {\n\t\t\tconst title = document.title;\n\t\t\tif (title) {\n\t\t\t\tif (title.includes(\"Myytävät\") && payload.isRental) {\n\t\t\t\t\tdocument.title = title.replace(\"Myytävät\", \"Vuokrattavat\");\n\t\t\t\t} else if (title.includes(\"Vuokrattavat\") && !payload.isRental) {\n\t\t\t\t\tdocument.title = title.replace(\"Vuokrattavat\", \"Myytävät\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n};\n\nexport default (state: IApartmentSearch = initialState, { type, payload }: IAction) => {\n\tswitch (type) {\n\t\tcase INIT:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t...payload,\n\t\t\t};\n\n\t\tcase ADD_SELECTION:\n\t\tcase REMOVE_SELECTION:\n\t\t\tcheckForSearchPageChange(state);\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisLanding: false,\n\t\t\t\tselections: {\n\t\t\t\t\t...state.selections,\n\t\t\t\t\t[payload.field]: payload.selections,\n\t\t\t\t},\n\t\t\t};\n\n\t\tcase ADD_CONSTRAINT:\n\t\t\tcheckForSearchPageChange(state);\n\t\t\tif (payload.field === \"min\" || payload.field === \"max\") {\n\t\t\t\tconst slot = `${payload.field}${state.rental ? \"Rental\" : \"Sale\"}Price`;\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\tconstraints: {\n\t\t\t\t\t\t...state.constraints,\n\t\t\t\t\t\t[payload.field]: payload.value,\n\t\t\t\t\t},\n\t\t\t\t\tisLanding: false,\n\t\t\t\t\t[slot]: payload.value,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tconstraints: {\n\t\t\t\t\t...state.constraints,\n\t\t\t\t\t[payload.field]: payload.value,\n\t\t\t\t},\n\t\t\t\tisLanding: false,\n\t\t\t};\n\n\t\tcase RESET_SELECTIONS:\n\t\t\tcheckForSearchPageChange(state);\n\t\t\treturn {\n\t\t\t\t...initialState,\n\t\t\t\tisLanding: false,\n\t\t\t\trental: state.rental,\n\t\t\t\tsort: state.sort,\n\t\t\t\tsortOrder: state.sortOrder,\n\t\t\t};\n\n\t\tcase SET_RENTAL:\n\t\t\tcheckForSearchPageChange(state);\n\t\t\tchooseTitle(payload);\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tconstraints: {\n\t\t\t\t\t...state.constraints,\n\t\t\t\t\tmax: payload.isRental ? state.maxRentalPrice : state.maxSalePrice,\n\t\t\t\t\tmin: payload.isRental ? state.minRentalPrice : state.minSalePrice,\n\t\t\t\t},\n\t\t\t\tisLanding: false,\n\t\t\t\trental: payload.isRental,\n\t\t\t};\n\n\t\tcase ADD_ADDRESSES:\n\t\t\tcheckForSearchPageChange(state);\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\taddresses: payload.addresses,\n\t\t\t\tisLanding: false,\n\t\t\t};\n\n\t\tcase ADD_QUERY:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tquery: payload,\n\t\t\t};\n\n\t\tcase ADD_SORT:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tsort: payload.sort.type,\n\t\t\t\tsortOrder: payload.sort.order,\n\t\t\t};\n\n\t\tcase LOAD_MORE_PROPERTIES:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisLoading: true,\n\t\t\t};\n\n\t\tcase LOAD_MORE_PROPERTIES_REJECTED:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisLoading: false,\n\t\t\t};\n\n\t\tcase LOAD_MORE_PROPERTIES_FULFILLED:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisLoading: false,\n\t\t\t\tresults: [...state.results, ...payload.results],\n\t\t\t\tsearched: true,\n\t\t\t\tskip: payload.skip,\n\t\t\t};\n\n\t\tcase SAVE_TO_LOCALSTORAGE:\n\t\t\tif (hasWindow && window.localStorage) {\n\t\t\t\tconsole.log(\"saving to storage\");\n\t\t\t\t/* This should be better and more compact format, not the state itself, but this is easy to save and use */\n\t\t\t\tconst { isLoading, results, matches, searched, ...rest } = state;\n\t\t\t\twindow.localStorage.setItem(\"kmPropertySearch\", JSON.stringify({ version: 2, state: rest }));\n\t\t\t}\n\t\t\treturn state;\n\n\t\tcase GET_PROPERTIES_PENDING:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisLoading: true,\n\t\t\t\tsearched: (payload && payload.searched) || false,\n\t\t\t};\n\n\t\tcase GET_PROPERTIES_REJECTED:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisLoading: false,\n\t\t\t\tsearched: true,\n\t\t\t};\n\n\t\tcase GET_PROPERTIES_FULLFILLED:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisLoading: false,\n\t\t\t\tmatches: payload.matches,\n\t\t\t\tresults: payload.results,\n\t\t\t\tsearched: payload.searched,\n\t\t\t};\n\n\t\tcase SET_STATE_FOR_LANDING_PAGE:\n\t\t\treturn {\n\t\t\t\t...initialState,\n\t\t\t\taddresses: payload.addresses,\n\t\t\t\tisLanding: true,\n\t\t\t\trental: payload.rental,\n\t\t\t\tselections: {\n\t\t\t\t\t...initialState.selections,\n\t\t\t\t\t...payload.selections,\n\t\t\t\t},\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n};\n","import { DISABLE_HOVER, ENABLE_HOVER } from \"@redux/ui/types\";\n\nexport interface IUI {\n\thoverDisabled?: boolean;\n}\n\nconst initialState: IUI = {\n\thoverDisabled: false,\n};\n\nexport default (state: IUI = initialState, { type, payload }: IAction) => {\n\tswitch (type) {\n\t\tcase DISABLE_HOVER:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\thoverDisabled: true,\n\t\t\t};\n\t\tcase ENABLE_HOVER:\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\thoverDisabled: false,\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n};\n","const addressTypes = {\n\taddress: \"osoite\",\n\tcity: \"kaupunki\",\n\tcounty: \"maakunta\",\n\tdistrict: \"kaupunginosa\",\n\tmunicipality: \"kunta\",\n\tpostcode: \"postinumero\",\n\tregion: \"lääni\",\n};\n\nexport default addressTypes;\n","import { ForkEffect, call, fork, put, race, select, take, takeLatest } from \"redux-saga/effects\";\n\nconst SEARCH_LIMIT_PER_PAGE: number = 30;\n\nimport {\n\tSAGA_ADD_ADDRESSES,\n\tSAGA_ADD_CONSTRAINT,\n\tSAGA_ADD_SELECTION,\n\tSAGA_ADD_SORT,\n\tSAGA_CANCEL_QUERY,\n\tSAGA_GET_PROPERTIES,\n\tSAGA_GET_PROPERTIES_FOR_LANDING_PAGE,\n\tSAGA_LOAD_MORE,\n\tSAGA_RESET_SELECTIONS,\n\tSAGA_SET_RENTAL,\n} from \"./saga.types\";\n\nimport {\n\tGET_PROPERTIES_FULLFILLED,\n\tGET_PROPERTIES_PENDING,\n\tGET_PROPERTIES_REJECTED,\n\tLOAD_MORE_PROPERTIES_PENDING,\n\tLOAD_MORE_PROPERTIES_REJECTED,\n\tSAVE_TO_LOCALSTORAGE,\n} from \"@redux/apartment-search/types\";\n\nimport {\n\taddAddresses,\n\taddSelection,\n\taddConstraint,\n\tresetSelections,\n\tsetRental,\n\taddQuery,\n\taddSort,\n\tloadMore,\n\tsetStateForLandingPage,\n} from \"@redux/apartment-search/apartment-search.actions\";\n\nimport {\n\tgetApartmentSearch,\n\tgetRooms,\n\tgetHouseTypes,\n\tgetFeatures,\n\tgetNewConstruction,\n\tgetValueListing,\n\tgetConditions,\n\tgetAddresses,\n\tgetConstraints,\n\tgetRental,\n\tgetSort,\n} from \"@redux/apartment-search/apartment-search.selectors\";\n\nimport { ISelection, selectableNewConstruction, selectableHouseTypes, selectableValueListing } from \"@utils/apartment-search/selections\";\nimport defaultQuery from \"@utils/apartment-search/default-query\";\nimport addressTypes from \"@utils/apartment-search/address-types\";\nimport dataLayerPush from \"@utils/dataLayerPush\";\n\nimport searchService from \"@services/search.service\";\n\nimport has from \"lodash-es/has\";\nimport { animateScroll as scroll } from \"react-scroll\";\nimport { hasWindow } from \"@utils\";\n\nconst storeLimit = (limit: number) => {\n\ttry {\n\t\tif (hasWindow) {\n\t\t\tlocalStorage.setItem(\"kmSearchLimit\", `${limit}`);\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n};\n\nconst getLimit = (): number => {\n\ttry {\n\t\tif (hasWindow) {\n\t\t\tconst limit = parseInt(localStorage.getItem(\"kmSearchLimit\"), 10) || SEARCH_LIMIT_PER_PAGE;\n\t\t\treturn limit;\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t\treturn SEARCH_LIMIT_PER_PAGE;\n\t}\n};\n\nconst afterSearchTermsChanged = () => {\n\tif (hasWindow && (location.pathname !== \"\" && location.pathname !== \"/\")) {\n\t\tscroll.scrollToTop();\n\t}\n};\n\nconst selectionSort = (a: ISelection, b: ISelection) => {\n\tif (has(a, \"order\") && has(b, \"order\")) {\n\t\treturn a.order - b.order;\n\t} else {\n\t\treturn a.label.localeCompare(b.label);\n\t}\n};\n\nfunction* getSelectionsFromState(field: string) {\n\tswitch (field) {\n\t\tcase \"rooms\":\n\t\t\treturn yield select(getRooms);\n\t\tcase \"houseTypes\":\n\t\t\treturn yield select(getHouseTypes);\n\t\tcase \"conditions\":\n\t\t\treturn yield select(getConditions);\n\t\tcase \"features\":\n\t\t\treturn yield select(getFeatures);\n\t\tcase \"newConstruction\":\n\t\t\treturn yield select(getNewConstruction);\n\t\tcase \"valueListing\":\n\t\t\treturn yield select(getValueListing);\n\t\tdefault:\n\t\t\treturn [];\n\t}\n}\n\nfunction* catchAddConstraintAction(): IterableIterator {\n\tyield takeLatest(SAGA_ADD_CONSTRAINT, addConstraintAction);\n}\n\nfunction* addConstraintAction({ payload }: IAction) {\n\tconst { field, value } = payload;\n\tyield put(addConstraint(field, value));\n\tconst query = yield createQuery();\n\tyield put(addQuery(query));\n\tstoreLimit(0);\n\tyield getProperties(query);\n}\n\nfunction* catchAddSelectionAction(): IterableIterator {\n\tyield takeLatest(SAGA_ADD_SELECTION, addSelectionAction);\n}\n\nfunction* addSelectionAction({ payload }: IAction) {\n\tconst { selection, field, single } = payload;\n\n\t/* Get selections by field from current state */\n\tconst stateSelections = yield getSelectionsFromState(field);\n\n\t/* Get selected item from stateSelections */\n\tconst matches = stateSelections.filter(item => item && selection && item.label === selection.label);\n\n\tif (!matches || matches.length <= 0) {\n\t\treturn;\n\t}\n\tconst foundSelection = matches[0];\n\n\t/* Remove found selection from stateSelections */\n\tconst filteredStateSelections = stateSelections.filter((s: ISelection) => s && s.label !== foundSelection.label);\n\n\t/* Invert 'selected' value for foundSelection */\n\tconst newSelection = {\n\t\t...foundSelection,\n\t\tselected: !foundSelection.selected,\n\t};\n\n\tlet returnSelections: ISelection[] = filteredStateSelections;\n\t/* If single selection wanted, set other items selected value to false */\n\tif (single) {\n\t\treturnSelections = filteredStateSelections.map((s: ISelection) => ({ ...s, selected: false }));\n\t}\n\n\t/* Create new selections array for new state */\n\tconst newSelections = [\n\t\t...returnSelections,\n\t\t{\n\t\t\t...newSelection,\n\t\t},\n\t].sort(selectionSort);\n\n\tyield put(addSelection(field, newSelections));\n\n\tconst query = yield createQuery();\n\tyield put(addQuery(query));\n\tstoreLimit(0);\n\tyield getProperties(query);\n}\n\nfunction* catchResetSelectionsAction(): IterableIterator {\n\tyield takeLatest(SAGA_RESET_SELECTIONS, resetSelectionsAction);\n}\n\nfunction* resetSelectionsAction() {\n\tyield put(resetSelections());\n\tconst query = yield createQuery();\n\t// console.log(query);\n\tyield put(addQuery(query));\n\tstoreLimit(0);\n\tyield getProperties(query, 1);\n}\n\nfunction* catchSetRentalAction(): IterableIterator {\n\tyield takeLatest(SAGA_SET_RENTAL, setRentalAction);\n}\n\nfunction* setRentalAction({ payload }: IAction) {\n\tyield put(setRental(payload.isRental));\n\n\tconst query = yield createQuery();\n\tyield put(addQuery(query));\n\tstoreLimit(0);\n\tyield getProperties(query);\n}\n\nfunction* catchAddAddressAction(): IterableIterator {\n\tyield takeLatest(SAGA_ADD_ADDRESSES, addAddressAction);\n}\n\nfunction* addAddressAction({ payload }: IAction) {\n\tyield put(addAddresses(payload.addresses));\n\n\tconst query = yield createQuery();\n\tyield put(addQuery(query));\n\tstoreLimit(0);\n\tyield getProperties(query);\n}\n\nfunction* catchAddSortAction(): IterableIterator {\n\tyield takeLatest(SAGA_ADD_SORT, addSortAction);\n}\n\nfunction* addSortAction({ payload }: IAction) {\n\tyield put(addSort(payload.sort));\n\n\tconst query = yield createQuery();\n\tyield put(addQuery(query));\n\tyield getProperties(query, 1);\n}\n\nfunction* catchGetPropertiesAction(): IterableIterator {\n\tyield takeLatest(SAGA_GET_PROPERTIES, getPropertiesAction);\n}\n\nfunction* getPropertiesAction({ payload }: IAction) {\n\tyield put({ type: GET_PROPERTIES_PENDING });\n\tconst initial = (payload && payload.initial) || false;\n\tconst cancelSave = initial;\n\tconst limit = initial ? getLimit() : SEARCH_LIMIT_PER_PAGE;\n\tconst query = yield createQuery(cancelSave, limit);\n\tyield put(addQuery(query));\n\tyield getProperties(query, 1, initial);\n}\n\nfunction* catchLoadMoreAction(): IterableIterator {\n\tyield takeLatest(SAGA_LOAD_MORE, loadMoreAction);\n}\n\nfunction* loadMoreAction() {\n\tyield put({ type: LOAD_MORE_PROPERTIES_PENDING });\n\n\ttry {\n\t\tconst { results: stateResults } = yield select(getApartmentSearch);\n\t\t// Skip is just, what we got now.\n\t\tconst newSkip = stateResults ? stateResults.length : 0;\n\t\tconst query: IApartmentQuery = yield createQuery();\n\n\t\tconsole.log(\"[Apartment search] loading more...\");\n\n\t\tconst response = yield call(searchService.fetchProperties, {\n\t\t\t...query,\n\t\t\tskip: newSkip,\n\t\t});\n\n\t\tconst newLimit = parseInt(stateResults.length + SEARCH_LIMIT_PER_PAGE, 10);\n\t\tstoreLimit(newLimit);\n\n\t\tconst { results } = response.data;\n\n\t\tconsole.log(`[Apartment search] successfully loaded more.`);\n\n\t\tyield put(loadMore(results, newSkip));\n\t} catch (e) {\n\t\tconsole.log(e);\n\t\tyield put({ type: LOAD_MORE_PROPERTIES_REJECTED });\n\t}\n}\n\nfunction* createQuery(cancelSave?: boolean, limit = 30) {\n\tyield put({ type: SAGA_CANCEL_QUERY });\n\n\tconst isSelected = (s: ISelection) => s.selected;\n\n\tconst rooms = yield select(getRooms);\n\tconst houseTypes = yield select(getHouseTypes);\n\tconst features = yield select(getFeatures);\n\tconst newConstruction = yield select(getNewConstruction);\n\tconst valueListing = yield select(getValueListing);\n\tconst conditions = yield select(getConditions);\n\n\tconst selectedRental = yield select(getRental);\n\tconst selectedRooms = rooms.filter(isSelected);\n\tconst selectedHouseTypes = houseTypes.filter(isSelected);\n\tconst selectedFeatures = features.filter(isSelected);\n\tconst selectedNewConstruction = newConstruction.filter(isSelected)[0];\n\tconst selectedValueListing = valueListing.filter(isSelected)[0];\n\tconst selectedConditions = conditions.filter(isSelected);\n\tconst selectedAddresses = yield select(getAddresses);\n\tconst selectedConstraints = yield select(getConstraints);\n\tconst { sort, sortOrder } = yield select(getSort);\n\n\tconst featureItems = selectedFeatures.map(feature => feature.value);\n\tconst addressItems = selectedAddresses.map(addr => addr.query);\n\n\tlet conditionQuery = [];\n\tif (selectedConditions) {\n\t\tfor (const condition of selectedConditions) {\n\t\t\tif (typeof(condition.value) === 'string') {\n\t\t\t\tconditionQuery.push(condition.value);\n\t\t\t} else {\n\t\t\t\tconditionQuery = conditionQuery.concat(condition.value);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst query: IApartmentQuery = {\n\t\t...defaultQuery,\n\t\tcondition: conditionQuery,\n\t\tgroupType: selectedHouseTypes.map(house => house.value),\n\t\tlimit,\n\t\tquery: addressItems,\n\t\trental: selectedRental,\n\t\trooms: selectedRooms.map(room => room.value),\n\t\tsort,\n\t\tsortOrder,\n\t\t...selectedConstraints,\n\t};\n\n\tif (selectedNewConstruction) {\n\t\tquery[\"newConstruction\"] = selectedNewConstruction.value;\n\t}\n\tif (selectedValueListing) {\n\t\tquery[\"valueListing\"] = selectedValueListing.value;\n\t}\n\n\tfor (const feature of featureItems) {\n\t\tif (feature) {\n\t\t\tquery[feature] = true;\n\t\t}\n\t}\n\n\tif (!cancelSave) {\n\t\t// Save query to localStorage.\n\t\tyield put({ type: SAVE_TO_LOCALSTORAGE });\n\t}\n\n\tconsole.log(\"[Apartment search] created query: \", query);\n\n\treturn query;\n}\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nfunction* fetchProperties(query: IApartmentQuery, delayMs: number = 800, searched: boolean = true, initial?: boolean) {\n\tyield delay(delayMs);\n\n\ttry {\n\t\tconsole.log(\"[Apartment search] running query...\");\n\t\tyield put({ type: GET_PROPERTIES_PENDING, payload: { searched } });\n\n\t\tdataLayerPush({\n\t\t\taction: \"Lähetä\",\n\t\t\tconversionDetails: \"Kohdehaku\",\n\t\t\tevent: \"customConversion\",\n\t\t});\n\n\t\tconst response = yield call(searchService.fetchProperties, query);\n\t\tconst { results, matches } = response.data;\n\n\t\tconsole.log(`[Apartment search] successful query. Found ${matches} properties`);\n\n\t\tyield put({\n\t\t\tpayload: {\n\t\t\t\tmatches,\n\t\t\t\tresults,\n\t\t\t\tsearched,\n\t\t\t},\n\t\t\ttype: GET_PROPERTIES_FULLFILLED,\n\t\t});\n\n\t\tif (initial) {\n\t\t\t/* scroll to last clicked apartment after initial search */\n\t\t\t/* e.g. when navigating back from property page */\n\t\t\ttry {\n\t\t\t\tconst lastKey = sessionStorage.getItem(\"kmLastClickedProperty\");\n\t\t\t\tif (lastKey) {\n\t\t\t\t\tconst targetElem = document.querySelector(`[data-key=\"${lastKey}\"]`);\n\t\t\t\t\tif (targetElem) {\n\t\t\t\t\t\tconst { top, height } = targetElem.getBoundingClientRect();\n\t\t\t\t\t\tconst { innerHeight } = window;\n\t\t\t\t\t\tconst targetOffset = top + height - innerHeight / 2;\n\n\t\t\t\t\t\tscroll.scrollTo(targetOffset, { smooth: false, duration: 0 });\n\t\t\t\t\t}\n\n\t\t\t\t\tsessionStorage.removeItem(\"kmLastClickedProperty\");\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(e);\n\t\t\t}\n\t\t} else {\n\t\t\tafterSearchTermsChanged();\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t\tyield put({ type: GET_PROPERTIES_REJECTED });\n\t}\n}\n\nfunction* getProperties(query: IApartmentQuery, delayMs?: number, initial: boolean = false) {\n\tyield race({\n\t\tcancel: take(SAGA_CANCEL_QUERY),\n\t\tresponse: fetchProperties(query, delayMs, true, initial),\n\t});\n}\n\nfunction getAddressQuery(searchData: ISearchData) {\n\tlet address: {\n\t\tparsedValue?: string;\n\t\tquery?: {\n\t\t\tcity?: string;\n\t\t\tdistrict?: string;\n\t\t};\n\t\ttype?: string;\n\t\tvalue?: string;\n\t};\n\n\ttry {\n\t\tconst { city, district } = searchData || { city: \"\", district: \"\" };\n\n\t\tif (searchData && city) {\n\t\t\taddress = {\n\t\t\t\tparsedValue: city + \", \" + addressTypes[\"city\"],\n\t\t\t\tquery: {\n\t\t\t\t\tcity,\n\t\t\t\t},\n\t\t\t\ttype: \"city\",\n\t\t\t\tvalue: city,\n\t\t\t};\n\t\t}\n\n\t\tif (searchData && district) {\n\t\t\taddress = {\n\t\t\t\tparsedValue: district + \", \" + addressTypes[\"district\"],\n\t\t\t\tquery: {\n\t\t\t\t\tcity: city ? city : \"\",\n\t\t\t\t\tdistrict,\n\t\t\t\t},\n\t\t\t\ttype: \"district\",\n\t\t\t\tvalue: district + (city ? \", \" + city : \"\"),\n\t\t\t};\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t\taddress = {};\n\t}\n\n\treturn address;\n}\n\nfunction getHouseTypesForQuery(searchData: ISearchData): ISelection[] {\n\tlet types: ISelection[] = [...selectableHouseTypes];\n\n\ttry {\n\t\tconst { groupType } = searchData;\n\n\t\tif (groupType !== \"uudiskohteet\") {\n\t\t\ttypes = selectableHouseTypes.map(item => ({ ...item, selected: item.value === groupType }));\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n\n\treturn types;\n}\n\nfunction getNewConstructionForQuery(searchData: ISearchData): ISelection[] {\n\tlet newConstruction: ISelection[] = [...selectableNewConstruction];\n\n\ttry {\n\t\tconst { groupType } = searchData;\n\n\t\tif (groupType === \"uudiskohteet\") {\n\t\t\tnewConstruction = newConstruction.map(item => ({ ...item, selected: item.value === true }));\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n\n\treturn newConstruction;\n}\n\nfunction getValueListingForQuery(searchData: ISearchData): ISelection[] {\n\tlet valueListing: ISelection[] = [...selectableValueListing];\n\n\ttry {\n\t\tconst { groupType } = searchData;\n\n\t\tif (groupType === \"arvokohteet\" || (Array.isArray(groupType) && groupType.includes(\"arvokohteet\"))) {\n\t\t\tvalueListing = valueListing.map(item => ({ ...item, selected: item.value === true }));\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n\n\treturn valueListing;\n}\n\nfunction* getPropertiesForLandingPageAction({ payload }: IAction) {\n\tconst searchData: ISearchData = payload.searchData;\n\tconst selectedAddress = getAddressQuery(searchData);\n\tconst houseTypes = getHouseTypesForQuery(searchData);\n\tconst newConstruction = getNewConstructionForQuery(searchData);\n\tconst valueListing = getValueListingForQuery(searchData);\n\tconst isRental: boolean = searchData.rental;\n\n\tconst state = {\n\t\taddresses: selectedAddress ? [selectedAddress] : [],\n\t\tisLanding: true,\n\t\trental: isRental,\n\t\tselections: {\n\t\t\thouseTypes,\n\t\t\tnewConstruction,\n\t\t\tvalueListing,\n\t\t},\n\t};\n\n\tyield put(setStateForLandingPage(state));\n\tconst query = yield createQuery(true);\n\tyield put(addQuery(query));\n\tyield fetchProperties(query, 0, false);\n}\n\nfunction* catchGetPropertiesForLandingPageAction(): IterableIterator {\n\tyield takeLatest(SAGA_GET_PROPERTIES_FOR_LANDING_PAGE, getPropertiesForLandingPageAction);\n}\n\nexport default function* rootSaga(): IterableIterator {\n\tyield fork(catchAddConstraintAction);\n\tyield fork(catchAddSelectionAction);\n\tyield fork(catchResetSelectionsAction);\n\tyield fork(catchSetRentalAction);\n\tyield fork(catchAddAddressAction);\n\tyield fork(catchAddSortAction);\n\tyield fork(catchLoadMoreAction);\n\tyield fork(catchGetPropertiesAction);\n\tyield fork(catchGetPropertiesForLandingPageAction);\n}\n","import { ForkEffect, fork, takeLatest, put } from \"redux-saga/effects\";\n\nimport { SAGA_DISABLE_HOVER, SAGA_ENABLE_HOVER } from \"./saga.types\";\nimport { enableHover, disableHover } from \"@redux/ui/ui.actions\";\nimport { body } from \"@utils\";\n\nconst delay = (ms: number) => new Promise(res => setTimeout(res, ms));\n\nfunction* disableHoverAction({ payload }: IAction) {\n\tconst { enableAfter } = payload;\n\tyield body.classList.add(\"no-hover\");\n\tyield put(disableHover());\n\n\tif (enableAfter) {\n\t\tyield delay(enableAfter);\n\t\tyield put({ type: SAGA_ENABLE_HOVER });\n\t}\n}\n\nfunction* catchDisableHoverAction(): IterableIterator {\n\tyield takeLatest(SAGA_DISABLE_HOVER, disableHoverAction);\n}\n\nfunction* enableHoverAction(): any {\n\tyield body.classList.remove(\"no-hover\");\n\tyield put(enableHover());\n}\n\nfunction* catchEnableHoverAction(): IterableIterator {\n\tyield takeLatest(SAGA_ENABLE_HOVER, enableHoverAction);\n}\n\nexport default function* rootSaga(): IterableIterator {\n\tyield fork(catchDisableHoverAction);\n\tyield fork(catchEnableHoverAction);\n}\n","import { fork, ForkEffect, takeLatest } from \"redux-saga/effects\";\n\nimport apartmentSearch from \"./apartment-search.sagas\";\nimport ui from \"./ui.sagas\";\n\nimport { hasWindow } from \"@utils\";\nimport { animateScroll as scroll } from \"react-scroll\";\n\nlet init = false;\n\nfunction* setNavigatingAction() {\n\tif (hasWindow) {\n\t\tif (init) {\n\t\t\tdocument.body.classList.add(\"navigating\");\n\t\t} else {\n\t\t\tinit = true;\n\t\t}\n\t}\n}\n\nfunction* setNavigatingFinishedAction() {\n\tif (hasWindow) {\n\t\tsetTimeout(() => {\n\t\t\tif (location.hash) {\n\t\t\t\tconst target = document.getElementById(location.hash.replace(\"#\", \"\"));\n\t\t\t\tif (target) {\n\t\t\t\t\tconst { top } = target.getBoundingClientRect();\n\t\t\t\t\tscroll.scrollMore(top - 65); /* some offsetting px for nav */\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twindow.scrollTo(0, 0);\n\t\t\t}\n\t\t}, 150);\n\t\tsetTimeout(() => {\n\t\t\tdocument.body.classList.remove(\"navigating\");\n\t\t}, 300);\n\t}\n}\n\nfunction* catchNavigateAction() {\n\tyield takeLatest(\"@@router/LOCATION_CHANGE\", setNavigatingAction);\n}\nfunction* catchNavigateEnd() {\n\tyield takeLatest(\"DOCUMENT/INIT\", setNavigatingFinishedAction);\n}\n\nexport default function* rootSaga(): Generator {\n\tyield fork(apartmentSearch);\n\tyield fork(ui);\n\tyield fork(catchNavigateAction);\n\tyield fork(catchNavigateEnd);\n}\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read http://bit.ly/CRA-PWA.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit http://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (\n response.status === 404 ||\n response.headers.get('content-type').indexOf('javascript') === -1\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import { library } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n\tfaAngleDown,\n\tfaAngleRight,\n\tfaArrowUp,\n\tfaCheck,\n\tfaCheckSquare,\n\tfaEnvelope,\n\tfaEye,\n\tfaHome,\n\tfaInfoCircle,\n\tfaMapMarkerAlt,\n\tfaMinus,\n\tfaMinusCircle,\n\tfaPen,\n\tfaPhone,\n\tfaPlay,\n\tfaPlus,\n\tfaPlusCircle,\n\tfaPrint,\n\tfaSearch,\n\tfaSeedling,\n\tfaStar,\n\tfaThumbsUp,\n\tfaTimes,\n\tfaUser,\n\tfaUsers,\n} from \"@fortawesome/free-solid-svg-icons\";\n\nimport { faStars, faTimes as fasTimes } from \"@fortawesome/pro-solid-svg-icons\";\n\nimport {\n\tfaAngleDown as farAngleDown,\n\tfaAngleLeft as farAngleLeft,\n\tfaAngleRight as farAngleRight,\n\tfaAngleUp as farAngleUp,\n\tfaCheck as farCheck,\n\tfaCircleNotch as farCircleNotch,\n\tfaExpand as farExpand,\n\tfaImage as farImage,\n\tfaSpinnerThird as farSpinnerThird,\n\tfaSquare as farSquare,\n\tfaTimes as farTimes,\n} from \"@fortawesome/pro-regular-svg-icons\";\n\nimport {\n\tfaFacebook,\n\tfaFacebookF,\n\tfaFacebookSquare,\n\tfaInstagram,\n\tfaLinkedinIn,\n\tfaTwitter,\n\tfaYoutube,\n} from \"@fortawesome/free-brands-svg-icons\";\n\nexport default function createFaLibrary() {\n\t// @ts-ignore\n\tlibrary.add(\n\t\t// @ts-ignore\n\t\tfaAngleDown,\n\t\tfaAngleRight,\n\t\tfaArrowUp,\n\t\tfaCheck,\n\t\tfaCheckSquare,\n\t\tfaEnvelope,\n\t\tfaEye,\n\t\tfaFacebook,\n\t\tfaFacebookF,\n\t\tfaFacebookSquare,\n\t\tfaHome,\n\t\tfaInfoCircle,\n\t\tfaInstagram,\n\t\tfaLinkedinIn,\n\t\tfaMapMarkerAlt,\n\t\tfaMinus,\n\t\tfaMinusCircle,\n\t\tfaPen,\n\t\tfaPhone,\n\t\tfaPlay,\n\t\tfaPlus,\n\t\tfaPlusCircle,\n\t\tfaPrint,\n\t\tfaSearch,\n\t\tfaSeedling,\n\t\tfaStar,\n\t\tfaStars,\n\t\tfaThumbsUp,\n\t\tfaTimes,\n\t\tfaTwitter,\n\t\tfaUser,\n\t\tfaUsers,\n\t\tfaYoutube,\n\t\tfarAngleDown,\n\t\tfarAngleLeft,\n\t\tfarAngleRight,\n\t\tfarAngleUp,\n\t\tfarCheck,\n\t\tfarCircleNotch,\n\t\tfarExpand,\n\t\tfarImage,\n\t\tfarSpinnerThird,\n\t\tfarSquare,\n\t\tfarTimes,\n\t\tfasTimes,\n\t);\n}\n","import React from \"react\";\nimport { hydrate, render } from \"react-dom\";\n\nimport \"./index.scss\";\n\nimport { createStore, Store, compose, applyMiddleware } from \"redux\";\nimport { Provider } from \"react-redux\";\nimport { ConnectedRouter, routerMiddleware } from \"connected-react-router\";\nimport { createBrowserHistory } from \"history\";\nimport createSagaMiddleware from \"redux-saga\";\n\nimport { reducers, IApplicationState } from \"@redux\";\nimport { hasWindow, wake } from \"@utils\";\nimport rootSaga from \"@redux/sagas\";\n\nimport * as serviceWorker from \"./serviceWorker\";\n\nimport Routes from \"./mainRoutes\";\nimport axios from \"axios\";\nimport \"wake-react-components/wake-admin-bundle.min\";\nimport { loadableReady } from \"@loadable/component\";\n\nimport createFaLibrary from \"./faLibrary\";\n\nimport toast from \"cogo-toast\";\nimport { animateScroll as scroll } from \"react-scroll\";\nimport dataLayerPush from \"@utils/dataLayerPush\";\nimport { isAdmin } from \"wake-react-components/utils\";\nimport get from \"lodash-es/get\";\nimport trackProperty from \"@utils/property-track\";\n\ncreateFaLibrary();\n\nconst composeEnhancers =\n\t(process.env.NODE_ENV !== \"production\" && hasWindow && window.top[\"__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\"]) ||\n\tcompose;\n\nconst sagaMiddleware = createSagaMiddleware();\n\nconst isDevEnv = process.env.NODE_ENV !== \"production\";\n\nconst history = createBrowserHistory({\n\tbasename: (hasWindow && window[\"editorBaseHref\"]) || \"\",\n});\n\nconst middleWares = [sagaMiddleware, routerMiddleware(history)];\n\nconst store: Store = createStore(\n\treducers(history),\n\twindow[\"wdso\"] || {},\n\tcomposeEnhancers(applyMiddleware(...middleWares))\n);\n\n// Mode and path\nif (window[\"wdso\"] && window[\"wdso\"].document && window[\"wdso\"].document.wake && window[\"wdso\"].document.wake.mode) {\n\twake.mode = window[\"wdso\"].document.wake.mode;\n\twake.assetPath = [\"development\", \"staging\"].includes(wake.mode) ? \"/assets/\" : \"/km/\";\n\twake.deploymentCount = window[\"wdso\"].document.wake.deploymentCount || 0;\n}\n\nsagaMiddleware.run(rootSaga);\n\nconst showLoader = () =>\n\tnew Promise(resolve => {\n\t\tif (hasWindow) {\n\t\t\tdocument.body.classList.remove(\"loaded\");\n\t\t\tdocument.body.classList.add(\"load-start\");\n\t\t}\n\t\tsetTimeout(() => {\n\t\t\tresolve();\n\t\t}, 150);\n\t});\n\nconst hideLoader = () => {\n\tif (hasWindow) {\n\t\tdocument.body.classList.remove(\"load-start\");\n\t\tdocument.body.classList.add(\"loaded\");\n\n\t\tlet loadedEvent: any;\n\t\tif (typeof Event === \"function\") {\n\t\t\tloadedEvent = new Event(\"js-loaded\");\n\t\t} else {\n\t\t\tloadedEvent = document.createEvent(\"Event\");\n\t\t\tloadedEvent.initEvent(\"js-loaded\", true, true);\n\t\t}\n\n\t\tdocument.body.dispatchEvent(loadedEvent);\n\t}\n};\n\nconst domainRegex = /https?:\\/\\/((?:[\\w\\d-]+\\.)+[\\w\\d]{2,})/i;\n\nconst getDomain = (url: string) => {\n\tconst exec = domainRegex.exec(url);\n\treturn exec ? exec[1] : exec;\n};\n\nconst isExternalLink = (url: string): boolean => {\n\tif (hasWindow) {\n\t\treturn getDomain(location.href) !== getDomain(url);\n\t}\n\treturn false;\n};\n\nconst opensToNewTab = (anchor: HTMLAnchorElement): boolean => anchor.target && anchor.target !== \"\";\nconst isCurrentPath = (href: string): boolean => {\n\tif (hasWindow && href === location.href) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nconst composedPath = (el: HTMLElement) => {\n\tconst path = [];\n\n\twhile (el) {\n\t\tpath.push(el);\n\n\t\tif (el.tagName === \"HTML\") {\n\t\t\tpath.push(document);\n\t\t\tpath.push(window);\n\n\t\t\treturn path;\n\t\t}\n\n\t\tel = el.parentElement;\n\t}\n};\n\nconst isScrollLink = (elem: HTMLElement) => {\n\treturn elem && elem.getAttribute && elem.getAttribute(\"scroll-to\");\n};\n\nconst isUrlWithHash = (elem: HTMLAnchorElement) => {\n\tif (!elem) {\n\t\treturn false;\n\t}\n\tif (elem.hash && !!elem.hash) {\n\t\treturn true;\n\t}\n\tif (elem.href && elem.href.split(\"#\")[1]) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nconst isCurrentPathname = (anchor: HTMLAnchorElement) =>\n\tanchor && anchor.pathname && anchor.pathname.replace(/\\//g, \"\") === location.pathname.replace(/\\//g, \"\");\n\nconst handleHashAnchorsClick = (anchors: HTMLAnchorElement[]) => {\n\tconst [anchor] = anchors;\n\tif (!anchor) {\n\t\treturn;\n\t}\n\n\tconst isExternal = isExternalLink(anchor.href);\n\tconst startsWithHash = /^#/.test(anchor.getAttribute(\"href\"));\n\n\tif (!isExternal && anchor.hash && (isCurrentPathname(anchor) || startsWithHash)) {\n\t\tconst [id, extra] = anchor.hash.split(\"|\");\n\t\tconst targetElement = document.getElementById(id.replace(\"#\", \"\"));\n\n\t\tif (targetElement) {\n\t\t\tconst { top } = targetElement.getBoundingClientRect();\n\t\t\tconst extraPx = ~~extra || 0;\n\t\t\tscroll.scrollMore(top + extraPx);\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (anchor.target === \"_blank\") {\n\t\twindow.open(anchor.href, \"_blank\");\n\t\treturn;\n\t}\n\n\tif (isExternal) {\n\t\tlocation.href = anchor.href;\n\t} else {\n\t\thistory.push({\n\t\t\thash: anchor.hash,\n\t\t\tpathname: anchor.pathname,\n\t\t\tsearch: anchor.search,\n\t\t});\n\t}\n};\n\nconst assetUrls = [\"assets\", \"file\", \"km\"];\n\nconst isAssetUrl = (anchor: HTMLAnchorElement): boolean => {\n\tconst [, path] = anchor.pathname.split(\"/\");\n\n\tif (path && assetUrls.indexOf(path) !== -1) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nconst onBodyClick = event => {\n\ttry {\n\t\tconst clickPath = event.path || composedPath(event.target);\n\t\tconst isPressingMetaKey = (event.key && event.key === \"Meta\") || event.metaKey;\n\n\t\tif (clickPath) {\n\t\t\tconst pathAnchors = clickPath.filter((elem: HTMLElement) => elem && elem.tagName === \"A\");\n\n\t\t\tif (pathAnchors.length >= 0 && isAdmin) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst scrollAnchors = clickPath.filter(isScrollLink);\n\t\t\tconst hashAnchors = pathAnchors.filter(isUrlWithHash);\n\n\t\t\tif (hashAnchors.length > 0) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\t\t\t\thandleHashAnchorsClick(hashAnchors);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (scrollAnchors.length > 0) {\n\t\t\t\tconst [scrollAnchor] = scrollAnchors;\n\n\t\t\t\tconst elemSelector = scrollAnchor.getAttribute(\"scroll-to\");\n\t\t\t\tconst isIDSelector = elemSelector.startsWith(\"#\");\n\n\t\t\t\tconst scrollToElement = isIDSelector\n\t\t\t\t\t? document.getElementById(elemSelector.substr(1))\n\t\t\t\t\t: document.querySelector(elemSelector);\n\n\t\t\t\tif (scrollToElement) {\n\t\t\t\t\tconst extraSpace = scrollAnchor.getAttribute(\"scroll-extra-space\") || 0;\n\t\t\t\t\tconst top = scrollToElement.offsetTop;\n\n\t\t\t\t\tscroll.scrollTo(top - parseInt(extraSpace, 10));\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (pathAnchors.length > 0) {\n\t\t\t\tconst anchor = pathAnchors[0];\n\t\t\t\tif (isCurrentPath(anchor.href)) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!isExternalLink(anchor.href)) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif (!navigator.onLine) {\n\t\t\t\t\t\tshowOfflineToast();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isAssetUrl(anchor)) {\n\t\t\t\t\t\twindow.open(anchor.href, \"_blank\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (event.target.classList.contains(\"no-loader\")) {\n\t\t\t\t\t\tlocation.href = anchor.href;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!opensToNewTab(anchor) && !isPressingMetaKey) {\n\t\t\t\t\t\tshowLoader().then(() => {\n\t\t\t\t\t\t\thistory.push(anchor.pathname);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\twindow.open(anchor.href, \"_blank\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n};\n\nif (hasWindow) {\n\tdocument.body.addEventListener(\"click\", onBodyClick);\n\n\thideLoader();\n\n\tsetTimeout(() => {\n\t\tif (location.hash) {\n\t\t\tconst [id, extra] = location.hash.split(\"|\");\n\t\t\tconst target = document.getElementById(id.replace(\"#\", \"\"));\n\t\t\tif (target) {\n\t\t\t\tconst { top } = target.getBoundingClientRect();\n\t\t\t\tscroll.scrollMore(top + (~~extra || -65)); /* some offsetting px for nav */\n\t\t\t}\n\t\t}\n\t\tdocument.body.classList.add(\"initialized\");\n\t}, 500);\n}\n\nlet loadTimeout: number = null;\n\nhistory.listen(async location => {\n\tclearTimeout(loadTimeout);\n\n\t// Mark wake as loading\n\twake.loading = true;\n\n\tawait showLoader();\n\n\ttry {\n\t\t/*\n\t\t * Added cache buster\n\t\t *\n\t\t * This because the browser can also cache the request(s), if you had arrived to that url it was cached as html,\n\t\t * and then this axios.get would return it as html, not as json. Added \"?cb=json\" to cache the json versions\n\t\t * as with \"?cb=json\", so that the html and json versions don't mix in browsers cache.\n\t\t */\n\t\tconst result = await axios.get(location.pathname + \"?cb=json\", {\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json\",\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tvalidateStatus: null /* Allow for eg. 404, to return result, not exception. */,\n\t\t});\n\n\t\t// Mark wake as not loading\n\t\twake.loading = false;\n\n\t\tif (typeof result.data !== \"object\") {\n\t\t\ttoast.error(\n\t\t\t\t`Tapahtui odottamaton virhe.\n\t\t\t\tPalaa etusivulle ›\n\t\t\t`,\n\t\t\t\t{\n\t\t\t\t\thideAfter: 0,\n\t\t\t\t\tonClick: (hide: any) => {\n\t\t\t\t\t\thide();\n\t\t\t\t\t\thistory.push(\"/\");\n\t\t\t\t\t},\n\t\t\t\t\tposition: \"bottom-right\",\n\t\t\t\t}\n\t\t\t);\n\t\t\tconsole.log(\"result.data is not object.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Add $$error to data.\n\t\tif (result.status !== 200) {\n\t\t\tresult.data.$$error = true;\n\t\t}\n\n\t\tconst {\n\t\t\tdata: { name, metaTitle, meta = {}, wake: responseWake = {} },\n\t\t} = result;\n\n\t\t// Support Wake's external redirects\n\t\tif (responseWake.wakeExternalRedirect && responseWake.redirectUrl) {\n\t\t\twindow.location = responseWake.redirectUrl;\n\t\t\treturn;\n\t\t}\n\n\t\t// Get title, url\n\t\tconst { title } = meta;\n\t\tconst { url, deploymentCount = 0 } = responseWake;\n\t\tconst documentTitle = metaTitle ? metaTitle : title ? title : `${name} - Kiinteistömaailma.fi`;\n\n\t\t// Do we need to to hard refresh?\n\t\tif (wake.deploymentCount < deploymentCount) {\n\t\t\tconsole.log(\"Wake deploymentCount mismatch, hard reload.\", wake.deploymentCount, deploymentCount);\n\t\t\ttry {\n\t\t\t\twindow.location.reload(true);\n\t\t\t} catch (e) {\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the title\n\t\tdocument.title = documentTitle;\n\n\t\t// Url might differ what we originally requested because of redirects, set the current url from backend.\n\t\tif (url) {\n\t\t\tconst params = new URLSearchParams(location.search);\n\t\t\tconst validParams = new URLSearchParams();\n\t\t\t[\"agent\"].forEach((validParamName: string) => {\n\t\t\t\tif (params.has(validParamName)) {\n\t\t\t\t\tvalidParams.set(validParamName, params.get(validParamName));\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst validParamsString = [...validParams].length > 0 ? `?${validParams.toString()}` : \"\";\n\n\t\t\twindow.history.replaceState(null, null, url + validParamsString + location.hash);\n\t\t\t// Track GTM\n\t\t\tdataLayerPush({\n\t\t\t\tevent: \"virtualPageview\",\n\t\t\t\tnewUrl: url,\n\t\t\t});\n\t\t}\n\n\t\t// Dispatch data\n\t\tstore.dispatch({ type: \"DOCUMENT/INIT\", data: result.data });\n\n\t\tconst component = get(result.data, [\"page\", \"renderClassComponent\"]);\n\t\tconst nameSort = get(result.data, [\"page\", \"nameSort\"]);\n\n\t\tif (component === \"PropertyPage\" || nameSort === \"kohde\") {\n\t\t\ttrackProperty(result.data);\n\t\t}\n\n\t\t// Remove loader\n\t\tloadTimeout = window.setTimeout(() => {\n\t\t\thideLoader();\n\t\t}, 350);\n\t} catch (e) {\n\t\twake.loading = false;\n\t\tconsole.log(\"axios request exception\", e);\n\t\tif (e.hasOwnProperty(\"message\") && e.message.match(/recursion/i)) {\n\t\t\t// this likely happens when page object is already loaded and a cancelled request gets processed after it\n\t\t\thideLoader();\n\t\t} else {\n\t\t\ttoast.error(\n\t\t\t\t`Tapahtui odottamaton virhe.\n\t\t\t\tPalaa etusivulle ›\n\t\t\t`,\n\t\t\t\t{\n\t\t\t\t\thideAfter: 0,\n\t\t\t\t\tonClick: (hide: any) => {\n\t\t\t\t\t\thide();\n\t\t\t\t\t\thistory.push(\"/\");\n\t\t\t\t\t},\n\t\t\t\t\tposition: \"bottom-right\",\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n});\n\nconst showOfflineToast = () => {\n\tdocument.body.classList.add(\"toast-warn\");\n\ttoast.warn(\"Internet yhteytesi toimii heikosti tai se on katkennut.\", {\n\t\thideAfter: 10,\n\t\tonClick: (hide: any) => {\n\t\t\thide();\n\t\t\tdocument.body.classList.remove(\"toast-warn\");\n\t\t},\n\t\tposition: \"bottom-right\",\n\t});\n};\n\nconst updateOnlineStatus = () => {\n\tif (!hasWindow) {\n\t\treturn;\n\t}\n\n\tif (!navigator.onLine) {\n\t\tshowOfflineToast();\n\t}\n};\n\nif (hasWindow) {\n\twindow.addEventListener(\"online\", updateOnlineStatus);\n\twindow.addEventListener(\"offline\", updateOnlineStatus);\n}\n\nconst root = document.getElementById(\"root\");\nlet renderMethod = hydrate;\n\nif (isDevEnv) {\n\trenderMethod = render;\n}\n\nif (hasWindow && window.location.pathname.indexOf(\"/api/contentEditor\") === 0) {\n\trenderMethod = render;\n\troot.innerHTML = \"\";\n\tif (window[\"wakeAdmin\"]) {\n\t\twindow[\"wakeAdmin\"].init(store);\n\t}\n}\n\nloadableReady(() => {\n\trenderMethod(\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t,\n\t\troot\n\t);\n});\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","import { combineReducers } from \"redux\";\nimport { connectRouter } from 'connected-react-router';\nimport { document, IDocument } from \"./document\";\nimport { apartmentSearch, IApartmentSearch } from \"./apartment-search\";\nimport { ui, IUI } from \"./ui\";\n// warning react-router-redux@5.0.0-alpha.9: This project is no longer maintained.\n//import { routerReducer as routing } from \"react-router-redux\";\n\nexport const reducers = (history) => combineReducers({\n\trouter: connectRouter(history),\n\tapartmentSearch,\n\tdocument,\n//\trouting,\n\tui,\n});\n\nexport interface IApplicationState {\n\tapartmentSearch: IApartmentSearch;\n\tdocument: IDocument;\n//\trouting: any;\n\tui: IUI;\n}\n","import { array, string, object } from \"yup\";\n\nexport const isValidPostcode = (pcode: string) => /^[0-9]{5}$/.test(pcode);\nexport const phoneReg = /^\\+?[0-9 \\-\\(\\)]{6,}$/;\nexport const postcodeReg = /^[0-9]{5}$/;\n\nconst validators = {\n\tcity: string(),\n\temail: string()\n\t\t.email(\"Virheellinen sähköpostiosoite\")\n\t\t.required(\"Sähköpostiosoite ei voi olla tyhjä\"),\n\tfirstName: string()\n\t\t.min(2, \"Etunimen täytyy sisältää vähintään 2 kirjainta\")\n\t\t.required(\"Etunimi ei voi olla tyhjä\"),\n\tlastName: string()\n\t\t.min(2, \"Sukunimen täytyy sisältää vähintään 2 kirjainta\")\n\t\t.required(\"Sukunimi ei voi olla tyhjä\"),\n\tmessage: string(),\n\tname: string()\n\t\t.min(2, \"Nimen täytyy sisältää vähintään 2 kirjainta\")\n\t\t.required(\"Nimi ei voi olla tyhjä\"),\n\tphone: string()\n\t\t.matches(phoneReg, \"Virheellinen puhelinnumero\")\n\t\t.required(\"Puhelinnumero ei voi olla tyhjä\"),\n\tpostCode: string()\n\t\t.matches(postcodeReg, \"Virheellinen postinumero\")\n\t\t.required(\"Postinumero ei voi olla tyhjä\"),\n\tpropertyID: array()\n\t\t.required(\"Valitse vähintään yksi asunto\"),\n\tstreetAddress: string()\n\t\t.min(4, \"Katuosoitteen täytyy olla vähintään 4 kirjainta\")\n\t\t.required(\"Katuosoite ei voi olla tyhjä\"),\n};\n\nexport const getSchema = (fields: string[]) => {\n\tconst shape = {};\n\n\tfor (const field of fields) {\n\t\tif (field && validators[field]) {\n\t\t\tshape[field] = validators[field];\n\t\t}\n\t}\n\n\treturn object().shape(shape);\n};\n","import React, { memo, useState, createContext, useContext } from \"react\";\nimport useLocalStorage from \"@hooks/use-localstorage\";\nimport { hasWindow } from \"@utils\";\nimport isEmpty from \"lodash-es/isEmpty\";\n\nconst context = createContext({\n\tactiveTab: 1,\n\tactiveUrl: \"\",\n\tbaseUrl: \"\",\n\tchangeTab: (id: number | string, url?: string, target?: HTMLElement) => undefined,\n\trenderHidden: false,\n});\n\nconst { Provider, Consumer } = context;\n\ninterface ITabProps {\n\tid: number | string;\n\tchildren: any;\n\turl?: string;\n\t[key: string]: any;\n}\n\nconst Tab = (props: ITabProps) => {\n\tconst { id, children, url = \"\", ...rest } = props;\n\tconst { changeTab, activeTab } = useContext(context);\n\n\treturn (\n\t\t changeTab(id, url, target as HTMLElement)}\n\t\t\t{...rest}\n\t\t>\n\t\t\t{children}\n\t\t\n\t);\n};\n\nconst TabPanel = ({ whenActive, children }) => {\n\tconst { activeTab, renderHidden } = useContext(context);\n\n\treturn renderHidden ? (\n\t\t\n\t) : activeTab === whenActive ? (\n\t\tchildren\n\t) : null;\n};\n\ninterface ITabSwitcherProps {\n\tsaveID?: string;\n\trenderHidden?: boolean;\n\tbaseUrl?: string;\n\tcurrentUrl?: string;\n\ttabs?: any[];\n\tinitialTab?: string | number;\n\temitChanges?: boolean;\n\tid?: string;\n\t[key: string]: any;\n}\n\nconst TabSwitcher = ({\n\tchildren,\n\tsaveID = \"\",\n\trenderHidden = false,\n\tbaseUrl = \"\",\n\tcurrentUrl = \"\",\n\ttabs = [],\n\tinitialTab = 1,\n\temitChanges = false,\n\tid = null,\n}: ITabSwitcherProps) => {\n\tconst [savedTab, saveTab] = useLocalStorage(saveID, \"\");\n\tconst [activeUrl, setActiveUrl] = useState(currentUrl);\n\tconst { data: savedValue } = savedTab || { data: null };\n\tlet initiallyActiveTab = initialTab;\n\n\t// Select active tab, based on url.\n\tif (baseUrl && !isEmpty(tabs)) {\n\t\tfor (const [index, tab] of tabs.entries()) {\n\t\t\tconst { tabUrl: tUrl, url } = tab;\n\t\t\tconst tabUrl = tUrl || url || null;\n\n\t\t\tif (tabUrl && activeUrl && activeUrl.endsWith(baseUrl + \"/\" + tabUrl)) {\n\t\t\t\tinitiallyActiveTab = index + 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst [activeTab, setActiveTab] = useState(savedValue && saveID ? savedValue : initiallyActiveTab);\n\n\tconst changeTab = (newTab: number | string, newUrl?: string, target?: HTMLElement) => {\n\t\tif (newTab === activeTab) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetActiveTab(newTab);\n\n\t\t// baseUrl is set and newUrl is not undefied, update url.\n\t\tif (baseUrl && newUrl !== undefined) {\n\t\t\tsetActiveUrl(baseUrl + \"/\" + newUrl);\n\t\t\tif (hasWindow && window.history.replaceState) {\n\t\t\t\twindow.history.replaceState({}, null, baseUrl + \"/\" + newUrl);\n\t\t\t}\n\t\t}\n\n\t\tif (saveID && saveID !== \"\") {\n\t\t\tsaveTab(newTab);\n\t\t}\n\n\t\tif (emitChanges && hasWindow) {\n\t\t\tconst event = new CustomEvent(\"tabChange\", {\n\t\t\t\tdetail: {\n\t\t\t\t\tcurrentTab: newTab,\n\t\t\t\t\tid,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\twindow.dispatchEvent(event);\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\nexport default memo(TabSwitcher);\nexport { Tab, TabPanel };\n","const defaultQuery: IApartmentQuery = {\n\tareaType: '',\n\tlimit: 30,\n\tmaxArea: null,\n\tmaxYearBuilt: null,\n\tminArea: null,\n\tminYearBuilt: null,\n\tsort: 'latestPublishTimestamp',\n\tsortOrder: 'desc',\n\ttype: 'property',\n};\n\nexport default defaultQuery;\n","import { DISABLE_HOVER, ENABLE_HOVER } from \"./types\";\n\nimport { SAGA_DISABLE_HOVER, SAGA_ENABLE_HOVER } from \"../sagas/saga.types\";\n\nexport const disableHover = (enableAfter: number = null) => {\n\treturn {\n\t\tpayload: {\n\t\t\tenableAfter,\n\t\t},\n\t\ttype: DISABLE_HOVER,\n\t};\n};\n\nexport const sagaDisableHover = (enableAfter: number = null) => {\n\treturn {\n\t\tpayload: {\n\t\t\tenableAfter,\n\t\t},\n\t\ttype: SAGA_DISABLE_HOVER,\n\t};\n};\n\nexport const enableHover = () => {\n\treturn {\n\t\ttype: ENABLE_HOVER,\n\t};\n};\n\nexport const sagaEnableHover = () => {\n\treturn {\n\t\ttype: SAGA_ENABLE_HOVER,\n\t};\n};\n","import React from \"react\";\nimport { getAssetUrl, imageWithSize } from \"@utils\";\nimport Image from \"@components/Image\";\n\ninterface IProps {\n\tagent: IAgent;\n\thalfBody?: boolean;\n\tsize?: string;\n\t[key: string]: any;\n}\n\nconst AgentImage = (props: IProps) => {\n\tconst {\n\t\tagent: { degrees, firstName, halfBodyImageName, halfBodyImagePath, imageName, imagePath, lastName, title },\n\t\thalfBody,\n\t\tsize = \"w_517,h_652\",\n\t\t...restProps\n\t} = props;\n\n\tconst alt = `${title ? title : \"\"}${degrees && title ? \", \" : \"\"}${\n\t\tdegrees ? degrees : \"\"\n\t} ${firstName} ${lastName}`;\n\tconst backupSrc = getAssetUrl(\"/assets/images/km-2019/valittaja/valittaja-backup.png\");\n\tlet src: string = `/assets${imagePath}/${imageName}`;\n\n\tif (halfBody && halfBodyImageName && halfBodyImagePath) {\n\t\tsrc = `/assets${halfBodyImagePath}/${halfBodyImageName}`;\n\t}\n\n\treturn (\n\t\t\n\t);\n};\n\nexport default AgentImage;\n","import styled from \"styled-components\";\nimport { BaseButton } from \"@components/Buttons\";\nimport { color, media, fontFamily } from \"@utils/style-utils\";\n\nexport const SelectionButton = styled(BaseButton)`\n\tbackground: ${props => (props.active ? color(\"greenBright\", 4) : props.disabled ? color(\"grey\", 4) : color(\"white\"))};\n\tborder-color: ${props => (props.active ? color(\"greenBright\", 1) : color(\"grey\", 5))};\n\tborder-radius: 0;\n\tcolor: ${color(\"grey\", 1)};\n\tdisplay: inline-block;\n\tfont-size: 16px;\n\tfont-family: ${fontFamily.condensed};\n\toutline: 0;\n\tpadding: 10px 26px;\n\tposition: relative;\n\tz-index: ${props => (props.active ? 2 : 1)};\n\n\t${media.sm`\n\t\tfont-family: ${fontFamily.base};\n\t\tfont-size: 17px;\n\t`}\n\n\t&:hover {\n\t\tbackground: ${props => (props.active ? color(\"greenBright\", 4) : props.disabled ? color(\"grey\", 4) : color(\"grey\", 7))};\n\t}\n\n\t&:active {\n\t\tborder-style: solid;\n\t\ttransform: scale(1);\n\t}\n\n\t&:first-of-type {\n\t\tborder-bottom-left-radius: 4px;\n\t\tborder-top-left-radius: 4px;\n\t}\n\n\t&:last-of-type {\n\t\tborder-bottom-right-radius: 4px;\n\t\tborder-top-right-radius: 4px;\n\t}\n`;\n","import React, { PureComponent } from \"react\";\nimport findIndex from \"lodash-es/findIndex\";\nimport { SelectionButton } from \"./styles\";\n\nimport { ISelection } from \"@utils/apartment-search/selections\";\nimport isEqual from \"react-fast-compare\";\n\ninterface IProps {\n\thasError?: boolean;\n\tonSelection?: (e?: any) => void;\n\tselections: ISelection[];\n\tsingle?: boolean;\n\t/** set true to bypass internal state stuff and use purely to show data and run callback on click */\n\tuseRedux?: boolean;\n\tdefaults?: any[];\n\t[key: string]: any;\n}\n\ninterface IState {\n\tselected?: ISelection[];\n}\n\nclass MultiButtonSelect extends PureComponent {\n\tprotected selections: ISelection[];\n\tconstructor(props: IProps) {\n\t\tsuper(props);\n\n\t\tthis.selections = [...this.props.selections];\n\t\t// Clear all selections as false.\n\t\tthis.selections.forEach(sel => (sel.selected = false));\n\n\t\t// Get default selections for selected.\n\t\tconst selected = [];\n\t\tif (this.props.defaults) {\n\t\t\tfor (let i in this.selections) {\n\t\t\t\tif (this.props.defaults.indexOf(this.selections[i].value) !== -1) {\n\t\t\t\t\tthis.selections[i].selected = true;\n\t\t\t\t\tselected.push(this.selections[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.state = {\n\t\t\tselected: selected,\n\t\t};\n\n\t\tthis.toggleSelection = this.toggleSelection.bind(this);\n\t}\n\n\tpublic reset() {\n\t\tthis.selections.forEach(sel => (sel.selected = false));\n\t\tthis.setState({\n\t\t\tselected: [],\n\t\t});\n\t}\n\n\ttoggleSelection(selection: ISelection) {\n\t\tif (selection.disabled) {\n\t\t\treturn;\n\t\t}\n\t\tconst { useRedux, onSelection, single } = this.props;\n\t\tconst { selected } = this.state;\n\n\t\tif (useRedux) {\n\t\t\tif (typeof onSelection === \"function\") {\n\t\t\t\tonSelection(selection);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst index = findIndex(selected, [\"label\", selection.label]);\n\t\tlet newSelected: ISelection[] = [...selected];\n\n\t\tif (index !== -1) {\n\t\t\tselection.selected = false;\n\t\t\tnewSelected.splice(index, 1);\n\t\t} else {\n\t\t\tif (single) {\n\t\t\t\tselected.forEach(s => (s.selected = false));\n\t\t\t\tselection.selected = true;\n\t\t\t\tnewSelected = [selection];\n\t\t\t} else {\n\t\t\t\tselection.selected = true;\n\t\t\t\tnewSelected = [...selected, selection];\n\t\t\t}\n\t\t}\n\n\t\tthis.setState(\n\t\t\t{\n\t\t\t\t...this.state,\n\t\t\t\tselected: newSelected,\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tif (!useRedux && typeof onSelection === \"function\") {\n\t\t\t\t\tonSelection(this.state.selected);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\trender() {\n\t\tconst { hasError, selections, single } = this.props;\n\n\t\tif (single && selections) {\n\t\t\tlet selectedFound = false;\n\t\t\tselections.forEach(s => {\n\t\t\t\tif (s.selected) {\n\t\t\t\t\tif (selectedFound) {\n\t\t\t\t\t\ts.selected = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselectedFound = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn (\n\t\t\tselections && (\n\t\t\t\t
\n\t\t\t\t\t{selections.map((selection: ISelection, index: number) => (\n\t\t\t\t\t\t this.toggleSelection(selection)}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{selection.label}\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\t
\n\t\t\t)\n\t\t);\n\t}\n}\n\nexport default MultiButtonSelect;\n","import styled from \"styled-components\";\n\nexport const BaseButton = styled.button`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tborder-style: solid; /* For some reason Firefox needs this specified separately... */\n\tborder-width: 1px; /* For some reason Firefox needs this specified separately... */\n\tcursor: pointer;\n\tfont-family: inherit;\n\tmargin: 0;\n\toutline: none !important;\n\ttransition: transform 150ms, color 150ms, background-color 150ms;\n\n\t&:active {\n\t\ttransform: scale(0.95);\n\t}\n`;\n","export const DISABLE_HOVER: string = \"UI/DISABLE_HOVER\";\nexport const ENABLE_HOVER: string = \"UI/ENABLE_HOVER\";\n","export const INIT: string = \"apartmentSearch/INIT\";\n\nexport const ADD_SELECTION: string = \"apartmentSearch/ADD_SELECTION\";\nexport const REMOVE_SELECTION: string = \"apartmentSearch/REMOVE_SELECTION\";\nexport const ADD_CONSTRAINT: string = \"apartmentSearch/ADD_CONSTRAINT\";\nexport const RESET_SELECTIONS: string = \"apartmentSearch/RESET_SELECTIONS\";\nexport const SET_RENTAL: string = \"apartmentSearch/SET_RENTAL\";\nexport const ADD_ADDRESSES: string = \"apartmentSearch/ADD_ADDRESSES\";\nexport const ADD_QUERY: string = \"apartmentSearch/ADD_QUERY\";\nexport const ADD_SORT: string = \"apartmentSearch/ADD_SORT\";\nexport const SAVE_TO_LOCALSTORAGE: string = \"apartmentSearch/SAVE_TO_LOCALSTORAGE\";\nexport const SET_STATE_FOR_LANDING_PAGE: string = \"apartmentSearch/SET_STATE_FOR_LANDING_PAGE\";\n\nexport const LOAD_MORE_PROPERTIES: string = \"apartmentSearch/LOAD_MORE_PROPERTIES\";\nexport const LOAD_MORE_PROPERTIES_PENDING: string = \"apartmentSearch/LOAD_MORE_PROPERTIES_PENDING\";\nexport const LOAD_MORE_PROPERTIES_REJECTED: string = \"apartmentSearch/LOAD_MORE_PROPERTIES_REJECTED\";\nexport const LOAD_MORE_PROPERTIES_FULFILLED: string = \"apartmentSearch/LOAD_MORE_PROPERTIES_FULFILLED\";\n\nexport const GET_PROPERTIES_PENDING = \"GET_PROPERTIES_PENDING\";\nexport const GET_PROPERTIES_REJECTED = \"GET_PROPERTIES_REJECTED\";\nexport const GET_PROPERTIES_FULLFILLED = \"GET_PROPERTIES_FULFILLED\";\n","export const truncate = (str: string, limit: number = 100) => (str.length > limit ? str.slice(0, limit) + \"...\" : str);\nexport const stripTags = (htmlString: string) => htmlString.replace(/(<([^>]+)>)/gi, \"\");\nexport const capitalizeFirst = (string: string) => string.charAt(0).toUpperCase() + string.slice(1);\n\nexport const getYoutubeID = (url: string) => {\n\tconst reg = /^.*(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/)|(?:(?:watch)?\\?v(?:i)?=|\\&v(?:i)?=))([^#\\&\\?]*).*/;\n\tconst match: RegExpMatchArray = url.match(reg);\n\treturn match ? match[1] : null;\n};\n","import queryString from \"query-string\";\nimport axios from \"axios\";\nimport { CANCEL } from \"redux-saga\";\n\nconst CancelToken = axios.CancelToken;\nconst API = \"/api/km/KM/?\";\n\nasync function fetchProperties(params: IApartmentQuery | any, api = API) {\n\tconst { query: queryObjects, ...rest } = params;\n\tlet query = queryString.stringify(rest, { arrayFormat: \"bracket\" });\n\n\tif (queryObjects) {\n\t\tfor (const q of queryObjects) {\n\t\t\tquery += \"&query[]=\" + encodeURIComponent(JSON.stringify(q));\n\t\t}\n\t}\n\n\ttry {\n\t\tconst url = `${api}${query}`;\n\t\tconst response = await fetchAPI(url);\n\t\treturn response.data;\n\t} catch (e) {\n\t\tconsole.log(\"errored apartment search\", e);\n\t}\n}\n\nasync function fetchAPI(url: string) {\n\tconst source = CancelToken.source();\n\n\tconst request = await axios.get(url, { cancelToken: source.token });\n\trequest[CANCEL] = () => source.cancel();\n\n\treturn request;\n}\n\nexport default {\n\tfetchAPI,\n\tfetchProperties,\n};\n","import React from \"react\";\nimport styled, { css } from \"styled-components\";\nimport { BaseButton } from \"@components/Buttons\";\nimport { color, textStyles, emSpacing } from \"@utils/style-utils\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\nconst CTA = styled(BaseButton)`\n\tbackground: ${color(\"greenBright\", 1)};\n\tborder: 0;\n\tborder-radius: 4px;\n\tcolor: ${color(\"white\")};\n\t${textStyles.PSmall};\n\tfont-weight: bold;\n\tline-height: 1;\n\tletter-spacing: ${emSpacing(0.07)};\n\tpadding: 16px 16px 15px;\n\ttext-align: center;\n\ttext-transform: uppercase;\n\n\t@media (min-width: 1140px) {\n\t\tfont-size: 16px;\n\t}\n\n\t&:disabled {\n\t\tcursor: not-allowed;\n\t}\n\n\t&:hover:not(:disabled) {\n\t\tbackground-color: #40b880;\n\t}\n\n\t${props =>\n\t\tprops.submitting &&\n\t\tcss`\n\t\t\tfont-size: 28px;\n\t\t\tcursor: normal !important;\n\t\t\tpadding-bottom: 7px;\n\t\t\tpadding-top: 9px;\n\n\t\t\t@media (min-width: 768px) {\n\t\t\t\tfont-size: 30px;\n\t\t\t}\n\t\t\t@media (min-width: 992px) {\n\t\t\t\tfont-size: 32px;\n\t\t\t}\n\n\t\t\tsvg {\n\t\t\t\tanimation-duration: 0.6s;\n\t\t\t\tmax-width: 28px;\n\n\t\t\t\t@media (min-width: 768px) {\n\t\t\t\t\tmax-width: 30px;\n\t\t\t\t}\n\t\t\t\t@media (min-width: 992px) {\n\t\t\t\t\tmax-width: 32px;\n\t\t\t\t}\n\t\t\t}\n\t\t`}\n`;\n\nconst CtaButton = props => {\n\tconst { onClick, text, submitting, children, ...rest } = props;\n\treturn (\n\t\t\n\t\t\t{submitting ? : children ? children : text}\n\t\t\n\t);\n};\n\nexport default CtaButton;\n","import React, { Fragment } from \"react\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport dataLayerPush from \"@utils/dataLayerPush\";\n\ninterface IPhone {\n\tphone: string;\n\tsingle?: boolean;\n\tstopPropagation?: boolean;\n\ttelPhone?: string;\n\twithIcon?: boolean;\n\t[key: string]: any;\n}\n\nconst cleanPhone = (phone: string) => {\n\treturn {\n\t\tphone: phone.trim(),\n\t\ttelPhone: phone\n\t\t\t.replace(\"(0)\", \"\")\n\t\t\t.replace(/[^0-9+]/g, \"\")\n\t\t\t.replace(/\\s/g, \"\"),\n\t};\n};\n\nconst Phone = ({\n\tphone,\n\ttelPhone,\n\tsingle,\n\tchildren = null,\n\tstopPropagation = false,\n\twithIcon = false,\n\t...restProps\n}: IPhone) => {\n\tif (single) {\n\t\tphone = phone ? phone.split(\",\")[0] : null;\n\t}\n\n\tconst phones = phone ? phone.split(\",\") : [];\n\n\tconst track = event => {\n\t\tif (stopPropagation) {\n\t\t\tevent.stopPropagation();\n\t\t}\n\n\t\tdataLayerPush({\n\t\t\taction: \"Lähetä\",\n\t\t\tconversionDetails: \"Puhelinnumero\",\n\t\t\tevent: \"customConversion\",\n\t\t});\n\t};\n\n\treturn (\n\t\t\n\t\t\t{phones.length > 1 && (\n\t\t\t\t\n\t\t\t\t\t{withIcon && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\t{phones.map(cleanPhone).map(({ phone: ph, telPhone: tph }, index: number) => (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{ph.replace(/\\+358(\\s+)?/, '0')}\n\t\t\t\t\t\t\t{children && children}\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\t\n\t\t\t)}\n\n\t\t\t{phones.length === 1 && (\n\t\t\t\t\n\t\t\t\t\t{withIcon && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\t{phone.replace(/\\+358(\\s+)?/, '0')}\n\t\t\t\t\t{children && children}\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport default Phone;\n","import React, { Fragment } from \"react\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport dataLayerPush from \"@utils/dataLayerPush\";\n\ninterface IEmail {\n\tto: string;\n\t/** splits email from @ into two spans inside */\n\tsplit?: boolean;\n\tstopPropagation?: boolean;\n\twithIcon?: boolean;\n\t[key: string]: any;\n}\n\nconst Email = (props: IEmail) => {\n\tconst { to = \"\", split = false, stopPropagation = false, withIcon = false, ...restProps } = props;\n\tlet toHtml = {to};\n\n\tif (split) {\n\t\tconst [namePart, domainPart] = to.split(\"@\");\n\n\t\ttoHtml = (\n\t\t\t\n\t\t\t\t{namePart}\n\t\t\t\t@{domainPart}\n\t\t\t\n\t\t);\n\t}\n\n\tconst track = event => {\n\t\tif (stopPropagation) {\n\t\t\tevent.stopPropagation();\n\t\t}\n\n\t\tdataLayerPush({\n\t\t\taction: \"Lähetä\",\n\t\t\tconversionDetails: \"Sähkoposti\",\n\t\t\tevent: \"customConversion\",\n\t\t});\n\t};\n\n\treturn (\n\t\t\n\t\t\t{withIcon && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\t{toHtml}\n\t\t\n\t);\n};\n\nexport default Email;\n","import React, { useEffect, useRef } from \"react\";\nimport { getAssetUrl, getOpenHouseDate, hasWindow, imageWithSize, isOpenHouseInFuture } from \"@utils\";\nimport NumberFormat from \"react-number-format\";\nimport { NavLink } from \"react-router-dom\";\nimport { ThemeProvider } from \"styled-components\";\nimport {\n\tAddress,\n\tAptBlock,\n\tAptBlockIcon,\n\tAptBlockIcons,\n\tAptBlockImage,\n\tAptBlockInfo,\n\tAptBlockOpenHouse,\n\tAptBlockValueListing,\n\tPrice,\n\tRoomTypes,\n\tSize,\n} from \"./styles\";\nimport Image from \"@components/Image\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport { filterXSS } from \"xss\";\nimport { getImageUrl, getMainImage } from \"@utils/apartment\";\n\ninterface IOpenHouse {\n\tdate?: number;\n\tendHours?: number;\n\tendMins?: number;\n\tmonth?: number;\n\tstartHours?: number;\n\tstartMins?: number;\n\ttype?: string;\n\tweekday?: string;\n\tyear?: string | number;\n}\n\ninterface IProps {\n\tdata: IProperty;\n\topenInNew?: boolean;\n\tsmall?: boolean;\n\tsmallValueListing?: boolean;\n\t[key: string]: any;\n}\n\nconst ApartmentBlock = (props: IProps) => {\n\tconst ref = useRef(null);\n\tconst { smallValueListing = false, small, lazy, data, openInNew, ...rest } = props;\n\tconst {\n\t\taddress,\n\t\tcanonicalPath,\n\t\tdistrict,\n\t\timages,\n\t\tkey,\n\t\tmunicipality,\n\t\tnewConstruction,\n\t\tonlineOffer,\n\t\topenHouses,\n\t\trentInfo,\n\t\trental,\n\t\troomTypes,\n\t\tsalesPriceUnencumbered: price,\n\t\tshowArea,\n\t\tvalueListing,\n\t\tvideoPresentationUrl,\n\t} = props.data;\n\n\tuseEffect(() => {\n\t\t// console.log(props.data);\n\t\t/* Background image fallback for older \"browsers\" that don't support object-fit */\n\t\tif (hasWindow && !(\"CSS\" in window && CSS.supports(\"object-fit\", \"cover\"))) {\n\t\t\tif (ref && ref.current) {\n\t\t\t\tconst img = ref.current.querySelector(\"img\");\n\t\t\t\timg.style.display = \"none\";\n\t\t\t\tref.current.style.cssText = `\n\t\t\t\t\tbackground-image: url(${img.src});\n\t\t\t\t\tbackground-size: cover;\n\t\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\t\tbackground-size: cover;\n\t\t\t\t`;\n\t\t\t}\n\t\t}\n\t}, []);\n\n\tconst image = React.useMemo(() => getImageUrl(getMainImage(images)), [images]);\n\tconst imageSize = \"w_622,h_352,c_zoom\";\n\tconst thumb = \"w_42,h_42,c_resize\";\n\tconst imageAlt = `${address}, ${district}${district && municipality ? \", \" : \"\"}${municipality}`;\n\n\tconst futureOpenHouses =\n\t\topenHouses && openHouses.length > 0 ? openHouses.filter(oh => isOpenHouseInFuture(oh)) : [];\n\tconst nextOpenHouse: IOpenHouse =\n\t\tfutureOpenHouses && futureOpenHouses.length > 0\n\t\t\t? { type: futureOpenHouses[0].type, ...getOpenHouseDate(futureOpenHouses[0], true) }\n\t\t\t: null;\n\tconst nextOpenHouseObject = futureOpenHouses.length > 0 ? futureOpenHouses[0] : null;\n\n\tconst getImageSrc = image ? imageWithSize(image, imageSize) : getAssetUrl(\"/assets/images/list/noimage-large.png\");\n\tconst getImageThumbSrc = React.useMemo(() => imageWithSize(image, thumb), [thumb]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{!!(valueListing && !smallValueListing) && (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{newConstruction && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!(smallValueListing && valueListing) && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{onlineOffer && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{videoPresentationUrl && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{nextOpenHouse && (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{nextOpenHouseObject.liveDemonstration\n\t\t\t\t\t\t\t\t\t? \"LIVE-ESITTELY\"\n\t\t\t\t\t\t\t\t\t: (nextOpenHouse.type === \"FIRST\" ? \"ENSIESITTELY\" : \"ESITTELY\")}\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{nextOpenHouse.weekday + \"na\"} \n\t\t\t\t\t\t\t\t\t{nextOpenHouse.date}.{nextOpenHouse.month}.  klo {nextOpenHouse.startHours}:\n\t\t\t\t\t\t\t\t\t{nextOpenHouse.startMins === 0 ? \"00\" : nextOpenHouse.startMins}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t{address}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t{district}\n\t\t\t\t\t\t\t{district && municipality ? \", \" : \"\"}\n\t\t\t\t\t\t\t{municipality}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t{roomTypes}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n\nexport default ApartmentBlock;\n","export const SAGA_ADD_SELECTION: string = \"saga/apartmentSearch/ADD_SELECTION\";\nexport const SAGA_REMOVE_SELECTION: string = \"saga/apartmentSearch/REMOVE_SELECTION\";\nexport const SAGA_ADD_CONSTRAINT: string = \"saga/apartmentSearch/ADD_CONSTRAINT\";\nexport const SAGA_RESET_SELECTIONS: string = \"saga/apartmentSearch/RESET_SELECTIONS\";\nexport const SAGA_SET_RENTAL: string = \"saga/apartmentSearch/SET_RENTAL\";\nexport const SAGA_ADD_ADDRESSES: string = \"saga/apartmentSearch/ADD_ADDRESSES\";\nexport const SAGA_ADD_QUERY: string = \"saga/apartmentSearch/ADD_QUERY\";\nexport const SAGA_CANCEL_QUERY: string = \"saga/apartmentSearch/CANCEL_QUERY\";\nexport const SAGA_ADD_SORT: string = \"saga/apartmentSearch/ADD_SORT\";\nexport const SAGA_GET_PROPERTIES_FOR_LANDING_PAGE: string = \"saga/apartmentSearch/SAGA_GET_PROPERTIES_FOR_LANDING_PAGE\";\n\nexport const SAGA_GET_PROPERTIES: string = \"saga/apartmentSearch/GET_PROPERTIES\";\nexport const SAGA_LOAD_MORE: string = \"saga/apartmentSearch/LOAD_MORE_PROPERTIES\";\n\nexport const SAGA_DISABLE_HOVER: string = \"saga/ui/DISABLE_HOVER\";\nexport const SAGA_ENABLE_HOVER: string = \"saga/ui/ENABLE_HOVER\";\n","import cabin from \"@images/brand-identity/icons/cabin.svg\";\nimport flat from \"@images/brand-identity/icons/flat.svg\";\nimport garage from \"@images/brand-identity/icons/garage.svg\";\nimport house from \"@images/brand-identity/icons/house.svg\";\nimport lot from \"@images/brand-identity/icons/lot.svg\";\nimport office from \"@images/brand-identity/icons/office.svg\";\nimport ranch from \"@images/brand-identity/icons/ranch.svg\";\nimport rowhouse from \"@images/brand-identity/icons/rowhouse.svg\";\nimport other from \"@images/brand-identity/icons/other.svg\";\n\nimport findKey from \"lodash-es/findKey\";\n\nconst buildingTypes = {\n\tcabin: [4],\n\tflat: [1, 9, 10],\n\tgarage: [6, 17],\n\thouse: [3, 8, 12],\n\tlot: [5],\n\toffice: [7, 14],\n\tranch: [13],\n\trowhouse: [2, 11],\n\tother: [15, 16],\n};\n\nconst buildingTypeIcons = {\n\tcabin,\n\tflat,\n\tgarage,\n\thouse,\n\tlot,\n\toffice,\n\tranch,\n\trowhouse,\n\tother,\n};\n\nconst resolveTypeText = (type: number): string => {\n\tconst key = findKey(buildingTypes, arr => arr.indexOf(type) !== -1);\n\treturn key ? key : null;\n};\n\nconst resolveIcon = (type: number): string => {\n\tconst key = resolveTypeText(type);\n\treturn buildingTypeIcons[key] || \"\";\n};\n\nconst buildingTypeNames = {\n\tcabin: \"Vapaa-ajan asunto\",\n\tflat: \"Kerros-/luhtitalo\",\n\tgarage: \"Autotalli\",\n\thouse: \"Omakoti-/erillistalo\",\n\tlot: \"Tontti\",\n\toffice: \"Toimitila\",\n\tranch: \"Maa- tai metsätila\",\n\trowhouse: \"Rivitalo/paritalo\",\n};\n\nconst resolveBuildingName = (type: string | number): string => {\n\tlet key = type;\n\tif (typeof type === \"number\") {\n\t\tkey = resolveTypeText(type);\n\t}\n\n\treturn buildingTypeNames[key] || null;\n};\n\nexport default buildingTypes;\nexport { buildingTypeIcons, buildingTypeNames, resolveBuildingName, resolveIcon, resolveTypeText };\n","import React from \"react\";\nimport logo from \"@images/brand-identity/logos/km-logo-horizontal.png\";\n\nconst LogoHorizontal = ({ asSvg = false, ...props }) => {\n\tif (asSvg) {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\t}\n\treturn \"Kiinteistömaailma\";\n};\n\nexport default LogoHorizontal;\n","module.exports = \"data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MiAzOCIgdmlld0JveD0iMCAwIDUyIDM4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im00NSAzNXYtMzBsLTE2LTUtOCA0djMxaC0ydi0zMWwtNy00LTkgNXYzMGgtM3YzaDQ4di0zem0tMzgtMjkuMiA0LTEuNnY1LjZsLTQgMS4zem0wIDggNC0xLjJ2NS42bC00IC45em0wIDggNC0uOHY1LjZsLTQgLjR6bTAgMTMuMnYtNS4zbDQtLjN2NS42em0zMi0yOS40IDQgMXY1LjJsLTQtLjh6bTAgOCA0IC44djUuMmwtNC0uNnptMCA4IDQgLjV2NS4xbC00LS4yem0tNi0xNy41IDQgMXY1LjRsLTQtLjl6bTAgOC40IDQgLjh2NS40bC00LS42em0wIDguNCA0IC41djUuNGwtNC0uM3ptMCAxNC4xdi01LjZsNCAuMnY1LjR6bTYgMHYtNS4zbDQgLjJ2NS4xeiIgZmlsbD0iIzIzZDI3OCIvPjwvc3ZnPg==\"","module.exports = \"data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MiAzOCIgdmlld0JveD0iMCAwIDUyIDM4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiMyM2QyNzgiPjxwYXRoIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTQ5IDIyaDNsLTE1LTE3aC0yMmwtMTUgMTdoM3YxM2gtM3YzaDUydi0zaC0zem0tMTMtMTEgMTAgMTF2MTNoLTZ2LTExaC04djExaC02di0xM3ptLTMwIDExaDE3djEzaC0xN3oiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Im0xMSAyNWg3djZoLTd6Ii8+PC9nPjwvc3ZnPg==\"","module.exports = \"data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MiAzOCIgdmlld0JveD0iMCAwIDUyIDM4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiMyM2QyNzgiPjxjaXJjbGUgY3g9IjE1IiBjeT0iMjAiIHI9IjMiLz48Y2lyY2xlIGN4PSIzNyIgY3k9IjIwIiByPSIzIi8+PHBhdGggY2xpcC1ydWxlPSJldmVub2RkIiBkPSJtNDkgMjJoM2wtMTUtMTdoLTIybC0xNSAxN2gzdjEzaC0zdjNoNTJ2LTNoLTN6bS0yNSAxM2gtNXYtMTBoLTh2MTBoLTV2LTEzbDktMTAgOSAxMHptMjIgMGgtNXYtMTBoLTh2MTBoLTV2LTEzbDktMTAgOSAxMHoiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=\"","module.exports = \"data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MiAzOCIgdmlld0JveD0iMCAwIDUyIDM4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiMyM2QyNzgiPjxwYXRoIGQ9Im0xMyAyNGgxMHY3aC0xMHoiLz48cGF0aCBkPSJtNDMgMzV2LTVoNmwtNy0xOS03IDE5aDZ2NWgtOHYtMTRoM2wtMTctMTZoLTJsLTE3IDE2aDN2MTRoLTN2M2g1MnYtM3ptLTEzIDBoLTI0di0xNGgyNHoiLz48L2c+PC9zdmc+\"","module.exports = \"data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MiAzOCIgdmlld0JveD0iMCAwIDUyIDM4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiMyM2QyNzgiPjxwYXRoIGQ9Im0yNiA1Yy00LjktLjEtOC45IDMuOC05IDguN3YuM2MwIDYgOSAxNyA5IDE3czktMTEgOS0xN2MuMS00LjktMy44LTguOS04LjctOS0uMSAwLS4yIDAtLjMgMHptMCAxMi42Yy0xLjkgMC0zLjQtMS41LTMuMy0zLjQgMC0xLjkgMS41LTMuMyAzLjQtMy4zczMuMyAxLjUgMy4zIDMuMy0xLjUgMy40LTMuNCAzLjR6Ii8+PHBhdGggZD0ibTE3LjEgMTgtMTcuMSAyMGgzNWwxNy4xLTIwem0tNi41IDE3aC01bDQuMy01aDV6bTI0IDBoLTIxbDYuOS04aDIxem05LjQtMTFoLTI0bC0yLjYgM2gtNWw1LjEtNmgyOXoiLz48L2c+PC9zdmc+\"","import React from \"react\";\nimport { PlaceholderSlides, PlaceholderSlide, Carousel } from \"./styles\";\n\nconst PropertyCarouselPlaceholder = () => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default PropertyCarouselPlaceholder;\n","import styled from 'styled-components';\nimport { color } from '@utils/style-utils';\n\nexport const CB = styled.span`\n\tinput[type=\"checkbox\"] {\n\t\tdisplay: none;\n\n\t\t&:checked ~ label {\n\t\t\t.box {\n\t\t\t\tbackground: ${ color('greenBright', 4) };\n\t\t\t\tborder-color: ${ color('greenBright', 1) };\n\n\t\t\t\ti {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&:disabled ~ label {\n\t\t\tcolor: ${color('grey', 4)};\n\n\t\t\t.box {\n\t\t\t\tbackground: ${color('grey', 4)};\n\t\t\t\tborder-color: ${color('grey', 1)};\n\n\t\t\t\ti {\n\t\t\t\t\tcolor: ${color('grey', 3)};\n\t\t\t\t\tdisplay: block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlabel {\n\t\talign-items: center;\n\t\tcolor: ${ color('grey', 2) };\n\t\tcursor: pointer;\n\t\tdisplay: flex;\n\t\tfont-size: 17px;\n\t\tline-height: 25px;\n\t\tmargin-bottom: 8px;\n\t\ttransition: color 150ms;\n\t\tuser-select: none;\n\n\t\t&:hover:not(:checked) {\n\t\t\t.box {\n\t\t\t\tbackground-color: ${ color('grey', 7) };\n\t\t\t}\n\t\t}\n\n\t\t.box {\n\t\t\tbackground: ${ color('white') };\n\t\t\tborder: 1px solid ${ color('grey', 5) };\n\t\t\tborder-radius: 2px;\n\t\t\tcolor: ${ color('greenBright', 1) };\n\t\t\tcursor: pointer;\n\t\t\tfont-size: 10px;\n\t\t\tdisplay: inline-block;\n\t\t\theight: 16px;\n\t\t\tmargin-right: 12px;\n\t\t\tmargin-top: -1px;\n\t\t\tposition: relative;\n\t\t\ttransition: background-color 150ms, border-color 150ms;\n\t\t\twidth: 16px;\n\n\t\t\ti {\n\t\t\t\tdisplay: none;\n\t\t\t\tleft: 0;\n\t\t\t\tposition: absolute;\n\t\t\t\tright: 0;\n\t\t\t\ttext-align: center;\n\t\t\t\ttop: 50%;\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t}\n\t\t}\n\t}\n`\n","import React from \"react\";\nimport { CB } from \"./styles\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\ninterface IProps {\n\tchecked?: boolean;\n\tid?: string;\n\tonChange?: (data?: any) => void;\n\tlabel: string;\n\tvalue: any;\n\t[key: string]: any;\n}\n\nconst Checkbox = (props: IProps) => {\n\tconst { label, value, onChange, checked, disabled, ...restProps } = props;\n\n\tconst handleChange = () => {\n\t\tonChange({ label, value, selected: !checked });\n\t};\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default Checkbox;\n","import styled from \"styled-components\";\nimport { color, media } from \"@utils/style-utils\";\nimport { BaseButton } from \"@components/Buttons\";\n\nexport const DdSelectWrapper = styled.div.attrs(() => ({\n\tclassName: \"dropdown-select\",\n}))`\n\tposition: relative;\n\tz-index: 9;\n`;\n\nexport const DdSelectToggle = styled(BaseButton)`\n\tbackground: ${color(\"white\")};\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-radius: 4px;\n\tcolor: ${color(\"grey\", 1)};\n\tfont-size: 16px;\n\tline-height: 20px;\n\tpadding: 10px 12px;\n\n\t&:hover {\n\t\tbackground-color: ${color(\"grey\", 7)};\n\t}\n\n\t.has-selections & {\n\t\tborder-color: ${color(\"greenBright\", 1)};\n\t}\n`;\n\nexport const DdSelectContent = styled.div`\n\tbackground: ${color(\"white\")};\n\tbox-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n\tdisplay: ${props => (props.open ? \"block\" : \"none\")};\n\tpadding: 32px 16px 16px;\n\tposition: absolute;\n\ttop: calc(100% + 12px);\n\t/* width: 100%; */\n\n\t${media.sm`\n\t\tpadding: 32px 24px 16px;\n\t`}\n\n\t#room-select & {\n\t\twidth: 363px;\n\n\t\t.selection-button {\n\t\t\tpadding: 10px 0 8px;\n\t\t\twidth: calc(100% / 5);\n\n\t\t\t+ .selection-button {\n\t\t\t\tmargin-left: -1px;\n\t\t\t}\n\t\t}\n\t}\n\n\t#apartment-type-select & {\n\t\twidth: 231px;\n\t}\n\n\t#area-select & {\n\t\twidth: 417px;\n\t}\n\n\t#price-select & {\n\t\tpadding-bottom: 0;\n\t\twidth: 417px;\n\n\t\t.monthly-payment {\n\t\t\tborder-top: 1px solid ${color(\"grey\", 5)};\n\t\t\tmargin-left: -24px;\n\t\t\tmargin-right: -24px;\n\t\t\tmargin-top: 32px;\n\t\t\twidth: calc(100% + 48px);\n\t\t}\n\t}\n\n\t#extra-select & {\n\t\twidth: 491px;\n\n\t\t@media (max-width: 1490px) {\n\t\t}\n\t}\n`;\n","import styled from \"styled-components\";\nimport { color, fontFamily, media } from \"@utils/style-utils\";\n\nexport const FormHeader = styled.div`\n\ttext-align: center;\n\n\th3 {\n\t\tmargin: 0 auto 15px;\n\t}\n`;\n\nexport const AgentInfo = styled.div`\n\talign-items: center;\n\tcolor: ${color(\"grey\", 2)};\n\tdisplay: flex;\n\tflex-direction: column;\n\tfont-family: ${fontFamily.condensed};\n\tfont-size: 16px;\n\tjustify-content: center;\n\tmargin: 0 auto 32px;\n\tmax-width: 662px;\n\n\t${media.md`\n\t\tflex-direction: row;\n\t`}\n`;\n\nexport const ImageBubble = styled.div`\n\tbackground: ${color(\"grey\", 7)};\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-radius: 50%;\n\theight: 40px;\n\tmargin-bottom: 15px;\n\toverflow: hidden;\n\tposition: relative;\n\twidth: 40px;\n\n\t${media.md`\n\t\tmargin-bottom: 0;\n\t\tmargin-right: 20px;\n\t`}\n\n\timg {\n\t\tdisplay: block;\n\t\tleft: 50%;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\ttransform: translate(-50%, -50%);\n\t\twidth: 100%;\n\t}\n`;\n","import React from \"react\";\nimport { Swiper } from \"react-dynamic-swiper\";\nimport { Carousel, CarouselHeader, CarouselButtons, CarouselTitle } from \"./styles\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\nconst PropertyCarousel = ({ title, children, slideCount, id, loop = true }) => {\n\tconst swiperOptionsBase = {\n\t\tgrabCursor: true,\n\t\tnavigation: {\n\t\t\tnextEl: `.properties-next_${id}`,\n\t\t\tprevEl: `.properties-prev_${id}`,\n\t\t},\n\t\tpagination: false,\n\t};\n\n\tconst swiperOptionsOne = {\n\t\t...swiperOptionsBase,\n\t\tloop: false,\n\t\tslidesPerGroup: 1,\n\t\tslidesPerView: 1,\n\t\tspaceBetween: 40,\n\t};\n\n\tconst swiperOptionsTwo = {\n\t\t...swiperOptionsBase,\n\t\tbreakpoints: {\n\t\t\t450: {\n\t\t\t\tfreeMode: true,\n\t\t\t\tslidesPerGroup: 1,\n\t\t\t\tslidesPerView: 1.1,\n\t\t\t\tspaceBetween: 10,\n\t\t\t},\n\t\t\t580: {\n\t\t\t\tfreeMode: true,\n\t\t\t\tslidesPerGroup: 1,\n\t\t\t\tslidesPerView: 1.4,\n\t\t\t\tspaceBetween: 20,\n\t\t\t},\n\t\t\t860: {\n\t\t\t\tfreeMode: true,\n\t\t\t\tslidesPerGroup: 2,\n\t\t\t\tslidesPerView: 2,\n\t\t\t\tspaceBetween: 20,\n\t\t\t},\n\t\t\t1920: {\n\t\t\t\tslidesPerGroup: 2,\n\t\t\t\tslidesPerView: 2,\n\t\t\t\tspaceBetween: 40,\n\t\t\t},\n\t\t},\n\t\tloop: false,\n\t\tslidesPerGroup: 2,\n\t\tslidesPerView: 2,\n\t\tspaceBetween: 40,\n\t};\n\n\tconst swiperOptionsThree = {\n\t\t...swiperOptionsBase,\n\t\tbreakpoints: {\n\t\t\t450: {\n\t\t\t\tfreeMode: true,\n\t\t\t\tslidesPerGroup: 1,\n\t\t\t\tslidesPerView: 1.1,\n\t\t\t\tspaceBetween: 10,\n\t\t\t},\n\t\t\t580: {\n\t\t\t\tfreeMode: true,\n\t\t\t\tslidesPerGroup: 1,\n\t\t\t\tslidesPerView: 1.4,\n\t\t\t\tspaceBetween: 20,\n\t\t\t},\n\t\t\t860: {\n\t\t\t\tfreeMode: true,\n\t\t\t\tslidesPerGroup: 2,\n\t\t\t\tslidesPerView: 2,\n\t\t\t\tspaceBetween: 20,\n\t\t\t},\n\t\t\t1130: {\n\t\t\t\tfreeMode: false,\n\t\t\t\tslidesPerGroup: 3,\n\t\t\t\tslidesPerView: 3,\n\t\t\t\tspaceBetween: 20,\n\t\t\t},\n\t\t\t1920: {\n\t\t\t\tslidesPerGroup: 3,\n\t\t\t\tslidesPerView: 3,\n\t\t\t\tspaceBetween: 40,\n\t\t\t},\n\t\t},\n\t\tloop: false,\n\t\tslidesPerGroup: 3,\n\t\tslidesPerView: 3,\n\t\tspaceBetween: 40,\n\t};\n\n\tconst swiperOptionsFourOrMore = {\n\t\t...swiperOptionsBase,\n\t\tbreakpoints: {\n\t\t\t450: {\n\t\t\t\tfreeMode: true,\n\t\t\t\tslidesPerGroup: 1,\n\t\t\t\tslidesPerView: 1.1,\n\t\t\t\tspaceBetween: 10,\n\t\t\t},\n\t\t\t580: {\n\t\t\t\tfreeMode: true,\n\t\t\t\tslidesPerGroup: 1,\n\t\t\t\tslidesPerView: 1.4,\n\t\t\t\tspaceBetween: 20,\n\t\t\t},\n\t\t\t860: {\n\t\t\t\tfreeMode: true,\n\t\t\t\tslidesPerGroup: 2,\n\t\t\t\tslidesPerView: 2,\n\t\t\t\tspaceBetween: 20,\n\t\t\t},\n\t\t\t1130: {\n\t\t\t\tfreeMode: false,\n\t\t\t\tslidesPerGroup: 3,\n\t\t\t\tslidesPerView: 3,\n\t\t\t\tspaceBetween: 20,\n\t\t\t},\n\t\t\t1300: {\n\t\t\t\tslidesPerView: 4,\n\t\t\t\tspaceBetween: 20,\n\t\t\t},\n\t\t\t1920: {\n\t\t\t\tslidesPerGroup: 4,\n\t\t\t\tspaceBetween: 40,\n\t\t\t},\n\t\t},\n\n\t\tloop,\n\t\tslidesPerGroup: 4,\n\t\tslidesPerView: 4,\n\t\tspaceBetween: 40,\n\t};\n\n\tconst getSwiperOptions = (count: number) => {\n\t\tswitch (count) {\n\t\t\tcase 1:\n\t\t\t\treturn swiperOptionsOne;\n\n\t\t\tcase 2:\n\t\t\t\treturn swiperOptionsTwo;\n\t\t\tcase 3:\n\t\t\t\treturn swiperOptionsThree;\n\n\t\t\tcase 4:\n\t\t\t\treturn swiperOptionsFourOrMore;\n\n\t\t\tdefault:\n\t\t\t\treturn swiperOptionsFourOrMore;\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{title}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t{children}\n\t\t\t
\n\t\t
\n\t);\n};\n\nexport default PropertyCarousel;\n","import React from \"react\";\nimport logo from \"@images/brand-identity/logos/km-logo-stacked.png\";\n\nconst LogoStacked = ({ asSvg = false, ...props }) => {\n\tif (asSvg) {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t);\n\t}\n\treturn \"Kiinteistömaailma\";\n};\n\nexport default LogoStacked;\n","import dataLayerPush from \"@utils/dataLayerPush\";\n\nexport default function propertyTrack(property: IProperty) {\n\ttry {\n\t\tconst {\n\t\t\tagencyInfo,\n\t\t\tcity,\n\t\t\tdistrict,\n\t\t\tkey,\n\t\t\tlivingArea,\n\t\t\tnewConstruction,\n\t\t\tonlineOffer,\n\t\t\trental,\n\t\t\troomAmount,\n\t\t\tsalesPriceUnencumbered,\n\t\t} = property;\n\t\tconst { key: agencyKey, companyName, marketingName } = agencyInfo;\n\n\t\t// prettier-ignore\n\t\tconst data = {\n\t\t\t\"prod-details\": {\n\t\t\t\t\"asuinpintaala\": `${livingArea}`,\n\t\t\t\t\"huoneluku\": `${roomAmount}`,\n\t\t\t\t\"kaupunginosa\": district,\n\t\t\t\t\"myymala-id\": agencyKey,\n\t\t\t\t\"myymala-laki\": companyName,\n\t\t\t\t\"myymala-markkinointi\": marketingName,\n\t\t\t\t\"myyntikohde\": !rental,\n\t\t\t\t\"productid\": key,\n\t\t\t\t\"sijainti\": city,\n\t\t\t\t\"tarjouskauppa\": !!onlineOffer,\n\t\t\t\t\"uudiskohde\": !!newConstruction,\n\t\t\t},\n\t\t};\n\t\t// prettier-ignore-end\n\n\t\tif (!rental) {\n\t\t\tconst priceField = onlineOffer ? \"tarjouskauppa-hinta\" : \"velaton-hinta\";\n\t\t\tdata[\"prod-details\"][priceField] = `${salesPriceUnencumbered}`;\n\t\t}\n\n\t\tdataLayerPush(data);\n\t} catch (e) {\n\t\tconsole.log(\"couldn't push property data\", e);\n\t}\n}\n","import styled, { css } from \"styled-components\";\nimport { color, media, fontFamily } from \"@utils/style-utils\";\nimport flat from \"@images/brand-identity/icons/flat.svg\";\nimport house from \"@images/brand-identity/icons/house.svg\";\nimport rowhouse from \"@images/brand-identity/icons/rowhouse.svg\";\nimport newConst from \"@images/brand-identity/icons/new.svg\";\nimport cabin from \"@images/brand-identity/icons/cabin.svg\";\nimport lot from \"@images/brand-identity/icons/lot.svg\";\n\nconst iconMap = {\n\tkerrostaloasunnot: flat,\n\tomakotitalot: house,\n\t\"rivitalot-paritalot\": rowhouse,\n\tuudiskohteet: newConst,\n\t\"vapaa-ajan_asunnot\": cabin,\n\ttontit: lot,\n};\n\nconst getIcon = type => (iconMap[type] ? iconMap[type] : \"\");\n\nexport const Bubbles = styled.div.attrs(() => ({\n\tclassName: \"apartment-bubbles\",\n}))`\n\tdisplay: flex;\n\n\t@media (max-width: 767px) {\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tpadding-bottom: 5px;\n\t\tpadding-top: 5px;\n\t\twhite-space: nowrap;\n\t}\n\n\t@media (min-width: 768px) and (max-width: 1199px) {\n\t\t@supports (display: grid) {\n\t\t\tdisplay: grid;\n\t\t\tgrid-gap: 16px;\n\t\t\tgrid-template-columns: repeat(3, 1fr);\n\n\t\t\t> * {\n\t\t\t\tmargin: 0 !important;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const Bubble = styled.div.attrs(() => ({\n\tclassName: \"apartment-bubble\",\n}))`\n\tcursor: pointer;\n\tflex-grow: 1;\n\tmargin-bottom: 16px;\n\tmargin-right: 12px;\n\tposition: relative;\n\n\t&::before {\n\t\tborder-radius: 4px;\n\t\tborder: 1px solid ${color(\"grey\", 6)};\n\t\tbackground: ${color(\"white\")};\n\t\tbox-shadow: 0px 6px 10px ${color(\"grey\", 6)};\n\t\tcontent: \"\";\n\t\theight: 100%;\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\ttransition: box-shadow 150ms, transform 150ms;\n\t\twidth: 100%;\n\t}\n\n\t.is-pointer & {\n\t\t&:hover::before {\n\t\t\tbox-shadow: 0px 6px 18px ${color(\"grey\", 6)};\n\t\t\ttransform: scale(1.1);\n\t\t}\n\t}\n\n\t&:active::before {\n\t\ttransform: scale(0.97);\n\t}\n\n\t@media (max-width: 330px) {\n\t\tmargin-right: 9px;\n\t}\n\n\t${media.md`\n\t\tflex-basis: calc((100% - 40px) / 3);\n\t\tmargin-right: 20px;\n\n\t\t&:last-of-type,\n\t\t&:nth-of-type(3n) {\n\t\t\tmargin-right: 0;\n\t\t}\n\n\t\t&:nth-last-child(-n+3) {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t`}\n\n\t${media.xl`\n\t\tflex-basis: auto;\n\t\tmargin-bottom: 0;\n\n\t\t&:nth-of-type(3n) {\n\t\t\tmargin-right: 20px;\n\t\t}\n\n\t\t&:last-of-type {\n\t\t\tmargin-right: 0;\n\t\t}\n\t`}\n\n\ta {\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\theight: 100%;\n\t\tjustify-content: center;\n\t\tpadding: 20px 32px;\n\t\tposition: relative;\n\t\ttext-decoration: none;\n\t\tz-index: 3;\n\n\t\tspan {\n\t\t\tdisplay: block;\n\t\t\tfont-family: ${fontFamily.condensed};\n\t\t\tfont-size: 14px;\n\t\t\tfont-weight: 500;\n\t\t}\n\t}\n\n\t${props =>\n\t\tprops.aptType &&\n\t\tcss`\n\t\t\ta {\n\t\t\t\tbackground-image: url(${getIcon(props.aptType)});\n\t\t\t\tbackground-position: 16px 50%;\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\tbackground-size: 30px auto;\n\t\t\t\tpadding-left: 60px;\n\n\t\t\t\t@media (min-width: 1360px) {\n\t\t\t\t\tbackground-position: 20px 50%;\n\t\t\t\t\tbackground-size: 40px auto;\n\t\t\t\t\tpadding-left: 79px;\n\t\t\t\t}\n\t\t\t}\n\t\t`}\n`;\n","import React from \"react\";\nimport { filterXSS } from \"xss\";\nimport { Bubbles, Bubble } from \"./styles\";\nimport { withRouter, RouteComponentProps } from \"react-router-dom\";\nimport { sagaResetSelections, sagaAddSelection } from \"@redux/apartment-search/apartment-search.actions\";\nimport { useDispatch } from \"react-redux\";\nimport { selectableHouseTypes, selectableNewConstruction } from \"@utils/apartment-search/selections\";\n\ninterface IProps {\n\tstats: any;\n\t[key: string]: any;\n}\n\nconst resolveHousetypeSelection = (value: string) => {\n\treturn selectableHouseTypes.filter(type => type.value === value)[0] || null;\n};\n\nconst getNewConstructionSelection = () => selectableNewConstruction.filter(item => item.value === true)[0] || null;\n\nconst ApartmentBubbles = (props: IProps & RouteComponentProps) => {\n\tconst { stats } = props;\n\n\tif (!stats) {\n\t\treturn null;\n\t}\n\n\tconst dispatch = useDispatch();\n\tconst statistics = Object.keys(stats).map((key: string) => ({ name: key, ...stats[key] }));\n\n\tconst searchByType = (e: any, type: string, href: string) => {\n\t\te.preventDefault();\n\t\tdispatch(sagaResetSelections());\n\n\t\tif (type === \"uudiskohteet\") {\n\t\t\tconst newConst = getNewConstructionSelection();\n\t\t\tif (!newConst) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdispatch(sagaAddSelection(\"newConstruction\", newConst, true));\n\t\t} else {\n\t\t\tconst housetypeSelection = resolveHousetypeSelection(type);\n\t\t\tif (!housetypeSelection) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdispatch(sagaAddSelection(\"houseTypes\", housetypeSelection));\n\t\t}\n\n\t\tprops.history.push(href);\n\t};\n\n\treturn (\n\t\t\n\t\t\t{statistics.map(({ type, href, name, count }, index) => (\n\t\t\t\t\n\t\t\t\t\t searchByType(e, type, href)}>\n\t\t\t\t\t\t\n\t\t\t\t\t\t({count})\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t))}\n\t\t\n\t);\n};\n\nexport default withRouter(ApartmentBubbles);\n","import styled from \"styled-components\";\nimport { color, media, fontFamily } from \"@utils/style-utils\";\n\nexport const RecommendationBlock = styled.div.attrs(() => ({\n\tclassName: \"recommendation-percentage\",\n}))`\n\talign-items: center;\n\tbackground: ${color(\"grey\", 7)};\n\tborder: 1px solid ${color(\"grey\", 6)};\n\tborder-radius: 4px;\n\tdisplay: flex;\n\tflex: 1 1 0;\n\tjustify-content: center;\n\tpadding: 18px 27px;\n\n\tbig {\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t\tfont-size: 24px;\n\t\tfont-weight: 500;\n\t\tmargin-right: 10px;\n\n\t\t${media.md`\n\t\t\tfont-size: 28px;\n\t\t\tmargin-right: 15px;\n\t\t`};\n\n\t\t${media.lg`\n\t\t\tfont-size: 30px;\n\t\t\tmargin-right: 20px;\n\t\t`};\n\t}\n\n\tsmall {\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tfont-family: ${fontFamily.condensed};\n\t\tfont-weight: 500;\n\t\tfont-size: 14px;\n\t}\n`;\n","import React from \"react\";\nimport Text from \"wake-react-components/text\";\nimport { RecommendationBlock } from \"./styles\";\n\nconst RecommendationPercentage = () => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t%\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default RecommendationPercentage;\n","export const getAddressString = (doc: IProperty): string => {\n\tif (!doc) {\n\t\treturn \"\";\n\t}\n\n\tconst { address, city, district, municipality } = doc;\n\n\treturn `${address}, ${district}${district && (municipality || city) ? \", \" : \"\"}${\n\t\tmunicipality ? municipality : city\n\t}`;\n};\n\nconst isMain = (image: IPropertyImage) => image && image.type && image.type === \"MAIN\";\nconst isNormal = (image: IPropertyImage) => image && image.type && image.type === \"NORMAL\";\n\nexport const getMainImage = (images: IPropertyImage[]): IPropertyImage => {\n\ttry {\n\t\tconst hasImages = images && images.length > 0;\n\n\t\tif (!hasImages) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst mainImage = images.filter(isMain)[0] || images.filter(isNormal)[0] || null;\n\n\t\tif (!mainImage) {\n\t\t\treturn {\n\t\t\t\tname: \"arealift-placeholder@2x.jpg\",\n\t\t\t\tpath: \"/images/km-2019/aluesivut\",\n\t\t\t\tsrc: \"/assets/images/km-2019/aluesivut/arealift-placeholder@2x.jpg\",\n\t\t\t};\n\t\t}\n\n\t\treturn mainImage;\n\t} catch (e) {\n\t\tconsole.log(e);\n\t\treturn {};\n\t}\n};\n\nexport const getFloorPlan = (images: IPropertyImage[]): IPropertyImage =>\n\timages && images.length > 0\n\t\t? images.filter((image: IPropertyImage) => image.type && image.type === \"GROUND_PLAN\")[0]\n\t\t: null;\n\nexport const getImageUrl = (image: IPropertyImage): string => (image\n\t? (image.dataUrl\n\t\t? image.dataUrl\n\t\t: `/assets${image.path}/${image.name}`\n\t)\n\t: \"\"\n);\n","import { IApplicationState } from \"@redux\";\nimport { createSelectorCreator, defaultMemoize } from \"reselect\";\nimport isEqual from \"react-fast-compare\";\nimport { IApartmentSearch } from \"./apartment-search.reducer\";\n\nconst createDeepEqualSelector = createSelectorCreator(defaultMemoize, isEqual);\n\nexport const getApartmentSearch = ({ apartmentSearch }: { apartmentSearch: IApartmentSearch }): IApartmentSearch =>\n\tapartmentSearch;\n\nexport const apartmentSearchSelector = createDeepEqualSelector(\n\tgetApartmentSearch,\n\t(apartmentSearch: IApartmentSearch): IApartmentSearch => apartmentSearch\n);\n\nexport const getRooms = ({ apartmentSearch: { selections } }: IApplicationState) => selections.rooms;\nexport const getHouseTypes = ({ apartmentSearch: { selections } }: IApplicationState) => selections.houseTypes;\nexport const getFeatures = ({ apartmentSearch: { selections } }: IApplicationState) => selections.features;\nexport const getNewConstruction = ({ apartmentSearch: { selections } }: IApplicationState) =>\n\tselections.newConstruction;\nexport const getValueListing = ({ apartmentSearch: { selections } }: IApplicationState) =>\n\tselections.valueListing;\nexport const getConditions = ({ apartmentSearch: { selections } }: IApplicationState) => selections.conditions;\nexport const getAddresses = ({ apartmentSearch: { addresses } }: IApplicationState) => addresses;\nexport const getConstraints = ({ apartmentSearch: { constraints } }: IApplicationState) => constraints;\nexport const getRental = ({ apartmentSearch: { rental } }: IApplicationState) => rental;\nexport const getQuery = ({ apartmentSearch: { query } }: IApplicationState) => query;\nexport const getSort = ({ apartmentSearch: { sort, sortOrder } }: IApplicationState) => ({ sort, sortOrder });\n","import {\n\tADD_SELECTION,\n\tREMOVE_SELECTION,\n\tADD_CONSTRAINT,\n\tRESET_SELECTIONS,\n\tSET_RENTAL,\n\tADD_ADDRESSES,\n\tADD_QUERY,\n\tADD_SORT,\n\tLOAD_MORE_PROPERTIES,\n\tLOAD_MORE_PROPERTIES_FULFILLED,\n\tINIT,\n\tSET_STATE_FOR_LANDING_PAGE,\n} from \"./types\";\nimport {\n\tSAGA_ADD_SELECTION,\n\tSAGA_REMOVE_SELECTION,\n\tSAGA_ADD_CONSTRAINT,\n\tSAGA_RESET_SELECTIONS,\n\tSAGA_SET_RENTAL,\n\tSAGA_ADD_ADDRESSES,\n\tSAGA_ADD_QUERY,\n\tSAGA_ADD_SORT,\n\tSAGA_LOAD_MORE,\n\tSAGA_GET_PROPERTIES,\n\tSAGA_GET_PROPERTIES_FOR_LANDING_PAGE,\n} from \"../sagas/saga.types\";\nimport { ISelection } from \"@utils/apartment-search/selections\";\nimport { hasWindow } from \"@utils\";\n\nexport const init = () => {\n\tlet payload = {};\n\n\ttry {\n\t\tif (hasWindow && window.localStorage) {\n\t\t\tconst kmPropertySearch = JSON.parse(window.localStorage.getItem(\"kmPropertySearch\") || \"{}\");\n\t\t\tif (kmPropertySearch.version === 2 && kmPropertySearch.state) {\n\t\t\t\tpayload = kmPropertySearch.state;\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n\n\treturn {\n\t\tpayload,\n\t\ttype: INIT,\n\t};\n};\n\nexport const addSelection = (field: string, selections: ISelection[]) => {\n\treturn {\n\t\tpayload: {\n\t\t\tfield,\n\t\t\tselections,\n\t\t},\n\t\ttype: ADD_SELECTION,\n\t};\n};\n\nexport const sagaAddSelection = (field: string, selection: ISelection, single?: boolean) => {\n\treturn {\n\t\tpayload: {\n\t\t\tfield,\n\t\t\tselection,\n\t\t\tsingle,\n\t\t},\n\t\ttype: SAGA_ADD_SELECTION,\n\t};\n};\n\nexport const addConstraint = (field: string, value: any) => {\n\treturn {\n\t\tpayload: {\n\t\t\tfield,\n\t\t\tvalue,\n\t\t},\n\t\ttype: ADD_CONSTRAINT,\n\t};\n};\n\nexport const sagaAddConstraint = (field: string, value: any) => {\n\treturn {\n\t\tpayload: {\n\t\t\tfield,\n\t\t\tvalue,\n\t\t},\n\t\ttype: SAGA_ADD_CONSTRAINT,\n\t};\n};\n\nexport const removeSelection = (field: string, selection: any) => {\n\treturn {\n\t\tpayload: {\n\t\t\tfield,\n\t\t\tselection,\n\t\t},\n\t\ttype: REMOVE_SELECTION,\n\t};\n};\n\nexport const sagaRemoveSelection = (field: string, selection: any) => {\n\treturn {\n\t\tpayload: {\n\t\t\tfield,\n\t\t\tselection,\n\t\t},\n\t\ttype: SAGA_REMOVE_SELECTION,\n\t};\n};\n\nexport const resetSelections = (): IAction => {\n\treturn {\n\t\tpayload: {},\n\t\ttype: RESET_SELECTIONS,\n\t};\n};\n\nexport const sagaResetSelections = (): IAction => {\n\treturn {\n\t\tpayload: {},\n\t\ttype: SAGA_RESET_SELECTIONS,\n\t};\n};\n\nexport const setRental = (isRental: boolean): IAction => {\n\treturn {\n\t\tpayload: {\n\t\t\tisRental,\n\t\t},\n\t\ttype: SET_RENTAL,\n\t};\n};\n\nexport const sagaSetRental = (isRental: boolean): IAction => {\n\treturn {\n\t\tpayload: {\n\t\t\tisRental,\n\t\t},\n\t\ttype: SAGA_SET_RENTAL,\n\t};\n};\n\nexport const addAddresses = (addresses): IAction => {\n\treturn {\n\t\tpayload: {\n\t\t\taddresses,\n\t\t},\n\t\ttype: ADD_ADDRESSES,\n\t};\n};\n\nexport const sagaAddAddresses = (addresses): IAction => {\n\treturn {\n\t\tpayload: {\n\t\t\taddresses,\n\t\t},\n\t\ttype: SAGA_ADD_ADDRESSES,\n\t};\n};\n\nexport const addSort = (sort): IAction => {\n\treturn {\n\t\tpayload: {\n\t\t\tsort,\n\t\t},\n\t\ttype: ADD_SORT,\n\t};\n};\n\nexport const sagaAddSort = (sort): IAction => {\n\treturn {\n\t\tpayload: {\n\t\t\tsort,\n\t\t},\n\t\ttype: SAGA_ADD_SORT,\n\t};\n};\n\nexport const addQuery = (query: IApartmentQuery): IAction => {\n\treturn {\n\t\tpayload: query,\n\t\ttype: ADD_QUERY,\n\t};\n};\n\nexport const sagaAddQuery = (query: IApartmentQuery): IAction => {\n\treturn {\n\t\tpayload: query,\n\t\ttype: SAGA_ADD_QUERY,\n\t};\n};\n\nexport const loadMore = (results, skip: number): IAction => {\n\treturn {\n\t\tpayload: { skip, results },\n\t\ttype: LOAD_MORE_PROPERTIES_FULFILLED,\n\t};\n};\n\nexport const sagaLoadMore = (): IAction => {\n\treturn {\n\t\tpayload: {},\n\t\ttype: SAGA_LOAD_MORE,\n\t};\n};\n\nexport const sagaGetInitialProperties = (): IAction => {\n\treturn {\n\t\tpayload: { initial: true },\n\t\ttype: SAGA_GET_PROPERTIES,\n\t};\n};\n\nexport const setStateForLandingPage = (state): IAction => {\n\treturn {\n\t\tpayload: state,\n\t\ttype: SET_STATE_FOR_LANDING_PAGE,\n\t};\n};\n\nexport const sagaGetPropertiesForLandingPage = (searchData: ISearchData): IAction => {\n\treturn {\n\t\tpayload: {\n\t\t\tsearchData,\n\t\t},\n\t\ttype: SAGA_GET_PROPERTIES_FOR_LANDING_PAGE,\n\t};\n};\n","import React, { memo, createContext } from \"react\";\n\nimport { IApartmentSearch } from \"@redux/apartment-search\";\n\nimport { IApplicationState } from \"@redux\";\nimport { connect } from \"react-redux\";\nimport { apartmentSearchSelector } from \"@redux/apartment-search/apartment-search.selectors\";\nimport { ISelection } from \"@utils/apartment-search/selections\";\nimport {\n\tsagaAddAddresses,\n\tsagaAddConstraint,\n\tsagaAddSelection,\n\tsagaResetSelections,\n\tsagaSetRental,\n\tinit as sagaInit,\n} from \"@redux/apartment-search/apartment-search.actions\";\n\nconst limit = (event: KeyboardEvent, max: number = 5) => {\n\tconst target = event.target as HTMLInputElement;\n\n\tif (target.value.length >= max) {\n\t\ttarget.value = target.value.substr(0, max);\n\t}\n};\n\ninterface IProps {\n\taddAddresses: (addresses: any) => void;\n\taddCondition: (condition: ISelection) => void;\n\taddConstraint: (field: string, value: any) => void;\n\taddFeatures: (feature: ISelection) => void;\n\taddSelection: (field: string, selection: any, single?: boolean) => void;\n\tapartmentSearch: IApartmentSearch;\n\tresetSelections: () => void;\n\tsetRental: (isRental: boolean) => void;\n\t[key: string]: any;\n}\n\nconst context = createContext({});\n\nconst { Provider, Consumer } = context;\n\nconst isSelected = (selection: ISelection) => selection && selection.selected;\n\nconst ApartmentSearch = (props: IProps) => {\n\tconst { addAddresses, addConstraint, addSelection, apartmentSearch, resetSelections, setRental, init } = props;\n\tconst { constraints, addresses, selections } = apartmentSearch;\n\n\tconst hasSelectedPriceRange = (): boolean => {\n\t\tconst { min, max } = constraints;\n\t\treturn !!min || !!max;\n\t};\n\n\tconst hasSelectedAreaRange = (): boolean => {\n\t\tconst { minArea, maxArea } = constraints;\n\t\treturn !!minArea || !!maxArea;\n\t};\n\n\tconst hasSelectedYearRange = (): boolean => {\n\t\tconst { minYearBuilt, maxYearBuilt } = constraints;\n\t\treturn !!minYearBuilt || !!maxYearBuilt;\n\t};\n\n\tconst hasSelectedRooms = (): boolean => {\n\t\tconst { rooms } = selections;\n\t\tconst selectedRooms = (rooms && rooms.filter(isSelected)) || [];\n\n\t\treturn selectedRooms.length > 0;\n\t};\n\n\tconst hasSelectedHousetype = (): boolean => {\n\t\tconst { houseTypes } = selections;\n\t\tconst selectedHouseTypes = (houseTypes && houseTypes.filter(isSelected)) || [];\n\n\t\treturn selectedHouseTypes.length > 0;\n\t};\n\n\tconst hasSelectedFeatures = (): boolean => {\n\t\tconst { features } = selections;\n\t\tconst selectedFeatures = (features && features.filter(isSelected)) || [];\n\n\t\treturn selectedFeatures.length > 0;\n\t};\n\n\tconst hasSelectedNewConstruction = (): boolean => {\n\t\tconst { newConstruction } = selections;\n\t\tconst selectedNewConstruction = (newConstruction && newConstruction.filter(isSelected)) || [];\n\n\t\treturn selectedNewConstruction.length > 0;\n\t};\n\n\tconst hasSelectedValueListing = (): boolean => {\n\t\tconst { valueListing } = selections;\n\t\tconst selectedValueListing = (valueListing && valueListing.filter(isSelected)) || [];\n\n\t\treturn selectedValueListing.length > 0;\n\t};\n\n\tconst hasSelectedConditions = (): boolean => {\n\t\tconst { conditions } = selections;\n\t\tconst selectedConditions = (conditions && conditions.filter(isSelected)) || [];\n\n\t\treturn selectedConditions.length > 0;\n\t};\n\n\tconst hasSelectedAddresses = (): boolean => {\n\t\treturn addresses && addresses.length > 0;\n\t};\n\n\tconst itemsWithSelections = {\n\t\taddresses: hasSelectedAddresses(),\n\t\tarea: hasSelectedAreaRange(),\n\t\tconditions: hasSelectedConditions(),\n\t\tfeatures: hasSelectedFeatures(),\n\t\thouseTypes: hasSelectedHousetype(),\n\t\tnewConstruction: hasSelectedNewConstruction(),\n\t\tprice: hasSelectedPriceRange(),\n\t\trooms: hasSelectedRooms(),\n\t\tvalueListing: hasSelectedValueListing(),\n\t\tyear: hasSelectedYearRange(),\n\t};\n\n\treturn (\n\t\t\n\t\t\t{props.children}\n\t\t\n\t);\n};\n\nconst ApartmentSearchConsumer = ({ children }) => {props => children(props)};\n\nconst mapStateToProps = (state: IApplicationState) => ({\n\tapartmentSearch: apartmentSearchSelector(state),\n});\n\nconst mapDispatchToProps = {\n\taddAddresses: sagaAddAddresses,\n\taddConstraint: sagaAddConstraint,\n\taddSelection: sagaAddSelection,\n\tinit: sagaInit,\n\tresetSelections: sagaResetSelections,\n\tsetRental: sagaSetRental,\n};\n\nconst ApartmentSearchContainer = connect(\n\tmapStateToProps,\n\tmapDispatchToProps\n)(ApartmentSearch);\n\nexport default memo(ApartmentSearchContainer);\nexport { ApartmentSearchConsumer };\n","import styled from \"styled-components\";\n\nimport { color } from \"@utils/style-utils\";\n\nexport const FormGroup = styled.div``;\n\nexport const StyledInput = styled.input`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tbackground: ${({ grey }) => (grey ? color(\"grey\", 7) + \"!important\" : color(\"white\"))};\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-radius: 4px;\n\tfont-family: \"GT Walsheim Condensed\", \"GT Walsheim\", Helvetica, Arial, sans-serif;\n\tfont-size: 16px;\n\tfont-weight: 400;\n\tline-height: normal;\n\tletter-spacing: 0;\n\tpadding: 10px 16px;\n\n\t&:focus {\n\t\toutline: 0;\n\t}\n\n\t&::placeholder {\n\t\tcolor: ${color(\"grey\", 2)};\n\t\tfont-size: 16px;\n\t}\n\n\t&.error {\n\t\tborder: 1px solid ${color(\"coral\", 1)};\n\t}\n`;\n","import styled from \"styled-components\";\nimport { color, media, grid, textStyles, boxShadow, buttons } from \"@utils/style-utils\";\nimport { Link } from \"react-router-dom\";\n\nexport const LiftsContainer = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: space-between;\n\tmargin-bottom: 30px;\n\n\t${media.md`\n\t\tmargin-bottom: 60px;\n\t`}\n\n\t${media.ml`\n\t\tflex-direction: row;\n\t\tmargin-bottom: 90px;\n\t`}\n\n\t${media.lg`\n\t\tmargin-bottom: 120px;\n\t`}\n`;\n\nexport const SectionLift = styled.div`\n\tbackground: ${color(\"grey\", 7)};\n\tborder: 1px solid ${color(\"grey\", 6)};\n\tdisplay: flex;\n\tflex-basis: 100%;\n\tflex-direction: column;\n\tmargin-bottom: ${grid.gutterSmall}px;\n\tpadding: 36px 30px;\n\tperspective: 3000px;\n\ttext-align: center;\n\n\t${media.ml`\n\t\tflex-basis: calc((100% - ${grid.gutterSmall}px) / 2);\n\t\tpadding: 55px 54px 46px;\n\t`}\n\n\t${media.lgx`\n\t\tflex-basis: calc((100% - ${grid.gutter}px) / 2);\n\t\tpadding: 75px 64px 56px;\n\t`}\n`;\n\nexport const SectionLiftContent = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-grow: 1;\n\n\th2 {\n\t\tmargin: 0 0 40px;\n\t}\n\n\tp {\n\t\t${textStyles.PMedium}\n\t\tmargin: 0 0 15px;\n\n\t\t&:last-of-type {\n\t\t\tmargin-bottom: 39px;\n\t\t}\n\n\t\ta:not(.cta) {\n\t\t\tcolor: ${color(\"grey\", 1)};\n\t\t\ttext-decoration: underline;\n\n\t\t\t&:hover {\n\t\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const SectionLiftPreview = styled.div`\n\tbox-shadow: ${boxShadow.largeLight};\n\ttransition: transform 250ms, box-shadow 250ms;\n\ttransform: scale(1);\n\n\t&:hover {\n\t\tbox-shadow: ${boxShadow.largeLightHovered};\n\t\ttransform: scale(1.05);\n\t}\n\n\t> a {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t\ttext-decoration: none;\n\n\t\t> img {\n\t\t\tborder-radius: 4px;\n\t\t\tdisplay: block;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n`;\n\nexport const AgentCard = styled.div`\n\tbackground: ${color(\"white\")};\n\tborder-radius: 4px;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\toverflow: hidden;\n`;\n\nexport const AgentCardImage = styled.div`\n\tflex-basis: 31.83%;\n\n\tdiv {\n\t\tbackground-color: ${color(\"grey\", 7)};\n\t\tmin-height: 100%;\n\t\toverflow: hidden;\n\t\tpadding-bottom: 116.47%;\n\t\tposition: relative;\n\t}\n\n\timg {\n\t\tdisplay: block;\n\t\tleft: 50%;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\ttransform: translateX(-50%);\n\t\twidth: 100%;\n\t}\n`;\n\nexport const AgentCardInfo = styled.div`\n align-items: flex-start;\n\tdisplay: flex;\n\tflex-basis: 68.17%;\n\tflex-direction: column;\n\tjustify-content: center;\n\tpadding: 40px 20px 32px 20px;\n\ttext-align: left;\n\n\tp {\n\t\t${textStyles.MicroText}\n\t\tcolor: ${color(\"grey\", 2)};\n\t\tmargin: 0 0 20px;\n\t}\n`;\n\nexport const AgentName = styled.h4`\n\t${textStyles.MicroTextCaps}\n\tcolor: ${color(\"grey\", 1)};\n\tmargin: 0 0 6px;\n`;\n\nexport const AgentContact = styled(Link)`\n\t${buttons.ctaLink}\n`;\n\nexport const AgentRecommendation = styled.div`\n\tcolor: ${color(\"grey\", 1)};\n\tdisplay: flex;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tposition: absolute;\n\tright: 18px;\n\ttop: 20px;\n\n\tspan {\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t\tfont-size: 14px;\n\t\tdisplay: inline-block;\n\t\tmargin-right: 7px;\n\n\t\tsvg {\n\t\t\tmax-width: 14px;\n\t\t}\n\t}\n`;\n","import React, { useEffect, useState, createContext } from \"react\";\nimport axios from \"axios\";\n\nconst context = createContext({\n\tagent: {},\n});\n\nconst { Provider, Consumer } = context;\n\nconst RandomAgentData = ({ children }) => {({ agent }) => children(agent)};\n\nconst RandomAgent = ({ children, postcode }) => {\n\tif (!postcode) {\n\t\treturn null;\n\t}\n\n\tconst [agent, setAgent] = useState(null);\n\tconst API = \"/api/km/KMSite/agentSearch?notuples=1&random=true&limit=1&postCode=\" + postcode;\n\n\tuseEffect(() => {\n\t\tlet isSubscribed = true;\n\n\t\tasync function getAgent() {\n\t\t\tif (!isSubscribed) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst res = await axios.get(API);\n\t\t\t\tconst { agents } = res.data.data;\n\n\t\t\t\tif (!isSubscribed || !agents || !agents[0]) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetAgent(agents[0]);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(\"error while fetching random agent\", e);\n\t\t\t}\n\t\t}\n\t\tgetAgent();\n\n\t\treturn () => {\n\t\t\tisSubscribed = false;\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport default RandomAgent;\nexport { RandomAgentData };\n","import React from \"react\";\nimport { Wrapper, Container } from \"@components/Grid\";\nimport { Link } from \"react-router-dom\";\nimport { LiftsContainer, SectionLift, SectionLiftContent, SectionLiftPreview } from \"./styles\";\nimport Image from \"@components/Image\";\nimport RandomAgent, { RandomAgentData } from \"@components/RandomAgent\";\nimport { IDocument } from \"@redux/document\";\nimport { getAssetUrl } from \"@utils/index\";\n\nimport AgentImage from \"@components/Agent/AgentImage\";\nimport { AgentCard, AgentCardImage, AgentCardInfo, AgentName, AgentContact, AgentRecommendation } from \"./styles\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\nconst AgentCardSimple = ({ agent }: { agent: IAgent }) => {\n\tif (!agent) {\n\t\treturn null;\n\t}\n\tconst { canonicalPath, degrees, firstName, lastName, name, recommendationPercentage, title } = agent;\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t\t\n\t\t\t\t{firstName && lastName ? `${firstName} ${lastName}` : name}\n\t\t\t\t

\n\t\t\t\t\t{title && {title}}\n\t\t\t\t\t{degrees && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{title ? \", \" : \"\"}\n\t\t\t\t\t\t\t{degrees}\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t

\n\t\t\t\tOta yhteyttä\n\n\t\t\t\t{recommendationPercentage && (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{recommendationPercentage}%\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t
\n\t\t
\n\t);\n};\n\ninterface IProps {\n\tdoc: IDocument;\n\t[key: string]: any;\n}\n\nconst SectionLifts = ({ doc }: IProps) => {\n\tconst { agentCount = null, ashiMaxYear = 2020 } = doc;\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t

Oletko myymässä?

\n\t\t\t\t\t\t\t\t{/*

\n\t\t\t\t\t\t\t\t\tChristoffer ja 79 muuta asuntokaupan ammattilaista palvelevat Sinua{\" \"}\n\t\t\t\t\t\t\t\t\tEspoossa.\n\t\t\t\t\t\t\t\t

*/}\n\t\t\t\t\t\t\t\t{/*

\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{(agent: IAgent) =>\n\t\t\t\t\t\t\t\t\t\t\tagent && {agent.firstName}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t

*/}\n\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\tLöydä itsellesi sopiva kiinteistönvälittäjä Kiinteistömaailman lähes 600 asuntokaupan ammattilaisen joukosta.\n\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tKatso kaikki välittäjämme\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{/* \n\t\t\t\t\t\t\t\t\t{(agent: IAgent) => }\n\t\t\t\t\t\t\t\t */}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t

Kiinnostavatko asuntojen hinnat?

\n\t\t\t\t\t\t\t

Katso vuoden {ashiMaxYear} asuntokauppa­tilastot postinumeron tarkkuudella.

\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tTutustu tästä\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n\nexport default SectionLifts;\n","import styled from \"styled-components\";\nimport { textStyles, media, grid, color } from \"@utils/style-utils\";\n\nexport const More = styled.div`\n\tpadding: 50px 0;\n\n\t${media.md`\n\t\tpadding: 70px 0;\n\t`}\n\n\t${media.lg`\n\t\tpadding: 100px 0;\n\t`}\n`;\n\nexport const AboutContent = styled.div`\n\tmargin: 0 auto;\n\tmax-width: 896px;\n\ttext-align: center;\n\n\th2 {\n\t\t${textStyles.H1}\n\t}\n\n\tp {\n\t\t${textStyles.PMedium}\n\t}\n`;\n\nexport const CityList = styled.div`\n\tpadding: 30px 0;\n\n\t${media.lg`\n\t\tpadding: 60px 0;\n\t`}\n\n\ta {\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tdisplay: inline-block;\n\t\tline-height: 1.5;\n\t\ttext-decoration: none;\n\t\ttransition: color 150ms;\n\n\t\t&:hover {\n\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t}\n\n\t\t&::after {\n\t\t\tcontent: \",\";\n\t\t\tmargin-right: 5px;\n\t\t}\n\n\t\t&:last-of-type::after {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n`;\n\nexport const Columns = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin-bottom: 40px;\n\n\t${media.lg`\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t`}\n`;\n\nexport const Column = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-basis: 100%;\n\n\t${media.lg`\n\t\tflex-basis: calc((100% - ${grid.gutter}px) / 2);\n\t`}\n\n\tp {\n\t\t${textStyles.PSmall}\n\t}\n\n\ta {\n\t\t${textStyles.AInline}\n\t}\n\n\th4 + p {\n\t\tmargin-top: 0;\n\t}\n`;\n","import React, { useState } from \"react\";\nimport { Container } from \"@components/Grid\";\nimport TextButton from \"@components/Buttons/TextButton\";\nimport { Link } from \"react-router-dom\";\n\nimport { More, AboutContent, CityList, Columns, Column } from \"./styles\";\n\nconst toArray = obj => Object.keys(obj).map((key: string) => ({ ...obj[key] }));\nconst flatten = (arrayOfArrays: any[]) => [].concat(...arrayOfArrays);\n\nconst MoreAboutKm = ({ cityList }) => {\n\tconst [expanded, setExpanded] = useState(false);\n\tconst arrayOfCityObjects = cityList ? toArray(cityList).map(toArray) : [];\n\tconst cities = flatten(arrayOfCityObjects);\n\n\tconst toggle = () => {\n\t\tsetExpanded(!expanded);\n\t};\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t

Kiinteistönvälitys yli 100 myymälän voimin varmistaa paikallistuntemuksen!

\n\t\t\t\t\t

Oletko myymässä tai ostamassa asuntoa?

\n\t\t\t\t\t

\n\t\t\t\t\t\tAnna meidän auttaa! Yli sadan myymälän verkosto varmistaa, että kiinteistönvälityksessä meillä\n\t\t\t\t\t\ton erinomainen paikallistuntemus.\n\t\t\t\t\t

\n\t\t\t\t
\n\n\t\t\t\t
\n\t\t\t\t\t{cities && cities.length > 0 && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{cities.map(({ name, urls }, idx) => (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t

Miten kiinteistönvälitys kauttamme tapahtuu?

\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\tOlemme valtakunnallinen kiinteistönvälitysketju yli 100 myymälällä. Vankka paikallinen\n\t\t\t\t\t\t\t\tosaaminen varmistaa sen, että meiltä saa tarkan tiedon eri alueiden ja asuntojen\n\t\t\t\t\t\t\t\thintatasosta.\n\t\t\t\t\t\t\t

\n\n\t\t\t\t\t\t\t

Oletko myyjä?

\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\tKaikki alkaa sopivan kiinteistönvälittäjän valitsemisesta. Yhteistyö alkaa\n\t\t\t\t\t\t\t\tensitapaamisella. Muodostamme kanssasi asuntosi hinta-arvion ja keskustelemme sinulle\n\t\t\t\t\t\t\t\ttärkeistä kodinvaihdon asioista. Käytämme arvioinnissa paitsi omaa tietämystä, myös\n\t\t\t\t\t\t\t\tsinun tietoja asunto-osakeyhtiöstä ja muista keskeisistä asuntoosi liittyvistä asioista.\n\t\t\t\t\t\t\t\tLisäksi tiedossamme ovat toteutuneet ja avoinna olevat asuntokaupat alueellasi juuri\n\t\t\t\t\t\t\t\tsillä hetkellä. Näppärää, eikö?\n\t\t\t\t\t\t\t

\n\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\tSamalla laadimme sinulle oman myynti- ja markkinointisuunnitelman. Verkkopalvelumme on\n\t\t\t\t\t\t\t\tSuomen kolmanneksi suurin asuntoportaali, jossa käy kuukausittain satoja tuhansia\n\t\t\t\t\t\t\t\tasunnon etsijöitä. Yhtenä monista markkinoinnin keinoista on asuntovideot, jonka\n\t\t\t\t\t\t\t\thalutessasi teemme asunnosta: asuntovideoitamme katsotaan yli neljännesmiljoona kertaa\n\t\t\t\t\t\t\t\tjoka kuukausi. Tämä varmistaa, että saat entistä laadukkaampia ostajakandidaatteja\n\t\t\t\t\t\t\t\ttutustumaan asuntoosi.\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t

Miten valitsen itselleni sopivan kiinteistönvälityksen ammattilaisen?

\n\t\t\t\t\t\t\t

Kun valitset kiinteistönvälittäjää, kannattaa miettiä:

\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\t\t\tKeneltä saat perustellun asunnon hinta-arvion?\n\t\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\t\t\tKenellä on ajan tasalla olevat tiedot asuntojen ja kiinteistöjen hintakehityksestä\n\t\t\t\t\t\t\t\t\talueellasi?\n\t\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\t\t
  • Onko välittäjällä kokemusta omasi kaltaisen asunnon myynnistä?
  • \n\t\t\t\t\t\t\t\t
  • Saatko räätälöidyn myynti- ja markkinointisuunnitelman?
  • \n\t\t\t\t\t\t\t\t
  • Millaista käytännön apua saat?
  • \n\t\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\t

Kiinteistönvälitys koko ketjun ammattilaisten voimin

\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\tMeiltä saat avuksesi oman välittäjän. Oman\n\t\t\t\t\t\t\t\tvälittäjän tukena on aina Kiinteistömaailman paikallinen yrittäjä. Lisäksi saat asuntosi\n\t\t\t\t\t\t\t\tmyyntiin maan laajimman ja tehokkaimman kiinteistönvälityksen verkoston: noin 700\n\t\t\t\t\t\t\t\tvälittäjäämme eri puolilla Suomea. Joskus asunnon ostaja löytyykin toiselta\n\t\t\t\t\t\t\t\tpaikkakunnalta. Lisäksi tietokannassamme on valmiina tuhansia ostaja-asiakkaita, jotka\n\t\t\t\t\t\t\t\tsaavat tiedon uusista myyntiin tulevista asunnoista.Muista myös, että käytät alan\n\t\t\t\t\t\t\t\tammattilaisia. Kiinteistönvälityksessä tunnet ne lyhenteistä LKV ja LVV. LKV on\n\t\t\t\t\t\t\t\tlaillistettu kiinteistönvälittäjä ja LVV tarkoittaa vuokra-asunnon välittäjää.\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\t\t\n\t\t\t\t\t

\n\t\t\t\t\t\t{expanded ? \"Näytä vähemmän\" : \"Lue lisää\"}\n\t\t\t\t\t

\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n\nexport default MoreAboutKm;\n","import styled, { css } from \"styled-components\";\nimport { color, fontFamily, media, textStyles } from \"@utils/style-utils\";\nimport CtaButton from \"@components/Buttons/CtaButton\";\n\nexport const SearchBlockContainer = styled.div`\n\t${media.lgx`\n\t\tdisplay: flex;\n\t\tflex-direction: row\n\t\tjustify-content: space-between;\n\t`}\n`;\n\nexport const SearchBlockSelections = styled.div`\n\tflex-basis: 100%;\n\n\t${media.lgx`\n\t\tflex-basis: calc(100% - 101px);\n\t`}\n`;\n\nexport const SearchButton = styled(CtaButton)`\n\tfont-size: 20px;\n\twidth: 100%;\n\n\t${media.md`\n\t\twidth: 317px;\n\t`}\n\n\t${media.lgx`\n\t\talign-items: center;\n\t\tdisplay: flex;\n\t\theight: 100%;\n\t\tjustify-content: center;\n\t\twidth: 77px;\n\t`}\n\n\tsvg {\n\t\tmax-width: 32px;\n\t}\n`;\n\nexport const SearchButtonContainer = styled.div`\n\t${media.md`\n\t\tborder-top: 1px solid ${color(\"grey\", 5)};\n\t\tdisplay: flex;\n\t\tjustify-content: flex-end;\n\t\tmargin-top: 24px;\n\t\tpadding-top: 24px;\n\t`}\n\n\t${media.lgx`\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t`}\n`;\n\nexport const SearchBlockHeader = styled.div`\n\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin-bottom: 26px;\n\tpadding-bottom: 30px;\n\n\t${media.md`\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t`}\n`;\n\nexport const RentalSelect = styled.div`\n\tdisplay: flex;\n\tmargin-bottom: 15px;\n\n\t${media.md`\n\t\tmargin-bottom: 0;\n\t\tmargin-right: 30px;\n\t`}\n`;\n\nexport const RadioSelector = styled.button`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tborder: 0;\n\tbackground: rgba(255, 255, 255, 0);\n\tcolor: ${color(\"grey\", 2)};\n\tcursor: pointer;\n\tfont-family: ${fontFamily.base};\n\tfont-size: 14px;\n\tfont-weight: 500;\n\toutline: 0;\n\tpadding: 0;\n\tposition: relative;\n\ttransition: color 200ms;\n\n\t${media.md`\n\t\tfont-size: 17px;\n\t`}\n\n\tspan {\n\t\tborder-radius: 50%;\n\t\tborder: 1px solid ${color(\"grey\", 5)};\n\t\tdisplay: inline-block;\n\t\theight: 24px;\n\t\tleft: 0;\n\t\tmargin-right: 7px;\n\t\ttop: 0;\n\t\ttransition: border-color 200ms;\n\t\tposition: relative;\n\t\tvertical-align: middle;\n\t\twidth: 24px;\n\n\t\t${media.md`\n\t\t\theight: 26px;\n\t\t\tmargin-right: 10px;\n\t\t\twidth: 26px;\n\t\t`}\n\n\t\t&::after {\n\t\t\tbackground: ${color(\"greenBright\", 1)};\n\t\t\tborder-radius: 50%;\n\t\t\tcontent: \"\";\n\t\t\tdisplay: block;\n\t\t\theight: 14px;\n\t\t\tleft: 50%;\n\t\t\topacity: 0;\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\ttransform: translate(-50%, -50%);\n\t\t\ttransition: opacity 200ms;\n\t\t\twidth: 14px;\n\n\t\t\t${media.md`\n\t\t\t\theight: 16px;\n\t\t\t\twidth: 16px;\n\t\t\t`}\n\t\t}\n\t}\n\n\t&:hover {\n\t\tspan::after {\n\t\t\topacity: 0.5;\n\t\t}\n\t}\n\n\t&:first-of-type {\n\t\tmargin-right: 15px;\n\n\t\t${media.sm`\n\t\t\tmargin-right: 30px;\n\t\t`}\n\n\t\t${media.md`\n\t\t\tmargin-right: 45px;\n\t\t`}\n\t}\n\n\t${props =>\n\t\tprops.selected &&\n\t\tcss`\n\t\t\tcolor: ${color(\"grey\", 1)};\n\n\t\t\tspan {\n\t\t\t\tborder-color: ${color(\"greenBright\", 1)};\n\t\t\t}\n\n\t\t\t&:hover span::after,\n\t\t\tspan::after {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t`}\n`;\n\nexport const Group = styled.div.attrs(props => ({\n\tclassName: `group ${props.name}`,\n}))`\n\talign-items: center;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin-bottom: 16px;\n\n\t${media.md`\n\t\tdisplay: inline-flex;\n\t\tflex-direction: row;\n\t\tmargin-bottom: 30px;\n\t`};\n\n\t&.address-search {\n\t\tflex-basis: 100%;\n\n\t\t.search-input {\n\t\t\twidth: 100%;\n\n\t\t\tinput {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\n\t\t${media.md`\n\t\t\tflex-basis: 50%;\n\t\t\tmargin-right: 2%;\n\t\t`};\n\n\t\t${media.lgx`\n\t\t\tflex-basis: 25.72%;\n\t\t\tmargin-right: unset;\n\n\t\t\t.search-input input {\n\t\t\t\twidth: 306px;\n\t\t\t}\n\t\t`};\n\t}\n\n\t&.rooms {\n\t\t.group-title {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t${media.md`\n\t\t\tflex-basis: 49%;\n\t\t\t.group-title {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t`};\n\n\t\t${media.lgx`\n\t\t\tflex-basis: 33.75%;\n\t\t`};\n\t}\n\n\t&.housetype {\n\t\t.group-title {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t${media.md`\n\t\t\tflex-basis: 49%;\n\t\t\t.group-title {\n\t\t\t\tdisplay: block;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\twidth: unset;\n\t\t\t}\n\t\t`};\n\n\t\t${media.lgx`\n\t\t\tflex-basis: 31.07%;\n\t\t\t.group-title {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t`};\n\n\t\t> div,\n\t\t> div button {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\tbutton {\n\t\t\t&:active {\n\t\t\t\ttransform: none;\n\t\t\t}\n\n\t\t\t> span {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\n\t\t\t\t.icon {\n\t\t\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.dropdown-select-content {\n\t\t\tmin-width: 100%;\n\t\t\ttop: 100%;\n\t\t}\n\n\t\t.selections {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\t&.spacer {\n\t\tflex-grow: 1;\n\t\t${media.md`\n\t\t\tdisplay: none;\n\t\t`};\n\t\t${media.lgx`\n\t\t\tdisplay: block;\n\t\t`};\n\t}\n\n\t&.price,\n\t&.area {\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\n\t\t${media.md`\n\t\t\tflex-basis: 49%;\n\t\t`};\n\t\t${media.lgx`\n\t\t\tflex-basis: unset;\n\t\t`};\n\n\t\t.group-title {\n\t\t\tmargin-right: 4px;\n\n\t\t\t@media (max-width: 767px) {\n\t\t\t\tflex-basis: 100%;\n\t\t\t\tmargin-bottom: 5px;\n\t\t\t\tmargin-right: 0;\n\t\t\t}\n\t\t}\n\n\t\tinput {\n\t\t\tmargin: 0 9px;\n\t\t\twidth: 78px;\n\n\t\t\t${media.md`\n\t\t\t\twidth: 83px;\n\t\t\t`};\n\t\t}\n\n\t\t@media (max-width: 1023px) {\n\t\t\t.group-title + .form-group {\n\t\t\t\tinput {\n\t\t\t\t\tmargin-left: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&.price {\n\t\t${media.lgx`\n\t\t\tmargin-right: 56px;\n\t\t`};\n\t}\n\n\t&.build-year {\n\t\tinput {\n\t\t\twidth: 85px;\n\t\t}\n\t}\n\n\t.multi-button-select {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\twidth: 100%;\n\n\t\t.selection-button {\n\t\t\tflex-grow: 1;\n\t\t\tpadding-left: 8px;\n\t\t\tmargin-right: -1px;\n\t\t\tpadding-right: 8px;\n\t\t}\n\t}\n\n\t&.rooms,\n\t&.build-year,\n\t&.new-construction,\n\t&.condition,\n\t&.features,\n\t&.value-listing,\n\t&.housetype {\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\n\t\t@media screen and (min-width: 1024px) {\n\t\t\tflex-wrap: nowrap;\n\t\t}\n\t}\n\n\t&.build-year {\n\t\t${media.md`\n\t\t\tflex-wrap: none;\n\t\t\tflex-basis: 49%;\n\t\t`};\n\t}\n\n\t&.new-construction, &.value-listing {\n\t\t${media.md`\n\t\t\tflex-basis: 49%;\n\t\t`};\n\t}\n\n\t&.new-construction + &.spacer, &.value-listing + &.spacer {\n\t\tdisplay: none;\n\t\t${media.xl`\n\t\t\tdisplay: inline-flex;\n\t\t`};\n\t}\n\n\t&.condition {\n\t\t${media.md`\n\t\t\tflex-basis: 100%;\n\t\t`};\n\n\t\t${media.xxl`\n\t\t\tflex-basis: unset;\n\t\t\tmargin-right: 56px;\n\t\t`};\n\t}\n\n\t&.features {\n\t\t${media.md`\n\t\t\tflex-basis: 100%;\n\t\t`};\n\n\t\t${media.xxl`\n\t\t\tflex-basis: unset;\n\t\t`};\n\t}\n`;\n\nexport const GroupTitle = styled.div.attrs(props => ({\n\tclassName: \"group-title\",\n}))`\n\tfont-weight: 500;\n\tflex-basis: 100%;\n\tmargin-bottom: 12px;\n\n\t@media screen and (min-width: 1024px) {\n\t\tflex-basis: unset;\n\t\tmargin-bottom: unset;\n\t\tmargin-right: 13px;\n\t}\n`;\n\nexport const MainSelections = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-wrap: wrap;\n\n\t${media.md`\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t`};\n`;\n\nexport const SearchBlockFooter = styled.div`\n\tborder-top: 1px solid ${color(\"grey\", 5)};\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding-top: 30px;\n\tpadding-bottom: 30px;\n\n\t${media.md`\n\t\tflex-direction: row;\n\t\tpadding-bottom:0;\n\t`};\n`;\n\nexport const ExtraSelections = styled.div`\n\tborder-top: 1px solid ${color(\"grey\", 5)};\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-wrap: wrap;\n\tmargin-bottom: 30px;\n\tpadding-top: 30px;\n\tjustify-content: space-between;\n\n\t${media.md`\n\t\tflex-direction: row;\n\t`};\n\n\t.condition {\n\t\t.multi-button-select {\n\t\t\tdisplay: flex;\n\t\t\tflex-grow: 1;\n\t\t\tflex-wrap: wrap;\n\t\t\twidth: 100%;\n\n\t\t\t.selection-button {\n\t\t\t\tflex-grow: 1;\n\t\t\t\tflex-basis: 33%;\n\t\t\t\tpadding-left: 8px;\n\t\t\t\tmargin-right: -1px;\n\t\t\t\tpadding-right: 8px;\n\t\t\t\tmargin-top: 8px;\n\n\t\t\t\t&:nth-of-type(1) {\n\t\t\t\t\tborder-bottom-left-radius: 4px;\n\t\t\t\t\tborder-top-left-radius: 4px;\n\t\t\t\t}\n\n\t\t\t\t&:nth-of-type(3) {\n\t\t\t\t\tborder-bottom-right-radius: 4px;\n\t\t\t\t\tborder-top-right-radius: 4px;\n\t\t\t\t}\n\n\t\t\t\t${media.sm`\n\t\t\t\t\tflex-basis: unset;\n\t\t\t\t\tmargin-top: 0;\n\t\t\t\t`};\n\t\t\t}\n\t\t}\n\t}\n\n\t.features {\n\t\t.multi-button-select {\n\t\t\tdisplay: flex;\n\t\t\tflex-grow: 1;\n\t\t\tflex-wrap: wrap;\n\t\t\twidth: 100%;\n\n\t\t\t.selection-button {\n\t\t\t\tflex-grow: 1;\n\t\t\t\tpadding-left: 8px;\n\t\t\t\tmargin-right: -1px;\n\t\t\t\tpadding-right: 8px;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tflex-basis: 50%;\n\t\t\t\t&:nth-of-type(2),\n\t\t\t\t&:nth-of-type(4),\n\t\t\t\t&:nth-of-type(6) {\n\t\t\t\t\tborder-bottom-right-radius: 4px;\n\t\t\t\t\tborder-top-right-radius: 4px;\n\t\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\t}\n\n\t\t\t\t&:nth-of-type(3),\n\t\t\t\t&:nth-of-type(5) {\n\t\t\t\t\tborder-bottom-left-radius: 4px;\n\t\t\t\t\tborder-top-left-radius: 4px;\n\t\t\t\t}\n\n\t\t\t\t&:nth-of-type(6) {\n\t\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\t}\n\n\t\t\t\t${media.md`\n\t\t\t\t\tmargin-top: 0;\n\t\t\t\t\tflex-basis: unset;\n\t\t\t\t\t&:nth-of-type(1) {\n\t\t\t\t\t\tborder-bottom-left-radius: 4px;\n\t\t\t\t\t\tborder-top-left-radius: 4px;\n\t\t\t\t\t}\n\n\t\t\t\t\t&:nth-of-type(6) {\n\t\t\t\t\t\tborder-bottom-left-radius: 4px;\n\t\t\t\t\t\tborder-top-left-radius: 4px;\n\t\t\t\t\t}\n\t\t\t\t`};\n\t\t\t}\n\t\t}\n\t}\n`;\n\nconst ButtonBase = styled.button`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tbackground: rgba(255, 255, 255, 0);\n\tborder: 0;\n\tcursor: pointer;\n\toutline: 0;\n`;\n\nexport const ExtraToggle = styled(ButtonBase)`\n\t${textStyles.PSmall};\n\tborder-radius: 4px;\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tcolor: ${color(\"greenBright\", 1)};\n\tfont-family: ${fontFamily.base};\n\tmargin-bottom: 20px;\n\tmargin-right: 0;\n\tpadding: 9px 14px 8px;\n\ttransition: color 150ms, border-color 150ms;\n\talign-items: center;\n\tdisplay: flex;\n\tjustify-content: center;\n\tline-height: 1;\n\n\t&:hover {\n\t\tcolor: ${color(\"greenBright\", 2)};\n\t}\n\n\t&.has-selections {\n\t\tborder-color: ${color(\"greenBright\", 1)};\n\t}\n\n\tspan {\n\t\tfont-size: 22px;\n\t\tdisplay: inline-block;\n\t\tmargin-left: 7px;\n\t\tvertical-align: middle;\n\n\t\tsvg {\n\t\t\tmax-width: 22px;\n\t\t}\n\t}\n\n\t${media.md`\n\t\tmargin-bottom: 0;\n\t\tmargin-right: 55px;\n\t`};\n`;\n\nexport const EmptySelections = styled(ButtonBase)`\n\tcolor: ${color(\"greenDark\", 1)};\n\tfont-family: ${fontFamily.condensed};\n\tfont-size: 16px;\n\n\t&:hover {\n\t\tcolor: ${color(\"greenDark\", 2)};\n\t\ttext-decoration: underline;\n\t}\n`;\n","import React, { useState, useRef, useEffect } from \"react\";\nimport includes from \"lodash-es/includes\";\nimport { IApartmentSearch } from \"@redux/apartment-search\";\nimport { ISelection } from \"@utils/apartment-search/selections\";\n\nimport ApartmentSearch, { ApartmentSearchConsumer } from \"@components/Search/ApartmentSearch\";\nimport MultiButtonSelect from \"@components/Form/MultiButtonSelect\";\nimport AddressSearch from \"@components/Search/AddressSearch\";\nimport PropertyKeySearch from \"@components/Search/PropertyKeySearch\";\n\nimport debounce from \"lodash-es/debounce\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\nimport { withRouter } from \"react-router-dom\";\n\nimport {\n\tExtraSelections,\n\tGroup,\n\tGroupTitle,\n\tMainSelections,\n\tRadioSelector,\n\tRentalSelect,\n\tSearchBlockContainer,\n\tSearchBlockFooter,\n\tSearchBlockHeader,\n\tSearchBlockSelections,\n\tSearchButton,\n\tSearchButtonContainer,\n\tExtraToggle,\n\tEmptySelections,\n} from \"./styles\";\nimport Dropdown from \"@components/DropdownSelect\";\nimport CheckboxSelect from \"@components/CheckboxSelect\";\nimport PriceRange from \"@components/Search/ApartmentSearch/PriceRange\";\nimport AreaRange from \"@components/Search/ApartmentSearch/AreaRange\";\nimport YearRange from \"@components/Search/ApartmentSearch/YearRange\";\nimport clsx from \"clsx\";\n\ninterface IProps {\n\taddAddresses?: (addresses: any) => void;\n\taddCondition?: (condition: ISelection) => void;\n\taddConstraint?: (field: string, value: any) => void;\n\taddFeatures?: (feature: ISelection) => void;\n\taddSelection?: (field: string, selection: any, single?: boolean) => void;\n\tapartmentSearch?: IApartmentSearch;\n\tresetSelections?: () => void;\n\tsetRental?: (isRental: boolean) => void;\n\t[key: string]: any;\n}\n\nconst ApartmentSearchBlock = withRouter((props: IProps) => {\n\tconst ref = useRef(null);\n\tconst addressRef = useRef(null);\n\tconst [extraOpen, setExtraOpen] = useState(false);\n\tconst [submitting, setSubmitting] = useState(false);\n\tconst { itemsWithSelections, apartmentSearch } = props;\n\tconst { rental, selections } = apartmentSearch;\n\n\tconst toggleExtras = () => {\n\t\tsetExtraOpen(isOpen => !isOpen);\n\t};\n\n\tconst handleInputChange = debounce((field: string, value: any) => {\n\t\tif (includes([\"minPrice\", \"maxPrice\"], field)) {\n\t\t\tfield = field.replace(\"Price\", \"\");\n\t\t\tif (!rental) {\n\t\t\t\tvalue = value ? parseInt(value, 10) * 1000 : null;\n\t\t\t}\n\t\t}\n\t\tprops.addConstraint(field, value);\n\t}, 450);\n\n\tconst doReset = () => {\n\t\tif (addressRef.current && addressRef.current.reset) {\n\t\t\taddressRef.current.reset();\n\t\t}\n\n\t\tprops.resetSelections();\n\t};\n\n\tconst doSearch = () => {\n\t\tsetSubmitting(true);\n\n\t\tsetTimeout(() => {\n\t\t\tsetSubmitting(false);\n\t\t\tdocument.body.classList.remove(\"loaded\");\n\t\t\tdocument.body.classList.add(\"load-start\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tprops.history.push(\"/haku\");\n\t\t\t}, 300);\n\t\t}, 500);\n\t};\n\n\tconst {\n\t\tconditions: selectableConditions,\n\t\tfeatures: selectableFeatures,\n\t\thouseTypes: selectableHouseTypes,\n\t\tnewConstruction: selectableNewConstruction,\n\t\trooms: selectableRooms,\n\t\tvalueListing: selectableValueListing,\n\t} = selections;\n\n\tconst housetypeButtonText = () => {\n\t\tconst selected = selectableHouseTypes.filter(type => type.selected) || [];\n\t\treturn selected.length > 0 ? `Asuntotyyppi (${selected.length})` : \"Kaikki asuntotyypit\";\n\t};\n\n\tuseEffect(() => {\n\t\tif (props.init) {\n\t\t\tprops.init();\n\t\t}\n\t}, []);\n\n\tconst extras = [\"year\", \"newConstruction\", \"conditions\", \"features\"];\n\n\tconst hasSelectionsFromExtras = () => {\n\t\tlet has = false;\n\t\tfor (const item of extras) {\n\t\t\tif (itemsWithSelections && itemsWithSelections[item]) {\n\t\t\t\thas = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn has;\n\t};\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t props.setRental(false)}>\n\t\t\t\t\t\t\t Myyntikohteet\n\t\t\t\t\t\t\n\t\t\t\t\t\t props.setRental(true)}>\n\t\t\t\t\t\t\t Vuokrakohteet\n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t props.addAddresses(e)} ref={addressRef} />\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\tHuoneita\n\t\t\t\t\t\t props.addSelection(\"rooms\", room)}\n\t\t\t\t\t\t\tuseRedux={true}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\tValitse asuntotyyppi\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{housetypeButtonText()}{\" \"}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t props.addSelection(\"houseTypes\", type)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\t{rental ? \"Vuokra\" : \"Hinta\"}\n\t\t\t\t\t\t handleInputChange(f, v)} />\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\tPinta-ala\n\t\t\t\t\t\t handleInputChange(f, v)} />\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tRakennusvuosi\n\t\t\t\t\t\t handleInputChange(f, v)} />\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tUudiskohde\n\t\t\t\t\t\t props.addSelection(\"newConstruction\", e, true)}\n\t\t\t\t\t\t\tuseRedux={true}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tArvokohde\n\t\t\t\t\t\t props.addSelection(\"valueListing\", e, true)}\n\t\t\t\t\t\t\tuseRedux={true}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tKunto\n\t\t\t\t\t\t props.addSelection(\"conditions\", e)}\n\t\t\t\t\t\t\tuseRedux={true}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tOminaisuudet\n\t\t\t\t\t\t props.addSelection(\"features\", e)}\n\t\t\t\t\t\t\tuseRedux={true}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{!extraOpen ? \"Lisää hakuehtoja\" : \"Vähemmän hakuehtoja\"}\n\t\t\t\t\t\t{!extraOpen ? : }\n\t\t\t\t\t\n\t\t\t\t\tTyhjennä valinnat\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n});\n\nconst ApartmentSearchBlockWrapper = () => {\n\treturn (\n\t\t\n\t\t\t{({ ...props }) => }\n\t\t\n\t);\n};\n\nexport default ApartmentSearchBlockWrapper;\n","import styled, { keyframes } from \"styled-components\";\nimport { color, textStyles, grid, buttons, media, fontFamily } from \"@utils/style-utils\";\n\nexport const Columns = styled.div`\n\tdisplay: flex;\n\t/* flex-direction: row; */\n\tflex-wrap: wrap;\n\tjustify-content: space-between;\n\toverflow: hidden;\n\tposition: relative;\n\twidth: 100%;\n\n\t${media.lgx`\n\t\tpadding-left: calc(43.5% + (${grid.gutter}px));\n\t`}\n`;\n\nexport const MapContainer = styled.div`\n\tdisplay: none;\n\n\t${media.smd`\n\t\tdisplay: block;\n\t\tmargin-left: auto;\n\t\tposition: relative;\n\t\twidth: 50%;\n\t`}\n\n\t${media.lgx`\n\t\theight: 100%;\n\t\tleft: 0;\n\t\tmargin-left: 0;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\twidth: 43.5%;\n\t`}\n\n\t> div {\n\t\theight: 100%;\n\t\twidth: 100%;\n\t}\n`;\n\nexport const AgencyMapContainer = styled.div.attrs(props => ({\n\tclassName: \"agency-map\",\n\tid: \"agency-map\",\n}))`\n\tbackground: ${color(\"grey\", 6)};\n\tborder: 1px solid ${color(\"grey\", 5)};\n\theight: 100%;\n\toverflow: hidden;\n\tposition: relative;\n\tpadding-bottom: 95%;\n\twidth: 100%;\n\n\t${media.lgx`\n\t\tpadding-bottom: 0;\n\t`}\n`;\n\nconst pulse = keyframes`\n\t0%, 100% {\n\t\topacity: 1;\n\t}\n\t50% {\n\t\topacity: 0.5;\n\t}\n`;\n\nexport const AgencyMapLoader = styled.div`\n\tanimation: ${pulse} 1s linear infinite;\n\tbackground: ${color(\"grey\", 7)};\n\theight: 100%;\n\tleft: 0;\n\tposition: absolute;\n\ttop: 0;\n\twidth: 100%;\n`;\n\nexport const AgencyMapInfo = styled.div`\n\tbackground: ${color(\"white\")};\n\tdisplay: flex;\n\tflex-direction: column;\n\theight: 100%;\n\tpadding: 20px 15px 15px;\n\tposition: absolute;\n\twidth: 80%;\n\tz-index: 99;\n\n\t${media.lg`\n\t\tpadding: 40px 25px 20px;\n\t\twidth: 55%;\n\t`}\n\n\th3 {\n\t\tflex-grow: 1;\n\t\tfont-size: 15px;\n\t\tfont-weight: 500;\n\t\tmargin: 0 0 15px;\n\n\t\t${media.lg`\n\t\t\tfont-size: 17px;\n\t\t`}\n\t}\n\n\tp {\n\t\tflex-grow: 2;\n\t\tfont-size: 14px;\n\t\tmargin: 0 0 30px;\n\t}\n\n\tbutton {\n\t\t${buttons.textLinkPrimary}\n\t\tbottom: 15px;\n\t\tposition: absolute;\n\t\tright: 15px;\n\n\t\t${media.lg`\n\t\t\tbottom: 20px;\n\t\t\tright: 25px;\n\t\t`}\n\n\t\t&::after {\n\t\t\topacity: 0;\n\t\t\ttransform: translateX(-5px);\n\t\t}\n\n\t\t&:hover::after {\n\t\t\topacity: 1;\n\t\t\ttransform: translateX(0);\n\t\t}\n\t}\n`;\n\nexport const SearchArea = styled.div`\n\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-wrap: wrap;\n\torder: -1;\n\tleft: 0;\n\t/* padding-right: 40px; */\n\t/* position: absolute; */\n\ttop: 0;\n\twidth: 100%;\n\n\t${media.smd`\n\t\twidth: calc(50% - 40px);\n\t`}\n\n\t${media.lgx`\n\t\talign-items: center;\n\t\tborder-bottom: 0;\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t`}\n`;\n\nexport const CarouselArea = styled.div`\n\tpadding-top: 35px;\n\twidth: 100%;\n\n\t${media.lgx`\n\t\tpadding-top: 0;\n\t`}\n\n\t.swiper-slide {\n\t\theight: auto;\n\t}\n\n\t.swiper-button-next,\n\t.swiper-button-prev {\n\t\tdisplay: none !important;\n\t}\n\n\t.agency-carousel {\n\t\tborder-right: 1px solid ${color(\"grey\", 5)};\n\t\tpadding-top: 10px;\n\t}\n\n\t.flash-active {\n\t\t.swiper-slide-active {\n\t\t\t> div {\n\t\t\t\tbackground-color: ${color(\"greenBright\", 4)};\n\t\t\t\ttransition: background-color 300ms;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const SpecificSearch = styled.button`\n\t${buttons.textLinkWithColor(color(\"beige\", 1), color(\"beige\", 2))}\n\n\t@media (max-width: 1119px) {\n\t\tmargin-bottom: 24px;\n\t\torder: 10;\n\t}\n`;\n\nexport const PostcodeSearch = styled.form`\n\tdisplay: flex;\n\n\tinput {\n\t\tmargin-right: 10px;\n\t}\n\n\tbutton {\n\t\t${buttons.textLinkPrimary}\n\n\t\t&::after {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&[disabled] {\n\t\t\tpointer-events: none;\n\t\t\topacity: 0.5;\n\t\t}\n\t}\n`;\n\nexport const AgencyBlock = styled.div`\n\tborder: 1px solid ${color(\"greenDark\", 4)};\n\tborder-radius: 4px;\n\tdisplay: flex;\n\tflex-direction: column;\n\theight: 100%;\n\tpadding: 24px;\n\ttransition: background-color 800ms;\n`;\n\nexport const AgencyTitle = styled.h4`\n\t${textStyles.MicroText}\n\tcolor: ${color(\"greenBright\", 1)};\n\tfont-weight: bold;\n\tmargin: 0 0 4px;\n\n\ta {\n\t\tcolor: inherit;\n\t\ttext-decoration: none;\n\n\t\t&:hover {\n\t\t\tcolor: ${color(\"greenBright\", 2)};\n\t\t\ttext-decoration: underline;\n\t\t}\n\t}\n`;\n\nexport const AgencyAddress = styled.p`\n\t${textStyles.MicroText}\n\tcolor: ${color(\"grey\", 2)};\n\tflex-grow: 1;\n\tmargin: 0 0 14px;\n`;\n\nexport const AgencyContact = styled.div`\n\tp {\n\t\t${textStyles.MicroText}\n\t\tmargin: 0 0 4px;\n\n\t\t&:last-of-type {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n\n\ta {\n\t\tcolor: ${color(\"grey\", 2)};\n\t\ttext-decoration: none;\n\n\t\t&:hover {\n\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t}\n\t}\n\n\t.email {\n\t\tspan {\n\t\t\t@media (max-width: 1360px) {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\n\t\t&.long-email {\n\t\t\tspan {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const QuickLinks = styled.div`\n\tmargin-bottom: 20px;\n\tmargin-top: 30px;\n\tflex-grow: 1;\n\n\t${media.lgx`\n\t\tflex-grow: 0;\n\t`}\n\n\tbutton {\n\t\t-webkit-appearance: none;\n\t\t-moz-appearance: none;\n\t\tbackground: rgba(255, 255, 255, 0);\n\t\tborder: 0;\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tcursor: pointer;\n\t\tfont-family: ${fontFamily.condensed};\n\t\tfont-size: 16px;\n\t\tmargin-right: 10px;\n\t\toutline: 0;\n\t\tpadding: 10px 10px 10px 0;\n\t\ttransition: color 150ms;\n\n\t\t&::after {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&:hover {\n\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t}\n\t}\n`;\n","import React, { forwardRef } from \"react\";\nimport { Swiper, Slide } from \"react-dynamic-swiper\";\n\nimport Phone from \"@components/Info/Phone\";\nimport Email from \"@components/Info/Email\";\n\nimport { Link } from \"react-router-dom\";\n\nimport { AgencyBlock, AgencyTitle, AgencyAddress, AgencyContact } from \"./styles\";\n\ninterface IProps {\n\tagencies: IAgency[];\n}\n\nconst swiperConfig = {\n\tbreakpoints: {\n\t\t320: {\n\t\t\tslidesPerView: 1,\n\t\t\tspaceBetween: 10,\n\t\t},\n\t\t650: {\n\t\t\tslidesPerView: 1.2,\n\t\t\tspaceBetween: 10,\n\t\t},\n\t\t768: {\n\t\t\tslidesPerView: 1.5,\n\t\t\tspaceBetween: 10,\n\t\t},\n\t\t1120: {\n\t\t\tslidesPerView: 2.4,\n\t\t\tspaceBetween: 10,\n\t\t},\n\t\t1360: {\n\t\t\tslidesPerView: 1.9,\n\t\t\tspaceBetween: 10,\n\t\t},\n\t},\n\tfreeMode: true,\n\tgrabCursor: true,\n\tloop: true,\n\tmousewheel: true,\n\tpagination: false,\n\tslidesPerView: 2.3,\n\tspaceBetween: 10,\n};\n\nconst AgencyCarousel = forwardRef(({ agencies }: IProps, ref) => {\n\tif (!agencies || agencies.length <= 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t\n\t\t\t{agencies.map(\n\t\t\t\t({\n\t\t\t\t\taddress,\n\t\t\t\t\tcity,\n\t\t\t\t\tcompanyName,\n\t\t\t\t\temail,\n\t\t\t\t\tkey,\n\t\t\t\t\tmarketingName,\n\t\t\t\t\tphone,\n\t\t\t\t\tpostcode,\n\t\t\t\t\ttelPhone,\n\t\t\t\t\turl,\n\t\t\t\t}: IAgency) => (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{marketingName ? `Kiinteistömaailma ${marketingName}` : companyName}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{address}, {postcode}, {city}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{phone && (\n\t\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{email && (\n\t\t\t\t\t\t\t\t\t

30 ? \"email long-email\" : \"email\"}>\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t)\n\t\t\t)}\n\t\t
\n\t);\n});\n\nexport default AgencyCarousel;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { Map, Marker, GoogleApiWrapper } from \"google-maps-react\";\nimport { AgencyMapContainer, AgencyMapLoader, AgencyMapInfo } from \"./styles\";\nimport { getAssetUrl } from \"@utils/index\";\n\nconst isDevEnv = process.env.NODE_ENV !== \"production\";\nconst apiKey = isDevEnv ? \"\" : \"AIzaSyB_h_r6Y-l_wPS4lgVmwynh8yxJUoOGzo0\";\nconst centerOfFinland = {\n\tlat: 64.180708,\n\tlng: 25.803222,\n};\n\nconst AgencyMap = props => {\n\tconst { google, markers, onMarkerClicked, forcedBounds } = props;\n\tconst [infoVisible, setInfoVisible] = useState(true);\n\tconst [mapBounds, setMapBounds] = useState(null);\n\tconst mapRef = useRef(null);\n\n\tuseEffect(() => {\n\t\tconst bounds = new google.maps.LatLngBounds();\n\n\t\tif (markers && markers.length > 0) {\n\t\t\tmarkers.forEach(({ lat, lng }) => bounds.extend(new google.maps.LatLng(Number(lat), Number(lng))));\n\t\t\tsetMapBounds(bounds);\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst bounds = new google.maps.LatLngBounds();\n\n\t\tif (forcedBounds && forcedBounds.length > 0) {\n\t\t\tforcedBounds.forEach(({ lat, lng }) => bounds.extend({ lat: Number(lat), lng: Number(lng) }));\n\n\t\t\tif (bounds.getNorthEast && bounds.getSouthWest && bounds.getNorthEast() && bounds.getSouthWest()) {\n\t\t\t\t/* prevent zooming too close on single markers */\n\t\t\t\tif (bounds.getNorthEast().equals(bounds.getSouthWest())) {\n\t\t\t\t\tconst extendPoint1 = new google.maps.LatLng(\n\t\t\t\t\t\tbounds.getNorthEast().lat() + 0.01,\n\t\t\t\t\t\tbounds.getNorthEast().lng() + 0.01\n\t\t\t\t\t);\n\t\t\t\t\tconst extendPoint2 = new google.maps.LatLng(\n\t\t\t\t\t\tbounds.getNorthEast().lat() - 0.01,\n\t\t\t\t\t\tbounds.getNorthEast().lng() - 0.01\n\t\t\t\t\t);\n\t\t\t\t\tbounds.extend(extendPoint1);\n\t\t\t\t\tbounds.extend(extendPoint2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetMapBounds(bounds);\n\t\t}\n\t}, [forcedBounds]);\n\n\tconst onMarkerClick = ({ name: key }: any) => {\n\t\tonMarkerClicked({ key });\n\t};\n\n\treturn (\n\t\t\n\t\t\t{infoVisible && (\n\t\t\t\t\n\t\t\t\t\t

Löydä toimipiste läheltä paikkaa, josta etsit tai myyt asuntoa

\n\t\t\t\t\t

\n\t\t\t\t\t\tHae aluetta postinumerolla tai etsi se kartalta, niin näet lähellä sijaitsevat\n\t\t\t\t\t\tKiinteistömaailman toimipisteet.\n\t\t\t\t\t

\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t)}\n\t\t\t\n\t\t\t\t{markers.map(({ key, lat, lng }) => (\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\n\t\t
\n\t);\n};\n\nexport default GoogleApiWrapper({\n\tLoadingContainer: AgencyMapLoader,\n\tapiKey,\n\tlanguage: \"fi\",\n})(AgencyMap);\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { isValidPostcode } from \"@utils/validators\";\nimport { IDocument } from \"@redux/document\";\nimport TextInput from \"@components/Form/TextInput\";\n\nimport agencySearchService from \"@services/agency-search.service\";\n\nimport { Columns, QuickLinks, PostcodeSearch, SearchArea, SpecificSearch, MapContainer, CarouselArea } from \"./styles\";\nimport AgencyCarousel from \"./agency-carousel\";\nimport AgencyMap from \"./agency-map\";\nimport findIndex from \"lodash-es/findIndex\";\nimport historyTracker from \"@services/history-tracker\";\nimport { Link } from \"react-router-dom\";\n\ninterface IAgencyResponse {\n\tmatches: number;\n\tresults: IDocument[];\n}\n\nconst quickLinks = [\"Helsinki\", \"Espoo\", \"Vantaa\", \"Turku\", \"Tampere\", \"Oulu\", \"Jyväskylä\", \"Kuopio\", \"Lahti\"];\n\nconst AgencySearch = () => {\n\tconst [agencies, setAgencies] = useState([]);\n\tconst [markerPoints, setMarkerPoints] = useState([]);\n\tconst [forcedBounds, setForcedBounds] = useState([]);\n\tconst [isValidForm, setValidForm] = useState(false);\n\n\tconst carouselRef = useRef(null);\n\tconst postcodeRef = useRef(null);\n\n\tlet isRendering: boolean = true;\n\n\tuseEffect(() => {\n\t\t(async function fetchAgencies() {\n\t\t\tconst response = await agencySearchService.fetchAgencies();\n\n\t\t\tconst { results, matches }: IAgencyResponse = response.data;\n\n\t\t\tif (results && matches && isRendering) {\n\t\t\t\tconst parsed = parseAgencies(results);\n\t\t\t\tconst locations = parsed\n\t\t\t\t\t.map(({ key, lat, lng }: IAgency) => ({ key, lat, lng }))\n\t\t\t\t\t.filter((l: any) => l.lat && l.lng)\n\t\t\t\t;\n\n\t\t\t\tsetAgencies(parsed);\n\t\t\t\tsetMarkerPoints(locations);\n\t\t\t}\n\t\t})();\n\n\t\treturn () => {\n\t\t\tisRendering = false;\n\t\t};\n\t}, []);\n\n\tconst parseAgencies = (agencyDocuments: IDocument[]): IAgency[] => {\n\t\tconst parsedAgencies = agencyDocuments.map((doc, i) => {\n\t\t\tconst {\n\t\t\t\taddress,\n\t\t\t\tcity,\n\t\t\t\tcompanyName,\n\t\t\t\tcoordinates,\n\t\t\t\temail,\n\t\t\t\tkey,\n\t\t\t\tmarketingName,\n\t\t\t\tphone,\n\t\t\t\tpostcode,\n\t\t\t\tresponsibleFor,\n\t\t\t\ttelPhone,\n\t\t\t\turlParts: [url],\n\t\t\t} = doc;\n\n\t\t\tif (!coordinates) {\n\t\t\t\treturn {\n\t\t\t\t\taddress,\n\t\t\t\t\tcity,\n\t\t\t\t\tcompanyName,\n\t\t\t\t\temail,\n\t\t\t\t\tkey,\n\t\t\t\t\tmarketingName,\n\t\t\t\t\tphone,\n\t\t\t\t\tpostcode,\n\t\t\t\t\tresponsibleFor,\n\t\t\t\t\ttelPhone,\n\t\t\t\t\turl,\n\t\t\t\t\tzIndex: i + 1,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst { latitude: lat, longitude: lng } = coordinates;\n\n\t\t\treturn {\n\t\t\t\taddress,\n\t\t\t\tcity,\n\t\t\t\tcompanyName,\n\t\t\t\temail,\n\t\t\t\tkey,\n\t\t\t\tlat,\n\t\t\t\tlng,\n\t\t\t\tmarketingName,\n\t\t\t\tphone,\n\t\t\t\tpostcode,\n\t\t\t\tresponsibleFor,\n\t\t\t\ttelPhone,\n\t\t\t\turl,\n\t\t\t\tzIndex: i + 1,\n\t\t\t};\n\t\t});\n\n\t\treturn parsedAgencies;\n\t};\n\n\tconst getSwiper = () => (carouselRef && carouselRef.current ? carouselRef.current.swiper() : null);\n\n\tconst updateSwiper = () => {\n\t\tgetSwiper().update();\n\t};\n\n\tconst slideTo = (index: number, flashActive: boolean = true) => {\n\t\tconst swiper = getSwiper();\n\n\t\tif (!swiper) {\n\t\t\treturn;\n\t\t}\n\t\tswiper.slideToLoop(index);\n\n\t\tif (flashActive) {\n\t\t\tswiper.wrapperEl.classList.add(\"flash-active\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tswiper.wrapperEl.classList.remove(\"flash-active\");\n\t\t\t}, 800);\n\t\t}\n\t};\n\n\tconst onMarkerClicked = ({ key }) => {\n\t\tconst index = findIndex(markerPoints, [\"key\", key]);\n\n\t\tif (index !== -1) {\n\t\t\tslideTo(index, true);\n\t\t}\n\t};\n\n\tconst focusPostcodeAreas = (postcode: string) => {\n\t\tconst agenciesInRange = [...agencies].filter(\n\t\t\t({ responsibleFor }: IAgency) => responsibleFor.indexOf(postcode) !== -1\n\t\t);\n\t\tconst orderedAgencies = [...agencies].sort((a, b) => {\n\t\t\tif (a.responsibleFor.indexOf(postcode) !== -1 && b.responsibleFor.indexOf(postcode) === -1) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a.responsibleFor.indexOf(postcode) === -1 && b.responsibleFor.indexOf(postcode) !== -1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\t\tif (agenciesInRange && agenciesInRange.length > 0) {\n\t\t\tconst agencyMarkers = agenciesInRange.map(({ lat, lng }) => ({ lat, lng }));\n\t\t\tconst locations = orderedAgencies.map(({ key, lat, lng }: IAgency) => ({ key, lat, lng }));\n\n\t\t\tsetAgencies(orderedAgencies);\n\t\t\tsetMarkerPoints(locations);\n\t\t\tsetForcedBounds(agencyMarkers);\n\t\t\tslideTo(0, false);\n\n\t\t\tconst firstAgency = agenciesInRange[0];\n\t\t\tif (firstAgency) {\n\t\t\t\thistoryTracker.trackHistory(\"seller-postcode\", postcode);\n\t\t\t\tif (firstAgency.city) {\n\t\t\t\t\thistoryTracker.trackHistory(\"seller-county\", firstAgency.city);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdateSwiper();\n\t\t}\n\t};\n\n\tconst focusArea = (area: string) => {\n\t\tconst agenciesInArea = [...agencies].filter(({ city }: IAgency) => city === area);\n\t\tconst orderedAgencies = [...agencies].sort((a, b) => {\n\t\t\tif (a.city === area && b.city !== area) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a.city !== area && b.city === area) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\t\tif (agenciesInArea && agenciesInArea.length > 0) {\n\t\t\tconst agencyMarkers = agenciesInArea.map(({ lat, lng }) => ({ lat, lng }));\n\t\t\tconst locations = orderedAgencies.map(({ key, lat, lng }: IAgency) => ({ key, lat, lng }));\n\n\t\t\tsetAgencies(orderedAgencies);\n\t\t\tsetMarkerPoints(locations);\n\t\t\tsetForcedBounds(agencyMarkers);\n\t\t\tslideTo(0, false);\n\n\t\t\tconst firstAgency = agenciesInArea[0];\n\t\t\tif (firstAgency) {\n\t\t\t\tif (firstAgency.postcode) {\n\t\t\t\t\thistoryTracker.trackHistory(\"seller-postcode\", firstAgency.postcode);\n\t\t\t\t}\n\t\t\t\tif (firstAgency.city) {\n\t\t\t\t\thistoryTracker.trackHistory(\"seller-county\", firstAgency.city);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdateSwiper();\n\t\t}\n\t};\n\n\tconst onPostcodeChange = (event: React.ChangeEvent) => {\n\t\tconst { value } = event.target;\n\n\t\tif (isValidPostcode(value) && !isValidForm) {\n\t\t\tsetValidForm(true);\n\t\t} else if (!isValidPostcode(value) && isValidForm) {\n\t\t\tsetValidForm(false);\n\t\t}\n\t};\n\n\tconst onPostcodeSearch = (event: any) => {\n\t\tevent.preventDefault();\n\t\tconst { value } = postcodeRef.current;\n\n\t\tif (isValidPostcode(value)) {\n\t\t\tfocusPostcodeAreas(value);\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tTarkka haku\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t{quickLinks.map((link: string, idx: number) => (\n\t\t\t\t\t\t focusArea(link)}\n\t\t\t\t\t\t\taria-label={`Keskitä kartta alueeseen ${link}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{link}\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\t\n\t\t\t\n\n\t\t\t{agencies && agencies.length > 0 && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport default AgencySearch;\n","import styled, { css } from \"styled-components\";\nimport { color, buttons, media, grid, textStyles } from \"@utils/style-utils\";\nimport { Link } from \"react-router-dom\";\n\nexport const Columns = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin: 0 auto;\n\tmax-width: 1150px;\n\n\t${media.lg`\n\t\talign-items: center;\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t`}\n\n\t${props =>\n\t\tprops.fetched &&\n\t\tcss`\n\t\t\t@media (min-width: 720px) {\n\t\t\t\tflex-direction: row;\n\n\t\t\t\t.column.with-link {\n\t\t\t\t\talign-items: flex-end;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t}\n\t\t\t}\n\t\t`}\n`;\n\nexport const Column = styled.div`\n\talign-items: center;\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-basis: 100%;\n\tmargin-bottom: 10px;\n\n\t${media.lg`\n\t\talign-items: start;\n\t\tflex-basis: calc((100% - ${grid.gutter}px) / 2);\n\n\t\t${props =>\n\t\t\tprops.first &&\n\t\t\tcss`\n\t\t\t\tmargin-left: -8px;\n\t\t\t\tjustify-content: center;\n\t\t\t`}\n\n\t\t${props =>\n\t\t\tprops.withLink &&\n\t\t\tcss`\n\t\t\t\talign-items: flex-end;\n\t\t\t`}\n\t`}\n\n\t${props =>\n\t\tprops.withLink &&\n\t\tcss`\n\t\t\t@media (max-width: 719px) {\n\t\t\t\tmargin-top: 20px;\n\t\t\t}\n\t\t`}\n\n\timg {\n\t\tflex-basis: 0; /* prevents weird stretching on chrome */\n\t\tmax-width: 396px;\n\t\tmargin-bottom: 30px;\n\t\tmargin-top: 30px;\n\t\tobject-fit: contain;\n\t\twidth: 100%;\n\n\t\t&[src*=\"w_42\"] {\n\t\t\tfilter: blur(8px);\n\t\t\tfilter: url(#sharpBlur);\n\t\t}\n\t}\n\n\th3 {\n\t\tmargin-top: 0;\n\t}\n\n\tp {\n\t\t${textStyles.PSmallCondensed}\n\t\tcolor: ${color(\"grey\", 2)};\n\t\tmargin-bottom: 20px;\n\t\tmargin-top: 25px;\n\t\tmax-width: 350px;\n\t\ttext-align: left;\n\t}\n\n\t.fetched {\n\t\twidth: 100%;\n\t}\n`;\n\nexport const SearchForm = styled.form`\n\talign-items: center;\n\tdisplay: flex;\n\n\t@media (max-width: 520px) {\n\t\tflex-direction: column;\n\t}\n\n\tinput {\n\t\tmargin-right: 16px;\n\n\t\t@media (max-width: 520px) {\n\t\t\tmargin-bottom: 16px;\n\t\t\tmargin-right: 0;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\tbutton {\n\t\t${buttons.textLinkPrimary}\n\n\t\t&::after {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n`;\n\nexport const Footer = styled.div`\n\tdisplay: flex;\n\tjustify-content: flex-end;\n`;\n\nexport const SpecificSearch = styled(Link)`\n\t${buttons.textLinkWithColor(color(\"beige\", 1), color(\"beige\", 2))}\n`;\n\nexport const Results = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tmargin-top: 40px;\n\tmax-height: 450px;\n\toverflow-x: hidden;\n\toverflow-y: auto;\n\t-webkit-overflow-scrolling: touch;\n\n\t&::before {\n\t\tbackground-image: linear-gradient(\n\t\t\tto bottom,\n\t\t\trgba(255, 255, 255, 0) 0%,\n\t\t\trgba(255, 255, 255, 0) 45%,\n\t\t\t${color(\"white\")} 100%\n\t\t);\n\t\tbottom: 28px;\n\t\tcontent: \"\";\n\t\theight: 50px;\n\t\tpointer-events: none;\n\t\tposition: absolute;\n\t\twidth: calc(100% - 56px);\n\t\tz-index: 2;\n\t}\n\n\t${media.md`\n\t\t&::before {\n\t\t\twidth: calc(100% - 82px);\n\t\t}\n\t`}\n\n\t${media.lg`\n\t\t&::before {\n\t\t\tbottom: 33px;\n\t\t}\n\t`}\n\n\t.agents {\n\t\tmargin: 0 auto;\n\t\tmax-width: 1150px;\n\t\twidth: 100%;\n\n\t\t.agent-list-item {\n\t\t\t@media (max-width: 376px) {\n\t\t\t\t.agent-recommendation {\n\t\t\t\t\tjustify-content: flex-end;\n\t\t\t\t\tleft: 0;\n\t\t\t\t\tmargin-bottom: 12px;\n\t\t\t\t\tposition: relative;\n\t\t\t\t\tright: 0;\n\t\t\t\t\ttop: 0;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\n\t\t\t\t.agent-phone {\n\t\t\t\t\tfont-size: 18px;\n\t\t\t\t}\n\n\t\t\t\t.agent-read-more {\n\t\t\t\t\tfont-size: 14px;\n\t\t\t\t}\n\n\t\t\t\t.agent-portrait {\n\t\t\t\t\tmax-width: 65px;\n\n\t\t\t\t\t+ div {\n\t\t\t\t\t\tmargin-bottom: 16px;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\th3 {\n\t\tdisplay: none;\n\t}\n`;\n\nexport const NoResults = styled.div`\n\t${textStyles.H3}\n\tpadding: 20px 0;\n\tmargin: 0 auto;\n\tmax-width: 1150px;\n`;\n","import React, { useState, useEffect, useRef, Fragment } from \"react\";\n\nimport agentSearchService from \"@services/agent-search.service\";\nimport { getAssetUrl, imageWithSize } from \"@utils\";\n\nimport { Columns, Column, SearchForm, SpecificSearch, Footer, Results, NoResults } from \"./styles\";\nimport Image from \"@components/Image\";\nimport AgentList from \"@components/AgentList\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport historyTracker from \"@services/history-tracker\";\n\nconst AgentSearchSimple = () => {\n\tconst [agents, setAgents] = useState([]);\n\tconst [isSubmitting, setSubmitting] = useState(false);\n\tconst [fetched, setFetched] = useState(false);\n\tconst nameRef = useRef(null);\n\tconst postcodeRef = useRef(null);\n\tlet isSubscribed = true;\n\n\tconst doAgentSearch = async e => {\n\t\te.preventDefault();\n\n\t\tif ((postcodeRef.current.value === \"\" && nameRef.current.value === \"\") || !isSubscribed) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetSubmitting(true);\n\n\t\tconst formData = {\n\t\t\tname: nameRef.current.value,\n\t\t\tpostCode: postcodeRef.current.value,\n\t\t};\n\n\t\ttry {\n\t\t\tconst res = await agentSearchService.fetchAgents(formData);\n\n\t\t\tif (isSubscribed) {\n\t\t\t\tsetSubmitting(false);\n\n\t\t\t\tconst { data } = res;\n\n\t\t\t\tif (data && data.agents) {\n\t\t\t\t\tsetAgents(data.agents);\n\n\t\t\t\t\tconst firstAgent = data.agents[0];\n\t\t\t\t\tif (firstAgent && firstAgent.homeAgency) {\n\t\t\t\t\t\tconst firstAgency = data.agencies[firstAgent.homeAgency] || {};\n\t\t\t\t\t\thistoryTracker.trackHistory(\"seller-postcode\", formData.postCode);\n\t\t\t\t\t\tif (firstAgency.city) {\n\t\t\t\t\t\t\thistoryTracker.trackHistory(\"seller-county\", firstAgency.city);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsetFetched(true);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(\"error while fetching agents\", e);\n\t\t\tif (isSubscribed) {\n\t\t\t\tsetSubmitting(false);\n\t\t\t}\n\t\t}\n\t};\n\n\t/* Return to initial state on blur if both inputs are cleared (= empty) */\n\tconst onBlur = () => {\n\t\tif (nameRef.current.value === \"\" && postcodeRef.current.value === \"\") {\n\t\t\tsetAgents([]);\n\t\t\tsetFetched(false);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tisSubscribed = false;\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t{(!fetched || (fetched && agents.length <= 0)) && (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t

Valitse alueesi tunteva välittäjä

\n\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\tSyötä kenttään välittäjän nimi tai sen alueen postinumero, josta olet myymässä tai\n\t\t\t\t\t\t\t\t\tostamassa.\n\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t{(!fetched || (fetched && agents.length <= 0)) && (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t{fetched && agents.length > 0 && (\n\t\t\t\t\t\n\t\t\t\t\t\tTarkka haku\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t
\n\n\t\t\t{(!fetched || (fetched && agents.length <= 0)) && (\n\t\t\t\t
\n\t\t\t\t\tTarkka haku\n\t\t\t\t
\n\t\t\t)}\n\n\t\t\t{fetched && agents.length > 0 && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\n\t\t\t{fetched && agents.length <= 0 && Valitsemillasi hakuehdoilla ei löytynyt tuloksia.}\n\t\t
\n\t);\n};\n\nexport default AgentSearchSimple;\n","import TabSwitcher, { Tab, TabPanel } from \"@components/TabSwitcher\";\nimport { FrontHeroTabs, TabButtons, TabContent } from \"@pages/FrontPage/styles\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport ApartmentSearchBlock from \"@components/Search/ApartmentSearchBlock\";\nimport AgencySearch from \"@components/Search/AgencySearch\";\nimport SimpleAgentSearch from \"@components/Search/AgentSearchSimple\";\nimport React from \"react\";\n\nexport const SearchTabs = (props: any) => {\n\n\treturn \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tHae asuntoja\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tHae toimipistettä\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tHae välittäjää\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t;\n\n};\n","import React, { Fragment } from \"react\";\nimport { IApplicationState } from \"@redux\";\nimport { connect } from \"react-redux\";\n\nimport { Container } from \"@components/Grid\";\n\nimport ApartmentBubbles from \"@components/Front/ApartmentBubbles\";\nimport RecommendationPercentage from \"@components/Front/RecommendationPercentage\";\nimport SectionLifts from \"@components/Front/SectionLifts\";\nimport ApartmentGrid from \"@components/ApartmentGrid\";\nimport WhyKm from \"@components/WhyKm\";\nimport MoreAboutKm from \"@components/Front/MoreAboutKm\";\nimport ArticleCards from \"@components/ArticleCards\";\nimport { getAssetUrl } from \"@utils\";\nimport Text from \"wake-react-components/text\";\n\nimport {\n\tApartmentBubblesContainer,\n\tArticles,\n\tCampaignLink,\n\tFrontHero,\n\tFrontHeroContent,\n\tSuggestedApartments,\n} from \"./styles\";\nimport useParallax from \"@hooks/use-parallax\";\nimport Editor from \"wake-react-components/editor\";\nimport { SearchTabs } from \"@pages/FrontPage/SearchTabs\";\nimport { isAdmin } from \"wake-react-components/utils\";\nimport Input from \"wake-react-components/input\";\n\nconst HeroImage = ({imagePath = \"/assets/images/km-2022/etusivu/\"}) => {\n\tconst sources = [\n\t\t[\"(min-width: 1024px)\", \"KM-front-hero\", 1920, 1232],\n\t\t[\"(min-width: 768px)\", \"KM-front-hero-tablet\", 1024, 919],\n\t\t[null, \"KM-front-hero-mobile\", 375, 919],\n\t];\n\n\tconst makeSrcSet = (src: string, ext: string) => {\n\t\treturn `${getAssetUrl(src + ext)} 1x, ${getAssetUrl(src + \"@2x\" + ext)} 2x`;\n\t};\n\n\treturn (\n\t\t\n\t\t\t{sources.map(([media, name, width, height], index: number) => {\n\t\t\t\tconst props = { ...(media && { media }) };\n\t\t\t\treturn (\n\t\t\t\t\t\n\t\t\t\t\t\t{/*\n\t\t\t\t\t\t// @ts-ignore */}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{/*\n\t\t\t\t\t\t// @ts-ignore */}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t})}\n\t\t\t\n\t\t\n\t);\n};\n\nconst FrontPage = ({ document: doc }) => {\n\tconst {\n\t\tcampaignImageFolder,\n\t\tfrontHeroCampaignButtonLink,\n\t\tfrontHeroMode,\n\t\theroTheme,\n\t\tRecentlyAddedApartments: properties,\n\t\tpropertyStatistics,\n\t} = doc;\n\n\tuseParallax(\".parallax\", { speed: -5 }, 0);\n\n\treturn (\n\t\t\n\n\t\t\t{isAdmin && (\n\t\t\t\t
\n\t\t\t\t\tValitse heron tyyppi:\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\tKansiossa tulee olla tiedostot:\n\n\t\t\t\t\t\tKM-front-hero.jpg (1920x1232),\n\t\t\t\t\t\tKM-front-hero.webp (1920x1232),\n\t\t\t\t\t\tKM-front-hero@2x.jpg (3840x2464),\n\t\t\t\t\t\tKM-front-hero@2x.webp (3840x2464),\n\t\t\t\t\t\tKM-front-hero-mobile.jpg (375x919),\n\t\t\t\t\t\tKM-front-hero-mobile.webp (375x919),\n\t\t\t\t\t\tKM-front-hero-mobile@2x.jpg (750x1838),\n\t\t\t\t\t\tKM-front-hero-mobile@2x.webp (750x1838),\n\t\t\t\t\t\tKM-front-hero-tablet.jpg (1024x919),\n\t\t\t\t\t\tKM-front-hero-tablet.webp (1024x919),\n\t\t\t\t\t\tKM-front-hero-tablet@2x.jpg (2048x1838) ja\n\t\t\t\t\t\tKM-front-hero-tablet@2x.webp (2048x1838)\n\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t\tTeema:\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t)}\n\n\t\t\t{(!frontHeroMode || frontHeroMode === \"searchHero\") && \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t

\n\t\t\t\t\t\tMeiltä löydät myytävät asunnot, oli tarpeesi mikä vain.

\" />\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
}\n\n\t\t\t{frontHeroMode === \"campaignHero\" && <>\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\tKiinteistömaailman Yhteismyynnistä®
500 välittäjää yhden hinnalla.

\"\n\t\t\t\t\t\t\t\tname=\"front-hero-campaign-content\"\n\t\t\t\t\t\t\t\ttitle=\"Kampanjaheron sisältö\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{isAdmin && \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\n\t\t\t\n\t\t\t\t

Sinulle valitsemamme kohteet

\n\t\t\t\t\n\t\t\t
\n\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t

Tietoa kodinvaihtosi tueksi

\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\n\t\t\t\n\n\t\t\t\n\t\t
\n\t);\n};\n\nconst mapStateToProps = (state: IApplicationState) => ({\n\tdocument: state.document,\n});\n\nconst FrontPageContainer = connect(mapStateToProps)(FrontPage);\n\nexport default FrontPageContainer;\n","import axios from \"axios\";\nimport { hasWindow } from \"@utils\";\nimport dataLayerPush from \"@utils/dataLayerPush\";\n\ninterface IFormParams {\n\tagency?: string;\n\tagent?: string;\n\tdeveloper?: string;\n\temail?: string;\n\tmessage?: string;\n\tname?: string;\n\tphone?: string;\n\tpostCode?: number | string;\n\tproperty?: string;\n\tsubject?: string;\n\tsubjectIndex: number;\n\tsubmitUrl?: string;\n\twakeTestEmail?: string;\n}\n\nconst formAPI = \"/api/km/KMSite/contactForm\";\n\nconst getSubject = (index: number = 1, name?: string) => {\n\tconst subjects = {\n\t\t0: \"Esittelypyyntö kohteesta\",\n\t\t1: \"Yhteydenottopyyntö verkosta\",\n\t\t2: \"Kotikäyntipyyntö verkosta\" + (name ? `: ${name}` : \"\"),\n\t\t3: \"Kotihakupyyntö verkosta\" + (name ? `: ${name}` : \"\"),\n\t};\n\n\treturn subjects[index];\n};\n\nconst analyticsEvents = {\n\t0: \"Ota yhteyttä kohteesta\",\n\t1: \"Ota yhteyttä yleisesti\",\n\t2: \"Tilaa Kotikäynti\",\n\t3: \"Tilaa Kotihaku\",\n\t5: \"Lataa Opas\",\n};\n\nconst adformEvents = {\n\t0: null,\n\t1: null,\n\t2: \"Kotikaynti Laheta\",\n\t3: \"Kotihaku Laheta\",\n};\n\nconst baseSend = async (params: IFormParams) => {\n\tif (hasWindow && window[\"wakeTestEmail\"]) {\n\t\tparams.wakeTestEmail = window[\"wakeTestEmail\"];\n\t}\n\n\ttry {\n\t\tconst response = await axios.post(formAPI, params);\n\n\t\t/* if (hasWindow && window[\"_gaq\"]) {\n\t\t\t_gaq.push([\"_trackEvent\", analyticsEvents[params.subjectIndex], \"Lähetä\"]);\n\t\t} */\n\t\tdataLayerPush({\n\t\t\taction: \"Lähetä\",\n\t\t\tconversionDetails: analyticsEvents[params.subjectIndex],\n\t\t\tevent: \"customConversion\",\n\t\t});\n\n\t\treturn response.data;\n\t} catch (e) {\n\t\tconsole.log(e);\n\t\tthrow e;\n\t}\n};\n\nconst doApartmentContact = async (params: IFormParams) => {\n\tconst data: IFormParams = {\n\t\tsubject: getSubject(0),\n\t\tsubjectIndex: 0,\n\t\t...params,\n\t};\n\n\ttry {\n\t\tconst response = await baseSend(data);\n\t\treturn response;\n\t} catch (e) {\n\t\tconsole.log(e);\n\t\tthrow e;\n\t}\n};\n\nconst doBasicContact = async (params: IFormParams) => {\n\tconst { subjectIndex = 1, ...rest } = params;\n\tconst data: IFormParams = {\n\t\tsubject: getSubject(subjectIndex),\n\t\tsubjectIndex,\n\t\t...rest,\n\t};\n\n\ttry {\n\t\tconst response = await baseSend(data);\n\t\treturn response;\n\t} catch (e) {\n\t\tconsole.log(e);\n\t\tthrow e;\n\t}\n};\n\nconst doDownloadContact = async (params: IFormParams) => {\n\tconst { subjectIndex = 5, ...rest } = params;\n\tconst data: IFormParams = {\n\t\tsubject: getSubject(subjectIndex),\n\t\tsubjectIndex,\n\t\t...rest,\n\t};\n\n\ttry {\n\t\treturn await baseSend(data);\n\t} catch (e) {\n\t\tconsole.log(e);\n\t\tthrow e;\n\t}\n};\n\nexport default {\n\tdoApartmentContact,\n\tdoBasicContact,\n\tdoDownloadContact,\n};\n","import React, { lazy, Suspense, Fragment, useState, useEffect } from \"react\";\n\nimport { hasWindow } from \"@utils\";\nimport { getSchema } from \"@utils/validators\";\nimport CtaButton from \"@components/Buttons/CtaButton\";\nimport { InputGroup, FormError, GdprLink, Textarea, ThankYouMessage } from \"@components/Form/form-styles\";\nimport contactService from \"@services/contact.service\";\n\nimport { Link } from \"react-router-dom\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\nimport {\n\tPlaceholder,\n\tFormColumns,\n\tFormColumn,\n\tPlaceholderTextarea,\n\tPlaceholderInput,\n\tPlaceholderGdpr,\n\tPlaceholderButton,\n\tFormContainer,\n\tFormWrapper,\n} from \"./styles\";\n\nconst validationSchema = getSchema([\"email\", \"message\", \"name\", \"phone\"]);\n\nconst Formik = lazy(() => import(/* webpackPrefetch:true */ \"formik\").then(module => ({ default: module.Formik })));\nconst ErrorMessage = lazy(() =>\n\timport(/* webpackPrefetch:true */ \"formik\").then(module => ({ default: module.ErrorMessage }))\n);\n\nconst FormPlaceholder = () => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\ninterface IProps {\n\tagent?: IAgent;\n\tagency?: IAgency;\n\tcolor?: string;\n\tchildren?: any;\n\tdisableIfPropNotDefined?: string;\n\tonPropMissing?: (prop: string) => void;\n\tthankYouMessage?: string;\n}\n\nconst ContactFormAgentOrAgency = (props: IProps) => {\n\tconst {\n\t\tagent = null,\n\t\tagency = null,\n\t\tcolor = \"beige\",\n\t\tchildren = null,\n\t\tdisableIfPropNotDefined = null,\n\t\tthankYouMessage = \"Kiitos yhteydenotostasi\",\n\t} = props;\n\tconst [isSubmitted, setSubmitted] = useState(false);\n\n\tconst initialValues = {\n\t\temail: \"\",\n\t\tmessage: \"\",\n\t\tname: \"\",\n\t\tphone: \"\",\n\t};\n\n\tlet contactSubmitTimeout: number;\n\n\tconst doSubmit = async (values, { setSubmitting, resetForm }) => {\n\t\tif (!!disableIfPropNotDefined && !props[disableIfPropNotDefined]) {\n\t\t\tconsole.log(\"missing prop \", disableIfPropNotDefined);\n\t\t\tif (typeof props.onPropMissing === \"function\") {\n\t\t\t\tprops.onPropMissing(disableIfPropNotDefined);\n\t\t\t}\n\t\t\tsetSubmitting(false);\n\t\t\treturn;\n\t\t}\n\n\t\tsetSubmitting(true);\n\n\t\tconst submitUrl = location.href;\n\n\t\tconst formData = {\n\t\t\tagency: agency ? agency.key : null,\n\t\t\tagent: agent ? agent.key : null,\n\t\t\tsubmitUrl,\n\t\t\t...values,\n\t\t};\n\n\t\ttry {\n\t\t\tconst res = await contactService.doBasicContact(formData);\n\t\t\tconsole.log(\"successful form submit\", res);\n\t\t\tsetSubmitting(false);\n\t\t\tsetSubmitted(true);\n\n\t\t\tif (hasWindow) {\n\t\t\t\tcontactSubmitTimeout = window.setTimeout(() => {\n\t\t\t\t\tsetSubmitted(false);\n\t\t\t\t\tresetForm(initialValues);\n\t\t\t\t}, 6000);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(\"error while sending form..\", e);\n\t\t\tsetSubmitting(false);\n\t\t\tsetSubmitted(false);\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\t/* clear the reset timeout before component unmounts */\n\t\t\tif (contactSubmitTimeout) {\n\t\t\t\tclearTimeout(contactSubmitTimeout);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{children ? children : null}\n\t\t\t\t{!hasWindow && }\n\t\t\t\t{hasWindow && (\n\t\t\t\t\t}>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{({ values, handleChange, handleBlur, handleSubmit, isSubmitting }) => (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t{isSubmitted && (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{thankYouMessage ? thankYouMessage : \"Kiitos yhteydenotosta!\"}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t{!isSubmitted && (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tTietosuojaseloste\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\n\t);\n};\n\nexport default ContactFormAgentOrAgency;\n","import React, { useEffect } from \"react\";\nimport rellax from \"rellax\";\nimport { hasWindow } from \"@utils/index\";\n\ninterface IOptions {\n\tspeed?: number;\n\t[key: string]: any;\n}\n\nfunction useParallax(selector: string = \".parallax\", options: IOptions = { speed: -3 }, disabledBb: number = 1120) {\n\tlet parallax;\n\tlet resizeTm: number = null;\n\n\tconst onResize = () => {\n\t\tif (hasWindow) {\n\t\t\tclearTimeout(resizeTm);\n\t\t\tif (!parallax) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tparallax.destroy();\n\n\t\t\tresizeTm = window.setTimeout(() => {\n\t\t\t\tif (window.innerWidth > disabledBb) {\n\t\t\t\t\tparallax.refresh();\n\t\t\t\t}\n\t\t\t}, 500);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tparallax = rellax(selector, options);\n\t\tif (!parallax) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (hasWindow && disabledBb) {\n\t\t\twindow.addEventListener(\"resize\", onResize);\n\t\t}\n\n\t\treturn () => {\n\t\t\tparallax.destroy();\n\t\t\tif (hasWindow && disabledBb) {\n\t\t\t\twindow.removeEventListener(\"resize\", onResize);\n\t\t\t}\n\t\t};\n\t}, []);\n}\n\nexport default useParallax;\n","import React, { Fragment } from \"react\";\n\ninterface IProps {\n\tagent: IAgent;\n}\n\nconst AgentSkills = (props: IProps) => {\n\tconst {\n\t\tagent: { skills, languageSkills },\n\t} = props;\n\treturn (\n\t\t\n\t\t\t{skills && (\n\t\t\t\t
\n\t\t\t\t\t

\n\t\t\t\t\t\tErityisosaaminen\n\t\t\t\t\t

\n\t\t\t\t\t

{skills.join(\", \")}

\n\t\t\t\t
\n\t\t\t)}\n\t\t\t{languageSkills && (\n\t\t\t\t
\n\t\t\t\t\t

\n\t\t\t\t\t\tKielitaito\n\t\t\t\t\t

\n\t\t\t\t\t

{languageSkills}

\n\t\t\t\t
\n\t\t\t)}\n\t\t
\n\t);\n};\n\nexport default AgentSkills;\n","import React from \"react\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport styled from \"styled-components\";\nimport { color } from \"@utils/style-utils\";\n\nconst SomeButton = styled.a`\n\talign-items: center;\n\tbackground: ${color(\"greenBright\", 1)};\n\tborder-radius: 4px;\n\tbox-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n\tcolor: ${color(\"white\")};\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\tfont-size: 20px;\n\theight: 45px;\n\tmargin-right: 16px;\n\tjustify-content: center;\n\ttext-decoration: none;\n\ttransform: scale(1);\n\ttransition: transform 150ms, box-shadow 150ms;\n\twidth: 52px;\n\n\t&:hover {\n\t\tbox-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1);\n\t\ttransform: scale(1.1);\n\t}\n\n\t&:active {\n\t\tbox-shadow: 0px 1px 4px rgba(0, 0, 0, 0.05);\n\t\ttransform: scale(0.96);\n\t}\n\n\tspan svg {\n\t\tmax-width: 36px;\n\t}\n`;\n\nconst icons = {\n\tfacebook: ,\n\tinstagram: ,\n\tlinkedin: ,\n\ttwitter: ,\n\tyoutube: ,\n};\n\nconst getIcon = (type: string) => (icons[type] ? icons[type] : null);\n\nconst SocialMediaButtons = ({ accounts }) => {\n\tif (!accounts || accounts.length <= 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t
\n\t\t\t{accounts.map(({ type, url }, index: number) => (\n\t\t\t\t\n\t\t\t\t\t{getIcon(type)}\n\t\t\t\t\n\t\t\t))}\n\t\t
\n\t);\n};\n\nexport default SocialMediaButtons;\n","import React from \"react\";\n\ninterface IProps {\n\tcount: number;\n}\n\nconst SoldProperties = ({ count }: IProps) => {\n\tif (!count || count === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t
\n\t\t\t

\n\t\t\t\tMyydyt kohteet\n\t\t\t

\n\t\t\t
{count}
\n\t\t\t

\n\t\t\t\tViimeisen 12 kuukauden aikana olen myynyt {count} kohdetta. Ota yhteyttä kun haluat keskustella oman\n\t\t\t\tasuntosi myynnistä.\n\t\t\t

\n\t\t
\n\t);\n};\n\nexport default SoldProperties;\n","import styled from \"styled-components\";\nimport { color, emSpacing, textStyles } from \"@utils/style-utils\";\n\nexport const Block = styled.div`\n\tbackground: ${color(\"beige\", 4)};\n\tborder: 1px solid ${color(\"beige\", 4)};\n\tborder-radius: 4px;\n\tdisplay: flex;\n\theight: 100%;\n\toverflow: hidden;\n\tpadding: 19px;\n\tposition: relative;\n\n\t&:after {\n\t\t${textStyles.MicroTextCaps};\n\t\tbackground: ${color(\"greenBright\", 1)};\n\t\tbottom: 10%;\n\t\tcolor: ${color(\"white\")};\n\t\tcontent: \"MYYTY\";\n\t\tdisplay: block;\n\t\tfont-size: 1.2rem;\n\t\tfont-weight: normal;\n\t\tposition: absolute;\n\t\tright: -40%;\n\t\ttext-align: center;\n\t\ttransform: rotate(-45deg);\n\t\twidth: 100%;\n\t}\n\n\t&.pre-block {\n\t\tbackground: transparent;\n\t\tborder-color: transparent;\n\n\t\timg {\n\t\t\tfilter: grayscale(1) brightness(0);\n\t\t}\n\t\t&:after {\n\t\t\tdisplay: none;\n\t\t}\n\t\t.total-count {\n\t\t\tfont-size: 2.4rem;\n\t\t\tletter-spacing: ${emSpacing(0.01)};\n\t\t}\n\t}\n`;\n\nexport const BlockType = styled.div`\n\t${textStyles.MicroText};\n\n\talign-items: center;\n\tdisplay: flex;\n\tflex-basis: 35.9%;\n\tflex-direction: column;\n\tjustify-content: center;\n\tpadding-right: 20px;\n\n\timg {\n\t\tdisplay: block;\n\t\tmargin-bottom: 10px;\n\t\tmax-width: 50px;\n\t\twidth: 100%;\n\t}\n`;\n\nexport const BlockInfo = styled.div`\n\t${textStyles.MicroText};\n\tflex-basis: 64.1%;\n`;\n\nexport const Title = styled.p`\n\t${textStyles.MicroText};\n\tfont-weight: bold;\n\tmargin: 0 0 3px;\n`;\n\nexport const SaleDate = styled.p`\n\t${textStyles.MicroText};\n\tmargin: 0 0 22px;\n`;\n\nexport const PreBlockContent = styled.div`\n\t${textStyles.MicroText};\n\talign-items: center;\n\tdisplay: flex;\n\tfont-size: 1.7rem;\n\theight: 100%;\n\tjustify-content: center;\n`;\n","import React, { Fragment, memo, useEffect, useState } from \"react\";\nimport axios from \"axios\";\nimport { Slide } from \"react-dynamic-swiper\";\nimport { Block, BlockInfo, BlockType, PreBlockContent, SaleDate, Title } from \"./styles\";\nimport { buildingTypeIcons, resolveIcon, resolveTypeText } from \"@utils/building-types\";\nimport PropertyCarousel from \"@components/PropertyCarousel\";\nimport CarouselPlaceholder from \"@components/PropertyCarousel/placeholder\";\n\nconst getRoomTypesHtml = (roomtypes: string) => {\n\tif (roomtypes.includes(\"+\")) {\n\t\tconst split = roomtypes.split(\"+\");\n\t\treturn (\n\t\t\t
\n\t\t\t\t{split.map((type, index) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{type}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{index !== split.length - 1 && \"+\"}\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t
\n\t\t);\n\t} else {\n\t\treturn roomtypes;\n\t}\n};\n\nconst SoldPropertiesCarousel = ({ agent, title = \"Esimerkkejä myymistäni kohteista\", totalCount = false }) => {\n\tconst [properties, setProperties] = useState([]);\n\tconst [fetched, setFetched] = useState(false);\n\n\tlet isRendering: boolean = true;\n\n\tconst fetchProperties = async () => {\n\t\tconst url = \"/api/km/KM/sales\";\n\t\tconst params = {\n\t\t\tagentKey: agent,\n\t\t\tlast: 11,\n\t\t\tlimit: 11,\n\t\t\tonlineOffer: \"all\",\n\t\t};\n\n\t\ttry {\n\t\t\tconst { data } = await axios.get(url, { params });\n\t\t\tconst {\n\t\t\t\tdata: { results },\n\t\t\t} = data;\n\n\t\t\tif (!results || results.length <= 0) {\n\t\t\t\tif (isRendering) {\n\t\t\t\t\tsetFetched(true);\n\t\t\t\t\tsetProperties([]);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (const result of results) {\n\t\t\t\tif (typeof(result.lotAreaType) === \"string\") {\n\t\t\t\t\tresult.lotAreaType = {\n\t\t\t\t\t\tnum: result.lotAreaType.replace(/[^0-9]+/, \"\"),\n\t\t\t\t\t\ttext: result.lotAreaType.replace(/[0-9]+/, \"\").toLowerCase(),\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tresult.lotAreaType = {\n\t\t\t\t\t\tnum: \"\",\n\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tresult.icon = resolveIcon(result.buildingType);\n\t\t\t\tresult.isLot = resolveTypeText(result.buildingType) === \"lot\";\n\t\t\t\tif (!result.buildingTypeFormatted && result.buildingType === 17) {\n\t\t\t\t\tresult.buildingTypeFormatted = \"Autotalli\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isRendering) {\n\t\t\t\tsetFetched(true);\n\t\t\t\tsetProperties(results);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(\"error while fetching agent properties\", e);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tif (isRendering) {\n\t\t\tfetchProperties();\n\t\t}\n\t\treturn () => {\n\t\t\tisRendering = false;\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t\n\t\t\t{!fetched && properties.length <= 0 && }\n\t\t\t{properties && properties.length > 0 && (\n\t\t\t\t\n\t\t\t\t\t{totalCount && \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t{totalCount} kpl\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tViimeisen 12 kuukauden aikana olen myynyt {totalCount} kohdetta.\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t{properties.map(\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbuildingTypeFormatted,\n\t\t\t\t\t\t\t\tdistrict,\n\t\t\t\t\t\t\t\ticon,\n\t\t\t\t\t\t\t\tisLot,\n\t\t\t\t\t\t\t\tlivingArea,\n\t\t\t\t\t\t\t\tlotArea,\n\t\t\t\t\t\t\t\tlotAreaType: { text, num },\n\t\t\t\t\t\t\t\tmunicipality,\n\t\t\t\t\t\t\t\troomTypes,\n\t\t\t\t\t\t\t\tsaleDateFormatted,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tindex\n\t\t\t\t\t\t) => (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{icon && {buildingTypeFormatted}}\n\t\t\t\t\t\t\t\t\t\t{buildingTypeFormatted}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{district} {municipality}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{saleDateFormatted}\n\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{isLot && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{lotArea} {text}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<sup>{num}</sup>\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{!isLot && livingArea && <span>{livingArea} m²</span>}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
{getRoomTypesHtml(roomTypes)}
\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t)\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t)}\n\t\t
\n\t);\n};\n\nexport default memo(SoldPropertiesCarousel);\n","import styled from \"styled-components\";\nimport { textStyles, media, color, grid } from \"@utils/style-utils\";\nimport { Link } from \"react-router-dom\";\n\nexport const WhyKmContent = styled.div`\n\talign-items: center;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin: 0 auto;\n\tmax-width: 1130px;\n\tpadding: 40px 0;\n\n\t${media.md`\n\t\tpadding: 60px 0;\n\t`}\n\n\t${media.lgx`\n\t\tflex-direction: row;\n\t`}\n`;\n\nexport const WhyKmIntro = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin-bottom: ${grid.gutter}px;\n\tmax-width: 600px;\n\ttext-align: center;\n\n\t${media.lgx`\n\t\tflex-basis: 43%;\n\t\tmargin-bottom: 0;\n\t\tpadding-right: ${grid.gutter + 15}px;\n\t\ttext-align: left;\n\t`}\n\n\th2 {\n\t\t${textStyles.H1}\n\t\tmargin: 0 0 25px;\n\n\t\t${media.lgx`\n\t\t\tmargin: 0 0 45px;\n\t\t`}\n\t}\n\n\tp {\n\t\t${textStyles.PSmall}\n\t\tmargin: 0 0 15px;\n\n\t\t:last-of-type {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n`;\n\nexport const WhyKmBubbles = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: space-between;\n\n\t${media.lgx`\n\t\tflex-basis: ${props => (props.full ? \"100%\" : \"57%\")};\n\t`}\n`;\n\nexport const WhyKmBubble = styled(Link)`\n\talign-items: center;\n\tbackground: ${color(\"greenBright\", 5)};\n\tborder: none;\n\tcolor: ${color(\"grey\", 1)};\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-basis: 100%;\n\tfont-size: 16px;\n\tfont-weight: 500;\n\tjustify-content: center;\n\tmargin-bottom: ${grid.gutterSmall}px;\n\toverflow: hidden;\n\tpadding: 18px 25px 18px 18px;\n\tposition: relative;\n\ttext-decoration: none;\n\n\t${media.md`\n\t\tflex-basis: calc((100% - ${grid.gutterSmall}px ) / 2);\n\t\tpadding: 20px 30px 25px 25px;\n\n\t\t&:nth-of-type(5),\n\t\t&:nth-of-type(6) {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t`}\n\n\t${media.lg`\n\t\tflex-basis: calc((100% - ${grid.gutter * 2}px ) / 3);\n\t\tmargin-bottom: ${grid.gutter}px;\n\t\tpadding: 26px 40px 32px 26px;\n\n\t\t&:nth-of-type(4),\n\t\t&:nth-of-type(5),\n\t\t&:nth-of-type(6) {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t`}\n\n\t&::before {\n\t\tbackground: linear-gradient(\n\t\t\t135deg,\n\t\t\t${color(\"greenBright\", 4)} 0%,\n\t\t\t${color(\"greenBright\", 4)} 50%,\n\t\t\t${color(\"white\")} 50%,\n\t\t\t${color(\"white\")} 100%\n\t\t);\n\t\tbottom: 0;\n\t\tcontent: \"\";\n\t\theight: 18px;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttransform: scale(1);\n\t\ttransform-origin: 100% 100%;\n\t\ttransition: transform 250ms;\n\t\twidth: 18px;\n\n\t\t${media.md`\n\t\t\theight: 25px;\n\t\t\twidth: 25px;\n\t\t`}\n\n\t\t${media.lg`\n\t\t\theight: 32px;\n\t\t\twidth: 32px;\n\t\t`}\n\t}\n\n\t&:hover {\n\t\t&::before {\n\t\t\ttransform: scale(0);\n\t\t}\n\t}\n`;\n","import React from \"react\";\nimport { Wrapper, Container } from \"@components/Grid\";\nimport { WhyKmContent, WhyKmIntro, WhyKmBubbles, WhyKmBubble } from \"./styles\";\n\nconst WhyKm = ({ withIntro = true }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{withIntro && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t

Valitse Kiinteistömaailma

\n\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\tKutsumalla välittäjämme kotiisi saat arvion asuntosi arvosta ja kuulet, miten sitä\n\t\t\t\t\t\t\t\tkannattaa lähteä markkinoimaan.\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\tKiinteistömaailman välittäjien arviot ovat toteutuneet viime vuosina 98 prosentin\n\t\t\t\t\t\t\t\tvarmuudella.\n\t\t\t\t\t\t\t

\n\t\t\t\t\t\t
\n\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t\tKaikki alkaa Kotikäynnistä\n\n\t\t\t\t\t\tKoko ketjun myyntivoima tukenasi\n\n\t\t\t\t\t\tOma Välittäjä tukenasi\n\n\t\t\t\t\t\tVideoesittelyt kertovat kuvia enemmän\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tKolmanneksi suurin asuntoportaali\n\t\t\t\t\t\t\n\n\t\t\t\t\t\tTarjouskaupalla oikea hinta nopeasti\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n\nexport default WhyKm;\n","import styled, { css } from \"styled-components\";\nimport { color, textStyles, media, grid, buttons } from \"@utils/style-utils\";\n\nexport const Cards = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\n\t@supports (display: grid) {\n\t\tdisplay: grid;\n\t\tgrid-gap: ${grid.gutter}px;\n\t\tgrid-template-columns: 100%;\n\n\t\t${media.md`\n\t\t\tgrid-template-columns: repeat(2, 1fr);\n\t\t`}\n\n\t\t${media.ml`\n\t\t\tgrid-template-columns: repeat(4, 1fr);\n\t\t`}\n\n\t\t.article-card {\n\t\t\tmargin: 0 !important;\n\t\t}\n\n\t\t.has-image {\n\t\t\t${media.md`\n\t\t\t\tgrid-column: span 2;\n\t\t\t`}\n\t\t}\n\t}\n`;\n\nexport const Card = styled.div.attrs(props => ({\n\tclassName: props.hasImage ? \"has-image\" : \"\",\n}))`\n\tbackground: ${color(\"white\")};\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-radius: 4px;\n\tbox-shadow: 0px 20px 14px -16px rgba(0, 0, 0, 0.05);\n\tflex-basis: 100%;\n\tmargin-bottom: ${grid.gutterSmall}px;\n\toverflow: hidden;\n\ttransition: border-color 200ms, box-shadow 200ms, transform 150ms;\n\ttransform: scale(1);\n\n\t${media.md`\n\t\tflex-basis: calc((100% - ${grid.gutterSmall}px) / 2);\n\n\t\t&:nth-of-type(odd) {\n\t\t\tmargin-right: ${grid.gutterSmall}px;\n\t\t}\n\n\t\t&:last-of-type {\n\t\t\tmargin-right: 0;\n\t\t}\n\t`}\n\n\t${media.lgx`\n\t\tflex-basis: calc((100% - ${grid.gutterSmall * 3}px) / 4);\n\n\t\t&:nth-of-type(2) {\n\t\t\tmargin-right: ${grid.gutterSmall}px;\n\t\t}\n\t`}\n\n\t${media.xl`\n\t\tflex-basis: calc((100% - ${grid.gutter * 3}px) / 4);\n\n\t\t&:nth-of-type(odd),\n\t\t&:nth-of-type(2) {\n\t\t\tmargin-right: ${grid.gutter}px;\n\t\t}\n\n\t\t&:last-of-type {\n\t\t\tmargin-right: 0;\n\t\t}\n\t`}\n\n\t${props =>\n\t\tprops.hasImage &&\n\t\tcss`\n\t\t${media.md`\n\t\t\tflex-basis: 100%;\n\n\t\t\t@media (max-width: 1120px) {\n\t\t\t\t&.has-image.article-card {\n\t\t\t\t\tmargin-right: 0;\n\t\t\t\t}\n\n\t\t\t\t+ .article-card:not(.has-image) {\n\t\t\t\t\tmargin-right: ${grid.gutterSmall}px;\n\n\t\t\t\t\t+ .article-card:not(.has-image) {\n\t\t\t\t\t\tmargin-right: 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t`}\n\n\t\t${media.lgx`\n\t\t\tflex-basis: calc((100% - ${grid.gutterSmall}px) / 2);\n\n\t\t\t${Title},\n\t\t\t${TextPreview} {\n\t\t\t\twidth: calc(50% - 47px);\n\t\t\t}\n\t\t`}\n\n\t\t${media.xl`\n\t\t\tflex-basis: calc((100% - ${grid.gutter}px) / 2);\n\n\t\t\t${Title},\n\t\t\t${TextPreview} {\n\t\t\t\twidth: calc(50% - 52px);\n\t\t\t}\n\t\t`}\n\t`}\n\n\ta {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\theight: 100%;\n\t\tpadding: 40px 32px 30px;\n\t\tposition: relative;\n\t\ttext-decoration: none;\n\n\t\t&::after {\n\t\t\tbackground-image: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 70%);\n\t\t\tcontent: '';\n\t\t\tdisplay: block;\n\t\t\theight: 100%;\n\t\t\tposition: absolute;\n\t\t\tright: 0;\n\t\t\ttop: 0;\n\t\t\twidth: 40px;\n\t\t}\n\t}\n\n\t&:hover {\n\t\tbox-shadow: 0px 20px 14px -15px rgba(0, 0, 0, 0.15);\n\t\tborder-color: ${color(\"greenBasic\", 4)};\n\t}\n\n\t&:active {\n\t\tbox-shadow: 0px 8px 14px -16px rgba(0, 0, 0, 0.05);\n\t\ttransform: scale(0.98);\n\t}\n`;\n\nexport const ImageContainer = styled.span`\n\tdisplay: block;\n\tposition: relative;\n\twidth: 100%;\n\n\t${media.lgx`\n\t\tbottom: 40px;\n\t\tmax-width: calc(50% - 15px);\n\t\toverflow: hidden;\n\t\tposition: absolute;\n\t\tright: 32px;\n\t\ttop: 40px;\n\t`}\n\n\t${media.xl`\n\t\tmax-width: calc(50% - 20px);\n\t`}\n\n\timg {\n\t\tdisplay: block;\n\t\tmargin-bottom: 20px;\n\t\twidth: 100%;\n\n\t\t${media.lgx`\n\t\t\tleft: 0;\n\t\t\tmargin-bottom: 0;\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\ttransform: translateY(-50%);\n\t\t`}\n\t}\n`;\n\nexport const Title = styled.div`\n\tmargin: 0 0 30px;\n\n\t${media.md`\n\t\tmargin-bottom: 35px;\n\t`}\n\n\t${media.lg`\n\t\tmargin-bottom: 45px;\n\t`}\n\n\th3 {\n\t\t${textStyles.H3Condensed};\n\t\tmargin: 0;\n\t}\n`;\n\nexport const TextPreview = styled.p`\n\t${textStyles.PSmall}\n\tcolor: ${color(\"grey\", 2)};\n\tflex-grow: 3;\n\tmargin: 0 0 30px;\n`;\n\nexport const ReadMore = styled.span`\n\t${buttons.textLinkPrimary}\n\tdisplay: block;\n\n\t&::after {\n\t\topacity: 0;\n\t\ttransform: translateX(-4px);\n\t\ttransition: transform 150ms, opacity 150ms;\n\t}\n\n\t${Card}:hover & {\n\t\t&::after {\n\t\t\topacity: 1;\n\t\t\ttransform: translateX(0);\n\t\t}\n\t}\n`;\n","import React, { useRef, useState, useEffect } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nimport { Cards, Card, Title, TextPreview, ReadMore, ImageContainer } from \"./styles\";\nimport debounce from \"lodash-es/debounce\";\nimport { filterXSS } from \"xss\";\nimport isEmpty from \"lodash-es/isEmpty\";\nimport Image from \"@components/Image\";\nimport isArray from \"lodash-es/isArray\";\n\nconst breakpoint = 1120;\n\nimport { truncate, stripTags } from \"@utils/string-utils\";\n\nconst hasImage = (item): boolean => !isEmpty(item.tile_image) && !isEmpty(item.tile_image.src);\nconst hasNotImage = (item): boolean => isEmpty(item.tile_image) || isEmpty(item.tile_image.src);\nconst articlesWithImages = articles => (!isEmpty(articles) && isArray(articles) ? articles.filter(hasImage) : []);\n\nconst calculateTallestTitle = (items: HTMLDivElement[]) => {\n\tlet tallest = 0;\n\n\tfor (const item of items) {\n\t\tif (item && item.children) {\n\t\t\tconst { height } = item.children[0].getBoundingClientRect();\n\t\t\ttallest = height > tallest ? height : tallest;\n\t\t}\n\t}\n\n\treturn tallest;\n};\n\nconst getTextPreview = ({ meta, articleContent, leadParagraph }): string => {\n\tconst { description } = meta || { description: null };\n\n\tif (description) {\n\t\treturn description;\n\t} else if (leadParagraph) {\n\t\treturn truncate(stripTags(leadParagraph));\n\t} else if (articleContent) {\n\t\treturn truncate(stripTags(articleContent));\n\t}\n\n\treturn \"\";\n};\n\nconst ArticleCards = ({ articles }) => {\n\tif (isEmpty(articles)) {\n\t\treturn null;\n\t}\n\tlet isRendering = true;\n\tconst ref = useRef(null);\n\tconst [tallest, setTallest] = useState(null);\n\n\tconst makeSameHeight = (elems: HTMLDivElement[]) => {\n\t\tif (elems && elems.length > 0 && isRendering) {\n\t\t\tif (window.innerWidth > breakpoint) {\n\t\t\t\tsetTallest(calculateTallestTitle(elems));\n\t\t\t} else {\n\t\t\t\tsetTallest(null);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst onResize = debounce(() => {\n\t\tif (ref && ref.current && isRendering) {\n\t\t\tconst elems = [...ref.current.querySelectorAll(\".article-card-title\")];\n\t\t\tmakeSameHeight(elems);\n\t\t}\n\t}, 100);\n\n\tuseEffect(() => {\n\t\twindow.addEventListener(\"resize\", onResize);\n\t\tif (ref && ref.current && isRendering) {\n\t\t\tconst elems = [...ref.current.querySelectorAll(\".article-card-title\")];\n\t\t\tmakeSameHeight(elems);\n\t\t}\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"resize\", onResize);\n\t\t};\n\t}, [ref]);\n\n\tuseEffect(() => {\n\t\tisRendering = true;\n\n\t\treturn () => {\n\t\t\tisRendering = false;\n\t\t};\n\t}, []);\n\n\tlet articlesToShow = isArray(articles) && !isEmpty(articles) ? articles.slice(0, 4) : [];\n\n\tconst withImages = articlesWithImages(articles);\n\n\tif (!isEmpty(withImages)) {\n\t\tif (withImages.length === 1) {\n\t\t\t/* Show only 3 articles if one has image */\n\t\t\tconst articlesWithoutImages = articles.filter(hasNotImage).slice(0, 2);\n\t\t\tarticlesToShow = [withImages[0], ...articlesWithoutImages];\n\t\t} else if (withImages.length >= 2) {\n\t\t\t/* Show only 2 articles if 2 or more have images */\n\t\t\tarticlesToShow = [withImages[0], withImages[1]];\n\t\t}\n\t}\n\n\treturn (\n\t\t\n\t\t\t{articlesToShow.map(\n\t\t\t\t(\n\t\t\t\t\t{ name, meta, articleContent, leadParagraph, canonicalPath, canonicalUrl, urlPart, tile_image },\n\t\t\t\t\tindex\n\t\t\t\t) => (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<h3>{name.replace(\"/\", \"/\\u200B\")}</h3>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{!isEmpty(tile_image) && !isEmpty(tile_image.src) && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tLue lisää\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t)\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport default ArticleCards;\n","import styled from \"styled-components\";\nimport { buttons } from \"@utils/style-utils\";\n\nconst TextButton = styled.button`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tborder: 0;\n\tbackground: rgba(255, 255, 255, 0);\n\n\t${buttons.textLinkPrimary}\n`;\n\nexport default TextButton;\n","export interface ISuggestionCategory {\n\tindex?: number;\n\tname: string;\n\ttype: string;\n\tvalues: any[];\n}\n\nconst suggestionCategories: ISuggestionCategory[] = [\n\t{\n\t\tname: \"Lääni\",\n\t\ttype: \"region\",\n\t\tvalues: [],\n\t},\n\t{\n\t\tname: \"Maakunta\",\n\t\ttype: \"county\",\n\t\tvalues: [],\n\t},\n\t{\n\t\tname: \"Kunta\",\n\t\ttype: \"municipality\",\n\t\tvalues: [],\n\t},\n\t{\n\t\tname: \"Kaupunki\",\n\t\ttype: \"city\",\n\t\tvalues: [],\n\t},\n\t{\n\t\tname: \"Kaupunginosa/alue\",\n\t\ttype: \"district\",\n\t\tvalues: [],\n\t},\n\t{\n\t\tname: \"Osoite\",\n\t\ttype: \"address\",\n\t\tvalues: [],\n\t},\n\t{\n\t\tname: \"Postinumero\",\n\t\ttype: \"postcode\",\n\t\tvalues: [],\n\t},\n];\n\nexport default suggestionCategories;","import styled from \"styled-components\";\nimport { color, boxShadow } from \"@utils/style-utils\";\n\nexport const SearchInput = styled.div`\n\tposition: relative;\n\n\tinput {\n\t\tpadding: 10px 30px 10px 16px;\n\t\twidth: 306px;\n\t}\n\n\t&.has-addresses input {\n\t\t::placeholder {\n\t\t\tcolor: ${color(\"grey\", 1)};\n\t\t}\n\t}\n\n\t.icon {\n\t\tcolor: ${color(\"grey\", 4)};\n\t\tdisplay: inline-block;\n\t\tfont-size: 14px;\n\t\tright: 14px;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\ttransform: translateY(-50%);\n\n\t\t&.searching {\n\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t}\n\n\t\tsvg {\n\t\t\tanimation-duration: 500ms;\n\t\t\tmax-width: 14px;\n\t\t}\n\t}\n`;\n\nexport const SearchResults = styled.div`\n\tbackground: ${color(\"white\")};\n\tbox-shadow: ${boxShadow.basic};\n\tleft: 0;\n\tposition: absolute;\n\ttop: 100%;\n\twidth: 100%;\n\tz-index: 99;\n`;\n\nexport const SelectedAddresses = styled.div`\n\tbackground: ${color(\"white\")};\n\tbox-shadow: ${boxShadow.basic};\n\tleft: 0;\n\tpadding: 24px;\n\tposition: absolute;\n\ttop: 100%;\n\twidth: 100%;\n\tz-index: 99;\n`;\n\nexport const SelectedTitle = styled.div`\n\tcolor: ${color(\"grey\", 1)};\n\tfont-size: 17px;\n\tfont-weight: 500;\n\tline-height: 1;\n\tmargin-bottom: 24px;\n`;\n\nexport const AddressGroup = styled.div`\n\tpadding: 10px 0;\n`;\n\nexport const AddressGroupTitle = styled.div`\n\tcolor: ${color(\"grey\", 4)};\n\tfont-size: 13px;\n\tfont-weight: bold;\n\tmargin-bottom: 8px;\n\ttext-transform: uppercase;\n`;\n\nexport const AddressGroupItem = styled.div`\n\tcolor: ${color(\"grey\", 2)};\n\tfont-size: 17px;\n\n\tlabel .box {\n\t\tbackground: ${color(\"greenBright\", 4)};\n\t\tborder-color: ${color(\"greenBright\", 1)};\n\n\t\ti {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n`;\n","import React, { PureComponent, RefObject } from \"react\";\nimport TextInput from \"@components/Form/TextInput\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\nimport axios from \"axios\";\nimport categories, { ISuggestionCategory } from \"./suggestion-categories\";\n\nimport AddressSearchResults from \"@components/Search/AddressSearchResults\";\nimport Checkbox from \"@components/Form/Checkbox\";\nimport isEqual from \"lodash-es/isEqual\";\nimport clsx from \"clsx\";\nimport { hasWindow } from \"@utils\";\nimport isEmpty from \"lodash-es/isEmpty\";\nimport { IApplicationState } from \"@redux\";\n\nimport {\n\tSearchInput,\n\tSelectedAddresses,\n\tSelectedTitle,\n\tAddressGroup,\n\tAddressGroupTitle,\n\tAddressGroupItem,\n} from \"./styles\";\nimport { connect } from \"react-redux\";\nimport { getAddresses } from \"@redux/apartment-search/apartment-search.selectors\";\n\ninterface IAddressSuggestion {\n\taddressTypeName: string;\n\tindex?: number;\n\ttype: string;\n\tvalue?: string;\n}\n\ninterface IProps {\n\tonSelect?: (selections?: any) => void;\n\textraParams?: object;\n\tisProperty?: boolean;\n\tgrey?: boolean;\n\tselectedAddresses?: any[];\n\t[key: string]: any;\n}\n\ninterface IState {\n\tisOpen: boolean;\n\tresults: any;\n\tresultsOpen: boolean;\n\tselectedAddresses: any[];\n\ttimestamp?: number;\n\t[key: string]: any;\n}\n\nclass AddressSearch extends PureComponent {\n\tprotected suggestionCategories: ISuggestionCategory[] = [...categories];\n\tprotected ref: RefObject = React.createRef();\n\tprotected inputRef: RefObject = React.createRef();\n\tprotected isRendering: boolean = true;\n\tprotected initialPlaceholder: string = \"Kirjoita kaupunki, katu tai postinumero\";\n\n\tconstructor(props: IProps) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tisOpen: false,\n\t\t\tresults: [],\n\t\t\tresultsOpen: false,\n\t\t\tselectedAddresses: [],\n\t\t};\n\n\t\tthis.reset = this.reset.bind(this);\n\t\tthis.parseAddressSuggestions = this.parseAddressSuggestions.bind(this);\n\t\tthis.getAddressSuggestionsCount = this.getAddressSuggestionsCount.bind(this);\n\t\tthis.setSearchTerm = this.setSearchTerm.bind(this);\n\t\tthis.search = this.search.bind(this);\n\t\tthis.checkForClickOutside = this.checkForClickOutside.bind(this);\n\t\tthis.addAddressSelection = this.addAddressSelection.bind(this);\n\t\tthis.removeAddressSelection = this.removeAddressSelection.bind(this);\n\t\tthis.setOpen = this.setOpen.bind(this);\n\t\tthis.createSelectedAddressGroups = this.createSelectedAddressGroups.bind(this);\n\t\tthis.createPlaceholder = this.createPlaceholder.bind(this);\n\t\tthis.onFocus = this.onFocus.bind(this);\n\t}\n\n\tpublic reset() {\n\t\tthis.setState({\n\t\t\tisOpen: false,\n\t\t\tresults: [],\n\t\t\tresultsOpen: false,\n\t\t\tselectedAddresses: [],\n\t\t});\n\t}\n\n\tparseAddressSuggestions(suggestions): ISuggestionCategory[] {\n\t\tfor (let i = 0, l = this.suggestionCategories.length; i < l; i++) {\n\t\t\tconst suggestionCategory = this.suggestionCategories[i];\n\t\t\tconst addressType = suggestionCategory.type;\n\t\t\tconst addressTypeName = suggestionCategory.name;\n\t\t\tsuggestionCategory.values.length = 0;\n\n\t\t\tfor (let j = 0; j < suggestions.length; j++) {\n\t\t\t\tconst suggestion = suggestions[j];\n\t\t\t\tif (suggestion.type === addressType) {\n\t\t\t\t\tsuggestion.index = j;\n\t\t\t\t\tsuggestion.addressTypeName = addressTypeName;\n\t\t\t\t\tsuggestionCategory.values.push(suggestion);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.suggestionCategories;\n\t}\n\n\tgetAddressSuggestionsCount() {\n\t\tlet count = 0;\n\t\tthis.suggestionCategories.forEach(category => {\n\t\t\tcount += category.values.length;\n\t\t});\n\t\treturn count;\n\t}\n\n\tgetAddressByAssignedIndex(index: number) {\n\t\tfor (const category of this.suggestionCategories) {\n\t\t\tconst values = category.values;\n\n\t\t\tfor (const value of values) {\n\t\t\t\tif (value.index === index) {\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tsetOpen(state?: boolean) {\n\t\tthis.setState({\n\t\t\t...this.state,\n\t\t\tisOpen: true,\n\t\t});\n\t}\n\n\tasync setSearchTerm(value: string) {\n\t\tif (!value) {\n\t\t\tthis.setState({\n\t\t\t\t...this.state,\n\t\t\t\tresults: [],\n\t\t\t\tresultsOpen: false,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState({\n\t\t\t...this.state,\n\t\t\tisSearching: true,\n\t\t});\n\n\t\tconst results = await this.search(value);\n\n\t\tif (!this.isRendering) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState({\n\t\t\tcount: this.getAddressSuggestionsCount(),\n\t\t\tisOpen: true,\n\t\t\tisSearching: false,\n\t\t\tresults,\n\t\t\tresultsOpen: true,\n\t\t\ttimestamp: new Date().getMilliseconds() /* this will make component re-render without need for very deep check */,\n\t\t});\n\t}\n\n\tasync search(query: string) {\n\t\ttry {\n\t\t\tconst params = {\n\t\t\t\tkey: query,\n\t\t\t\tlimit: 50,\n\t\t\t\t...this.props.extraParams,\n\t\t\t};\n\t\t\tconst response = await axios.get(`/api/km/KM/search`, { params });\n\t\t\tconst {\n\t\t\t\tdata: { results },\n\t\t\t} = response.data;\n\n\t\t\treturn this.parseAddressSuggestions(results);\n\t\t} catch (e) {\n\t\t\tconsole.log(\"Failed to search\", e);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tcheckForClickOutside(event: MouseEvent | TouchEvent) {\n\t\tif (!this.state.isOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst target = event.target as HTMLElement;\n\t\tif (!this.ref.current || this.ref.current.contains(target)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState({\n\t\t\t...this.state,\n\t\t\tisOpen: false,\n\t\t\tresultsOpen: false,\n\t\t});\n\t}\n\n\taddAddressSelection(index: number) {\n\t\tconst selection = this.getAddressByAssignedIndex(index);\n\t\tconst input = this.ref.current.querySelector(\"input\");\n\t\tinput.value = \"\";\n\n\t\tif (!selection) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet exists: boolean = false;\n\n\t\t/* Making sure the same item cannot be added twice */\n\t\tif (this.state.selectedAddresses.length > 0) {\n\t\t\tthis.state.selectedAddresses.forEach(addr => {\n\t\t\t\tif (isEqual(addr, selection)) {\n\t\t\t\t\texists = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (exists) {\n\t\t\tthis.setState({\n\t\t\t\t...this.state,\n\t\t\t\tresultsOpen: false,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState(\n\t\t\t{\n\t\t\t\t...this.state,\n\t\t\t\tisOpen: true,\n\t\t\t\tresultsOpen: false,\n\t\t\t\tselectedAddresses: [...this.state.selectedAddresses, selection],\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tif (this.props.onSelect) {\n\t\t\t\t\tthis.props.onSelect(this.state.selectedAddresses);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\tremoveAddressSelection(value: string) {\n\t\tconst newAddresses = this.state.selectedAddresses.filter(addr => addr.value !== value);\n\n\t\tthis.setState(\n\t\t\t{\n\t\t\t\t...this.state,\n\t\t\t\tselectedAddresses: newAddresses,\n\t\t\t},\n\t\t\t() => this.props.onSelect(this.state.selectedAddresses)\n\t\t);\n\t}\n\n\tcreateSelectedAddressGroups() {\n\t\tconst { selectedAddresses } = this.state;\n\n\t\ttry {\n\t\t\tif (isEmpty(selectedAddresses) || isEmpty(selectedAddresses.filter(item => !!item))) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst addressGroups = selectedAddresses.reduce(\n\t\t\t\t(acc, address, i) => {\n\t\t\t\t\tconst { type, addressTypeName: typeName, value, index }: IAddressSuggestion = address;\n\n\t\t\t\t\tif (!acc.groups[type]) {\n\t\t\t\t\t\tacc.groups[type] = { label: typeName, items: [] };\n\t\t\t\t\t}\n\n\t\t\t\t\tacc.groups[type].items.push({ type, typeName, value, index });\n\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{ groups: {} }\n\t\t\t).groups;\n\n\t\t\tconst addressGroupArray = [];\n\n\t\t\tfor (const group in addressGroups) {\n\t\t\t\tif (group) {\n\t\t\t\t\taddressGroupArray.push(addressGroups[group]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn addressGroupArray.map(({ label, items }, index) => (\n\t\t\t\t\n\t\t\t\t\t{label}\n\t\t\t\t\t{items.map((item: IAddressSuggestion, i: number) => (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t this.removeAddressSelection(item.value)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\t\n\t\t\t));\n\t\t} catch (e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tcreatePlaceholder() {\n\t\tconst { selectedAddresses, isOpen } = this.state;\n\n\t\tif (isOpen) {\n\t\t\treturn this.initialPlaceholder;\n\t\t}\n\n\t\tif (selectedAddresses && selectedAddresses.length > 0) {\n\t\t\tconst values = selectedAddresses.map((addr: IAddressSuggestion) => addr.value);\n\n\t\t\treturn values.join(\" + \");\n\t\t}\n\n\t\treturn this.initialPlaceholder;\n\t}\n\n\tonFocus() {\n\t\tthis.setOpen(true);\n\t}\n\n\tcomponentDidMount() {\n\t\tdocument.addEventListener(\"mousedown\", this.checkForClickOutside);\n\t\tdocument.addEventListener(\"touchstart\", this.checkForClickOutside);\n\n\t\tthis.setState({\n\t\t\t...this.state,\n\t\t\tselectedAddresses: this.props.selectedAddresses,\n\t\t});\n\t}\n\n\tcomponentDidUpdate(prevProps: IProps) {\n\t\tif (!isEqual(prevProps.selectedAddresses, this.props.selectedAddresses)) {\n\t\t\tthis.setState({\n\t\t\t\t...this.state,\n\t\t\t\tselectedAddresses: this.props.selectedAddresses,\n\t\t\t});\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tthis.isRendering = false;\n\t\tdocument.removeEventListener(\"mousedown\", this.checkForClickOutside);\n\t\tdocument.removeEventListener(\"touchstart\", this.checkForClickOutside);\n\t}\n\n\trender() {\n\t\tconst { grey } = this.props;\n\t\tconst { count, isOpen, isSearching, results, resultsOpen, selectedAddresses, timestamp } = this.state;\n\n\t\treturn (\n\t\t\t 0 && !isOpen && \"has-addresses\")}\n\t\t\t\tref={this.ref}\n\t\t\t>\n\t\t\t\t this.setSearchTerm(e.target.value)}\n\t\t\t\t\tonFocus={this.onFocus}\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t/>\n\t\t\t\t\n\t\t\t\t\t{isSearching && }\n\t\t\t\t\t{!isSearching && }\n\t\t\t\t\n\t\t\t\t{resultsOpen && results && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t{!resultsOpen && isOpen && selectedAddresses.length > 0 && (\n\t\t\t\t\t\n\t\t\t\t\t\tHakualueesi:\n\t\t\t\t\t\t{this.createSelectedAddressGroups()}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t);\n\t}\n}\n\nconst mapStateToProps = (state: IApplicationState) => ({\n\tselectedAddresses: getAddresses(state),\n});\n\nexport default connect(\n\tmapStateToProps,\n\tnull,\n\tnull,\n\t{ forwardRef: true }\n)(AddressSearch);\n","import styled, { keyframes } from \"styled-components\";\nimport { color, textStyles, fontFamily, buttons, media } from \"@utils/style-utils\";\n\nconst wiggle = keyframes`\n\t0%, 100% {\n\t\ttransform: rotate(0deg);\n\t\ttransform-origin: 50% 50%;\n\t}\n\t10% {\n\t\ttransform: rotate(2deg);\n\t}\n\t20%, 40%, 60% {\n\t\ttransform: rotate(-4deg);\n\t}\n\t30%, 50%, 70% {\n\t\ttransform: rotate(4deg);\n\t}\n\t80% {\n\t\ttransform: rotate(-2deg);\n\t}\n\t90% {\n\t\ttransform: rotate(2deg);\n\t}\n`;\n\nexport const Item = styled.div.attrs(() => ({\n\tclassName: \"agent-card\",\n}))`\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-radius: 4px;\n\tbox-shadow: 0px 10px 25px -15px rgba(0, 0, 0, 0.1);\n\tcursor: pointer;\n\tpadding: 30px 18px 22px;\n\tposition: relative;\n\ttransition: transform 150ms, box-shadow 150ms, border-color 150ms;\n\ttransform: scale(1);\n\n\t.is-pointer & {\n\t\t&:hover {\n\t\t\tbox-shadow: 0px 12px 25px -15px rgba(0, 0, 0, 0.11);\n\t\t\tborder-color: ${color(\"beige\", 1)};\n\t\t}\n\t}\n\n\t&:active {\n\t\tbox-shadow: 0px 0px 25px -25px rgba(0, 0, 0, 0.05);\n\t\ttransform: scale(0.98);\n\t}\n`;\n\nexport const ItemHeader = styled.div`\n\talign-items: center;\n\tborder-bottom: 1px solid ${color(\"grey\", 6)};\n\tdisplay: flex;\n`;\n\nexport const ItemFooter = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 22px 0 0;\n`;\n\nexport const AgentRecommendation = styled.div`\n\tcolor: ${color(\"grey\", 1)};\n\tdisplay: flex;\n\tfont-weight: 500;\n\tposition: absolute;\n\tright: 18px;\n\ttop: 20px;\n\n\tspan {\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t\tfont-size: 14px;\n\t\tdisplay: inline-block;\n\t\tmargin-right: 7px;\n\n\t\tsvg {\n\t\t\tmax-width: 14px;\n\t\t}\n\t}\n`;\n\nexport const AgentPortrait = styled.div`\n\tmargin-right: 16px;\n\tmax-width: 100px;\n\tposition: relative;\n\twidth: 100%;\n\n\t${media.lg`\n\t\tmax-width: 126px;\n\t`}\n\n\t&::before {\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\tpadding-bottom: 132.5396825%;\n\t\twidth: 100%;\n\t}\n\n\timg {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\t/* opacity: 0; */\n\t\t/* transition: opacity 300ms; */\n\t\twidth: 100%;\n\n\t\t&.loaded {\n\t\t\t/* opacity: 1; */\n\t\t}\n\n\t\t&[src*=\"backup\"] {\n\t\t\theight: 100%;\n\t\t}\n\t}\n`;\n\nexport const AgentName = styled.h5`\n\t${textStyles.MicroTextCaps}\n\tcolor: ${color(\"grey\", 1)};\n\tmargin: 0 0 4px;\n`;\n\nexport const AgentTitle = styled.p`\n\t${textStyles.MicroText};\n\tcolor: ${color(\"grey\", 2)};\n\tmargin: 0 0 25px;\n`;\n\nexport const AgentExtraTitle = styled(AgentTitle)`\n\tmargin-top: -15px;\n\tmin-height: 25px;\n`;\n\nexport const AgentAgency = styled.p`\n\t${textStyles.MicroText};\n\tcolor: ${color(\"grey\", 2)};\n\tmargin: -25px 0 25px;\n`;\n\nexport const AgentPhone = styled.span`\n\tcolor: ${color(\"greenBright\", 1)};\n\tcursor: pointer;\n\tfont-family: ${fontFamily.condensed};\n\tfont-size: 20px;\n\tfont-weight: 500;\n\n\t.icon {\n\t\tdisplay: inline-block;\n\t\tmargin-right: 16px;\n\t\tposition: relative;\n\n\t\tsvg {\n\t\t\tmax-width: 20px;\n\t\t}\n\t}\n\n\ta {\n\t\tcolor: inherit;\n\t\ttext-decoration: none;\n\t}\n\n\t.is-pointer & {\n\t\t&:hover {\n\t\t\tcolor: ${color(\"greenBright\", 2)};\n\n\t\t\t.icon {\n\t\t\t\tanimation: ${wiggle} 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) both;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const AgentEmail = styled.p`\n\t${textStyles.MicroText}\n\tmargin: 0;\n\n\tspan {\n\t\tdisplay: block;\n\t}\n\n\ta {\n\t\tcolor: ${color(\"grey\", 2)};\n\t\ttext-decoration: none;\n\t\ttransition: color 150ms;\n\n\t\t.is-pointer & {\n\t\t\t&:hover {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const ReadMore = styled.span`\n\t${buttons.textLinkWithColor(color(\"beige\", 1))}\n\n\t&::after {\n\t\tdisplay: none;\n\t}\n`;\n","import React from \"react\";\nimport { AgentImage } from \"@components/Agent\";\nimport Phone from \"@components/Info/Phone\";\nimport Email from \"@components/Info/Email\";\n\nimport {\n\tAgentAgency,\n\tAgentEmail,\n\tAgentExtraTitle,\n\tAgentName,\n\tAgentPhone,\n\tAgentPortrait,\n\tAgentRecommendation,\n\tAgentTitle,\n\tItem,\n\tItemFooter,\n\tItemHeader,\n\tReadMore,\n} from \"./styles\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\ninterface IProps {\n\tagency?: IAgency;\n\tagent: IAgent;\n\t[key: string]: any;\n}\n\nconst AgentListItem = (props: IProps) => {\n\tif (!props.agent) {\n\t\treturn null;\n\t}\n\tconst {\n\t\tagency,\n\t\tagent,\n\t\tagentImageSize = \"w_117,h_155,c_zoom\",\n\t\thalfBody = false,\n\t\tlazy = true,\n\t} = props;\n\tconst {\n\t\tdegrees,\n\t\temail,\n\t\textraTitle,\n\t\tfirstName,\n\t\tlastName,\n\t\tname,\n\t\tphone,\n\t\trecommendationPercentage,\n\t\ttelPhone,\n\t\ttitle,\n\t} = agent;\n\n\tconst handleClick = () => {\n\t\tif (props.onClick) {\n\t\t\tprops.onClick(agent);\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t\t\t{!!recommendationPercentage && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{recommendationPercentage}%\n\t\t\t\t\n\t\t\t)}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t{firstName && lastName ? `${firstName} ${lastName}` : name}\n\t\t\t\t\t\n\t\t\t\t\t\t{title && {title}}\n\t\t\t\t\t\t{degrees && (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{title ? \", \" : \"\"}\n\t\t\t\t\t\t\t\t{degrees}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t{extraTitle && {extraTitle}}\n\t\t\t\t\t{agency && {agency.marketingName ? `Kiinteistömaailma ${agency.marketingName}` : agency.name}}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tLue lisää\n\t\t\t\t\n\t\t\t\n\t\t
\n\t);\n};\n\nexport default AgentListItem;\n","import { useState, useEffect } from 'react';\nimport { hasWindow } from '@utils';\n\n// Hook\nfunction useOnScreen(ref, rootMargin = '0px', onlyOnce: boolean = true) {\n\t// State and setter for storing whether element is visible\n\tconst [ isIntersecting, setIntersecting ] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!hasWindow) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ('IntersectionObserver' in window) {\n\t\t\tconst observer = new IntersectionObserver(([ entry ]) => {\n\t\t\t\tsetIntersecting(entry.isIntersecting);\n\t\t\t\tif (entry.isIntersecting && ref.current && onlyOnce) {\n\t\t\t\t\tobserver.unobserve(ref.current);\n\t\t\t\t}\n\t\t\t}, { rootMargin });\n\n\t\t\tif (ref.current) {\n\t\t\t\tobserver.observe(ref.current);\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tobserver.unobserve(ref.current);\n\t\t\t};\n\t\t} else {\n\t\t\tsetIntersecting(true);\n\t\t}\n\t}, []);\n\n\treturn isIntersecting;\n}\n\nexport default useOnScreen;\n","import axios from \"axios\";\nimport queryString from \"query-string\";\n\nconst API = \"/api/km/KMSite/agentSearch?notuples=1&random=1\";\n\nasync function fetchAgents({ name = null, postCode = null }, api:string = API) {\n\tlet query = \"\";\n\n\tif (name) {\n\t\tquery += \"&name=\" + name;\n\t}\n\n\tif (postCode) {\n\t\tquery += \"&postCode=\" + postCode;\n\t}\n\n\ttry {\n\t\tconst url = `${api}${query}`;\n\t\tconst response = await fetchAPI(url);\n\t\treturn response.data;\n\t} catch (e) {\n\t\tconsole.log(\"errored agent search\", e);\n\t}\n}\n\nasync function getAgentByKey(key: string) {\n\ttry {\n\t\tconst response = await fetchAPI(\"/api/km/KMSite/getAgent?key=\" + key);\n\t\treturn response.data;\n\t} catch (e) {\n\t\tconsole.log(\"Fetching agent failed\", e);\n\t}\n}\n\ninterface IAgentsByNameAreaOrDegreesParams {\n\tdegrees?: \"degree\" | undefined;\n\tlanguage?: string;\n\tname?: string;\n\tpostCode?: string | number;\n}\n\nasync function getAgentsByNameAreaOrDegrees(params: IAgentsByNameAreaOrDegreesParams) {\n\tconst { language, ...restParams } = params;\n\n\tconst data = {\n\t\t...restParams,\n\t};\n\n\tlet query = queryString.stringify(data);\n\n\tif (language) {\n\t\tquery += \"&language[]=\" + language;\n\t}\n\n\ttry {\n\t\tconst url = `${API}&${query}`;\n\t\tconst response = await fetchAPI(url);\n\t\treturn response.data;\n\t} catch (e) {\n\t\tconsole.log(\"errored agent search\", e);\n\t}\n}\n\nasync function getAgentsByHouseType(params) {\n\tconst { rooms, ...restParams } = params;\n\n\tconst data = {\n\t\t...restParams,\n\t};\n\n\tlet query = queryString.stringify(data);\n\n\tif (rooms) {\n\t\tfor (const room of rooms) {\n\t\t\tif (room && room.value) {\n\t\t\t\tquery += \"&roomAmount[]=\" + room.value;\n\t\t\t}\n\t\t}\n\t}\n\n\ttry {\n\t\tconst url = `/api/km/KMSite/agentSearchBySales?${query}`;\n\t\tconst response = await fetchAPI(url);\n\t\treturn response.data;\n\t} catch (e) {\n\t\tconsole.log(\"errored agent search\", e);\n\t}\n}\n\nasync function fetchAPI(url: string) {\n\tconst request = await axios.get(url);\n\n\treturn request;\n}\n\nexport default {\n\tfetchAPI,\n\tfetchAgents,\n\tgetAgentsByHouseType,\n\tgetAgentsByNameAreaOrDegrees,\n\tgetAgentByKey,\n};\n","import styled from 'styled-components';\nimport { color, boxShadow } from '@utils/style-utils';\n\nexport const SearchResults = styled.div`\n\tbackground: ${ color('white') };\n\tbox-shadow: ${ boxShadow.basic };\n\tleft: 0;\n\tmax-height: 350px;\n\toverflow: auto;\n\t-webkit-overflow-scrolling: touch;\n\tposition: absolute;\n\ttop: 100%;\n\twidth: 100%;\n\tz-index: 99;\n`\n\nexport const Category = styled.div`\n\tborder-bottom: 1px solid ${ color('grey', 5) };\n\tpadding: 16px 0;\n`\n\nexport const CategoryTitle = styled.div`\n\tcolor: ${ color('grey', 4) };\n\tfont-size: 13px;\n\tfont-weight: bold;\n\tmargin-bottom: 5px;\n\tpadding: 3px 21px;\n\ttext-transform: uppercase;\n`\n\nexport const CategoryValues = styled.div`\n\n`\n\nexport const CategoryItem = styled.div`\n\tbackground: ${ props => props.active ? color('greenBright', 4) : color('white') };\n\tcolor: ${ props => props.active ? color('grey', 1) : color('grey', 2) };\n\tcursor: pointer;\n\tfont-size: 17px;\n\tline-height: 1;\n\tpadding: 3px 21px;\n\n\t&:hover {\n\t\tbackground: ${ color('greenBright', 4) };\n\t\tcolor: ${ color('grey', 1) };\n\t}\n`","import React, { Component, RefObject } from \"react\";\nimport { ISuggestionCategory } from \"../AddressSearch/suggestion-categories\";\n\nimport { SearchResults, Category, CategoryTitle, CategoryItem, CategoryValues } from \"./styles\";\n\ninterface IProps {\n\tresults?: any;\n\tcount?: number;\n\ttime?: number;\n\tonSelectedAddress?: (e: any) => void;\n}\n\ninterface IState {\n\tcurrentIndex: number;\n}\n\nclass AddressSearchResults extends Component {\n\tprotected keysToWatch: string[] = [\"ArrowUp\", \"ArrowDown\", \"Enter\"];\n\tprotected ref: RefObject = React.createRef();\n\n\tconstructor(props: IProps) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tcurrentIndex: 0,\n\t\t};\n\n\t\tthis.onKeyDown = this.onKeyDown.bind(this);\n\t\tthis.scrollToActiveElement = this.scrollToActiveElement.bind(this);\n\t}\n\n\tonKeyDown(event: KeyboardEvent) {\n\t\tconst { key } = event;\n\n\t\tif (this.keysToWatch.indexOf(key) === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tconst { currentIndex } = this.state;\n\t\tconst { count } = this.props;\n\n\t\tif (key === \"ArrowDown\") {\n\t\t\tconst newIndex = currentIndex !== count - 1 ? currentIndex + 1 : 0;\n\n\t\t\tthis.setState({\n\t\t\t\tcurrentIndex: newIndex,\n\t\t\t});\n\n\t\t\tthis.scrollToActiveElement();\n\t\t} else if (key === \"ArrowUp\") {\n\t\t\tconst newIndex = currentIndex > 0 ? currentIndex - 1 : count - 1;\n\n\t\t\tthis.setState({\n\t\t\t\tcurrentIndex: newIndex,\n\t\t\t});\n\n\t\t\tthis.scrollToActiveElement();\n\t\t} else if (key === \"Enter\" && currentIndex !== -1) {\n\t\t\tthis.props.onSelectedAddress(currentIndex);\n\t\t}\n\t}\n\n\tscrollToActiveElement() {\n\t\tconst item = this.ref.current.querySelector(\".active\") as HTMLElement;\n\t\tif (!item) {\n\t\t\treturn;\n\t\t}\n\t\tconst { top: itemTop, bottom: itemBottom } = item.getBoundingClientRect();\n\n\t\tconst container = this.ref.current;\n\t\tconst { top: containerTop, bottom: containerBottom } = container.getBoundingClientRect();\n\n\t\tif (itemBottom > containerBottom) {\n\t\t\tcontainer.scrollTop += itemBottom - containerBottom;\n\t\t} else if (itemTop < containerTop) {\n\t\t\tcontainer.scrollTop += itemTop - containerTop;\n\t\t}\n\t}\n\n\tcomponentDidMount() {\n\t\twindow.addEventListener(\"keydown\", this.onKeyDown);\n\t}\n\n\tcomponentWillUnmount() {\n\t\twindow.removeEventListener(\"keydown\", this.onKeyDown);\n\t}\n\n\tgetSnapshotBeforeUpdate(prevProps) {\n\t\tif (prevProps.time !== this.props.time) {\n\t\t\tthis.setState({\n\t\t\t\t...this.state,\n\t\t\t\tcurrentIndex: 0,\n\t\t\t});\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tcomponentDidUpdate(prevProps, prevState, snapshot) {\n\t\t/* Just here because React wants it with getSnapshotBeforeUpdate */\n\t}\n\n\trender() {\n\t\tconst { results } = this.props;\n\t\tconst { currentIndex } = this.state;\n\n\t\treturn (\n\t\t\t\n\t\t\t\t{results\n\t\t\t\t\t.filter((result: ISuggestionCategory) => result.values && result.values.length > 0)\n\t\t\t\t\t.map((result: ISuggestionCategory, i: number) => (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{result.name}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{result.values.map((item, j) => (\n\t\t\t\t\t\t\t\t\t this.props.onSelectedAddress(item.index)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\n\t\t);\n\t}\n}\n\nexport default AddressSearchResults;\n","import axios from \"axios\";\n\nconst API = \"/api/km/KMSite/agencySearch\";\n\nasync function fetchAgencies() {\n\tconst query = { random: true, limit: 1000 };\n\n\ttry {\n\t\tconst response = await fetchAPI(API, query);\n\t\treturn response.data;\n\t} catch (e) {\n\t\tconsole.log(\"errored agent search\", e);\n\t}\n}\n\nasync function fetchAPI(url: string, query: any) {\n\tconst request = await axios.get(url, { params: query });\n\n\treturn request;\n}\n\nexport default {\n\tfetchAPI,\n\tfetchAgencies,\n};\n","import React, { useState, useEffect, Fragment } from \"react\";\nimport ApartmentBlock from \"@components/ApartmentBlock\";\nimport searchService from \"@services/search.service\";\nimport { Slide } from \"react-dynamic-swiper\";\nimport PropertyCarousel from \"@components/PropertyCarousel\";\nimport CarouselPlaceholder from \"@components/PropertyCarousel/placeholder\";\n\nconst PropertiesOnSale = ({ agency, id = \"agent-properties\", title = \"Kohteita myynnissä\" }) => {\n\tif (!agency) {\n\t\treturn null;\n\t}\n\tlet isRendering = true;\n\tconst [properties, setProperties] = useState([]);\n\tconst [fetched, setFetched] = useState(false);\n\n\tconst getProperties = async () => {\n\t\tconst params = {\n\t\t\tagencyKey: agency,\n\t\t\tlimit: 24,\n\t\t\tsort: \"latestPublishTimestamp\",\n\t\t\tsortOrder: \"desc\",\n\t\t\ttype: \"agency\",\n\t\t};\n\n\t\tif (isRendering) {\n\t\t\ttry {\n\t\t\t\tconst { data: response } = await searchService.fetchProperties(params);\n\t\t\t\tconst { results } = response;\n\n\t\t\t\tif (isRendering) {\n\t\t\t\t\tif (results && results.length > 0) {\n\t\t\t\t\t\tsetProperties(results);\n\t\t\t\t\t}\n\t\t\t\t\tsetFetched(true);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(e);\n\t\t\t}\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tgetProperties();\n\n\t\treturn () => {\n\t\t\tisRendering = false;\n\t\t};\n\t}, []);\n\n\tif (fetched && properties.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t\n\t\t\t{!fetched && properties.length <= 0 && }\n\t\t\t{properties && properties.length > 0 && (\n\t\t\t\t\n\t\t\t\t\t{properties.map((property: IProperty) => (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport default PropertiesOnSale;\n","import styled from \"styled-components\";\nimport { boxShadow, breakpoints, color, emSpacing, hexToRGB, textStyles } from \"@utils/style-utils\";\n\nexport const CookieConsentWrapper = styled.div`\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\n\t&:not(.cookie-consent-page) {\n\t\theight: 100vh;\n\t\twidth: 100vw;\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tz-index: 20000;\n\t\tbackground: ${hexToRGB(color(\"greenDark\", 4), 0.7)};\n\n\t\t@media (max-width: ${breakpoints.md}) {\n\t\t\tposition: absolute;\n\t\t\talign-items: flex-start;\n\t\t\theight: 100%;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\t&.cookie-consent-page {\n\t\tmargin-top: 8em;\n\t\tdiv {\n\t\t\tbox-shadow: none;\n\t\t}\n\t}\n\t&.cookie-calendar-embed {\n\t\tmargin-top: 0;\n\t\t.km-ccc {\n\t\t\twidth: auto;\n\t\t}\n\t}\n`;\n\nexport const CookieConsentContent = styled.div`\n\twidth: 660px;\n\tmin-height: min(50vh, 455px);\n\tbackground: #fff;\n\tpadding: 2em 6em;\n\ttext-align: center;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\talign-items: center;\n\tbox-shadow: ${boxShadow.huge};\n\tborder-radius: 4px;\n\n\ta {\n\t\tcolor: ${color(\"greenDark\", 1)};\n\t}\n\n\t.current-consent-value {\n\t\tmargin: 1em 0;\n\t}\n\n\t.consent-buttons {\n\t\twidth: 100%;\n\t\tmargin: 2em 0 4em;\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tbutton {\n\t\t\tbackground: ${color(\"greenDark\", 1)};\n\t\t\tborder: 1px solid ${color(\"greenDark\", 1)};\n\t\t\tborder-radius: 4px;\n\t\t\tcolor: ${color(\"white\")};\n\t\t\tcursor: pointer;\n\t\t\t${textStyles.MicroText};\n\t\t\tfont-weight: bold;\n\t\t\tline-height: 1;\n\t\t\tletter-spacing: ${emSpacing(0.07)};\n\t\t\tpadding: 16px 16px 15px;\n\t\t\ttext-align: center;\n\t\t\ttext-transform: uppercase;\n\t\t\tmargin: 0;\n\n\t\t\t&.consent-buttons__no {\n\t\t\t\tborder-color: ${color(\"grey\", 2)};\n\t\t\t\tbackground: ${color(\"white\")};\n\t\t\t\tcolor: ${color(\"grey\", 2)};\n\t\t\t}\n\t\t}\n\t}\n\n\t.consent-infolink {\n\t\t${textStyles.MicroText};\n\t\tcolor: ${color(\"greenDark\", 1)};\n\t\twhite-space: nowrap;\n\n\t\t&:after {\n\t\t\t${textStyles.MicroText};\n\t\t\tcontent: \">\";\n\t\t\tmargin-left: 0.25rem;\n\t\t\tdisplay: inline-block;\n\t\t\tcolor: ${color(\"greenDark\", 1)};\n\t\t}\n\t}\n\n\t@media (max-width: ${breakpoints.md}) {\n\t\twidth: 90vw;\n\t\tpadding: 1em 2em;\n\t\tmargin-top: max(5vw, 30px); // yes, width!\n\n\t\t.consent-buttons {\n\t\t\tmargin: 1em 0 2em;\n\n\t\t\tbutton {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tline-height: 13.74px;\n\t\t\t\tpadding: 16px;\n\t\t\t}\n\n\t\t\t@media (max-width: 375px) {\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: center;\n\n\t\t\t\tbutton {\n\t\t\t\t\twidth: 75%;\n\t\t\t\t\tmargin-bottom: 5px;\n\t\t\t\t\t&.consent-buttons__no {\n\t\t\t\t\t\torder: 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n`;\n","import React, { Fragment, useEffect, useState } from \"react\";\nimport { withRouter, RouteComponentProps, NavLink } from \"react-router-dom\";\nimport { CookieConsentContent, CookieConsentWrapper } from \"./styles\";\nimport Text from \"wake-react-components/text\"\nimport Editor from \"wake-react-components/editor\";\nimport { hasWindow } from \"@utils\";\nimport get from \"lodash-es/get\";\nimport { isAdmin } from \"wake-react-components/utils\";\nimport dataLayerPush from \"@utils/dataLayerPush\";\nimport { breakpoints } from \"@utils/style-utils\";\n\ninterface IProps {\n\t[key: string]: any;\n}\n\nconst CookieConsent = (props: IProps & RouteComponentProps) => {\n\tconst { className, text, title } = props;\n\tconst doc = props.doc || (hasWindow ? get(window[\"wdso\"], [\"document\"]) : null);\n\n\tif (title) {\n\t\tdoc.cookieConsentTitle = title;\n\t\tdoc.cookieConsentPageFor = true;\n\t}\n\tif (text) {\n\t\tdoc.cookieConsentText = text;\n\t\tdoc.cookieConsentPageFor = true;\n\t}\n\n\tif (!hasWindow || !doc) return null;\n\n\t// do not display a popup version on cookie consent settings page\n\tif (doc.cookieConsentPageFor && (!className || className.indexOf('cookie-consent-page') === -1)) {\n\t\treturn null;\n\t}\n\n\tconst [storedValue, setStoredValue] = useState(window.localStorage.getItem('km-cookie-consent'));\n\tconst [visible, setVisible] = useState(true);\n\tconst [forceHidden, setForceHidden] = useState(false);\n\n\tconst sendConsentInfo = (hasConsent: boolean = false) => {\n\t\tdataLayerPush({cookieConsent: hasConsent ? \"yes\" : \"no\"});\n\t};\n\n\tif (storedValue === \"yes\") {\n\t\tsendConsentInfo(true);\n\t} else if (storedValue === \"no\") {\n\t\tsendConsentInfo(false);\n\t}\n\n\tuseEffect(() => {\n\t\tif (!hasWindow || screen.availWidth >= parseInt(breakpoints.md) || !isPopup) return;\n\n\t\tconst wrapper = document.getElementById('km-ccw');\n\t\tif (wrapper) {\n\t\t\twrapper.style.height = wrapper.parentElement.clientHeight + \"px\";\n\t\t}\n\t}, []);\n\n\tconst isPopup = !doc.cookieConsentPageFor;\n\tif (storedValue && isPopup) {\n\t\treturn null;\n\t}\n\n\tconst hideConsentElements = () => {\n\t\tif (!isPopup) return;\n\n\t\tsetVisible(false);\n\t};\n\tconst noConsentAction = (e: any) => {\n\t\te.stopPropagation();\n\t\tif (isAdmin) return;\n\n\t\thideConsentElements();\n\n\t\tsetStoredValue(\"no\");\n\t\twindow.localStorage.setItem('km-cookie-consent', \"no\");\n\t\tdataLayerPush({\n\t\t\t'event': 'cookieConsentChoice',\n\t\t\t'cookieConsentGiven': 'no',\n\t\t});\n\t\tsendConsentInfo(false);\n\t\tif (text || title) {\n\t\t\tsetForceHidden(true);\n\t\t\treturn;\n\t\t}\n\t\tlocation.replace(location.href);\n\t};\n\n\tconst consentAction = (e) => {\n\t\te.stopPropagation();\n\t\tif (isAdmin) return;\n\n\t\thideConsentElements();\n\n\t\tsetStoredValue(\"yes\");\n\t\twindow.localStorage.setItem('km-cookie-consent', \"yes\");\n\t\tdataLayerPush({\n\t\t\t'event': 'cookieConsentChoice',\n\t\t\t'cookieConsentGiven': 'yes',\n\t\t});\n\t\tsendConsentInfo(true);\n\t\tlocation.replace(location.href);\n\t};\n\n\treturn (\n\t\t\n\t\t\t{!!((!isPopup || visible) && !forceHidden) && \n\t\t\t\t {e.stopPropagation()}}>\n\t\t\t\t\t

\n\t\t\t\t\tKiinteistömaailma käyttää verkkopalvelussaan evästeitä, joiden avulla sivusto toimii toivotulla tavalla ja voimme tarjota sinulle kiinnostavaa sisältöä.

' +\n\t\t\t\t\t\t'

Voit antaa suostumuksesi painamalla \"Hyväksy kaikki\". Valintaa voi muuttaa myöhemmin Evästeasetukset-linkin kautta.

'}\n\t\t\t\t\t/>\n\t\t\t\t\t{!isPopup &&
\n\t\t\t\t\t\tNykyinen asetus: \n\t\t\t\t\t\t{!!(isAdmin || storedValue === \"yes\") && }\n\t\t\t\t\t\t{!!(isAdmin || storedValue === \"no\") && }\n\t\t\t\t\t\t{!!(isAdmin || (storedValue !== \"yes\" && storedValue !== \"no\")) && }\n\t\t\t\t\t
}\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\tTietosuojaseloste\n\t\t\t\t
\n\t\t\t
}\n\t\t
\n\t);\n};\n\nexport default withRouter(CookieConsent);\n","import styled, { css } from \"styled-components\";\nimport { grid } from \"@utils/style-utils\";\n\nexport const ApartmentGridWrapper = styled.div`\n\tpadding: 40px ${grid.gutterSmall / 2}px;\n`;\n\nexport const ApartmentGridContainer = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: space-between;\n\tmargin: 0 auto;\n\tmax-width: ${props => (props.count && props.count === 10 ? \"1635px\" : \"1364px\")};\n\n\t> div {\n\t\tflex-basis: 100%;\n\t\tmargin-bottom: ${grid.gutterSmall}px;\n\n\t\t@media (min-width: 610px) {\n\t\t\tflex-basis: calc((100% - ${grid.gutterSmall / 2}px) / 2);\n\t\t\tmargin-bottom: ${grid.gutterSmall / 2}px;\n\t\t}\n\n\t\t@media (min-width: 940px) {\n\t\t\tflex-basis: calc((100% - ${(grid.gutterSmall / 2) * 1.5}px) / 3);\n\t\t}\n\n\t\t@media (min-width: 1215px) {\n\t\t\tflex-basis: calc((100% - ${(grid.gutter / 2) * 3}px) / 4);\n\t\t\tmargin-bottom: ${grid.gutter / 2}px;\n\t\t}\n\n\t\t${props =>\n\t\t\tprops.count &&\n\t\t\tprops.count === 10 &&\n\t\t\tcss`\n\t\t\t\t@media (min-width: 1500px) {\n\t\t\t\t\tflex-basis: calc((100% - ${(grid.gutter / 2) * 4}px) / 5);\n\t\t\t\t}\n\t\t\t`}\n\t}\n\n\t@supports (display: grid) {\n\t\t.is-pointer & {\n\t\t\t@media (min-width: 610px) {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-column-gap: ${grid.gutterSmall / 2}px;\n\t\t\t\tgrid-template-columns: repeat(2, 1fr);\n\t\t\t}\n\n\t\t\t@media (min-width: 940px) {\n\t\t\t\tgrid-template-columns: repeat(3, 1fr);\n\t\t\t}\n\n\t\t\t@media (min-width: 1215px) {\n\t\t\t\tgrid-column-gap: ${grid.gutter / 2}px;\n\t\t\t\tgrid-template-columns: repeat(4, 1fr);\n\t\t\t}\n\n\t\t\t${props =>\n\t\t\t\tprops.count &&\n\t\t\t\tprops.count === 10 &&\n\t\t\t\tcss`\n\t\t\t\t\t@media (min-width: 1500px) {\n\t\t\t\t\t\tgrid-template-columns: repeat(5, 1fr);\n\t\t\t\t\t}\n\t\t\t\t`}\n\t\t}\n\t}\n\n\t/* horizontal scrolling for touch devices */\n\t@media (max-width: 991px) and (pointer: coarse) {\n\t\tflex-wrap: nowrap;\n\t\tmargin-left: -${grid.gutterSmall / 2}px;\n\t\tmargin-right: -${grid.gutterSmall / 2}px;\n\t\toverflow-x: scroll;\n\t\t-webkit-overflow-scrolling: touch;\n\t\twhite-space: nowrap;\n\t\twidth: auto;\n\n\t\t> div {\n\t\t\tflex: 1 0 86%;\n\t\t\tmargin-right: ${grid.gutterSmall / 2}px;\n\n\t\t\t&:first-of-type {\n\t\t\t\tmargin-left: ${grid.gutterSmall / 2}px;\n\t\t\t}\n\n\t\t\t&:nth-last-of-type(2) {\n\t\t\t\tflex: 0 0 ${grid.gutterSmall / 2}px;\n\t\t\t\tmargin: 0 !important;\n\t\t\t\twidth: ${grid.gutterSmall / 2}px;\n\t\t\t}\n\n\t\t\t&:nth-last-of-type(2),\n\t\t\t&:last-of-type {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n`;\n","import React from \"react\";\nimport ApartmentBlock from \"@components/ApartmentBlock\";\n\nimport { ApartmentGridWrapper, ApartmentGridContainer } from \"./styles\";\n\ninterface IApartmentGridProps {\n\tcount?: number;\n\tlazy?: boolean;\n\tproperties: IProperty[];\n\t[key: string]: any;\n}\n\nconst ApartmentGrid = ({ properties, count = 8, lazy = false, ...rest }: IApartmentGridProps) => {\n\tif (!properties || !properties.length) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{properties.map((property: IProperty) => (\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\t{/* these empty divs make the grid work without nth-child \"hacks\" */}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\n\t\t\n\t);\n};\n\nexport default ApartmentGrid;\n","import styled from \"styled-components\";\nimport { colors, grid, media } from \"@utils/style-utils\";\n\nexport const AgentListItems = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: space-between;\n\t&:-webkit-scrollbar {\n\t\twidth: 1em;\n\t}\n\t&:-webkit-scrollbar-track {\n\t\t-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);\n\t}\n\t&:-webkit-scrollbar-thumb {\n\t\tbackground-color: darkgrey;\n\t\toutline: 1px solid slategrey;\n\t}\n\n\n\t> div {\n\t\tflex-basis: 100%;\n\t\tmargin-bottom: ${grid.gutterSmall}px;\n\n\t\t${media.md`\n\t\t\tflex-basis: calc((100% - ${grid.gutterSmall}px) / 2);\n\t\t`}\n\n\t\t${media.lg`\n\t\t\tflex-basis: calc((100% - ${grid.gutter}px) / 2);\n\t\t\tmargin-bottom: ${grid.gutter}px;\n\t\t`}\n\t}\n`;\n","import React, { Fragment } from \"react\";\nimport AgentListItem from \"@components/AgentList/AgentListItem\";\nimport { withRouter, RouteComponentProps } from \"react-router-dom\";\nimport { AgentListItems } from \"./styles\";\nimport { hasWindow } from \"@utils\";\n\ninterface IProps {\n\tagents: IAgent[];\n\ttitle?: string;\n\topenToNewTab?: boolean;\n\t[key: string]: any;\n}\n\nconst AgentList = (props: IProps & RouteComponentProps) => {\n\tconst { agents, history, title = \"Asuntokaupan asiantuntijat palveluksessasi\", openToNewTab = false } = props;\n\n\tconst onItemClick = (agent: IAgent) => {\n\t\tconst { canonicalPath, urlParts } = agent;\n\t\tconst href = canonicalPath ? canonicalPath : urlParts ? urlParts[0] : null;\n\n\t\tif (href) {\n\t\t\tif (!openToNewTab) {\n\t\t\t\tdocument.body.classList.remove(\"loaded\");\n\t\t\t\tdocument.body.classList.add(\"load-start\");\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\thistory.push(href);\n\t\t\t\t}, 300);\n\t\t\t} else {\n\t\t\t\tif (hasWindow) {\n\t\t\t\t\twindow.open(href, \"_blank\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tif (!agents || agents.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t\n\t\t\t

{title}

\n\t\t\t\n\t\t\t\t{agents.map((agent: IAgent) => (\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\n\t\t
\n\t);\n};\n\nexport default withRouter(AgentList);\n","import styled from \"styled-components\";\nimport { color, media, textStyles } from \"@utils/style-utils\";\n\nexport const CityListContainer = styled.div`\n\t/* padding: 37px 34px; */\n`;\n\nexport const CityListHeader = styled.div.attrs(() => ({\n\tclassName: \"city-list-header\",\n}))`\n\talign-items: center;\n\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\tdisplay: flex;\n\tjustify-content: space-between;\n\tmargin-bottom: 32px;\n\tpadding-bottom: 16px;\n\twidth: 100%;\n\n\th4 {\n\t\t${textStyles.MicroText}\n\t\tcolor: ${color(\"grey\", 2)};\n\t\tmargin: 0;\n\t}\n`;\n\nexport const PostcodeSearch = styled.form.attrs(() => ({\n\tclassName: \"postcode-search\",\n}))`\n\talign-items: center;\n\tdisplay: flex;\n\tposition: relative;\n\n\t> label {\n\t\t${textStyles.MicroText}\n\t\tcolor: ${color(\"grey\", 2)};\n\t\tmargin-right: 22px;\n\t}\n\n\tinput {\n\t\tcolor: ${color(\"grey\", 3)};\n\t\tpadding-right: 36px;\n\t\twidth: 100px;\n\t}\n\n\tbutton {\n\t\t-webkit-appearance: none;\n\t\t-moz-apprearance: none;\n\t\tbackground: rgba(255, 255, 255, 0);\n\t\tborder: 0;\n\t\tcolor: ${color(\"grey\", 3)};\n\t\tcursor: pointer;\n\t\tfont-size: 15px;\n\t\theight: 100%;\n\t\toutline: 0;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 0;\n\t\ttransition: color 150ms;\n\t\twidth: 40px;\n\n\t\t.is-pointer & {\n\t\t\t&:hover {\n\t\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t\t}\n\t\t}\n\n\t\tsvg {\n\t\t\tmax-width: 15px;\n\t\t}\n\t}\n`;\n\nexport const CityListGroups = styled.div.attrs(() => ({\n\tclassName: \"city-list-groups\",\n}))`\n\t${media.lg`\n\t\tcolumn-count: 4;\n\t\tcolumn-gap: 40px;\n\t`}\n`;\n\nexport const CityListGroupTitle = styled.p.attrs(() => ({\n\tclassName: \"city-list-group-title\",\n}))`\n\t${textStyles.PSmall}\n\tcolor: ${color(\"grey\", 2)};\n\tmargin: 0 0 15px;\n`;\n\nexport const CityListGroup = styled.div.attrs(() => ({\n\tclassName: \"city-list-group\",\n}))`\n\tdisplay: inline-block;\n\tmargin-bottom: 40px;\n\twidth: 100%;\n\n\ta {\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tdisplay: inline-block;\n\t\ttext-decoration: none;\n\t\ttransition: color 200ms;\n\n\t\t.is-pointer & {\n\t\t\t&:hover {\n\t\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t\t}\n\t\t}\n\n\t\t&::after {\n\t\t\tcontent: \",\";\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-right: 5px;\n\t\t}\n\n\t\t&:last-of-type::after {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n`;\n","import React, { memo, useRef } from \"react\";\nimport toPairs from \"lodash-es/toPairs\";\nimport values from \"lodash-es/values\";\nimport {\n\tCityListContainer,\n\tCityListGroup,\n\tCityListGroupTitle,\n\tCityListGroups,\n\tCityListHeader,\n\tPostcodeSearch,\n} from \"./styles\";\nimport TextInput from \"@components/Form/TextInput\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport { withRouter, RouteComponentProps, Link } from \"react-router-dom\";\nimport { isValidPostcode } from \"@utils/validators\";\n\nimport { sagaDisableHover } from \"@redux/ui/ui.actions\";\nimport { connect } from \"react-redux\";\n\nconst createLinks = item => {\n\tconst itemValues = values(item);\n\n\tif (itemValues) {\n\t\treturn itemValues.map(({ name, urls }, i) => (\n\t\t\t\n\t\t\t\t{name}\n\t\t\t\n\t\t));\n\t}\n\n\treturn itemi;\n};\n\ninterface IProps {\n\tcityList: any;\n\tdisableHover: (ms: number) => void;\n\tinputPlaceholder?: string;\n}\n\nconst NavigationCityList = (props: IProps & RouteComponentProps) => {\n\tconst { cityList, history, disableHover, inputPlaceholder } = props;\n\tconst cityTuples = toPairs(cityList);\n\tconst postcodeRef = useRef(null);\n\tconst buttonRef = useRef(null);\n\n\tconst searchWithPostcode = e => {\n\t\te.preventDefault();\n\t\tconst { value } = postcodeRef.current;\n\n\t\tif (isValidPostcode(value)) {\n\t\t\tdisableHover(300);\n\t\t\tdocument.body.classList.remove(\"loaded\");\n\t\t\tdocument.body.classList.add(\"load-start\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\thistory.push(`/etsi-myymala/${value}#myymala`);\n\t\t\t}, 300);\n\t\t}\n\t};\n\n\tconst checkForValidPostcode = ({ target }) => {\n\t\tif (isValidPostcode(target.value)) {\n\t\t\tpostcodeRef.current.classList.add(\"is-valid\");\n\t\t\tbuttonRef.current.classList.add(\"is-valid\");\n\t\t} else {\n\t\t\tpostcodeRef.current.classList.remove(\"is-valid\");\n\t\t\tbuttonRef.current.classList.remove(\"is-valid\");\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t

Valitse lähin myymäläpaikkakunta

\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t\t{cityTuples.map(([letter, cities], index) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{letter}\n\t\t\t\t\t\t{createLinks(cities)}\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\n\t\t
\n\t);\n};\n\nconst mapDispatchToProps = {\n\tdisableHover: sagaDisableHover,\n};\n\nconst NavigationCityListContainer = connect(\n\tnull,\n\tmapDispatchToProps\n)(NavigationCityList);\n\nexport default withRouter(\n\tmemo(NavigationCityListContainer, (prevProps, nextProps) => {\n\t\tif (!prevProps.cityList && !nextProps.cityList) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t})\n);\n","import styled from \"styled-components\";\nimport { color } from \"@utils/style-utils\";\n\nexport const KeySearch = styled.form`\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-radius: 4px;\n\tdisplay: inline-flex;\n\theight: 40px;\n\toverflow: hidden;\n\tposition: relative;\n\n\t.form-group {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t}\n\n\tinput {\n\t\tborder: 0;\n\t\theight: 100%;\n\t\twidth: 100%;\n\t}\n\n\tbutton {\n\t\t-webkit-appearance: none;\n\t\t-moz-appearance: none;\n\t\tbackground: ${color(\"grey\", 7)};\n\t\tborder: 0;\n\t\tcolor: ${color(\"grey\", 4)};\n\t\tcursor: pointer;\n\t\tfont-size: 14px;\n\t\theight: 100%;\n\t\ttext-align: center;\n\t\twidth: 42px;\n\n\t\t&:hover {\n\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t}\n\n\t\tsvg {\n\t\t\tmax-width: 16px;\n\t\t}\n\t}\n`;\n","import React, { FormEvent, useRef } from \"react\";\nimport TextInput from \"@components/Form/TextInput\";\n\nimport { KeySearch } from \"./styles\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport { hasWindow } from \"@utils\";\n\nconst PropertyKeySearch = ({ placeholder = \"Hae kohdenumerolla\", buttonHtml = null }) => {\n\tconst keyRef = useRef(null);\n\n\tconst onSubmit = (event: FormEvent) => {\n\t\tevent.preventDefault();\n\t\tconst { value: propertyKey } = keyRef.current;\n\n\t\tif (propertyKey && propertyKey.length > 0 && hasWindow) {\n\t\t\twindow.location.pathname = \"/kohde/\" + propertyKey;\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default PropertyKeySearch;\n","import styled, { css } from \"styled-components\";\nimport { grid, media, color } from \"@utils/style-utils\";\n\nexport const Wrapper = styled.div`\n\tposition: relative;\n\twidth: 100%;\n\n\t${props =>\n\t\tprops.gradient &&\n\t\tcss`\n\t\t\tbackground-image: linear-gradient(to bottom, hsla(113, 0%, 97%, 0) 0%, hsla(113, 0%, 97%, 1) 100%);\n\t\t`};\n\n\t${props =>\n\t\tprops.grey &&\n\t\tcss`\n\t\t\tbackground-color: ${color(\"grey\", 7)};\n\t\t`};\n`;\n\nexport const Container = styled.div`\n\tmargin-left: auto;\n\tmargin-right: auto;\n\tmax-width: ${grid.width}px;\n\tpadding-left: ${grid.gutterSmall / 2}px;\n\tpadding-right: ${grid.gutterSmall / 2}px;\n\twidth: 100%;\n\n\t${media.lg`\n\t\tpadding-left: ${grid.gutter / 2}px;\n\t\tpadding-right: ${grid.gutter / 2}px;\n\t`};\n\n\t&::before,\n\t&::after {\n\t\tcontent: \"\";\n\t\tdisplay: table;\n\t}\n\n\t&::after {\n\t\tclear: both;\n\t}\n\n\t${props =>\n\t\tprops.narrow &&\n\t\tcss`\n\t\t\t@media (min-width: 992px) {\n\t\t\t\tmax-width: 1130px;\n\t\t\t\twidth: 87.5%;\n\t\t\t}\n\t\t`};\n\n\t&.first-in-blocks {\n\t\tmargin-top: 65px;\n\t}\n\n\t${media.md`\n\t\t&.no-padding {\n\t\t\tpadding-left: 0;\n\t\t\tpadding-right: 0;\n\t\t}\n\t`};\n\n\t&.no-padding-at-all {\n\t\tpadding-left: 0;\n\t\tpadding-right: 0;\n\t}\n`;\n\nexport const NarrowContainer = styled.div.attrs(() => ({\n\tclassName: \"container-narrow\",\n}))`\n\tmargin-left: auto;\n\tmargin-right: auto;\n\tmax-width: ${props => (props.withoutPadding ? grid.narrowWidth - grid.gutterSmall : grid.narrowWidth)}px;\n\tpadding-left: ${props => (props.withoutPadding ? 0 : grid.gutterSmall / 2)}px;\n\tpadding-right: ${props => (props.withoutPadding ? 0 : grid.gutterSmall / 2)}px;\n\twidth: 100%;\n`;\n","import React from \"react\";\nimport isEmpty from \"lodash-es/isEmpty\";\nimport historyTracker from \"@services/history-tracker\";\n\nexport const hasWindow = typeof window === \"object\" && !!window;\nexport const doc: any = hasWindow ? document : {};\nexport const body: HTMLElement = doc.body || null;\nexport const root: HTMLElement = doc.documentElement || body;\nexport const win: any = hasWindow ? window : {};\n\ninterface IWake {\n\tassetPath?: string;\n\tdeploymentCount?: number;\n\tloading?: boolean;\n\tmode?: string;\n}\n\n// Wake defaults\nexport const wake: IWake = {\n\tassetPath: \"/assets/\",\n\tdeploymentCount: 0,\n\tloading: false,\n\tmode: \"development\",\n};\n\n/**\n * eg getAssetUrl('/assets/images/brand-identity/graphics/form-bg-pattern.png')\n * => '/km/images/brand-identity/graphics/form-bg-pattern.png' in katti and live\n * @param src\n */\nexport const getAssetUrl = (src: string): string => {\n\treturn src.replace(\"/assets/\", wake.assetPath);\n};\n\nexport const imageWithSize = (src: string, size: string = \"w_42,h_42\"): string => {\n\tif (isEmpty(src) || (typeof(src) === 'string' && src.match(/^data/))) return src;\n\tconst pos = src.lastIndexOf(\"/\");\n\treturn pos === -1 ? src : src.substr(0, pos) + \"/\" + size + src.substr(pos);\n};\n\nexport const removeNonNumeric = (str: string) => str.replace(/\\D/g, \"\");\nexport const stripLeadingZeros = (str: string) => str.replace(/^0+/, \"\");\n\nexport const getDomain = (url: string) => {\n\tlet result: string;\n\tconst match = url.match(/^(?:https?:\\/\\/)?(?:[^@\\n]+@)?(?:www\\.)?([^:\\/\\n\\?\\=]+)/im);\n\n\tif (match) {\n\t\tresult = match[1];\n\t\tconst newMatch = result.match(/^[^\\.]+\\.(.+\\..+)$/);\n\t\tif (newMatch) {\n\t\t\tresult = match[1];\n\t\t}\n\t}\n\treturn result;\n};\n\n/* Valid virtual presentation services for apartment image carousel */\nexport const allowedVirtualUrls = [\"unrealer.com\", \"my.matterport.com\", \"rawian.info\", \"virtualtours.rvn-consulting.fi\" ];\n\nexport const hasValidVirtualPresentation = (url: string): boolean => {\n\tif (!url) {\n\t\treturn false;\n\t}\n\n\tconst domain = getDomain(url);\n\n\treturn allowedVirtualUrls.indexOf(domain) !== -1;\n};\n\nexport const getSeconds = obj => (obj ? (obj.sec ? obj.sec : obj.usec ? obj.usec : obj.$date && obj.$date.$numberLong ? obj.$date.$numberLong/1000 : 0) : 0);\n\nexport const weekdays = [\"Sunnuntai\", \"Maanantai\", \"Tiistai\", \"Keskiviikko\", \"Torstai\", \"Perjantai\", \"Lauantai\"];\n\nexport const getFormattedDate = obj => {\n\tconst secs = getSeconds(obj);\n\n\tconst d = new Date(secs * 1000);\n\tconst date = d.getDate();\n\tconst month = d.getMonth() + 1;\n\tconst year = d.getFullYear();\n\n\treturn (\n\t\t\n\t\t\t{date}.{month}.{year}\n\t\t\n\t);\n};\n\nexport const isOpenHouseInFuture = obj => {\n\tif (!obj) {\n\t\treturn false;\n\t}\n\tconst { end } = obj;\n\tconst endSecs = getSeconds(end);\n\tconst endDate = new Date(endSecs * 1000);\n\tconst currentDate = new Date();\n\tif (endDate >= currentDate) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nexport const getOpenHouseText = (obj) => {\n\tif (!obj) {\n\t\treturn null;\n\t}\n\n\tif (!(obj.liveDemonstration)) {\n\t\treturn (\n\t\t\t
\n\t\t\t\t{getOpenHouseDate(obj)}\n\t\t\t\t{!isEmpty(obj.description) &&
{obj.description}
}\n\t\t\t
\n\t\t)\n\t}\n\n\treturn (\n\t\t
\n\t\t\t{getOpenHouseDate(obj)}\n\t\t\t{!isEmpty(obj.remoteUrl) &&\n\t\t\t\t\n\t\t\t\t\tSiirry live-esittelyyn\n\t\t\t\t\n\t\t\t}\n\t\t\t{!isEmpty(obj.description) &&
{obj.description}
}\n\t\t
\n\t);\n};\n\nexport const getOpenHouseDate = (obj, onlyValues = false, withEnding = true) => {\n\tif (!obj) {\n\t\treturn null;\n\t}\n\n\tconst { start, end } = obj;\n\tconst startSecs = getSeconds(start);\n\tconst endSecs = getSeconds(end);\n\n\tconst startDate = new Date(startSecs * 1000);\n\tconst endDate = new Date(endSecs * 1000);\n\n\tconst weekday = weekdays[startDate.getDay()];\n\tconst date = startDate.getDate();\n\tconst month = startDate.getMonth() + 1; /* getMonth returns index (0-11) */\n\tconst year = startDate.getFullYear();\n\tconst sHours = startDate.getHours();\n\tconst sMins = startDate.getMinutes();\n\tconst eHours = endDate.getHours();\n\tconst eMins = endDate.getMinutes();\n\n\tif (onlyValues) {\n\t\treturn {\n\t\t\tdate,\n\t\t\tendHours: eHours,\n\t\t\tendMins: eMins,\n\t\t\tmonth,\n\t\t\tstartHours: sHours,\n\t\t\tstartMins: sMins,\n\t\t\tweekday,\n\t\t\tyear,\n\t\t};\n\t}\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{weekday} {date}.{month}.{year}\n\t\t\t\n\t\t\t
\n\t\t\t\n\t\t\t\t{sHours}:{sMins === 0 ? \"00\" : sMins}\n\t\t\t\t{withEnding && ` - ${eHours}:${eMins === 0 ? \"00\" : eMins}`}\n\t\t\t\n\t\t
\n\t);\n};\n\nexport const hasCookieConsent = (hasWindow && window.localStorage.getItem('km-cookie-consent') === \"yes\");\n\nexport const getHistoryAgency = () => {\n\tconst historyVisit = historyTracker.getHistory(\"visited-agency\" as any);\n\tif (historyVisit) {\n\t\ttry {\n\t\t\tconst parsedHistory = JSON.parse(historyVisit);\n\t\t\tconst { visitedAt, ...rest } = parsedHistory;\n\t\t\tif (\n\t\t\t\t\"key\" in rest && // agency has key set\n\t\t\t\t\"agencyKeys\" in doc && // agent has agency links set\n\t\t\t\tdoc.agencyKeys.includes(rest.key) && // agent belongs to agency found from history\n\t\t\t\tvisitedAt + 3600000 > new Date().getTime() // visit was less than an hour ago\n\t\t\t) {\n\t\t\t\treturn rest;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(\"Parsing JSON failed\", e);\n\t\t}\n\t}\n\treturn null;\n};\n","import { useState } from \"react\";\nimport { hasWindow } from \"@utils\";\n\n// Usage example\n/* function App() {\n\t// Similar to useState but first arg is key to the value in local storage.\n\tconst [ name, setName ] = useLocalStorage('name', 'Bob');\n\n\treturn (\n\t\t
\n\t\t\t setName(e.target.value) }\n\t\t\t/>\n\t\t
\n\t);\n} */\n\nfunction makeStorageObject(data: any) {\n\treturn {\n\t\tdata,\n\t\tupdated: new Date().toJSON(),\n\t};\n}\n\nexport default function useLocalStorage(key: string, initialValue: any) {\n\tif (!hasWindow) {\n\t\treturn [{}, null];\n\t}\n\n\tconst getItem = () => {\n\t\ttry {\n\t\t\t/* Get from local storage by key */\n\t\t\tconst item = window.localStorage.getItem(key);\n\t\t\t/* Parse stored json or if none return initialValue */\n\t\t\treturn item ? JSON.parse(item) : initialValue;\n\t\t} catch (error) {\n\t\t\t/* If error also return initialValue */\n\t\t\tconsole.log(`Failed to GET localstorage item ${key}:`, error);\n\t\t\treturn initialValue;\n\t\t}\n\t};\n\n\t/* Pass initial state function to useState so logic is only executed once */\n\tconst [storedValue, setStoredValue] = useState(getItem);\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage.\n\t */\n\tconst setValue = (value: any) => {\n\t\ttry {\n\t\t\t/* Allow value to be a function so we can have same API as useState */\n\t\t\tconst valueToStore = value instanceof Function ? value(storedValue) : value;\n\t\t\t/* Save state */\n\t\t\tsetStoredValue(valueToStore);\n\n\t\t\tconst storageObj = makeStorageObject(value);\n\t\t\tconsole.log(`saving item [\"${key}\"]: `, storageObj);\n\t\t\t/* Save to local storage */\n\t\t\twindow.localStorage.setItem(key, JSON.stringify(storageObj));\n\t\t} catch (error) {\n\t\t\t/* Should we implement a fallback for failed localstorage save? */\n\t\t\t/* Maybe try to use cookies if saving to localstorage fails? */\n\t\t\tconsole.log(`Failed to SET localstorage item ${key} with value ${value}:`, error);\n\t\t}\n\t};\n\n\treturn [storedValue, setValue];\n}\n","import React, { PureComponent, RefObject } from \"react\";\n\nimport { DdSelectWrapper, DdSelectToggle, DdSelectContent } from \"./styles\";\nimport clsx from \"clsx\";\n\ninterface IProps {\n\tbuttonText?: string | JSX.Element;\n\tchildren: any;\n\t[key: string]: any;\n}\n\ninterface IState {\n\tddOpen: boolean;\n}\n\nclass Dropdown extends PureComponent {\n\tprotected ref: RefObject = React.createRef();\n\n\tconstructor(props: IProps) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\tddOpen: false,\n\t\t};\n\n\t\tthis.toggle = this.toggle.bind(this);\n\t\tthis.checkForClickOutside = this.checkForClickOutside.bind(this);\n\t}\n\n\ttoggle(forceState?: boolean) {\n\t\tconst newState = typeof forceState !== \"undefined\" ? forceState : !this.state.ddOpen;\n\t\tthis.setState({\n\t\t\tddOpen: newState,\n\t\t});\n\t}\n\n\tcheckForClickOutside(event: MouseEvent | TouchEvent) {\n\t\tif (!this.state.ddOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst target = event.target as HTMLElement;\n\t\tif (!this.ref.current || this.ref.current.contains(target)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.toggle(false);\n\t}\n\n\tcomponentDidMount() {\n\t\tdocument.addEventListener(\"mousedown\", this.checkForClickOutside);\n\t\tdocument.addEventListener(\"touchstart\", this.checkForClickOutside);\n\t}\n\n\tcomponentWillUnmount() {\n\t\tdocument.removeEventListener(\"mousedown\", this.checkForClickOutside);\n\t\tdocument.removeEventListener(\"touchstart\", this.checkForClickOutside);\n\t}\n\n\trender() {\n\t\tconst { buttonText = \"Drop it\", children, ...restProps } = this.props;\n\n\t\tconst { ddOpen } = this.state;\n\n\t\treturn (\n\t\t\t\n\t\t\t\t this.toggle()}>{buttonText}\n\n\t\t\t\t\n\t\t\t\t\t{typeof children === \"function\" ? children({ toggleDd: this.toggle }) : children}\n\t\t\t\t\n\t\t\t\n\t\t);\n\t}\n}\n\nexport default Dropdown;\n","import { hasWindow } from \"./index\";\n\nexport default function dataLayerPush(dataObj: any) {\n\ttry {\n\t\tif (!hasWindow) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!window[\"dataLayer\"]) {\n\t\t\twindow[\"dataLayer\"] = [];\n\t\t}\n\n\t\twindow[\"dataLayer\"].push(dataObj);\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n}\n","module.exports = \"data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MiAzOCIgdmlld0JveD0iMCAwIDUyIDM4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiMyM2QyNzgiPjxwYXRoIGQ9Im0yMyAxNmgtMTZsMS43LTkuMmMuMi0xIDEuMS0xLjggMi4yLTEuOGg4LjNjMS4xIDAgMiAuOCAyLjIgMS44eiIvPjxwYXRoIGQ9Im01MiAxOGgtNTJ2M2gzdjE3aDR2LTVoMzh2NWg0di0xN2gzeiIvPjxwYXRoIGQ9Im0zOC41IDVjLTMgMC01LjUgMi41LTUuNSA1LjVzMi41IDUuNSA1LjUgNS41IDUuNS0yLjUgNS41LTUuNS0yLjUtNS41LTUuNS01LjV6bTAgOWMtMS45IDAtMy41LTEuNS0zLjUtMy40IDAtMS44IDEuMy0zLjMgMy0zLjV2My45aDN2LTFoLTJ2LTIuOWMxLjkuMyAzLjMgMiAzIDMuOS0uMiAxLjctMS43IDMtMy41IDN6Ii8+PC9nPjwvc3ZnPg==\"","module.exports = \"data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MiAzOSIgdmlld0JveD0iMCAwIDUyIDM5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiMyM2QyNzgiPjxwYXRoIGQ9Im0xNy4zIDI0LTEwLjMgMTVoNy4ybDYuNC0xNXoiLz48cGF0aCBkPSJtMjYuNyAyNCAuOCAxNWg3LjJsLTQuNy0xNXoiLz48cGF0aCBkPSJtMzEuNCAyNCA2LjQgMTVoNy4ybC0xMC4zLTE1eiIvPjxwYXRoIGQ9Im0yNCAyMGg0bC01LTEyLTQuNSAxMC44LTUuNS0xMy44LTYgMTVoNXY0aC0xMnY1aDExLjFsNC4xLTVoLTEuMnYtNGg0IDEgM3Y0bC00LjcgMTVoNy4ybC44LTE1aC0xLjN6Ii8+PHBhdGggZD0ibTM2LjggMjQgNC4xIDVoMTEuMXYtNXoiLz48cGF0aCBkPSJtMCAzMXY4aDNsNi41LTh6Ii8+PHBhdGggZD0ibTQ5IDM5aDN2LThoLTkuNXoiLz48L2c+PC9zdmc+\"","import React, { memo, forwardRef, ReactNode } from \"react\";\n\nimport { FormGroup, StyledInput } from \"./styles\";\n\ninterface ITextInputProps {\n\tafterText?: ReactNode;\n\textraClass?: string;\n\tgrey?: boolean;\n\thasError?: boolean;\n\tlabel?: string;\n\tlabelAfter?: boolean;\n\tname: string;\n\tonChange?: (e?: any) => void;\n\tplaceholder?: string;\n\tvalue?: string | number | string[];\n\t/** Additional props will be given to the element */\n\t[key: string]: any;\n}\n\nconst TextInput = forwardRef((props: ITextInputProps, ref) => {\n\tconst {\n\t\tafterText,\n\t\textraClass,\n\t\tgrey,\n\t\thasError = false,\n\t\tlabel,\n\t\tlabelAfter,\n\t\tname,\n\t\tonChange,\n\t\tplaceholder,\n\t\tvalue,\n\t\t...restProps\n\t} = props;\n\n\treturn (\n\t\t\n\t\t\t{label && !labelAfter && (\n\t\t\t\t\n\t\t\t)}\n\t\t\t\n\t\t\t{label && labelAfter && (\n\t\t\t\t\n\t\t\t)}\n\t\t\t{afterText && {afterText}}\n\t\t\n\t);\n});\n\nexport default memo(TextInput);\n","import styled from 'styled-components';\nimport { color } from '@utils/style-utils';\n\nexport const CheckBoxWrapper = styled.div`\n\n`\n\nexport const Checkbox = styled.div`\n\tinput[type=\"checkbox\"] {\n\t\tdisplay: none;\n\n\t\t&:checked ~ label {\n\t\t\t.box {\n\t\t\t\tbackground: ${ color('greenBright', 4) };\n\t\t\t\tborder-color: ${ color('greenBright', 1) };\n\n\t\t\t\ti {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlabel {\n\t\talign-items: center;\n\t\tcolor: ${ color('grey', 2) };\n\t\tcursor: pointer;\n\t\tdisplay: flex;\n\t\tfont-size: 17px;\n\t\tline-height: 25px;\n\t\tmargin-bottom: 8px;\n\t\ttransition: color 150ms;\n\t\tuser-select: none;\n\n\t\t&:hover:not(:checked) {\n\t\t\t.box {\n\t\t\t\tbackground-color: ${ color('grey', 7) };\n\t\t\t}\n\t\t}\n\n\t\t.box {\n\t\t\tbackground: ${ color('white') };\n\t\t\tborder: 1px solid ${ color('grey', 5) };\n\t\t\tborder-radius: 2px;\n\t\t\tcolor: ${ color('greenBright', 1) };\n\t\t\tcursor: pointer;\n\t\t\tfont-size: 10px;\n\t\t\tdisplay: inline-block;\n\t\t\theight: 16px;\n\t\t\tmargin-right: 12px;\n\t\t\tmargin-top: -1px;\n\t\t\tposition: relative;\n\t\t\ttransition: background-color 150ms, border-color 150ms;\n\t\t\twidth: 16px;\n\n\t\t\ti {\n\t\t\t\tdisplay: none;\n\t\t\t\tleft: 0;\n\t\t\t\tposition: absolute;\n\t\t\t\tright: 0;\n\t\t\t\ttext-align: center;\n\t\t\t\ttop: 50%;\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t}\n\t\t}\n\t}\n`","import React from \"react\";\n\nimport { ISelection } from \"@utils/apartment-search/selections\";\nimport Checkbox from \"@components/Form/Checkbox\";\n\nimport {\n\tCheckBoxWrapper,\n\t// Checkbox,\n} from \"./styles\";\n\ninterface IProps {\n\tselections: ISelection[];\n\t/** set true to bypass internal state stuff and use purely to show data and run callback on click */\n\tuseRedux?: boolean;\n\t[key: string]: any;\n}\n\nconst CheckboxSelect = (props: IProps) => {\n\tconst { selections, onSelect, useRedux } = props;\n\n\tconst onChange = (selection: ISelection) => {\n\t\tif (useRedux && onSelect) {\n\t\t\tonSelect(selection);\n\t\t\treturn;\n\t\t}\n\t\tselection.selected = !selection.selected;\n\n\t\tconst activeSelections = selections.filter(s => s.selected);\n\n\t\tif (onSelect) {\n\t\t\tonSelect(activeSelections);\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t\t\t{selections &&\n\t\t\t\tselections.map((selection: ISelection, i: number) => {\n\t\t\t\t\tconst id = selection.value.toString();\n\t\t\t\t\treturn (\n\t\t\t\t\t\t\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\n\t);\n};\n\nexport default CheckboxSelect;\n","import styled from \"styled-components\";\nimport { color } from \"@utils/style-utils\";\n\nexport const DividerDash = styled.span`\n\tbackground: ${({ light }) => (light ? color(\"grey\", 5) : color(\"grey\", 1))};\n\tdisplay: inline-block;\n\theight: ${({ vertical }) => (vertical ? 24 : 1)}px;\n\tmargin: 0 12px;\n\twidth: ${({ vertical }) => (vertical ? 1 : 8)}px;\n`;\n","import React, { useEffect, useState, Fragment } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { getApartmentSearch } from \"@redux/apartment-search/apartment-search.selectors\";\nimport TextInput from \"@components/Form/TextInput\";\nimport { DividerDash } from \"./styles\";\n\nconst getSellingPrice = (value: number | string) => {\n\treturn value ? (Number(value) >= 1000 ? Number(value) / 1000 : value) : \"\";\n};\n\nconst PriceRange = props => {\n\tconst {\n\t\tconstraints,\n\t\trental,\n\t\tminSalePrice = \"\",\n\t\tmaxSalePrice = \"\",\n\t\tminRentalPrice = \"\",\n\t\tmaxRentalPrice = \"\",\n\t} = useSelector(getApartmentSearch);\n\n\tconst min = (rental ? minRentalPrice : minSalePrice && getSellingPrice(minSalePrice)) || \"\";\n\tconst max = (rental ? maxRentalPrice : maxSalePrice && getSellingPrice(maxSalePrice)) || \"\";\n\n\tconst [minValue, setMinValue] = useState(min);\n\tconst [maxValue, setMaxValue] = useState(max);\n\n\tconst onMinChange = (event: React.ChangeEvent) => {\n\t\tconst { value } = event.target as HTMLInputElement;\n\t\tsetMinValue(value);\n\n\t\tif (props.onChange) {\n\t\t\tprops.onChange(\"minPrice\", value);\n\t\t}\n\t};\n\n\tconst onMaxChange = (event: React.ChangeEvent) => {\n\t\tconst { value } = event.target as HTMLInputElement;\n\t\tsetMaxValue(value);\n\n\t\tif (props.onChange) {\n\t\t\tprops.onChange(\"maxPrice\", value);\n\t\t}\n\t};\n\n\tconst limitLength = (event: React.KeyboardEvent) => {\n\t\tconst target = event.target as HTMLInputElement;\n\n\t\tif (target.value.length >= 5) {\n\t\t\ttarget.value = target.value.substr(0, 5);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tif (constraints) {\n\t\t\tif (minValue !== constraints.min) {\n\t\t\t\tconst newMin = rental ? minRentalPrice : getSellingPrice(minSalePrice);\n\t\t\t\tsetMinValue(newMin);\n\t\t\t}\n\n\t\t\tif (maxValue !== constraints.max) {\n\t\t\t\tconst newMax = rental ? maxRentalPrice : getSellingPrice(maxSalePrice);\n\t\t\t\tsetMaxValue(newMax);\n\t\t\t}\n\t\t}\n\t}, [constraints, rental]);\n\n\treturn (\n\t\t\n\t\t\t\n\n\t\t\t\n\n\t\t\t\n\t\t\n\t);\n};\n\nexport default PriceRange;\n","import React, { useEffect, useState, Fragment } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { getApartmentSearch } from \"@redux/apartment-search/apartment-search.selectors\";\nimport TextInput from \"@components/Form/TextInput\";\nimport { DividerDash } from \"./styles\";\n\nconst AreaRange = props => {\n\tconst { constraints } = useSelector(getApartmentSearch);\n\n\tconst min = (constraints && constraints.minArea) || \"\";\n\tconst max = (constraints && constraints.maxArea) || \"\";\n\n\tconst [minValue, setMinValue] = useState(min);\n\tconst [maxValue, setMaxValue] = useState(max);\n\n\tconst onMinChange = (event: React.ChangeEvent) => {\n\t\tconst { value } = event.target as HTMLInputElement;\n\t\tsetMinValue(value);\n\n\t\tif (props.onChange) {\n\t\t\tprops.onChange(\"minArea\", value);\n\t\t}\n\t};\n\n\tconst onMaxChange = (event: React.ChangeEvent) => {\n\t\tconst { value } = event.target as HTMLInputElement;\n\t\tsetMaxValue(value);\n\n\t\tif (props.onChange) {\n\t\t\tprops.onChange(\"maxArea\", value);\n\t\t}\n\t};\n\n\tconst limitLength = (event: React.KeyboardEvent) => {\n\t\tconst target = event.target as HTMLInputElement;\n\n\t\tif (target.value.length >= 5) {\n\t\t\ttarget.value = target.value.substr(0, 5);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tif (constraints) {\n\t\t\tif (minValue !== constraints.minArea) {\n\t\t\t\tsetMinValue(constraints.minArea || \"\");\n\t\t\t}\n\n\t\t\tif (maxValue !== constraints.maxArea) {\n\t\t\t\tsetMaxValue(constraints.maxArea || \"\");\n\t\t\t}\n\t\t}\n\t}, [constraints]);\n\n\treturn (\n\t\t\n\t\t\t\n\n\t\t\t\n\n\t\t\t\n\t\t\n\t);\n};\n\nexport default AreaRange;\n","import React, { useEffect, useState, Fragment } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { getApartmentSearch } from \"@redux/apartment-search/apartment-search.selectors\";\nimport TextInput from \"@components/Form/TextInput\";\nimport { DividerDash } from \"./styles\";\n\nconst YearRange = props => {\n\tconst { constraints } = useSelector(getApartmentSearch);\n\n\tconst min = (constraints && constraints.minYearBuilt) || \"\";\n\tconst max = (constraints && constraints.maxYearBuilt) || \"\";\n\n\tconst [minValue, setMinValue] = useState(min);\n\tconst [maxValue, setMaxValue] = useState(max);\n\n\tconst onMinChange = (event: React.ChangeEvent) => {\n\t\tconst { value } = event.target as HTMLInputElement;\n\t\tsetMinValue(value);\n\n\t\tif (props.onChange) {\n\t\t\tprops.onChange(\"minYearBuilt\", value);\n\t\t}\n\t};\n\n\tconst onMaxChange = (event: React.ChangeEvent) => {\n\t\tconst { value } = event.target as HTMLInputElement;\n\t\tsetMaxValue(value);\n\n\t\tif (props.onChange) {\n\t\t\tprops.onChange(\"maxYearBuilt\", value);\n\t\t}\n\t};\n\n\tconst limitLength = (event: React.KeyboardEvent) => {\n\t\tconst target = event.target as HTMLInputElement;\n\n\t\tif (target.value.length >= 4) {\n\t\t\ttarget.value = target.value.substr(0, 4);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tif (constraints) {\n\t\t\tif (minValue !== constraints.minYearBuilt) {\n\t\t\t\tsetMinValue(constraints.minYearBuilt || \"\");\n\t\t\t}\n\n\t\t\tif (maxValue !== constraints.maxYearBuilt) {\n\t\t\t\tsetMaxValue(constraints.maxYearBuilt || \"\");\n\t\t\t}\n\t\t}\n\t}, [constraints]);\n\n\treturn (\n\t\t\n\t\t\t\n\n\t\t\t\n\n\t\t\t\n\t\t\n\t);\n};\n\nexport default YearRange;\n","import React, { Fragment, useEffect } from \"react\";\nimport { Route, Switch } from \"react-router\";\nimport DynamicRoute from \"wake-react-components/dynamic-route\";\nimport Headroom from \"react-headroom\";\nimport loadable from \"@loadable/component\";\nimport GlobalStyle from \"./globalStyle\";\nimport Logo from \"@components/Logos/logo\";\n\nimport get from \"lodash-es/get\";\n\n// \"Static\"\nimport CookieConsent from \"@components/CookieConsent\";\nimport FrontPage from \"@pages/FrontPage\";\nimport NotFound from \"@pages/NotFoundPage\";\nimport SiteFooter from \"@components/SiteFooter\";\nimport SiteHeader from \"@components/SiteHeader\";\n\n// \"Dynamic\", no prefetch, if we prefetch these, this loses it's point, they are always loaded. Ref. import(/* webpackPrefetch: true */ \"@pages/SellingPage\"));\nconst AdminPage = loadable(() => import(\"@pages/AdminPage\"));\nconst AgencyPage = loadable(() => import(\"@pages/AgencyPage\"));\nconst AgencyPriceList = loadable(() => import(\"@pages/AgencyPriceList\"));\nconst AgencySearchPage = loadable(() => import(\"@pages/AgencySearchPage\"));\nconst AgentPage = loadable(() => import(\"@pages/AgentPage\"));\nconst AgentSearchPage = loadable(() => import(\"@pages/AgentSearchPage\"));\nconst ApartmentPricingPage = loadable(() => import(\"@pages/ApartmentPricingPage\"));\nconst AreaListingPage = loadable(() => import(\"@pages/AreaListingPage\"));\nconst AreaPage = loadable(() => import(\"@pages/AreaPage\"));\nconst ArticleListingPage = loadable(() => import(\"@pages/ArticleListingPage\"));\nconst ArticlePage = loadable(() => import(\"@pages/ArticlePage\"));\nconst AgentOwnArticle = loadable(() => import(\"@pages/AgentOwnArticle\"));\nconst BulletinsPage = loadable(() => import(\"@pages/BulletinsPage\"));\nconst BuyorderPage = loadable(() => import(\"@pages/BuyorderPage\"));\nconst BuyordersPage = loadable(() => import(\"@pages/BuyordersPage\"));\nconst CampaignContentPage = loadable(() => import(\"@pages/CampaignContentPage\"));\nconst CampaignSpring2023 = loadable(() => import(\"@pages/CampaignSpring2023\"));\nconst CareersPage = loadable(() => import(\"@pages/CareersPage\"));\nconst CompaniesPage = loadable(() => import(\"@pages/CompaniesPage\"));\nconst ContactPage = loadable(() => import(\"@pages/ContactPage\"));\nconst CookieConsentPage = loadable(() => import(\"@pages/CookieConsentPage\"));\nconst DanskeChatPage = loadable(() => import (\"@pages/DanskeChatPage\"));\nconst DanskeFormPage = loadable(() => import (\"@pages/DanskeFormPage\"));\nconst DanskeSimpleFormPage = loadable(() => import (\"@pages/DanskeSimpleFormPage\"));\nconst DeveloperPage = loadable(() => import(\"@pages/DeveloperPage\"));\nconst GdprAgencyPage = loadable(() => import(\"@pages/GdprAgencyPage\"));\nconst GdprPage = loadable(() => import(\"@pages/GdprPage\"));\nconst HeadstartCancelPage = loadable(() => import(\"@pages/HeadstartCancelPage\"));\nconst HeadstartExtendPage = loadable(() => import(\"@pages/HeadstartExtendPage\"));\nconst HeadstartPage = loadable(() => import(\"@pages/HeadstartPage\"));\nconst HomeSearchPage = loadable(() => import(\"@pages/HomeSearchPage\"));\nconst HomevisitPage = loadable(() => import(\"@pages/HomevisitPage\"));\nconst InfoDisplayPage = loadable(() => import(\"@pages/InfoDisplayPage\"));\nconst LivingPage = loadable(() => import(\"@pages/LivingPage\"));\nconst MultiAgencyPage = loadable(() => import(\"@pages/MultiAgencyPage\"));\nconst OnlineOfferCancelPage = loadable(() => import(\"@pages/OnlineOfferCancelPage\"));\nconst OnlineOfferPropertyPage = loadable(() => import(\"@pages/OnlineOfferPropertyPage\"));\nconst PropertyBrochurePage = loadable(() => import(\"@pages/PropertyBrochure\"));\nconst PropertyPage = loadable(() => import(\"@pages/PropertyPage\"));\nconst RentalFormPage = loadable(() => import(\"@pages/RentalFormPage\"));\nconst SearchPage = loadable(() => import(\"@pages/SearchPage\"));\nconst SellingPage = loadable(() => import(\"@pages/SellingPage\"));\nconst TextContentPage = loadable(() => import(\"@pages/TextContentPage\"));\nconst ThinkingPage = loadable(() => import(\"@pages/ThinkingPage\"));\n\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport { hasWindow } from \"@utils\";\nimport dataLayerPush from \"@utils/dataLayerPush\";\nimport { isAdmin } from \"wake-react-components/utils\";\nimport trackProperty from \"@utils/property-track\";\nimport clsx from \"clsx\";\n\n/* Component map for routing */\nconst components = {\n\tAdminPage,\n\tAgencyPage,\n\tAgencyPriceList,\n\tAgencySearchPage,\n\tAgentOwnArticle,\n\tAgentPage,\n\tAgentSearchPage,\n\tApartmentPricingPage,\n\tAreaListingPage,\n\tAreaPage,\n\tArticleListingPage,\n\tArticlePage,\n\tBulletinsPage,\n\tBuyorderPage,\n\tBuyordersPage,\n\tCampaignSpring2023,\n\tCareersPage,\n\tCompaniesPage,\n\tContactPage,\n\tCookieConsentPage,\n\tDanskeChatPage,\n\tDanskeFormPage,\n\tDanskeSimpleFormPage,\n\tDeveloperPage,\n\tFrontPage,\n\tGdprAgencyPage,\n\tGdprPage,\n\tHeadstartCancelPage,\n\tHeadstartExtendPage,\n\tHeadstartPage,\n\tHomeSearchPage,\n\tHomevisitPage,\n\tInfoDisplayPage,\n\tLivingPage,\n\tMultiAgencyPage,\n\tNotFound,\n\tOnlineOfferCancelPage,\n\tOnlineOfferPropertyPage,\n\tPropertyBrochurePage,\n\tPropertyPage,\n\tRentalFormPage,\n\tSearchPage,\n\tSellingPage,\n\tTextContentPage,\n\tThinkingPage,\n};\n\nconst contentComponents = {\n\taluesivu: AreaPage,\n\tkampanjasisalto: CampaignContentPage,\n\tkiinteistovalittajasivu: AgentPage,\n\tkohde: PropertyPage,\n\tmyymalasivu: AgencyPage,\n\ttietosuoja: GdprAgencyPage,\n};\n\nconst classNameComponents = {\n\tCampaignContentPage,\n};\n\nconst routeResolver = (props: any) => {\n\tconst { document: doc } = props;\n\tif (!doc) {\n\t\t// console.log(\"route by !doc\");\n\t\treturn components[\"NotFound\"];\n\t}\n\n\t/* Routing by renderClassComponent */\n\tconst { page, renderClassComponent } = doc;\n\tif (renderClassComponent && components[renderClassComponent]) {\n\t\t// console.log(\"route by renderClassComponent\", renderClassComponent);\n\t\treturn components[renderClassComponent];\n\t} else if (page && page.renderClassComponent && components[page.renderClassComponent]) {\n\t\t// console.log(\"route by page.renderClassComponent\", page.renderClassComponent);\n\t\treturn components[page.renderClassComponent];\n\t}\n\n\t/* A hack to get \"subpages\" working for now */\n\tif (!doc.isPage && doc.page && contentComponents[doc.page.nameSort]) {\n\t\t// console.log(\"route by doc.page.nameSort\", doc.page.nameSort);\n\t\treturn contentComponents[doc.page.nameSort];\n\t} else if (doc.shortClassName in classNameComponents) {\n\t\t// console.log(\"route by shortClassName\", doc.shortClassName);\n\t\treturn classNameComponents[doc.shortClassName];\n\t}\n};\n\nexport default () => {\n\tuseEffect(() => {\n\t\tif (hasWindow) {\n\t\t\t/* navigator.msMaxTouchPoints for some windows phones */\n\t\t\tif (\"ontouchstart\" in window || navigator.msMaxTouchPoints) {\n\t\t\t\tdocument.body.classList.add(\"is-touch\");\n\t\t\t} else {\n\t\t\t\tdocument.body.classList.add(\"is-pointer\");\n\t\t\t}\n\t\t\t// Track GTM\n\t\t\tdataLayerPush({\n\t\t\t\tevent: \"virtualPageview\",\n\t\t\t\tnewUrl: location.href,\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tconst doc = get(window[\"wdso\"], [\"document\"]);\n\t\t\t\tconst component = get(doc, [\"page\", \"renderClassComponent\"]);\n\t\t\t\tconst nameSort = get(doc, [\"page\", \"nameSort\"]);\n\n\t\t\t\tif (component === \"PropertyPage\" || nameSort === \"kohde\") {\n\t\t\t\t\ttrackProperty(doc);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(e);\n\t\t\t}\n\t\t}\n\t}, []);\n\n\tlet useCookieModal: boolean = true;\n\tif (hasWindow) {\n\t\ttry {\n\t\t\tconst d = get(window[ \"wdso\" ], [ \"document\" ]);\n\t\t\tif (d.noCookieConsent) {\n\t\t\t\tuseCookieModal = false;\n\t\t\t}\n\t\t} catch {\n\t\t\tconsole.log(\"No window object\");\n\t\t}\n\t}\n\n\treturn (\n\t\t (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{!isAdmin && (\n\t\t\t\t\t\t document.body.classList.add(\"header-pinned\")}\n\t\t\t\t\t\t\tonUnpin={() => document.body.classList.remove(\"header-pinned\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t } />\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{(!isAdmin && useCookieModal) && }\n\t\t\t\t\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import styled, { createGlobalStyle } from \"styled-components\";\nimport { color, fontFamily, textStyles, buttons } from \"@utils/style-utils\";\n\nconst GlobalStyle = createGlobalStyle`\n\tbody {\n\t\tcolor: ${color(\"grey\", 1)};\n\n\t\t&.infoDisplayPage {\n\t\t\tbackground: ${color(\"beige\", 3)};\n\t\t}\n\n\t\t&.propertyBrochurePage, &.infoDisplayPage {\n\t\t\tvisibility: hidden;\n\n\t\t\t.site-content {\n\t\t\t\tvisibility: visible;\n\t\t\t\tmargin-top: 0;\n\t\t\t\ttransition: none;\n\t\t\t}\n\n\t\t\t/* These may create empty space to the end of page that will be visible in PDFs */\n\t\t\t& > DIV:not(.app-wrapper):not(#measurementStick),\n\t\t\t&::before,\n\t\t\t&::after,\n\t\t\tDIV.headroom-wrapper,\n\t\t\tNOSCRIPT,\n\t\t\tSPAN.page-loader,\n\t\t\t.siteFooter {\n\t\t\t\tdisplay: none !important;\n\t\t\t}\n\t\t}\n\t}\n\n\tinput[type=\"text\"],\n\tinput[type=\"email\"],\n\tinput[type=\"tel\"],\n\ttextarea {\n\t\t-webkit-appearance: none;\n\t\t-moz-appearance: none;\n\t\tbackground: ${color(\"white\")};\n\t\tborder: 1px solid ${color(\"grey\", 5)};\n\t\tborder-radius: 4px;\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tfont-family: ${fontFamily.condensed};\n\t\tfont-size: 16px;\n\t\tfont-weight: 400;\n\t\tline-height: normal;\n\t\tletter-spacing: 0;\n\t\tpadding: 10px 16px;\n\n\t\t&:focus {\n\t\t\toutline: 0;\n\t\t}\n\n\t\t&::placeholder {\n\t\t\tcolor: ${color(\"grey\", 3)};\n\t\t\tfont-size: 16px;\n\t\t}\n\t}\n\n\ttextarea {\n\t\tresize: none;\n\t}\n\n\th1 {\n\t\t${textStyles.H1}\n\t}\n\n\th2 {\n\t\t${textStyles.H2}\n\t}\n\n\th3 {\n\t\t${textStyles.H3}\n\t}\n\n\th4 {\n\t\t${textStyles.H4}\n\t}\n\n\th5 {\n\t\t${textStyles.H5}\n\t}\n\n\tp {\n\t\t${textStyles.PSmall}\n\t}\n\n\t/* Overriding without the need for !important on every property */\n\t.cta.cta {\n\t\t${buttons.textLinkPrimary}\n\t\ttext-decoration: none;\n\t}\n\n\timg.lazy-image {\n\t\ttransition: filter 800ms;\n\n\t\t&.lazy-thumb {\n\t\t\tfilter: blur(8px);\n\t\t\tfilter: url(#sharpBlur);\n\t\t}\n\t}\n`;\n\nexport default GlobalStyle;\n","import React from \"react\";\n\nconst Logo = ({ noText = false }) => {\n\treturn (\n\t\t\n\t\t\t{!noText && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default Logo;\n","module.exports = \"data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MiAzOCIgdmlld0JveD0iMCAwIDUyIDM4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiMyM2QyNzgiPjxwYXRoIGQ9Im0yOCA4aDF2LTNoLTE3djMzaDQwdi0zMC0zaC0xM3YzaDEwdjEzaC0xN3YzaDE3djExaC0xN3YtMTRoLTN2MTRoLTE0di04LTMtMTZoMTB6Ii8+PHBhdGggZD0ibTAgNXY2aDN2LTNoNnYtM3oiLz48cGF0aCBkPSJtMyAyMWgtM3Y2aDMgNnYtM2gtNnoiLz48cGF0aCBkPSJtMCAxNGgzdjRoLTN6Ii8+PC9nPjwvc3ZnPg==\"","module.exports = \"data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MiAzOCIgdmlld0JveD0iMCAwIDUyIDM4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiMyM2QyNzgiPjxwYXRoIGQ9Im0yNiA1LTI2IDd2MjZoNnYtM2gtM3YtMjAuN2wyMy02LjIgMjMgNi4ydjIwLjdoLTN2M2g2di0yNnoiLz48cGF0aCBkPSJtMzkuNyAyMC4zYy0uMi4yLS4zLjQtLjMuNnYuOHMwIC4xLS4xLjFoLS4xbC0yLjYtNS45Yy0xLTEuOC0yMC4zLTEuOC0yMS4yIDBsLTIuNiA1LjloLS4xcy0uMS0uMS0uMS0uMXYtLjdjMC0uNS0uNC0uOC0uOC0uOGgtLjFsLTIuMS4yYy0uNCAwLS43LjQtLjcuN2wtLjEuN2MwIC4zLjIuNi41LjdsMi43LjFjLjEgMCAuMSAwIC4xLjF2LjJsLTEuOSAyLjVjLS4zLjQtLjUgMS0uNSAxLjVsNy4xLjFjLjcgMCAxLjggMy4xIDEuNiAzLjUtLjEuMS0uMi4yLS40LjJsLTguNC0uM3Y0LjhsLjUgMi43aDUuM2wuMy0yLjloMjAuM2wuMyAyLjloNS4zbC41LTIuN3YtNC44bC04LjQuM2MtLjIgMC0uMy0uMS0uNC0uMi0uMi0uMy45LTMuNCAxLjYtMy41bDcuMi0uMWMwLS42LS4yLTEuMS0uNS0xLjVsLTEuOS0yLjVzMC0uMSAwLS4yLjEtLjEuMS0uMWwyLjctLjFjLjIgMCAuMy0uMS40LS4ycy4yLS4zLjEtLjVsLS4xLS43YzAtLjQtLjMtLjctLjctLjdsLTIuMS0uMmMwLS4xLS4zIDAtLjQuMXptLTI0LjIgMi4yIDIuMi01LjFjMC0uOCAxNi42LS44IDE2LjYgMGwyLjIgNS4xeiIvPjwvZz48L3N2Zz4=\"","module.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjMiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAyMyAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTExLjQgMEM5LjkgMCA4LjQgMC4zIDcgMC44QzUuNiAxLjQgNC40IDIuMiAzLjMgMy4zQzIuMiA0LjQgMS40IDUuNiAwLjggN0MwLjMgOC40IDAgOS45IDAgMTEuNEMwIDE5IDExLjQgMzMgMTEuNCAzM0MxMS40IDMzIDIyLjggMTkgMjIuOCAxMS40QzIyLjggOS45IDIyLjUgOC40IDIyIDdDMjEuNCA1LjYgMjAuNiA0LjMgMTkuNSAzLjNDMTguNCAyLjIgMTcuMiAxLjQgMTUuOCAwLjhDMTQuNCAwLjMgMTIuOSAwIDExLjQgMFpNMTEuNCAxNkMxMC42IDE2IDkuNyAxNS44IDkgMTUuM0M4LjMgMTQuOCA3LjggMTQuMiA3LjQgMTMuNEM3LjEgMTIuNiA3IDExLjggNy4yIDEwLjlDNy40IDEwLjEgNy44IDkuMyA4LjQgOC43QzkgOC4xIDkuOCA3LjcgMTAuNiA3LjVDMTEuNCA3LjMgMTIuMyA3LjQgMTMuMSA3LjdDMTMuOSA4IDE0LjUgOC42IDE1IDkuM0MxNS41IDEwIDE1LjcgMTAuOCAxNS43IDExLjdDMTUuNyAxMi44IDE1LjMgMTMuOSAxNC41IDE0LjdDMTMuNiAxNS41IDEyLjYgMTYgMTEuNCAxNloiIGZpbGw9IiMyM0QyNzgiLz4KPHBhdGggZD0iTTExLjI5OTkgMzUuN0M3LjM5OTkgMzUuNyA0LjM5OTkgMzQuMiA0LjM5OTkgMzIuMkM0LjM5OTkgMzAuMiA3LjM5OTkgMjguNyAxMS4yOTk5IDI4LjdDMTUuMTk5OSAyOC43IDE4LjE5OTkgMzAuMiAxOC4xOTk5IDMyLjJDMTguMTk5OSAzNC4yIDE1LjI5OTkgMzUuNyAxMS4yOTk5IDM1LjdaTTExLjI5OTkgMzAuMkM3Ljk5OTkgMzAuMiA1Ljg5OTkgMzEuNCA1Ljg5OTkgMzIuMkM1Ljg5OTkgMzMgNy45OTk5IDM0LjIgMTEuMjk5OSAzNC4yQzE0LjU5OTkgMzQuMiAxNi42OTk5IDMzIDE2LjY5OTkgMzIuMkMxNi42OTk5IDMxLjQgMTQuNTk5OSAzMC4yIDExLjI5OTkgMzAuMloiIGZpbGw9IiMyM0QyNzgiLz4KPC9zdmc+Cg==\"","module.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIyOSIgaGVpZ2h0PSIyMDEiIHZpZXdCb3g9IjAgMCAxMjI5IDIwMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGQ9Ik0xMTIuNTY1IDIwMVYxNTUuMTk2QzExMi41NjUgMTI2LjcwNyA4OS40NTQ1IDEwMy43MjcgNjEuMTU2MyAxMDMuNzI3QzMyLjcwMSAxMDMuNzI3IDkuNzQ4MDUgMTI2LjcwNyA5Ljc0ODA1IDE1NS4xOTZWMjAxSDExMi41NjVaIiBmaWxsPSIjRTFDMTlFIi8+CjxwYXRoIGQ9Ik0xMzYuNjE3IDIwMUgxNzQuODJWMTI1LjI5MVY5OC4zNzUxQzE3NC44MiA5Ny4yNzMzIDE3NC45NzcgOTYuMzI4OSAxNzUuMTM0IDk1LjIyNzFWODUuNjI1N0MxNzUuMTM0IDc0LjkyMjUgMTY2LjQ4NyA2Ni40MjI5IDE1NS45NTQgNjYuNDIyOUMxNDUuNDIxIDY2LjQyMjkgMTM2Ljc3NCA3NS4wNzk5IDEzNi43NzQgODUuNjI1N1YxMTIuNTQxVjExNC45MDJWMTI0LjE4OVYyMDFIMTM2LjYxN1oiIGZpbGw9IiMwMENFN0MiLz4KPHBhdGggZD0iTTEzNi42MTcgMTI0LjAzMVYxMTQuOTAyQzEzNi42MTcgMTA0LjE5OSAxMjcuOTcgOTUuNjk5MiAxMTcuNDM3IDk1LjY5OTJDMTA2LjkwMyA5NS42OTkyIDk4LjA5OTYgMTA0LjE5OSA5OC4wOTk2IDExNC45MDJWMjAxLjE1N0gxMzYuNjE3VjEyNC4wMzFaIiBmaWxsPSIjMDBDRTdDIi8+CjxwYXRoIGQ9Ik0xNzUuMTMzIDEyNC4wMzFWMjAxSDIxMy4zMzVWMTI1LjI5MVY5OC4zNzUyQzIxMy4zMzUgODcuNjcyIDIwNC42ODkgNzkuMTcyNCAxOTQuMTU1IDc5LjE3MjRDMTg0LjU2NiA3OS4xNzI0IDE3Ni43MDUgODYuMDk4IDE3NS4xMzMgOTUuMzg0NlYxMTIuNjk5VjEyNC4wMzFaIiBmaWxsPSIjMDBDRTdDIi8+CjxwYXRoIGQ9Ik0xNzQuODE4IDk4LjM3NTFWMTI1LjI5VjIwMUgxNzUuMTMzVjEyNC4wMzFWMTEyLjU0MVY5NS4yMjcxQzE3NC45NzYgOTYuMzI4OSAxNzQuODE4IDk3LjI3MzMgMTc0LjgxOCA5OC4zNzUxWiIgZmlsbD0iIzAwQ0U3QyIvPgo8cGF0aCBkPSJNMjk2LjUwMSAxNDIuNzYySDIxNy40MjRWMTg5LjM1MkgyOTYuNTAxVjE0Mi43NjJaIiBmaWxsPSIjMDNBMDU0Ii8+CjxwYXRoIGQ9Ik01MDIuNDQ5IDE1MS4yNjJWNzMuODIwN1Y1OS4wMjUxTDQzNy44MzUgNy4zOTc4MUw0MjguNzE3IDBMMzU0Ljk4NCA1OS4wMjUxVjczLjgyMDdWMTUxLjI2Mkg1MDIuNDQ5WiIgZmlsbD0iIzAwOUQ0RiIvPgo8cGF0aCBkPSJNNDQzLjQ5NSA0NC4yMjk0VjExLjgwNUw0MzcuODM1IDcuMzk3ODFMNDI4LjcxNyAwTDM1NC45ODQgNTkuMDI1MVY3My44MjA3VjEwNi4yNDVMMzYwLjQ4NyAxMTAuNjUyTDM2OS43NjIgMTE4LjA1TDQ0My40OTUgNTkuMDI1MVY0NC4yMjk0WiIgZmlsbD0iIzAwQ0U3QyIvPgo8cGF0aCBkPSJNNTIyLjg4NiAxNjYuNTI5VjExNC45MDJWMTA0LjUxNEw0NzcuNzY2IDY4LjMxMTZMNDcxLjMyIDYzLjExNzRMNDE5LjU5OCAxMDQuNTE0VjExNC45MDJWMTY2LjUyOUg0NzEuMzJINTIyLjg4NloiIGZpbGw9IiMwMDlENEYiLz4KPHBhdGggZD0iTTQ4MS41MzkgOTQuMTI1M1Y3MS40NTk2TDQ3Ny43NjYgNjguMzExNkw0NzEuMzIgNjMuMTE3NEw0MTkuNTk4IDEwNC41MTRWMTE0LjkwMlYxMzcuNTY4TDQyMy41MjggMTQwLjcxNkw0MjkuOTc0IDE0NS45MUw0ODEuNTM5IDEwNC41MTRWOTQuMTI1M1oiIGZpbGw9IiMwMENFN0MiLz4KPHBhdGggZD0iTTM4LjUxNzYgMjAxSDc2LjcyMDFWMTk1LjQ5MVYxNjguNTc2Qzc2LjcyMDEgMTY3LjQ3NCA3Ni44NzczIDE2Ni41MjkgNzcuMDM0NSAxNjUuNDI4VjE1NS44MjZDNzcuMDM0NSAxNDUuMTIzIDY4LjM4NzggMTM2LjYyMyA1Ny44NTQ2IDEzNi42MjNDNDcuMzIxNCAxMzYuNjIzIDM4LjY3NDggMTQ1LjI4IDM4LjY3NDggMTU1LjgyNlYxODIuNzQyVjE4NC45NDVWMTk0LjIzMlYyMDFIMzguNTE3NloiIGZpbGw9IiMwMDlENEYiLz4KPHBhdGggZD0iTTM4LjUxNjkgMTk0LjM4OVYxODUuMTAzQzM4LjUxNjkgMTc0LjQgMjkuODcwMyAxNjUuOSAxOS4zMzcxIDE2NS45QzguODAzODcgMTY1LjkgMCAxNzQuNTU3IDAgMTg1LjEwM1YyMDFIMzguNTE2OVYxOTQuMzg5WiIgZmlsbD0iIzAwOUQ0RiIvPgo8cGF0aCBkPSJNNzcuMDMzMiAxOTQuMzg5VjIwMUgxMTUuMjM2VjE5NS40OTFWMTY4LjU3NkMxMTUuMjM2IDE1Ny44NzIgMTA2LjU4OSAxNDkuMzczIDk2LjA1NTggMTQ5LjM3M0M4Ni40NjU5IDE0OS4zNzMgNzguNjA1MyAxNTYuMjk4IDc3LjAzMzIgMTY1LjU4NVYxODIuODk5VjE5NC4zODlaIiBmaWxsPSIjMDA5RDRGIi8+CjxwYXRoIGQ9Ik03Ni43MTg4IDE2OC43MzNWMTk1LjY0OFYyMDEuMTU3SDc3LjAzMzJWMTk0LjU0NlYxODMuMDU2VjE2NS43NDJDNzYuODc2IDE2Ni41MjkgNzYuNzE4OCAxNjcuNjMxIDc2LjcxODggMTY4LjczM1oiIGZpbGw9IiMwMDlENEYiLz4KPHBhdGggZD0iTTQ0My40OTUgMTM5LjE0MkgyOTYuODE2VjIwMUg0NDMuNDk1VjEzOS4xNDJaIiBmaWxsPSIjRTFDMTlFIi8+CjxwYXRoIGQ9Ik05OTYuODggMjAxVjU3LjkyMzFWNTIuMjU2N0w5NzIuMDQxIDMyLjQyNDNMOTY4LjU4MiAyOS41OTExTDk0MC4xMjcgNTIuMjU2N1Y1Ny45MjMxVjIwMUg5NjguNTgySDk5Ni44OFoiIGZpbGw9IiMwMDlENEYiLz4KPHBhdGggZD0iTTk3NC4yNDIgNDYuNTkwM1YzNC4xNTU3TDk3Mi4wNDEgMzIuNDI0M0w5NjguNTgyIDI5LjU5MTFMOTQwLjEyNyA1Mi4yNTY3VjU3LjkyMzFWNzAuMzU3N0w5NDIuMzI4IDcyLjA4OTFMOTQ1Ljc4NyA3NC45MjIzTDk3NC4yNDIgNTIuMjU2N1Y0Ni41OTAzWiIgZmlsbD0iIzAwQ0U3QyIvPgo8cGF0aCBkPSJNMTA3My45MSA3MS4zMDI0QzEwNzMuOTEgNjAuNTk5MiAxMDY1LjI3IDUyLjA5OTYgMTA1NC43MyA1Mi4wOTk2QzEwNDQuMiA1Mi4wOTk2IDEwMzUuNTUgNjAuNzU2NiAxMDM1LjU1IDcxLjMwMjRWOTguMjE3OVYxMDkuNzA4VjE3MS44ODFIMTA3NC4wN1YxMDkuNzA4Vjk4LjIxNzlMMTA3My45MSA3MS4zMDI0WiIgZmlsbD0iIzAwNjQ1MCIvPgo8cGF0aCBkPSJNMTAzNS40IDEwMC41NzlDMTAzNS40IDg5Ljg3NTYgMTAyNi43NSA4MS4zNzYgMTAxNi4yMiA4MS4zNzZDMTAwNS42OCA4MS4zNzYgOTk3LjAzNyA5MC4wMzMgOTk3LjAzNyAxMDAuNTc5VjE2Mi43NTJWMTc0LjI0MlYyMDEuMTU4SDEwMzUuNTVWMTc0LjI0MlYxNjIuNzUyTDEwMzUuNCAxMDAuNTc5WiIgZmlsbD0iIzAwNjQ1MCIvPgo8cGF0aCBkPSJNMTExMi4xMiA4NC4wNTE5QzExMTIuMTIgNzMuMzQ4NyAxMTAzLjQ3IDY0Ljg0OTEgMTA5Mi45NCA2NC44NDkxQzEwODIuMjUgNjQuODQ5MSAxMDczLjc2IDczLjUwNjEgMTA3My43NiA4NC4wNTE5VjExMC45NjdWMTU3LjU1OFYxODQuNDczSDExMTIuMjdWMTU3LjU1OFYxMTAuOTY3TDExMTIuMTIgODQuMDUxOVoiIGZpbGw9IiMwMDY0NTAiLz4KPHBhdGggZD0iTTYyNS44NjEgOTIuNTUxNEM2MjUuODYxIDY0LjA2MiA2MDIuNzUxIDQxLjA4MTUgNTc0LjQ1MyA0MS4wODE1QzU0NS45OTggNDEuMDgxNSA1MjMuMDQ1IDY0LjA2MiA1MjMuMDQ1IDkyLjU1MTRWMTg1Ljg5SDYyNi4wMTlMNjI1Ljg2MSA5Mi41NTE0WiIgZmlsbD0iI0ExRThCQyIvPgo8cGF0aCBkPSJNNzM2LjM4MSA1My44MzA3QzczNi4zODEgNDMuMTI3NSA3MjcuNzM1IDM0LjYyNzkgNzE3LjIwMSAzNC42Mjc5QzcwNi41MTEgMzQuNjI3OSA2OTguMDIxIDQzLjI4NDkgNjk4LjAyMSA1My44MzA3VjgwLjc0NjJWOTIuMjM2NFYxMTkuMTUySDczNi41MzhWOTIuMjM2NFY4MC43NDYyTDczNi4zODEgNTMuODMwN1oiIGZpbGw9IiNBMUU4QkMiLz4KPHBhdGggZD0iTTY5Ny44NjQgODMuMTA3MUM2OTcuODY0IDcyLjQwMzkgNjg5LjIxNyA2My45MDQzIDY3OC42ODQgNjMuOTA0M0M2NjcuOTkzIDYzLjkwNDMgNjU5LjUwNCA3Mi41NjEzIDY1OS41MDQgODMuMTA3MVYxMTAuMDIzVjEyMS41MTNWMTQ4LjQyOEg2OTguMDIxVjEyMS41MTNWMTEwLjAyM0w2OTcuODY0IDgzLjEwNzFaIiBmaWxsPSIjQTFFOEJDIi8+CjxwYXRoIGQ9Ik03NzQuNzQxIDY2LjU4MDNDNzc0Ljc0MSA1NS44NzcgNzY2LjA5NCA0Ny4zNzc0IDc1NS41NjEgNDcuMzc3NEM3NDQuODcgNDcuMzc3NCA3MzYuMzgxIDU2LjAzNDQgNzM2LjM4MSA2Ni41ODAzVjkzLjQ5NTdWMTA0Ljk4NlYxMzEuOTAxSDc3NC44OThWMTA0Ljk4NlY5My40OTU3TDc3NC43NDEgNjYuNTgwM1oiIGZpbGw9IiNBMUU4QkMiLz4KPHBhdGggZD0iTTcwNS4yNTQgODcuMzU3Mkw2NDguNSAxMzIuODQ2VjE0NC4xNzlWMjAxSDcwNS4yNTRINzYyLjE2NFYxNDQuMTc5VjEzMi44NDZMNzEyLjQ4NSA5My4wMjM2TDcwNS4yNTQgODcuMzU3MloiIGZpbGw9IiNFMUMxOUUiLz4KPHBhdGggZD0iTTcwOC43MTEgMjAxVjEyNy4zMzdWMTEyLjU0MUw2NDQuMjU0IDYwLjkxMzlMNjM0Ljk3OCA1My41MTYxTDU2MS4yNDYgMTEyLjU0MVYxMjcuMzM3VjIwMUg2MzQuOTc4SDcwOC43MTFaIiBmaWxsPSIjMDA5RDRGIi8+CjxwYXRoIGQ9Ik02NDkuNzU2IDk3Ljc0NTZWNjUuMzIxMUw2NDQuMjU0IDYwLjkxMzlMNjM0Ljk3OCA1My41MTYxTDU2MS4yNDYgMTEyLjU0MVYxMjcuMzM3VjE1OS43NjFMNTY2LjkwNiAxNjQuMTY4TDU3Ni4wMjQgMTcxLjU2Nkw2NDkuNzU2IDExMi41NDFWOTcuNzQ1NloiIGZpbGw9IiMwMENFN0MiLz4KPHBhdGggZD0iTTk0MC4xMjggMTYyLjc1MlY4NS4xNTMzVjcwLjM1NzdMODc1LjY3MSAxOC43MzA0TDg2Ni41NTMgMTEuNDlMNzkyLjgyIDcwLjM1NzdWODUuMTUzM1YxNjIuNzUySDk0MC4xMjhaIiBmaWxsPSIjMDA5RDRGIi8+CjxwYXRoIGQ9Ik04ODEuMTczIDU1LjcxOTRWMjMuMjk1TDg3NS42NzEgMTguNzMwNEw4NjYuNTUzIDExLjQ5TDc5Mi44MiA3MC4zNTc3Vjg1LjE1MzNWMTE3LjU3OEw3OTguMzIzIDEyMi4xNDJMODA3LjU5OCAxMjkuMzgzTDg4MS4xNzMgNzAuMzU3N1Y1NS43MTk0WiIgZmlsbD0iIzAwQ0U3QyIvPgo8cGF0aCBkPSJNNDk5LjE0OCAyMDFWMTcxLjA5NFYxNjUuNDI3TDQ3NC43OCAxNDUuOTFMNDcxLjMyMiAxNDMuMDc3TDQ0My4zMzggMTY1LjQyN1YxNzEuMDk0VjIwMUg0OTkuMTQ4WiIgZmlsbD0iIzAwOUQ0RiIvPgo8cGF0aCBkPSJNNDc2LjgyNCAxNTkuOTE4VjE0Ny40ODRMNDc0Ljc4IDE0NS45MUw0NzEuMzIyIDE0My4wNzdMNDQzLjMzOCAxNjUuNDI3VjE3MS4wOTRWMTgzLjM3MUw0NDUuNTM5IDE4NC45NDVMNDQ4Ljk5OCAxODcuNzc4TDQ3Ni44MjQgMTY1LjQyN1YxNTkuOTE4WiIgZmlsbD0iIzAwQ0U3QyIvPgo8cGF0aCBkPSJNNDI3LjE0NSAxMzcuNTY4VjEyMS4zNTVINDEwLjc5NVYxMDQuOTg2SDM5NC40NDVWODguNjE2MkgzNzguMjUyVjEwNC45ODZWMTIxLjM1NVYxMzcuNTY4VjE1My45MzdIMzk0LjQ0NUg0MTAuNzk1SDQyNy4xNDVINDQzLjQ5NVYxMzcuNTY4SDQyNy4xNDVaIiBmaWxsPSIjRTFDMTlFIi8+CjxwYXRoIGQ9Ik0zMTYuNjI0IDE4OC41NjVWMTE0LjkwMlYxMDQuNTE0TDI3MS41MDQgNjguMzExNkwyNjUuMDU5IDYzLjExNzRMMjEzLjMzNiAxMDQuNTE0VjExNC45MDJWMTg4LjU2NUgyNjUuMDU5SDMxNi42MjRaIiBmaWxsPSIjMDJBMDU0Ii8+CjxwYXRoIGQ9Ik0yNzUuMjc3IDk0LjEyNTNWNzEuNDU5NkwyNzEuNTA0IDY4LjMxMTZMMjY1LjA1OSA2My4xMTc0TDIxMy4zMzYgMTA0LjUxNFYxMTQuOTAyVjEzNy41NjhMMjE3LjI2NiAxNDAuNzE2TDIyMy43MTIgMTQ1LjkxTDI3NS4yNzcgMTA0LjUxNFY5NC4xMjUzWiIgZmlsbD0iIzAwQ0U3QyIvPgo8cGF0aCBkPSJNMzE2LjYyNSAyMDFWMTcyLjY2OFYxNjcuMDAyTDI5MS43ODUgMTQ3LjE2OUwyODguMTY5IDE0NC4zMzZMMjU5Ljg3MSAxNjcuMDAyVjE3Mi42NjhWMjAxSDI4OC4xNjlIMzE2LjYyNVoiIGZpbGw9IiMwMkEwNTQiLz4KPHBhdGggZD0iTTI5My44MjkgMTYxLjMzNVYxNDguNzQzTDI5MS43ODUgMTQ3LjE2OUwyODguMTY5IDE0NC4zMzZMMjU5Ljg3MSAxNjcuMDAyVjE3Mi42NjhWMTg1LjEwM0wyNjEuOTE1IDE4Ni44MzRMMjY1LjUzMSAxODkuNjY3TDI5My44MjkgMTY3LjAwMlYxNjEuMzM1WiIgZmlsbD0iIzAwQ0U3QyIvPgo8cGF0aCBkPSJNMjQ0LjMwNyAxODUuNTc1VjE2OS45OTJIMjI4LjlWMTU0LjU2N0gyMTMuMzM2VjEzOC45ODRIMTk3LjkzVjE1NC41NjdWMTY5Ljk5MlYxODUuNTc1VjIwMUgyMTMuMzM2SDIyOC45SDI0NC4zMDdIMjU5Ljg3MVYxODUuNTc1SDI0NC4zMDdaIiBmaWxsPSIjRTFDMTlFIi8+CjxwYXRoIGQ9Ik0xNzcuMzM1IDEzOC45ODRIMTU2LjU4M1YxNTkuNjA0SDEzNS45ODhWMTgwLjM4MUgxMTUuMjM2VjIwMUgxMzUuOTg4SDE1Ni41ODNIMTc3LjMzNUgxOTcuOTNWMTgwLjM4MVYxNTkuNjA0VjEzOC45ODRWMTE4LjIwOEgxNzcuMzM1VjEzOC45ODRaIiBmaWxsPSIjMDA2NDUwIi8+CjxwYXRoIGQ9Ik0xMTcyLjk2IDE1MS43MzRIMTA3Ny44NVYyMDFIMTE3Mi45NlYxNTEuNzM0WiIgZmlsbD0iIzAwNjQ1MCIvPgo8cGF0aCBkPSJNMTIzMS42IDE2Ni41MjlWMTE0LjkwMlYxMDQuNTE0TDExODYuNDggNjguMzExNkwxMTgwLjAzIDYzLjExNzRMMTEyOC4zMSAxMDQuNTE0VjExNC45MDJWMTY2LjUyOUgxMTgwLjAzSDEyMzEuNloiIGZpbGw9IiMwMDlENEYiLz4KPHBhdGggZD0iTTExOTAuMjUgOTQuMTI1M1Y3MS40NTk2TDExODYuNDggNjguMzExNkwxMTgwLjAzIDYzLjExNzRMMTEyOC4zMSAxMDQuNTE0VjExNC45MDJWMTM3LjU2OEwxMTMyLjI0IDE0MC43MTZMMTEzOC42OSAxNDUuOTFMMTE5MC4yNSAxMDQuNTE0Vjk0LjEyNTNaIiBmaWxsPSIjMDBDRTdDIi8+CjxwYXRoIGQ9Ik0xMjMxLjQ0IDIwMVYxNjkuNTJWMTYzLjIyNEwxMjAzLjkzIDE0MS4xODhMMTIwMCAxMzguMDRMMTE2OC41NiAxNjMuMjI0VjE2OS41MlYyMDFIMTIwMEgxMjMxLjQ0WiIgZmlsbD0iIzAwOUQ0RiIvPgo8cGF0aCBkPSJNMTIwNi4yOSAxNTYuOTI4VjE0My4wNzdMMTIwMy45MyAxNDEuMTg4TDEyMDAgMTM4LjA0TDExNjguNTYgMTYzLjIyNFYxNjkuNTJWMTgzLjM3MUwxMTcwLjkxIDE4NS4yNkwxMTc0Ljg1IDE4OC40MDhMMTIwNi4yOSAxNjMuMjI0VjE1Ni45MjhaIiBmaWxsPSIjMDBDRTdDIi8+CjxwYXRoIGQ9Ik0xMTI4LjMxIDE1MC40NzVWMTM0LjI2M0gxMTEyLjEyVjExNy44OTNIMTA5NS43N1YxMDEuNjgxSDEwNzkuNTdWMTE3Ljg5M1YxMzQuMjYzVjE1MC40NzVWMTY2LjY4N0gxMDk1Ljc3SDExMTIuMTJIMTEyOC4zMUgxMTQ0LjY2VjE1MC40NzVIMTEyOC4zMVoiIGZpbGw9IiNBMUU4QkMiLz4KPHBhdGggZD0iTTEwNTguODIgMTM4Ljk4NEgxMDM4LjIzVjE1OS42MDRIMTAxNy42M1YxODAuMzgxSDk5Ni44ODFWMjAxSDEwMTcuNjNIMTAzOC4yM0gxMDU4LjgySDEwNzkuNTdWMTgwLjM4MVYxNTkuNjA0VjEzOC45ODRWMTE4LjIwOEgxMDU4LjgyVjEzOC45ODRaIiBmaWxsPSIjRTFDMTlFIi8+CjxwYXRoIGQ9Ik01NDIuMjI1IDE0My4zOTJDNTMxLjUzNCAxNDMuMzkyIDUyMy4wNDUgMTUyLjA0OSA1MjMuMDQ1IDE2Mi41OTRINTI5LjQ5MUM1MjkuNDkxIDE1NS41MTEgNTM1LjMwNyAxNDkuNjg4IDU0Mi4zODIgMTQ5LjY4OEM1NDkuNDU2IDE0OS42ODggNTU1LjI3MyAxNTUuNTExIDU1NS4yNzMgMTYyLjU5NEg1NjEuNzE5QzU2MS40MDUgMTUyLjA0OSA1NTIuNzU4IDE0My4zOTIgNTQyLjIyNSAxNDMuMzkyWiIgZmlsbD0iIzAwNjQ1MCIvPgo8cGF0aCBkPSJNNTQyLjIyMyAxNDkuODQ1QzUzNS4xNDkgMTQ5Ljg0NSA1MjkuMzMyIDE1NS42NjkgNTI5LjMzMiAxNjIuNzUySDU1NC45NThDNTU0Ljk1OCAxNTUuNTExIDU0OS4yOTggMTQ5Ljg0NSA1NDIuMjIzIDE0OS44NDVaIiBmaWxsPSIjMDA2NDUwIi8+CjxwYXRoIGQ9Ik01NjEuNDA0IDE2Mi41OTRINTIyLjg4N1YyMDFINTYxLjQwNFYxNjIuNTk0WiIgZmlsbD0iIzAwNjQ1MCIvPgo8cGF0aCBkPSJNNTQyLjIyNSAxMTAuOTY3QzUzMS41MzQgMTEwLjk2NyA1MjMuMDQ1IDExOS42MjQgNTIzLjA0NSAxMzAuMTdINTI5LjQ5MUM1MjkuNDkxIDEyMy4wODcgNTM1LjMwNyAxMTcuMjYzIDU0Mi4zODIgMTE3LjI2M0M1NDkuNDU2IDExNy4yNjMgNTU1LjI3MyAxMjMuMDg3IDU1NS4yNzMgMTMwLjE3SDU2MS43MTlDNTYxLjQwNSAxMTkuNjI0IDU1Mi43NTggMTEwLjk2NyA1NDIuMjI1IDExMC45NjdaIiBmaWxsPSIjMDA2NDUwIi8+CjxwYXRoIGQ9Ik01NDIuMjIzIDExNy4yNjNDNTM1LjE0OSAxMTcuMjYzIDUyOS4zMzIgMTIzLjA4NyA1MjkuMzMyIDEzMC4xN0g1NTQuOTU4QzU1NC45NTggMTIzLjA4NyA1NDkuMjk4IDExNy4yNjMgNTQyLjIyMyAxMTcuMjYzWiIgZmlsbD0iIzAwNjQ1MCIvPgo8cGF0aCBkPSJNNTYxLjQwNCAxMzAuMTdINTIyLjg4N1YxNjguNTc2SDU2MS40MDRWMTMwLjE3WiIgZmlsbD0iIzAwNjQ1MCIvPgo8cGF0aCBkPSJNODA3LjEyNyAyMDFWMTEwLjE4VjEwNC41MTRMNzgyLjI4NyA4NC42ODEzTDc3OC42NzEgODEuNjkwN0w3NTAuMzczIDEwNC41MTRWMTEwLjE4VjIwMUg3NzguNjcxSDgwNy4xMjdaIiBmaWxsPSIjMDA5RDRGIi8+CjxwYXRoIGQ9Ik03ODQuNDg4IDk4Ljg0NzNWODYuMjU1M0w3ODIuMjg3IDg0LjY4MTNMNzc4LjY3MSA4MS42OTA3TDc1MC4zNzMgMTA0LjUxNFYxMTAuMThWMTIyLjYxNUw3NTIuNTc0IDEyNC4zNDZMNzU2LjAzMyAxMjcuMTc5TDc4NC40ODggMTA0LjUxNFY5OC44NDczWiIgZmlsbD0iIzAwQ0U3QyIvPgo8cGF0aCBkPSJNNjkyLjUxOSAxNTIuMzYzSDY3Ni4xNjlWMTY4LjU3Nkg2NTkuOTc2VjE4NC43ODhINjQzLjc4M1YyMDFINjU5Ljk3Nkg2NzYuMTY5SDY5Mi41MTlINzA4LjcxMlYxODQuNzg4VjE2OC41NzZWMTUyLjM2M1YxMzYuMTUxSDY5Mi41MTlWMTUyLjM2M1oiIGZpbGw9IiMwMDY0NTAiLz4KPHBhdGggZD0iTTkyNC40MDYgMTMzLjk0OEM4ODcuNDYxIDEzMy45NDggODU3LjQzNCAxNjQuMDExIDg1Ny40MzQgMjAxSDg3OS43NThDODc5Ljc1OCAxNzYuMjg4IDg5OS43MjQgMTU2LjI5OCA5MjQuNDA2IDE1Ni4yOThDOTQ5LjA4OCAxNTYuMjk4IDk2OS4wNTQgMTc2LjI4OCA5NjkuMDU0IDIwMUg5OTEuMzc4Qzk5MS4zNzggMTY0LjAxMSA5NjEuMzUxIDEzMy45NDggOTI0LjQwNiAxMzMuOTQ4WiIgZmlsbD0iI0UxQzE5RSIvPgo8cGF0aCBkPSJNOTI0LjQwNiAxNTYuMjk4Qzg5OS43MjQgMTU2LjI5OCA4NzkuNzU4IDE3Ni4yODggODc5Ljc1OCAyMDFIOTY5LjA1NEM5NjkuMDU0IDE3Ni4yODggOTQ5LjA4OCAxNTYuMjk4IDkyNC40MDYgMTU2LjI5OFoiIGZpbGw9IiMwMDlENEYiLz4KPHBhdGggZD0iTTg2OS4wNjYgMTgwLjM4MVYxNTkuNjA0SDg0OC40NzJWMTM4Ljk4NEg4MjcuNzJWMTE4LjIwOEg4MDcuMTI1VjEzOC45ODRWMTU5LjYwNFYxODAuMzgxVjIwMUg4MjcuNzJIODQ4LjQ3Mkg4NjkuMDY2SDg4OS44MThWMTgwLjM4MUg4NjkuMDY2WiIgZmlsbD0iI0ExRThCQyIvPgo8cGF0aCBkPSJNNTIzLjA0NSAxNjAuNzA2QzUyMy4wNDUgMTU0LjA5NSA1MTcuNjk5IDE0OC43NDMgNTExLjA5NyAxNDguNzQzQzUwNC40OTQgMTQ4Ljc0MyA0OTkuMTQ4IDE1NC4wOTUgNDk5LjE0OCAxNjAuNzA2VjE3Ny4zOVYxODQuNDczVjIwMS4xNTdINTIyLjg4N1YxODQuNDczVjE3Ny4zOUw1MjMuMDQ1IDE2MC43MDZaIiBmaWxsPSIjMDA2NDUwIi8+CjxwYXRoIGQ9Ik0zNTQuOTg1IDEzOS4xNDJWMTMwLjE3VjEwMy40MTJDMzU0Ljk4NSA5Mi44NjYgMzQ2LjMzOCA4NC4yMDkgMzM1LjgwNSA4NC4yMDlDMzI1LjI3MiA4NC4yMDkgMzE2LjYyNSA5Mi44NjYgMzE2LjYyNSAxMDMuNDEyVjEzMC4zMjdWMTM5LjI5OVYxNDEuNjZWMTU0LjU2N1YxNTUuODI2VjE3MC4xNDlWMTg1LjU3NVYyMDFIMzMyLjAzMlYxODUuNTc1SDM0Ny40MzlWMTcwLjE0OUgzNjIuODQ1VjE1NC43MjRIMzc4LjA5NVYxMzkuMjk5SDM1NC45ODVWMTM5LjE0MloiIGZpbGw9IiMwMDY0NTAiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMCI+CjxyZWN0IHdpZHRoPSIxMjM2IiBoZWlnaHQ9IjIwMSIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K\"","module.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTEyIiBoZWlnaHQ9IjM0MiIgdmlld0JveD0iMCAwIDkxMiAzNDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiPgo8cGF0aCBkPSJNMTYxLjMgMjA0LjdDMTcwLjQgMTg5LjEgMTg3LjMgMTc4LjcgMjA2LjYgMTc4LjdDMjM1LjUgMTc4LjcgMjU5IDIwMi4xIDI1OS4xIDIzMUgyNTlDMjU5IDIzMS42IDI1OS4xIDIzMi4zIDI1OS4xIDIzMi45TDI0Ny4yIDI0Mi40VjI1MS41VjI1My41QzI0Ny43IDI1My43IDI0Mi44IDI1MS45IDIzOS41IDI1MS45QzIyOS4zIDI1MS45IDIyMC45IDI1OS43IDIxOS45IDI2OS42VjI2Ny42VjI1My41TDE2MS4yIDIwNi42QzE2MS41IDIwNi4yIDE2MS43IDIwNS43IDE2MiAyMDUuM0wxNjEuMyAyMDQuN1oiIGZpbGw9IiM5MUVCQkUiLz4KPHBhdGggZD0iTTI1LjUwMDQgMjU2LjlDMjUuNTAwNCAyNDcuMyAzMy4zMDA0IDIzOS41IDQyLjkwMDQgMjM5LjVDNTIuNDAwNCAyMzkuNSA2MC4xMDA0IDI0Ny4xIDYwLjMwMDQgMjU2LjZWMjU0LjJWMjQzLjJWMjQxVjIzMFYyMTAuNFYxOTkuNEM2MC4zMDA0IDE4OS44IDY4LjEwMDQgMTgyIDc3LjcwMDQgMTgyQzg3LjMwMDQgMTgyIDk1LjEwMDMgMTg5LjggOTUuMTAwMyAxOTkuNFYxOTAuM1YxNzkuM0M5NS4xMDAzIDE2OS43IDEwMi45IDE2MS45IDExMi41IDE2MS45QzEyMi4xIDE2MS45IDEyOS45IDE2OS43IDEyOS45IDE3OS4zVjE5MC4zVjIyMi4zVjIyMy4xVjIzMy4zVjIzNC4xVjI1Ni45VjI2Ni4xVjI2Ny45VjI3Ny4xVjMwMC43VjMxMS43SDk1LjAwMDRINjAuMzAwNEgyNS42MDAzVjMwMC43VjI2OEwyNS41MDA0IDI1Ni45WiIgZmlsbD0iIzkxRUJCRSIvPgo8cGF0aCBkPSJNMzMxLjcgOTkuMDAwMkMzMzEuNyA4Ny4zMDAyIDM0MS4yIDc3LjgwMDIgMzUyLjkgNzcuODAwMkMzNjQuNiA3Ny44MDAyIDM3NC4xIDg3LjMwMDIgMzc0LjEgOTkuMDAwMlY4NC45MDAyQzM3NC4xIDczLjIwMDIgMzgzLjYgNjMuNzAwMiAzOTUuMyA2My43MDAyQzQwNyA2My43MDAyIDQxNi41IDczLjIwMDIgNDE2LjUgODQuOTAwMlYxMTcuM0M0MTYuNyAxMDUuOCA0MjYuMSA5Ni40MDAyIDQzNy43IDk2LjQwMDJDNDQ5LjQgOTYuNDAwMiA0NTguOSAxMDUuOSA0NTguOSAxMTcuNlYxNzEuMUg0MTYuNUgzNzQuMUgzMzEuN1YxNTIuNVYxMTcuNlY5OS4wMDAyWiIgZmlsbD0iIzkxRUJCRSIvPgo8cGF0aCBkPSJNNDAzLjIgMTEyLjZWMTI3LjFWMTQwLjhINDMxLjRWMTU1LjNWMTY5SDQ1OC44VjE4My41VjIxNi4yVjIzMC43QzQ1OC40IDIzMy43IDQ1OC4yIDIzNi44IDQ1OC4yIDIzOS45SDQzMS40SDQwMy4ySDM3NVYyMjUuNFYyMTEuN1YxOTcuMlYxODMuNVYxNjlWMTU1LjNWMTQwLjhWMTI3LjFWMTEyLjZINDAzLjJaIiBmaWxsPSIjMDA2NDUwIi8+CjxwYXRoIGQ9Ik0yODkuNSAyMDYuOEwzMDAgMTk4LjNMMzUyLjcgMjQwLjVWMjc0LjNMMzQyLjIgMjgyLjdMMjg5LjUgMjQwLjVWMjA2LjhaIiBmaWxsPSIjMjNEMjc4Ii8+CjxwYXRoIGQ9Ik0xMjkuNyAyMDMuNUwxNDQuOCAxOTEuNEwyMjAgMjUxLjZWMjk5LjhMMjA1IDMxMS44TDEyOS43IDI1MS42VjIwMy41WiIgZmlsbD0iIzIzRDI3OCIvPgo8cGF0aCBkPSJNMzE4LjUgMjg3LjRMMzI0LjIgMjgyLjhMMzUyLjcgMzA1LjZWMzIzLjhMMzQ3IDMyOC40TDMxOC41IDMwNS42VjI4Ny40WiIgZmlsbD0iIzIzRDI3OCIvPgo8cGF0aCBkPSJNMTI5LjcgMjAzLjVWMjUxLjZMMjA1IDMxMS44TDIyMCAyOTkuOFYzNDEuOUgxMzUuN1YzMjUuNEgxMTkuMlYzMDguOEgxMDIuNlYyOTIuM0g4Ni4xVjI3NS43SDY5LjVWMjUxLjZMMTI5LjcgMjAzLjVaIiBmaWxsPSIjMDBBMDUwIi8+CjxwYXRoIGQ9Ik0yMTkuOSAyNjkuNkMyMTkuOSAyNTguOCAyMjguNyAyNTAgMjM5LjYgMjUwQzI1MC40IDI1MCAyNTkuMiAyNTguOCAyNTkuMyAyNjkuNlYyOTkuMkMyNjAgMjkzLjIgMjY1LjEgMjg4LjUgMjcxLjQgMjg4LjVDMjc4LjEgMjg4LjUgMjgzLjUgMjkzLjkgMjgzLjYgMzAwLjZWMzQxLjhIMjU5LjRIMjU5LjNIMjIwLjFMMjE5LjkgMjY5LjZaIiBmaWxsPSIjMDA2NDUwIi8+CjxwYXRoIGQ9Ik0yODMuNCAzMDAuN0MyODMuNCAyOTQgMjc4IDI4OC42IDI3MS4yIDI4OC42QzI2NSAyODguNiAyNTkuOSAyOTMuMyAyNTkuMSAyOTkuM1YyNjkuN0MyNTkuMSAyNjEuNiAyNTQuMiAyNTQuNiAyNDcuMiAyNTEuNlYyNDAuNkwzMDAgMTk4LjNMMjg5LjUgMjA2LjdWMjQwLjRMMzQyLjIgMjgyLjZMMzUyLjcgMjc0LjJWMzA1LjVMMzI0LjIgMjgyLjdMMzE4LjUgMjg3LjNWMzA1LjVMMzQ3IDMyOC40TDM1Mi43IDMyMy44VjM0MS45SDI4My40VjMwMC43WiIgZmlsbD0iIzAwQTA1MCIvPgo8cGF0aCBkPSJNMzY0LjcgMTMxLjRMMzQ5LjcgMTQzLjRWMTkxLjZMNDA1LjggMjM2LjVDNDAxLjQgMjM4LjIgMzk4LjMgMjQyLjQgMzk4LjMgMjQ3LjRWMjc0LjNIMzUyLjhWMjQwLjZMMzAwLjEgMTk4LjRMMjg5LjUgMjA2LjlWMTkxLjdMMzY0LjcgMTMxLjRaIiBmaWxsPSIjMDBBMDUwIi8+CjxwYXRoIGQ9Ik0zNjQuNyAxMzEuNEw0MzkuOSAxOTEuNlYyMDguM0M0MjkuNyAyMDguNiA0MjEuNSAyMTYuOSA0MjEuNSAyMjcuMlYyNDZDNDIwLjggMjQwLjIgNDE1LjkgMjM1LjcgNDA5LjkgMjM1LjdDNDA4LjQgMjM1LjcgNDA3IDIzNiA0MDUuNyAyMzYuNUwzNDkuNiAxOTEuNlYxNDMuNEwzNjQuNyAxMzEuNFoiIGZpbGw9IiMyM0QyNzgiLz4KPHBhdGggZD0iTTEzNy4yIDMxOS4zVjI5Ni44SDExNC43VjI3NC4ySDkyLjA5OThWMjUxLjdINjkuNDk5OFYzNDEuOUgxNTkuOFYzMTkuM0gxMzcuMloiIGZpbGw9IiNFMUM4QUYiLz4KPHBhdGggZD0iTTUyLjIgMjg5LjdIMzQuOFYzMDcuMUgxNy40VjMyNC41SDBWMzQxLjlIMTcuNEgzNC44SDUyLjJINjkuNVYzMjQuNVYzMDcuMVYyODkuN1YyNzIuNEg1Mi4yVjI4OS43WiIgZmlsbD0iIzAwNjQ1MCIvPgo8cGF0aCBkPSJNODI2LjEgMjI2LjlDODI2LjEgMjE1LjkgODM1IDIwNyA4NDYgMjA3Qzg1NyAyMDcgODY1LjkgMjE1LjkgODY1LjkgMjI2LjlWMjU3Qzg2Ni42IDI1MC45IDg3MS44IDI0Ni4xIDg3OC4xIDI0Ni4xQzg4NC45IDI0Ni4xIDg5MC40IDI1MS42IDg5MC40IDI1OC40VjMwMC4ySDg2Nkg4NjUuOUg4MjYuMVYyMjYuOVoiIGZpbGw9IiM5MUVCQkUiLz4KPHBhdGggZD0iTTU0NS42IDE3LjM5OTlWNDkuODk5OVY4Ny4xOTk5TDYwMC40IDEzMUg2NzYuNFYxNjMuNVYyNTMuNFYzMzIuOUg0NTguNFYyNTMuNFYyMzguNlYyMDYuMVYxNjMuNVYxMzFWMTE5LjdWODcuMTk5OUw1NDUuNiAxNy4zOTk5WiIgZmlsbD0iIzAwQTA1MCIvPgo8cGF0aCBkPSJNNTY3LjQgMEw2NzYuNCA4Ny4yVjg3LjhWMTU2LjlWMTU3LjZMNjU0LjYgMTc1TDU0NS42IDg3LjhWODcuMlYxOFYxNy40TDU2Ny40IDBaIiBmaWxsPSIjMjNEMjc4Ii8+CjxwYXRoIGQ9Ik01MzMuNyAxNzEuNEM1MzMuNyAxNTIuNiA1NDguOSAxMzcuNCA1NjcuNyAxMzcuNEM1ODYuNSAxMzcuNCA2MDEuNyAxNTIuNiA2MDEuNyAxNzEuNFYyNTcuMkg1MzMuN1YxNzEuNFoiIGZpbGw9IiMwMDY0NTAiLz4KPHBhdGggZD0iTTYwMS44IDIwMi4zVjE5OS4zVjE4Mi44VjE3Ny41SDYyNi42VjE3NC40VjE1OFYxNTIuNkg2NTEuNVYxNDkuNlYxMzMuMVYxMjcuN0g2NzYuNFYxMzMuMVYxNDkuNlYxNTQuOVYyMjcuMlYyMzIuNlYyNDlWMjU0LjRINTc2LjlWMjQ5VjIzMi42VjIyOS42VjIyNy4yVjIyNC4yVjIwNy43VjIwMi4zSDYwMS44WiIgZmlsbD0iIzkxRUJCRSIvPgo8cGF0aCBkPSJNNTg0LjYgMTkyLjdDNTc1LjkgMTc5LjkgNTYzLjEgMTcwLjEgNTQ4IDE2NS40QzU0Ny45IDE2NS40IDU0Ny45IDE2NS40IDU0Ny44IDE2NS40QzU0NS43IDE2NC44IDU0My42IDE2NC4yIDU0MS41IDE2My44QzU0MS40IDE2My44IDU0MS4zIDE2My44IDU0MS4yIDE2My43QzU0MC4xIDE2My41IDUzOS4xIDE2My4zIDUzOCAxNjMuMUM1MzcuOSAxNjMuMSA1MzcuOCAxNjMuMSA1MzcuOCAxNjMuMUM1MzYuOCAxNjIuOSA1MzUuOCAxNjIuOCA1MzQuNyAxNjIuN0M1MzQuNiAxNjIuNyA1MzQuNSAxNjIuNyA1MzQuNCAxNjIuN0M1MzMuNCAxNjIuNiA1MzIuMyAxNjIuNSA1MzEuMyAxNjIuNUM1MzEuMSAxNjIuNSA1MzAuOSAxNjIuNSA1MzAuNyAxNjIuNUM1MjkuNiAxNjIuNSA1MjguNiAxNjIuNCA1MjcuNSAxNjIuNEM1MjYuNCAxNjIuNCA1MjUuNCAxNjIuNCA1MjQuMyAxNjIuNUM1MjQuMSAxNjIuNSA1MjMuOSAxNjIuNSA1MjMuNyAxNjIuNUM1MjIuNiAxNjIuNiA1MjEuNiAxNjIuNiA1MjAuNiAxNjIuN0M1MjAuNSAxNjIuNyA1MjAuNCAxNjIuNyA1MjAuMyAxNjIuN0M1MTkuMyAxNjIuOCA1MTguMiAxNjIuOSA1MTcuMiAxNjMuMUM1MTcuMSAxNjMuMSA1MTcgMTYzLjEgNTE3IDE2My4xQzUxNS45IDE2My4zIDUxNC45IDE2My41IDUxMy44IDE2My43QzUxMy43IDE2My43IDUxMy42IDE2My43IDUxMy41IDE2My44QzUxMS4zIDE2NC4yIDUwOS4yIDE2NC44IDUwNy4yIDE2NS40QzUwNy4xIDE2NS40IDUwNy4xIDE2NS40IDUwNyAxNjUuNEM0OTEuOSAxNzAuMSA0NzkuMSAxNzkuOCA0NzAuNCAxOTIuN0M0NjMgMjAzLjcgNDU4LjYgMjE3IDQ1OC42IDIzMS4zVjI0NS44SDQ4MS42VjIzMS4zQzQ4MS42IDIyMi44IDQ4My45IDIxNC45IDQ4Ny45IDIwOC4xQzQ4OC4yIDIwNy43IDQ4OC40IDIwNy4yIDQ4OC43IDIwNi44QzQ4OC45IDIwNi41IDQ4OS4xIDIwNi4yIDQ4OS4zIDIwNS44QzQ4OS43IDIwNS4yIDQ5MC4xIDIwNC42IDQ5MC41IDIwNC4xQzQ5MC43IDIwMy44IDQ5MSAyMDMuNSA0OTEuMiAyMDMuMkM0OTEuNiAyMDIuNyA0OTIgMjAyLjIgNDkyLjQgMjAxLjhDNDkyLjYgMjAxLjUgNDkyLjkgMjAxLjIgNDkzLjEgMjAxQzQ5My41IDIwMC42IDQ5My44IDIwMC4yIDQ5NC4yIDE5OS44QzQ5NC40IDE5OS41IDQ5NC43IDE5OS4zIDQ5NC45IDE5OUM0OTUuNSAxOTguNCA0OTYuMSAxOTcuOCA0OTYuNyAxOTcuM0M0OTYuOSAxOTcuMSA0OTcuMiAxOTYuOSA0OTcuNCAxOTYuN0M0OTcuOCAxOTYuMyA0OTguMyAxOTUuOSA0OTguNyAxOTUuNkM0OTkgMTk1LjQgNDk5LjMgMTk1LjEgNDk5LjYgMTk0LjlDNTAwIDE5NC42IDUwMC41IDE5NC4yIDUwMC45IDE5My45QzUwMS4yIDE5My43IDUwMS41IDE5My41IDUwMS44IDE5My4zQzUwMi41IDE5Mi44IDUwMy4yIDE5Mi40IDUwMy45IDE5MkM1MDQuMiAxOTEuOCA1MDQuNSAxOTEuNyA1MDQuOCAxOTEuNUM1MDUuMyAxOTEuMiA1MDUuOCAxOTEgNTA2LjMgMTkwLjdDNTA2LjYgMTkwLjUgNTA3IDE5MC40IDUwNy4zIDE5MC4yQzUwNy44IDE4OS45IDUwOC4zIDE4OS43IDUwOC45IDE4OS41QzUwOS4yIDE4OS40IDUwOS41IDE4OS4yIDUwOS44IDE4OS4xQzUxMC42IDE4OC44IDUxMS40IDE4OC41IDUxMi4xIDE4OC4yQzUxMi40IDE4OC4xIDUxMi43IDE4OCA1MTMuMSAxODcuOUM1MTMuNiAxODcuNyA1MTQuMiAxODcuNSA1MTQuOCAxODcuNEM1MTUuMSAxODcuMyA1MTUuNSAxODcuMiA1MTUuOCAxODcuMUM1MTYuNCAxODYuOSA1MTcuMSAxODYuOCA1MTcuOCAxODYuNkM1MTggMTg2LjUgNTE4LjMgMTg2LjUgNTE4LjUgMTg2LjRDNTE5LjQgMTg2LjIgNTIwLjIgMTg2LjEgNTIxLjEgMTg1LjlDNTIxLjQgMTg1LjkgNTIxLjcgMTg1LjggNTIyIDE4NS44QzUyMi43IDE4NS43IDUyMy4zIDE4NS42IDUyNCAxODUuNkM1MjQuMyAxODUuNiA1MjQuNiAxODUuNSA1MjQuOSAxODUuNUM1MjUuOCAxODUuNCA1MjYuNyAxODUuNCA1MjcuNyAxODUuNEM1MjcuNyAxODUuNCA1MjcuNyAxODUuNCA1MjcuOCAxODUuNEM1MjcuOSAxODUuNCA1MjcuOCAxODUuNCA1MjcuOSAxODUuNEM1MjguOCAxODUuNCA1MjkuOCAxODUuNCA1MzAuNyAxODUuNUM1MzEgMTg1LjUgNTMxLjMgMTg1LjUgNTMxLjYgMTg1LjZDNTMyLjMgMTg1LjcgNTMyLjkgMTg1LjcgNTMzLjYgMTg1LjhDNTMzLjkgMTg1LjggNTM0LjIgMTg1LjkgNTM0LjUgMTg1LjlDNTM1LjQgMTg2IDUzNi4zIDE4Ni4yIDUzNy4xIDE4Ni40QzUzNy4zIDE4Ni40IDUzNy42IDE4Ni41IDUzNy44IDE4Ni42QzUzOC41IDE4Ni43IDUzOS4xIDE4Ni45IDUzOS44IDE4Ny4xQzU0MC4xIDE4Ny4yIDU0MC41IDE4Ny4zIDU0MC44IDE4Ny40QzU0MS40IDE4Ny42IDU0MS45IDE4Ny43IDU0Mi41IDE4Ny45QzU0Mi44IDE4OCA1NDMuMSAxODguMSA1NDMuNSAxODguMkM1NDQuMyAxODguNSA1NDUuMSAxODguOCA1NDUuOCAxODkuMUM1NDYuMSAxODkuMiA1NDYuNCAxODkuNCA1NDYuNyAxODkuNUM1NDcuMiAxODkuNyA1NDcuNyAxOTAgNTQ4LjMgMTkwLjJDNTQ4LjYgMTkwLjQgNTQ5IDE5MC41IDU0OS4zIDE5MC43QzU0OS44IDE5MSA1NTAuMyAxOTEuMiA1NTAuOCAxOTEuNUM1NTEuMSAxOTEuNyA1NTEuNCAxOTEuOCA1NTEuNyAxOTJDNTUyLjQgMTkyLjQgNTUzLjEgMTkyLjkgNTUzLjggMTkzLjNDNTU0LjEgMTkzLjUgNTU0LjQgMTkzLjcgNTU0LjcgMTkzLjlDNTU1LjEgMTk0LjIgNTU1LjYgMTk0LjUgNTU2IDE5NC45QzU1Ni4zIDE5NS4xIDU1Ni42IDE5NS40IDU1Ni45IDE5NS42QzU1Ny4zIDE5NiA1NTcuOCAxOTYuMyA1NTguMiAxOTYuN0M1NTguNCAxOTYuOSA1NTguNyAxOTcuMSA1NTguOSAxOTcuM0M1NTkuNSAxOTcuOSA1NjAuMSAxOTguNCA1NjAuNyAxOTlDNTYxIDE5OS4zIDU2MS4yIDE5OS41IDU2MS40IDE5OS44QzU2MS44IDIwMC4yIDU2Mi4xIDIwMC42IDU2Mi41IDIwMUM1NjIuNyAyMDEuMyA1NjMgMjAxLjYgNTYzLjIgMjAxLjhDNTYzLjYgMjAyLjMgNTY0IDIwMi44IDU2NC40IDIwMy4yQzU2NC42IDIwMy41IDU2NC45IDIwMy44IDU2NS4xIDIwNC4xQzU2NS41IDIwNC43IDU2NS45IDIwNS4yIDU2Ni4zIDIwNS44QzU2Ni41IDIwNi4xIDU2Ni43IDIwNi40IDU2Ni45IDIwNi44QzU2Ny4yIDIwNy4yIDU2Ny40IDIwNy43IDU2Ny43IDIwOC4xQzU3MS43IDIxNC45IDU3NCAyMjIuOCA1NzQgMjMxLjNINTk3QzU5Ni40IDIxNyA1OTIgMjAzLjcgNTg0LjYgMTkyLjdaIiBmaWxsPSIjRTFDOEFGIi8+CjxwYXRoIGQ9Ik03MzYuMyAxNDMuNEw3NTEuMiAxMzEuNEw4MjYuMSAxOTEuM1YyMzkuMkw4MTEuMSAyNTEuMkw3MzYuMyAxOTEuM1YxNDMuNFoiIGZpbGw9IiMyM0QyNzgiLz4KPHBhdGggZD0iTTUwMC40IDIwN0w1MTEgMTk4LjZMNTYzLjYgMjQwLjdWMjc0LjRMNTUzLjEgMjgyLjhMNTAwLjQgMjQwLjdWMjA3WiIgZmlsbD0iIzIzRDI3OCIvPgo8cGF0aCBkPSJNNTAwLjQgMjkyLjNMNTA1LjcgMjg4LjFMNTMyLjEgMzA5LjJWMzI2LjFMNTI2LjggMzMwLjNMNTAwLjQgMzA5LjJWMjkyLjNaIiBmaWxsPSIjMjNEMjc4Ii8+CjxwYXRoIGQ9Ik02OTYgMzA2LjZDNjk0LjUgMjk3LjUgNjg2LjYgMjkwLjYgNjc3LjEgMjkwLjVDNjgxLjEgMjY4IDcwMC44IDI1MC45IDcyNC41IDI1MC45Qzc1MS4xIDI1MC45IDc3Mi42IDI3Mi40IDc3Mi43IDI5OVYzMjYuMUM3NzIuNyAzMTUuNSA3NjQuMSAzMDcgNzUzLjUgMzA3Qzc0Mi45IDMwNyA3MzQuMyAzMTUuNiA3MzQuMyAzMjYuMVYyOTdDNzM0LjMgMjg2LjQgNzI1LjcgMjc3LjkgNzE1LjEgMjc3LjlDNzA0LjUgMjc3LjkgNjk1LjkgMjg2LjUgNjk1LjkgMjk3VjMwNi42SDY5NloiIGZpbGw9IiM1QURDOUIiLz4KPHBhdGggZD0iTTYxNi4zIDI3OC43SDYzNy4zVjI5OS44SDY1OC40VjMyMC44SDY3OS41VjM0MS45SDU5NS4yVjI1Ny42SDYxNi4zVjI3OC43WiIgZmlsbD0iIzIzRDI3OCIvPgo8cGF0aCBkPSJNNzcyLjcgMjk5LjFDNzcyLjcgMjcyLjUgNzUxLjEgMjUxIDcyNC41IDI1MUM3MDAuOCAyNTEgNjgxLjIgMjY4LjEgNjc3LjEgMjkwLjZDNjc3LjEgMjkwLjYgNjc3LjEgMjkwLjYgNjc3IDI5MC42QzY3Ni44IDI5MC42IDY3Ni41IDI5MC42IDY3Ni4zIDI5MC42VjE5MS4zTDczNi4yIDE0My40VjE5MS4zTDgxMS4xIDI1MS4yTDgyNi4xIDIzOS4yVjM0MS45SDc3Mi43VjMyNi4xVjI5OS4xWiIgZmlsbD0iIzAwQTA1MCIvPgo8cGF0aCBkPSJNNTQ3LjkgMzI2LjFWMzEwLjRINTYzLjZWMjk0LjZINTc5LjRWMjc4LjhINTk1LjJWMzQxLjlINTMyLjFWMzI2LjFINTQ3LjlaIiBmaWxsPSIjRTFDOEFGIi8+CjxwYXRoIGQ9Ik01MDAuNCAyMDdWMjQwLjdMNTUzLjEgMjgyLjhMNTYzLjYgMjc0LjRWMzEwLjRINTQ3LjlWMzI2LjFINTMyLjFWMzA5LjVMNTA1LjcgMjg4LjRMNTAwLjQgMjkyLjdWMzA5LjVMNTI2LjggMzMwLjZMNTMyLjEgMzI2LjRWMzQxLjlINDU4LjRWMjQwLjdMNTAwLjQgMjA3WiIgZmlsbD0iIzAwQTA1MCIvPgo8cGF0aCBkPSJNNTYzLjYgMjMxLjdDNTYzLjYgMjIxLjMgNTcyLjEgMjEyLjkgNTgyLjUgMjEyLjlDNTkxLjkgMjEyLjkgNTk5LjYgMjE5LjcgNjAxLjEgMjI4LjdWMjE5LjNDNjAxLjEgMjA4LjkgNjA5LjYgMjAwLjUgNjIwIDIwMC41QzYzMC40IDIwMC41IDYzOC44IDIwOC45IDYzOC45IDIxOS4zVjI0Ny45QzYzOC45IDIzNy41IDY0Ny40IDIyOS4xIDY1Ny44IDIyOS4xQzY2OC4yIDIyOS4xIDY3Ni42IDIzNy41IDY3Ni43IDI0Ny45VjI5MC44QzY2Ny41IDI5MS4xIDY1OS45IDI5OCA2NTguNSAzMDdWMjk5LjlINjM4LjlINjM3LjRWMjc4LjhINjE2LjNWMjU3LjdINTk1LjJWMjc4LjlINTc5LjRWMjk0LjdINTYzLjZWMjMxLjdaIiBmaWxsPSIjMDA2NDUwIi8+CjxwYXRoIGQ9Ik04OTAuNSAzMjAuNFYyOTlIODY5LjFWMjc3LjVIODQ3LjZWMjU2SDgyNi4xVjM0MS45SDkxMlYzMjAuNEg4OTAuNVoiIGZpbGw9IiNFMUM4QUYiLz4KPHBhdGggZD0iTTM5OC4yIDI0NS4yQzM5OC4yIDIzOC44IDQwMy40IDIzMy42IDQwOS44IDIzMy42QzQxNS43IDIzMy42IDQyMC42IDIzOC4xIDQyMS4zIDI0My44VjIzNS45VjIyNS4xQzQyMS4zIDIxNC43IDQyOS43IDIwNi4zIDQ0MC4xIDIwNi4zQzQ1MC41IDIwNi4zIDQ1OC45IDIxNC43IDQ1OC45IDIyNS4xVjIzNS45VjI3NS40QzQ2MC44IDI2OC4xIDQ2Ny40IDI2Mi43IDQ3NS4zIDI2Mi43QzQ4NC42IDI2Mi43IDQ5Mi4yIDI3MC4zIDQ5Mi4yIDI3OS42VjI5OS4yVjMyMi4zVjM0MS45SDQ1OC4zVjMzMi45SDQ0Mi4xVjMyMi4xVjMxNi4xSDQyNS4zVjMwNS4zVjI5OS4zSDQwOC41VjI4OC41VjI4Mi41SDM5OC4xVjI3MS43VjI1NS44TDM5OC4yIDI0NS4yWiIgZmlsbD0iIzkxRUJCRSIvPgo8cGF0aCBkPSJNNjc3LjMgMjgzLjVDNjg2LjggMjgzLjUgNjk0LjcgMjkwLjQgNjk2LjIgMjk5LjVWMjk5LjZWMjkwQzY5Ni4yIDI3OS40IDcwNC44IDI3MC45IDcxNS4zIDI3MC45QzcyNS45IDI3MC45IDczNC40IDI3OS41IDczNC40IDI5MFYzMTlDNzM0LjQgMzA4LjQgNzQzIDI5OS45IDc1My41IDI5OS45Qzc2NC4xIDI5OS45IDc3Mi42IDMwOC41IDc3Mi42IDMxOVYzNDEuOUg2NzkuNFYzMjAuOEg2NTguM1YyOTkuN0M2NTkuOCAyOTAuNiA2NjcuNyAyODMuNSA2NzcuMyAyODMuNVoiIGZpbGw9IiM5MUVCQkUiLz4KPHBhdGggZD0iTTc3Mi44IDMyMkM3NzIuOCAzMTIuNyA3ODAuMyAzMDUuMiA3ODkuNiAzMDUuMkM3OTYuOCAzMDUuMiA4MDIuOSAzMDkuNyA4MDUuMyAzMTZWMzA0QzgwNS4zIDI5OC4zIDgwOS45IDI5My43IDgxNS42IDI5My43QzgyMS4zIDI5My43IDgyNS45IDI5OC4zIDgyNS45IDMwNFYzMTkuNUM4MjYuMyAzMTYuMyA4MjkgMzEzLjkgODMyLjIgMzEzLjlDODM1LjcgMzEzLjkgODM4LjYgMzE2LjcgODM4LjYgMzIwLjNWMzQxLjlINzcyLjhWMzIyWiIgZmlsbD0iIzAwNjQ1MCIvPgo8cGF0aCBkPSJNNDA4LjUgMjc0LjVWMjkxLjNINDI1LjNWMzA4LjJINDQyLjJWMzI1LjFINDU5VjM0MS45SDM1Mi43VjI3NC41SDQwOC41WiIgZmlsbD0iI0UxQzhBRiIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwIj4KPHJlY3Qgd2lkdGg9IjkxMiIgaGVpZ2h0PSIzNDEuOSIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDkxMiAwKSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPg==\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEzIDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02LjkxNDA2IDAuNzVDNi43MTg3NSAwLjU5Mzc1IDYuNDg0MzggMC40NzY1NjIgNi4yNSAwLjQ3NjU2MkM1Ljk3NjU2IDAuNDc2NTYyIDUuNzQyMTkgMC41OTM3NSA1LjU4NTk0IDAuNzVMMC4yNzM0MzggNi4wNjI1QzAuMDc4MTI1IDYuMjU3ODEgMCA2LjQ5MjE5IDAgNi43MjY1NkMwIDcgMC4wNzgxMjUgNy4yMzQzOCAwLjI3MzQzOCA3LjM5MDYyTDEuMTcxODggOC4yNUMxLjMyODEyIDguNDQ1MzEgMS41NjI1IDguNTIzNDQgMS44MzU5NCA4LjUyMzQ0QzIuMDcwMzEgOC41MjM0NCAyLjMwNDY5IDguNDQ1MzEgMi41IDguMjVMNi4yNSA0LjVMMTAuMDM5MSA4LjI1QzEwLjE5NTMgOC40NDUzMSAxMC4zOTA2IDguNTIzNDQgMTAuNjY0MSA4LjUyMzQ0QzEwLjg5ODQgOC41MjM0NCAxMS4xMzI4IDguNDQ1MzEgMTEuMzI4MSA4LjI1TDEyLjIyNjYgNy4zOTA2MkMxMi4zODI4IDcuMjM0MzggMTIuNSA3IDEyLjUgNi43MjY1NkMxMi41IDYuNDkyMTkgMTIuMzgyOCA2LjI1NzgxIDEyLjIyNjYgNi4wNjI1TDYuOTE0MDYgMC43NVoiIGZpbGw9IiMyM0QyNzgiLz4KPC9zdmc+Cg==\"","import styled, { keyframes, css } from \"styled-components\";\nimport { color, boxShadow, textStyles, media, buttons } from \"@utils/style-utils\";\nimport LogoHorizontal from \"@components/Logos/LogoHorizontal\";\nimport LogoStacked from \"@components/Logos/LogoStacked\";\n\nexport const HeaderWrapper = styled.header`\n\tbackground: ${props => (props.isLight ? color(\"white\") : \"transparent\")};\n\tborder-bottom-color: ${props => (props.isLight ? color(\"grey\", 5) : \"transparent\")};\n\tborder-bottom-style: solid;\n\tborder-bottom-width: 1px;\n\tleft: 0;\n\tposition: relative;\n\ttop: 0;\n\ttransition: background-color 500ms, border-color 500ms;\n\twidth: 100%;\n\tz-index: 999;\n\n\t.header-pinned & {\n\t\tbackground-color: ${color(\"white\")};\n\t\tborder-bottom-color: ${color(\"grey\", 5)};\n\t\ttransition: background-color 200ms, border-color 200ms;\n\t}\n\n\t.header-transparent:not(.has-area-nav) & {\n\t\t${media.lg`\n\t\t\tbackground-color: ${props => (props.isLight ? color(\"white\") : \"transparent\")};\n\t\t\tborder-bottom-color: ${props => (props.isLight ? color(\"grey\", 5) : \"transparent\")};\n\t\t\ttransition: background-color 500ms, border-color 500ms;\n\t\t`};\n\t}\n\n\t.nav-open & {\n\t\tbackground-color: ${color(\"white\")};\n\t\tborder-bottom-color: ${color(\"grey\", 5)};\n\t\ttransition: background-color 200ms, border-color 200ms;\n\t}\n\n\t.is-resizing & {\n\t\ttransition: background-color 0ms, border-color 0ms;\n\t}\n\n\t@media (max-width: 530px) {\n\t\tbackground: ${color(\"white\")};\n\t}\n`;\n\nexport const HeaderContainer = styled.div`\n\talign-items: center;\n\tdisplay: flex;\n\theight: 64px;\n\tmargin: 0 auto;\n\tpadding: 0 24px;\n\tposition: relative;\n\twidth: 100%;\n\n\t@media (max-width: 530px) {\n\t\theight: 56px;\n\n\t\t.frontpage-link {\n\t\t\theight: 40px;\n\t\t\toverflow: hidden;\n\t\t\tposition: relative;\n\t\t\twidth: 60px;\n\t\t\tz-index: 105;\n\n\t\t\tsvg {\n\t\t\t\tleft: 0;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 50%;\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t}\n\t\t}\n\t}\n\n\t&::after {\n\t\t@media (max-width: 1109px) {\n\t\t\tbackground: ${color(\"white\")};\n\t\t\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\t\t\tcontent: \"\";\n\t\t\tdisplay: block;\n\t\t\theight: 65px;\n\t\t\tposition: absolute;\n\t\t\tright: 0;\n\t\t\ttop: 0;\n\t\t\ttransform: translateX(100%);\n\t\t\ttransition: transform 300ms;\n\t\t\tmax-width: 420px;\n\t\t\twidth: 100%;\n\t\t\tz-index: 100;\n\n\t\t\t.nav-open & {\n\t\t\t\ttransform: translateX(0);\n\t\t\t}\n\t\t}\n\n\t\t@media (max-width: 530px) {\n\t\t\theight: 57px;\n\t\t\tmax-width: 530px;\n\t\t}\n\t}\n\n\t@media print {\n\t\tbutton {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n`;\n\nexport const Navigation = styled.nav`\n\talign-items: center;\n\tdisplay: flex;\n\tflex-grow: 1;\n\theight: 100%;\n\n\t@media (max-width: 1109px) {\n\t\tbackground: ${color(\"white\")};\n\t\tflex-direction: column;\n\t\theight: calc(100vh - 64px);\n\t\theight: calc((var(--vh, 1vh) * 100) - 64px);\n\t\tmax-width: 420px;\n\t\toverflow-y: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tpadding: 0 0 64px;\n\t\tpointer-events: ${props => (props.isOpen ? \"auto\" : \"none\")};\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 64px;\n\t\ttransform: ${props => (props.isOpen ? \"translateX(0)\" : \"translateX(100%)\")};\n\t\ttransition: transform 300ms;\n\t\twidth: 100%;\n\t\tz-index: 99;\n\n\t\t.is-resizing & {\n\t\t\ttransition: transform 0ms;\n\t\t}\n\t}\n\n\t@media (max-width: 530px) {\n\t\theight: calc(100vh - 56px);\n\t\theight: calc((var(--vh, 1vh) * 100) - 56px);\n\t\tmax-width: 100%;\n\t\tpadding: 0 0 56px;\n\t\ttop: 56px;\n\n\t\t#contact {\n\t\t\tmargin-bottom: 56px;\n\t\t}\n\t}\n\n\t@media print {\n\t\tdisplay: none;\n\t}\n`;\n\nexport const NavLogo = styled(LogoHorizontal)`\n\tdisplay: block;\n\theight: 28px;\n\tmargin-right: 48px;\n\twidth: auto;\n\n\t@media (max-width: 530px) {\n\t\tdisplay: none;\n\t}\n`;\n\nexport const MobileNavLogo = styled(LogoStacked)`\n\tdisplay: none;\n\theight: 28px;\n\tmargin-right: 48px;\n\twidth: auto;\n\n\t@media (max-width: 530px) {\n\t\tdisplay: block;\n\t}\n`;\n\nexport const NavSpacer = styled.span`\n\t@media (min-width: 1110px) {\n\t\tflex-grow: 100;\n\t}\n`;\n\nexport const NavItem = styled.div`\n\tbackground-color: ${props => (props.isOpen ? color(\"grey\", 7) : color(\"white\"))};\n\tborder-bottom: ${props => (props.isOpen ? \"1px solid \" + color(\"grey\", 5) : 0)};\n\tborder-top: ${props => (props.isOpen ? \"1px solid \" + color(\"grey\", 5) : 0)};\n\tpadding: 0px 16px;\n\tposition: relative;\n\tmargin-top: ${props => (props.isOpen ? \"-1px\" : 0)};\n\ttransition: background-color 150ms, border-color 150ms;\n\twidth: 100%;\n\n\t.is-resizing & {\n\t\ttransition: background-color 0ms, border-color 0ms;\n\t}\n\n\t@media (min-width: 531px) {\n\t\tpadding: 0 32px;\n\t}\n\n\t@media (min-width: 1110px) {\n\t\talign-items: center;\n\t\tbackground-color: rgba(255, 255, 255, 0);\n\t\tborder-bottom: 0;\n\t\tdisplay: inline-flex;\n\t\tflex-grow: 1;\n\t\theight: 100%;\n\t\tjustify-content: center;\n\t\tmargin-top: 0;\n\t\tpadding: 0;\n\t\twidth: auto;\n\n\t\t&:not(#contact) {\n\t\t\tmargin-right: 24px;\n\t\t}\n\t}\n\n\ta.main {\n\t\talign-items: center;\n\t\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tdisplay: inline-block;\n\t\tdisplay: flex;\n\t\tfont-size: 17px;\n\t\tfont-weight: 500;\n\t\tline-height: 1;\n\t\tpadding: 20px 0;\n\t\tposition: relative;\n\t\ttext-decoration: none;\n\t\ttransition: color 150ms, border-color 150ms;\n\n\t\t.is-resizing & {\n\t\t\ttransition: color 0ms, border-color 0ms;\n\t\t}\n\n\t\t&:hover {\n\t\t\tcolor: ${color(\"grey\", 2)};\n\t\t}\n\n\t\t@media (min-width: 1110px) {\n\t\t\tborder-bottom: 2px solid rgba(0, 0, 0, 0);\n\t\t\tborder-top: 2px solid rgba(0, 0, 0, 0);\n\t\t\tfont-size: 15px;\n\t\t\theight: 100%;\n\n\t\t\t&.active {\n\t\t\t\tborder-bottom-color: ${color(\"grey\", 1)};\n\t\t\t}\n\t\t}\n\t}\n\n\t@media (min-width: 1110px) {\n\t\tbody:not(.no-hover) & {\n\t\t\t&:hover {\n\t\t\t\ta.main {\n\t\t\t\t\tborder-bottom-color: ${color(\"grey\", 1)};\n\t\t\t\t}\n\n\t\t\t\t.nav-item-dropdown {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\tpointer-events: auto;\n\t\t\t\t\ttransition: opacity 250ms;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&#contact a.main {\n\t\tborder: 1px solid ${color(\"white\")};\n\t\tborder-radius: 4px;\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tdisplay: inline-block;\n\t\tfont-size: 14px;\n\t\tfont-weight: 500;\n\t\theight: auto;\n\t\tline-height: 1;\n\t\tpadding: 6px 15px 5px;\n\t\ttext-transform: uppercase;\n\t\ttransition: color 150ms, border-color 150ms;\n\n\t\t/* .header-pinned & { */\n\t\tborder-color: ${color(\"greenBright\", 1)};\n\t\t/* } */\n\n\t\t@media (max-width: 1109px) {\n\t\t\t${buttons.ctaLink};\n\t\t\tmargin-top: 40px;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n`;\n\nexport const NavItemDropdown = styled.div`\n\tdisplay: ${props => (props.isOpen ? \"flex\" : \"none\")};\n\tflex-direction: column;\n\tpadding: 0 16px;\n\n\t#agencies & {\n\t\tdisplay: none;\n\t}\n\n\t@media (min-width: 1110px) {\n\t\tbackground: ${color(\"white\")};\n\t\tbox-shadow: ${boxShadow.wideShifted};\n\t\tdisplay: flex;\n\t\topacity: 0;\n\t\tpadding: 48px 40px 40px;\n\t\tpointer-events: none;\n\t\tposition: absolute;\n\t\ttop: 6.4rem;\n\t\ttransition: opacity 200ms;\n\n\t\t#thinking & {\n\t\t\tright: 2px;\n\t\t\twidth: 341px;\n\t\t}\n\n\t\t#selling & {\n\t\t\tleft: 2px;\n\t\t\twidth: 626px;\n\t\t}\n\n\t\t#buying & {\n\t\t\tleft: -120px;\n\t\t\twidth: 626px;\n\n\t\t\t${media.xl`\n\t\t\t\tleft: 2px;\n\t\t\t`};\n\t\t}\n\n\t\t#agencies & {\n\t\t\tdisplay: flex;\n\t\t\tright: -149px;\n\t\t\tpadding: 37px 34px;\n\t\t\twidth: calc(100vw - 48px);\n\n\t\t\t@media (min-width: 1270px) {\n\t\t\t\tright: -120px;\n\t\t\t\twidth: 1190px;\n\t\t\t}\n\n\t\t\t@media (min-width: 1400px) {\n\t\t\t\tright: 2px;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const NavItemDropdownTitle = styled.p`\n\tdisplay: none;\n\n\t@media (min-width: 1110px) {\n\t\t${textStyles.MicroText};\n\t\tcolor: ${color(\"grey\", 2)};\n\t\tdisplay: block;\n\t\tmargin: 0 0 24px;\n\t}\n`;\n\nexport const NavLinksSecondary = styled.div`\n\t@media (min-width: 1110px) {\n\t\tmargin-bottom: 30px;\n\t}\n\n\th3 {\n\t\t${textStyles.PSmall};\n\t\tmargin: 0;\n\n\t\t@media (min-width: 1110px) {\n\t\t\tdisplay: inline-block;\n\t\t\tmargin: 0 0 20px;\n\t\t\tpadding-right: 40px;\n\t\t\tvertical-align: top;\n\t\t\twidth: 50%;\n\t\t}\n\t}\n\n\ta {\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tdisplay: inline-block;\n\t\tpadding: 16px 0;\n\t\tposition: relative;\n\t\ttext-decoration: none;\n\n\t\t@media (min-width: 1110px) {\n\t\t\tpadding: 0;\n\t\t}\n\n\t\t&:hover {\n\t\t\tcolor: ${color(\"greenBright\", 1)};\n\n\t\t\t&::after {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: translate(0, 1px);\n\t\t\t}\n\t\t}\n\n\t\t&::after {\n\t\t\tcontent: \"\\\\2192\";\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-left: 5px;\n\t\t\topacity: 0;\n\t\t\ttransform: translate(-5px, 1px);\n\t\t\ttransition: opacity 150ms, transform 150ms;\n\t\t}\n\t}\n`;\n\nexport const NavLinksTertiary = styled.div`\n\tborder-top: 1px solid ${color(\"grey\", 5)};\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-wrap: wrap;\n\n\t#thinking & {\n\t\tborder-top: 0;\n\t}\n\n\t@media (min-width: 1110px) {\n\t\tborder-top: 0;\n\t\tflex-direction: row;\n\t}\n\n\th4 {\n\t\t${textStyles.MicroText};\n\t\tmargin: 0;\n\n\t\t@media (min-width: 1110px) {\n\t\t\tmargin: 0 0 16px;\n\t\t}\n\n\t\ta {\n\t\t\tcolor: ${color(\"grey\", 1)};\n\t\t\tdisplay: inline-block;\n\t\t\tpadding: 16px 0;\n\t\t\ttext-decoration: none;\n\n\t\t\t@media (min-width: 340px) and (max-width: 1109px) {\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t@media (min-width: 1110px) {\n\t\t\t\tpadding: 0;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tcolor: ${color(\"greenBright\", 1)};\n\n\t\t\t\t&::after {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translate(0, 1px);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&::after {\n\t\t\t\tcontent: \"\\\\2192\";\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tmargin-left: 5px;\n\t\t\t\topacity: 0;\n\t\t\t\ttransform: translate(-5px, 1px);\n\t\t\t\ttransition: opacity 150ms, transform 150ms;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const NavLinksColumn = styled.div`\n\t@media (min-width: 1110px) {\n\t\tdisplay: flex;\n\t\tflex-basis: 50%;\n\t\tflex-direction: column;\n\t\tpadding-right: 40px;\n\n\t\t#thinking & {\n\t\t\tflex-basis: 100%;\n\t\t\tpadding-right: 0;\n\t\t}\n\t}\n`;\n\nexport const Burger = styled.button`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tbackground: rgba(255, 255, 255, 0);\n\tborder: 0;\n\tcursor: pointer;\n\theight: 56px;\n\toutline: 0;\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\twidth: 56px;\n\tz-index: 999;\n\n\t@media (min-width: 531px) {\n\t\theight: 64px;\n\t\twidth: 74px;\n\t}\n\n\t@media (pointer: fine) {\n\t\ttransition: background-color 150ms;\n\n\t\t&:hover {\n\t\t\tbackground: ${color(\"grey\", 7)};\n\t\t}\n\t}\n\n\tspan {\n\t\tbackground: ${color(\"grey\", 1)};\n\t\tdisplay: block;\n\t\theight: 2px;\n\t\tleft: 50%;\n\t\tposition: absolute;\n\t\ttransform: translateX(-50%);\n\t\ttransition: transform 150ms, top 150ms;\n\t\twidth: 24px;\n\n\t\t&:nth-of-type(1) {\n\t\t\ttop: 23px;\n\n\t\t\t@media (max-width: 530px) {\n\t\t\t\ttop: 20px;\n\t\t\t}\n\t\t}\n\t\t&:nth-of-type(2) {\n\t\t\ttop: 31px;\n\t\t\ttransform: translateX(-50%) scaleX(1);\n\t\t\ttransform-origin: 50% 50%;\n\t\t\ttransition: transform 150ms;\n\n\t\t\t@media (max-width: 530px) {\n\t\t\t\ttop: 28px;\n\t\t\t}\n\t\t}\n\t\t&:nth-of-type(3) {\n\t\t\ttop: 39px;\n\n\t\t\t@media (max-width: 530px) {\n\t\t\t\ttop: 36px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&::before {\n\t\tbackground: rgba(61, 61, 61, 0.07);\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 32px;\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\ttransform: translateY(-50%);\n\t\twidth: 1px;\n\t}\n\n\t${props =>\n\t\tprops.isOpen &&\n\t\tcss`\n\t\t\tspan {\n\t\t\t\t&:nth-of-type(1) {\n\t\t\t\t\ttop: 31px;\n\t\t\t\t\ttransform: translateX(-50%) rotate(45deg);\n\t\t\t\t\ttransition: transform 150ms 350ms, top 350ms 0ms;\n\n\t\t\t\t\t@media (max-width: 530px) {\n\t\t\t\t\t\ttop: 28px;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t&:nth-of-type(2) {\n\t\t\t\t\ttransform: translateX(-50%) scaleX(0);\n\t\t\t\t\ttransition: transform 250ms;\n\t\t\t\t}\n\t\t\t\t&:nth-of-type(3) {\n\t\t\t\t\ttop: 31px;\n\t\t\t\t\ttransform: translateX(-50%) rotate(-45deg);\n\t\t\t\t\ttransition: transform 150ms 350ms, top 350ms 0ms;\n\n\t\t\t\t\t@media (max-width: 530px) {\n\t\t\t\t\t\ttop: 28px;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t`};\n\n\t@media (min-width: 1110px) {\n\t\tdisplay: none !important;\n\t}\n`;\n\nconst doSpin = keyframes`\n\t0% {\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\ttransform: rotate(180deg);\n\t}\n`;\n\nexport const ExpanderButton = styled.button`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tbackground: rgba(255, 255, 255, 0);\n\tborder: 0;\n\tcolor: ${color(\"greenBright\", 1)};\n\tcursor: pointer;\n\tfont-size: 13px;\n\toutline: 0;\n\tpadding: 10px;\n\tpadding: 19px 20px;\n\tposition: absolute;\n\tright: 0px;\n\ttop: 0;\n\n\t@media (min-width: 531px) {\n\t\tright: 16px;\n\t}\n\n\t@media (pointer: fine) {\n\t\ttransition: background-color 150ms;\n\n\t\t&:hover {\n\t\t\tbackground-color: ${color(\"grey\", 7)};\n\n\t\t\tsvg {\n\t\t\t\tanimation: ${doSpin} 150ms forwards;\n\t\t\t}\n\t\t}\n\t}\n\n\tsvg {\n\t\tmax-width: 13px;\n\t}\n\n\t@media (min-width: 1110px) {\n\t\tdisplay: none !important;\n\t}\n`;\n\nexport const NavDimmer = styled.span`\n\tbackground: rgba(0, 0, 0, 0.6);\n\theight: 100vh;\n\tleft: 0;\n\topacity: ${props => (props.isOpen ? 1 : 0)};\n\tpointer-events: ${props => (props.isOpen ? \"auto\" : \"none\")};\n\tposition: absolute;\n\ttop: 0;\n\ttransition: opacity 300ms;\n\twidth: 100%;\n\tz-index: 90;\n\n\t@media (min-width: 1110px) {\n\t\tdisplay: none;\n\t}\n`;\n\nexport const QuickLinksContainer = styled.div`\n\tdisplay: flex;\n\tflex-grow: 1;\n\theight: 100%;\n\tjustify-content: flex-end;\n\tpadding-right: 50px;\n\n\t@media (max-width: 530px) {\n\t\tpadding-right: 22px;\n\t}\n\n\t${NavItem} {\n\t\talign-items: center;\n\t\tbackground: rgba(255, 255, 255, 0) !important;\n\t\tborder-bottom: 0;\n\t\tdisplay: inline-flex;\n\t\theight: 100%;\n\t\tjustify-content: center;\n\t\tmargin-right: 24px;\n\t\tmargin-top: 0;\n\t\tpadding: 0;\n\t\twidth: auto;\n\n\t\ta.main {\n\t\t\tborder-bottom: 2px solid rgba(0, 0, 0, 0);\n\t\t\tborder-top: 2px solid rgba(0, 0, 0, 0);\n\t\t\tfont-size: 15px;\n\t\t\theight: 100%;\n\n\t\t\t&.active {\n\t\t\t\tborder-bottom-color: ${color(\"grey\", 1)};\n\t\t\t}\n\t\t}\n\n\t\t&#search-quick {\n\t\t\tspan {\n\t\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tfont-size: 14px;\n\t\t\t\tmargin-right: 9px;\n\t\t\t\tvertical-align: middle;\n\n\t\t\t\tsvg {\n\t\t\t\t\tmax-width: 14px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@media (min-width: 716px) {\n\t\t\t\tdisplay: none !important;\n\t\t\t}\n\t\t}\n\n\t\t@media (max-width: 715px) {\n\t\t\t&:not(#search-quick) {\n\t\t\t\tdisplay: none !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t@media (min-width: 1110px) {\n\t\tdisplay: none !important;\n\t}\n\n\t@media print {\n\t\tdisplay: none;\n\t}\n`;\n","export interface INavItem {\n\thref: string;\n\tid: string;\n\ttitle: string;\n\tsecondary?: {\n\t\ttitle: string;\n\t\tlinks: Array<{\n\t\t\tid: string;\n\t\t\thref: string;\n\t\t\ttitle: string;\n\t\t}>;\n\t};\n\ttertiary?: Array<{\n\t\tid: string;\n\t\ttitle: string;\n\t\tlinks: Array<{\n\t\t\tid: string;\n\t\t\thref: string;\n\t\t\ttitle: string;\n\t\t}>;\n\t}>;\n}\n\nconst navLinks: INavItem[] = [\n\t/* *********** Search *********** */\n\t{\n\t\thref: \"/haku\",\n\t\tid: \"search\",\n\t\ttitle: \"Haku\",\n\t},\n\n\t/* *********** Selling *********** */\n\t{\n\t\thref: \"/asunnon-myynti\",\n\t\tid: \"selling\",\n\t\ttitle: \"Asunnon myynti\",\n\t\tsecondary: {\n\t\t\ttitle: \"Näin palvelemme sinua asunnon tai kiinteistön myynnissä\",\n\t\t\tlinks: [\n\t\t\t\t{\n\t\t\t\t\thref: \"/kotikaynti\",\n\t\t\t\t\tid: \"homevisit\",\n\t\t\t\t\ttitle: \"Asunnon hinta-arvio\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttitle: \"Digikotikäynti\",\n\t\t\t\t\tid: \"digihomevisit\",\n\t\t\t\t\thref: \"/digikotikäynti\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\thref: \"/tarjouskauppa\",\n\t\t\t\t\tid: \"online-offer\",\n\t\t\t\t\ttitle: \"Kiinteistömaailman Tarjouskauppa\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\thref: \"/myyjan-palvelut\",\n\t\t\t\t\tid: \"sellers-services\",\n\t\t\t\t\ttitle: \"Palvelut asunnon myyjälle\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\thref: \"/digikauppa\",\n\t\t\t\t\tid: \"digi-sales\",\n\t\t\t\t\ttitle: \"Kiinteistömaailman Digikauppa\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\thref: \"/palveluhinnasto\",\n\t\t\t\t\tid: \"service-prices\",\n\t\t\t\t\ttitle: \"Palveluhinnasto\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\thref: \"/avoimet-ostotoimeksiannot\",\n\t\t\t\t\tid: \"open-buyorders\",\n\t\t\t\t\ttitle: \"Avoimet ostotoimeksiannot\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\ttertiary: [\n\t\t\t{\n\t\t\t\tid: \"selling-tertiary1\",\n\t\t\t\ttitle: \"Päätöksenteon tueksi\",\n\t\t\t\tlinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/asuntojen-hinnat\",\n\t\t\t\t\t\tid: \"aptprices-selling\",\n\t\t\t\t\t\ttitle: \"Asuntojen hinnat\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/etsi-myymala\",\n\t\t\t\t\t\tid: \"find-agency-selling\",\n\t\t\t\t\t\ttitle: \"Kiinteistönvälitys alueellasi\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"selling-tertiary2\",\n\t\t\t\ttitle: \"\",\n\t\t\t\tlinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/etsi-kiinteistonvalittaja\",\n\t\t\t\t\t\tid: \"find-agent\",\n\t\t\t\t\t\ttitle: \"Valitse kiinteistönvälittäjä\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/arviointipalvelu\",\n\t\t\t\t\t\tid: \"estimation-service\",\n\t\t\t\t\t\ttitle: \"Arviointipalvelu\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n\n\t/* *********** Buying *********** */\n\t{\n\t\thref: \"/asunnon-ostaminen\",\n\t\tid: \"buying\",\n\t\ttitle: \"Asunnon osto\",\n\t\tsecondary: {\n\t\t\ttitle: \"Näin palvelemme sinua asunnon ostossa\",\n\t\t\tlinks: [\n\t\t\t\t{\n\t\t\t\t\thref: \"/myytavat_asunnot\",\n\t\t\t\t\tid: \"search-apartments\",\n\t\t\t\t\ttitle: \"Myytävät asunnot\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\thref: \"/ostajan-palvelut\",\n\t\t\t\t\tid: \"buyers-services\",\n\t\t\t\t\ttitle: \"Palvelut asunnon ostajille\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\thref: \"/24h-etumatka\",\n\t\t\t\t\tid: \"searhc-watcher\",\n\t\t\t\t\ttitle: \"24h asuntovahti\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\thref: \"/kotihaku\",\n\t\t\t\t\tid: \"homesearch\",\n\t\t\t\t\ttitle: \"Kotihaku\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\thref: \"/hae-asuntolainaa\",\n\t\t\t\t\tid: \"get-mortgage\",\n\t\t\t\t\ttitle: \"Hae asuntolainaa\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\thref: \"/asunnon-ostotoimeksianto\",\n\t\t\t\t\tid: \"buyorder\",\n\t\t\t\t\ttitle: \"Asunnon ostotoimeksianto\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\ttertiary: [\n\t\t\t{\n\t\t\t\tid: \"buying-tertiary1\",\n\t\t\t\ttitle: \"Päätöksenteon tueksi\",\n\t\t\t\tlinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/ensiasunnon-ostaminen\",\n\t\t\t\t\t\tid: \"first-apt\",\n\t\t\t\t\t\ttitle: \"Ensiasunnon osto\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/asunnon-vaihto\",\n\t\t\t\t\t\tid: \"apt-change\",\n\t\t\t\t\t\ttitle: \"Asunnon vaihto\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/asuntosijoittaminen\",\n\t\t\t\t\t\tid: \"investment\",\n\t\t\t\t\t\ttitle: \"Asuntosijoitus\",\n\t\t\t\t\t},\n\t\t\t\t\t// {\n\t\t\t\t\t// \thref: \"/asuinalue\",\n\t\t\t\t\t// \tid: \"areapages\",\n\t\t\t\t\t// \ttitle: \"Alue-esittelyt\",\n\t\t\t\t\t// },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"buying-tertiary2\",\n\t\t\t\ttitle: \"Täältä löydät meidät\",\n\t\t\t\tlinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/etsi-myymala\",\n\t\t\t\t\t\tid: \"find-agency\",\n\t\t\t\t\t\ttitle: \"Kiinteistönvälitys alueellasi\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n\n\t/* *********** Selling cottage *********** */\n\t{\n\t\thref: \"/mokin-myynti\",\n\t\tid: \"selling-cottage\",\n\t\ttitle: \"Mökin myynti\",\n\t},\n\n\t/* *********** Rental *********** */\n\t{\n\t\thref: \"/asunnon-vuokraus\",\n\t\tid: \"rental\",\n\t\ttitle: \"Vuokraus\",\n\t},\n\n\t/* *********** Estimation *********** */\n\t{\n\t\thref: \"/arviointipalvelu\",\n\t\tid: \"estimation\",\n\t\ttitle: \"Arviointi\",\n\t},\n\n\t/* *********** Thinking *********** */\n\t{\n\t\thref: \"/pohtimassa\",\n\t\tid: \"thinking\",\n\t\ttitle: \"Pohtimassa\",\n\t\ttertiary: [\n\t\t\t{\n\t\t\t\tid: \"thinking-articles\",\n\t\t\t\ttitle: \"Päätöksenteon tueksi\",\n\t\t\t\tlinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/asunnon-arviointi\",\n\t\t\t\t\t\tid: \"apartment-evaluation\",\n\t\t\t\t\t\ttitle: \"Asunnon arviointi\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/asunnon-ostamisen-myymisen-kaytannot\",\n\t\t\t\t\t\tid: \"apartment-buy-sell-practices\",\n\t\t\t\t\t\ttitle: \"Asunnon ostoon ja myyntiin liittyvät käytännöt\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/asunnon-vaihto\",\n\t\t\t\t\t\tid: \"apartment-change\",\n\t\t\t\t\t\ttitle: \"Asunnon vaihto\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/asunto-perintona\",\n\t\t\t\t\t\tid: \"apartment-as-heritage\",\n\t\t\t\t\t\ttitle: \"Asunto perintönä\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/asuntojen-hintakehitys\",\n\t\t\t\t\t\tid: \"apartment-price-development\",\n\t\t\t\t\t\ttitle: \"Asuntojen hintakehitys\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/asuntolaina\",\n\t\t\t\t\t\tid: \"mortgage\",\n\t\t\t\t\t\ttitle: \"Asuntolaina\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/asuntosijoittaminen\",\n\t\t\t\t\t\tid: \"apartment-investment\",\n\t\t\t\t\t\ttitle: \"Asuntosijoittaminen\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/ensiasunnon-ostaminen\",\n\t\t\t\t\t\tid: \"first-apartment\",\n\t\t\t\t\t\ttitle: \"Ensiasunnon osto\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"/senioriasuminen\",\n\t\t\t\t\t\tid: \"senior-living\",\n\t\t\t\t\t\ttitle: \"Senioriasuminen\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n\n\t/* *********** Agencies *********** */\n\t{\n\t\thref: \"/etsi-myymala\",\n\t\tid: \"agencies\",\n\t\ttitle: \"Asuntomyymälät\",\n\t},\n\n\t/* *********** Contact *********** */\n\t{\n\t\thref: \"/ota-yhteytta\",\n\t\tid: \"contact\",\n\t\ttitle: \"Ota yhteyttä\",\n\t},\n];\n\nexport default navLinks;\n","import React, { Fragment, useEffect, useRef, useState } from \"react\";\nimport { NavLink } from \"react-router-dom\";\n\nimport { IApplicationState } from \"@redux\";\nimport { IDocument } from \"@redux/document\";\nimport { connect } from \"react-redux\";\nimport throttle from \"lodash-es/throttle\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\nimport { hasWindow } from \"@utils\";\nimport { clearAllBodyScrollLocks, disableBodyScroll } from \"body-scroll-lock\";\n\nimport {\n\tBurger,\n\tExpanderButton,\n\tHeaderContainer,\n\tHeaderWrapper,\n\tMobileNavLogo,\n\tNavDimmer,\n\tNavigation,\n\tNavItem,\n\tNavItemDropdown,\n\tNavItemDropdownTitle,\n\tNavLinksColumn,\n\tNavLinksSecondary,\n\tNavLinksTertiary,\n\tNavLogo,\n\tNavSpacer,\n\tQuickLinksContainer,\n} from \"./styles\";\n\nimport navigationItems, { INavItem } from \"./NavigationItems\";\nimport NavigationCityList from \"./NavigationCityList\";\nimport { sagaDisableHover } from \"@redux/ui/ui.actions\";\n\nconst lightHeaderComponents = [\"SearchPage\", \"PropertyPage\"];\n\nconst QuickLinks = () => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{\" \"}\n\t\t\t\t\tHae kohteita\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\tHaku\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\tAsunnon myynti\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\tAsunnon osto\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\ninterface IProps {\n\tdocument?: IDocument;\n\tlight?: boolean;\n\tdisableHover: (ms: number) => void;\n}\n\nconst SiteHeader = (props: IProps) => {\n\tconst [navOpen, setNavOpen] = useState(false);\n\tconst [openedSubnav, setOpenedSubnav] = useState(null);\n\tconst navRef = useRef(null);\n\tconst headerRef = useRef(null);\n\tlet resizeTm: number = null;\n\n\tconst toggleNav = () => {\n\t\tif (hasWindow) {\n\t\t\tconst { innerWidth } = window;\n\t\t\tconst body = document.body || document.documentElement;\n\n\t\t\tif (navOpen) {\n\t\t\t\tcloseNav();\n\t\t\t} else {\n\t\t\t\tbody.classList.add(\"nav-open\");\n\t\t\t\tif (innerWidth < 1110) {\n\t\t\t\t\tdisableBodyScroll(navRef.current);\n\t\t\t\t}\n\t\t\t\tsetNavOpen(true);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst closeNav = () => {\n\t\tif (hasWindow) {\n\t\t\tconst body = document.body || document.documentElement;\n\t\t\tsetNavOpen(false);\n\t\t\tsetOpenedSubnav(null);\n\t\t\tbody.classList.remove(\"nav-open\");\n\t\t\tprops.disableHover(300);\n\t\t\tclearAllBodyScrollLocks();\n\t\t}\n\t};\n\n\tconst toggleSubnav = (id: string) => {\n\t\tif (openedSubnav === id) {\n\t\t\tsetOpenedSubnav(null);\n\t\t} else {\n\t\t\tsetOpenedSubnav(id);\n\t\t}\n\t};\n\n\tconst getWindowSize = () => {\n\t\tif (hasWindow) {\n\t\t\treturn {\n\t\t\t\theight: window.innerHeight,\n\t\t\t\twidth: window.innerWidth,\n\t\t\t};\n\t\t}\n\t};\n\n\tconst setVH = () => {\n\t\tif (hasWindow && navRef.current) {\n\t\t\tconst { height } = getWindowSize();\n\t\t\tnavRef.current.style.setProperty(\"--vh\", `${height * 0.01}px`);\n\t\t\tdocument.body.style.setProperty(\"--vh\", `${height * 0.01}px`);\n\t\t}\n\t};\n\n\tconst onResize = () => {\n\t\tif (hasWindow) {\n\t\t\tclearTimeout(resizeTm);\n\t\t\tdocument.body.classList.add(\"is-resizing\");\n\n\t\t\tresizeTm = window.setTimeout(() => {\n\t\t\t\tdocument.body.classList.remove(\"is-resizing\");\n\t\t\t\tsetVH();\n\t\t\t}, 500);\n\t\t}\n\t};\n\n\tconst getRenderClassComponent = (document: IDocument) => {\n\t\tif (!document) {\n\t\t\treturn null;\n\t\t}\n\t\tconst { page, renderClassComponent } = document;\n\t\tif (renderClassComponent) {\n\t\t\treturn renderClassComponent;\n\t\t} else {\n\t\t\tif (page && page.renderClassComponent) {\n\t\t\t\treturn page.renderClassComponent;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tconst onScroll = () => {\n\t\tif (hasWindow && window.innerWidth >= 768) {\n\t\t\tlet hh = 65;\n\t\t\tconst { current: header } = headerRef;\n\t\t\tif (header) {\n\t\t\t\thh = header.getBoundingClientRect().height;\n\t\t\t}\n\n\t\t\tif (window.pageYOffset <= 0) {\n\t\t\t\tdocument.body.classList.remove(\"header-pinned\");\n\t\t\t}\n\n\t\t\tif (window.pageYOffset <= hh) {\n\t\t\t\tdocument.body.style.setProperty(\"--sc\", \"\" + window.pageYOffset);\n\t\t\t} else {\n\t\t\t\tdocument.body.style.setProperty(\"--sc\", \"\" + hh);\n\t\t\t}\n\n\t\t\tif (window.pageYOffset < 100) {\n\t\t\t\tdocument.body.classList.add(\"header-transparent\");\n\t\t\t} else {\n\t\t\t\tdocument.body.classList.remove(\"header-transparent\");\n\t\t\t}\n\t\t}\n\t};\n\n\tconst { document: doc } = props;\n\n\tconst component = getRenderClassComponent(doc);\n\tconst isLightPage = (component && lightHeaderComponents.indexOf(component) !== -1) || (\"heroTheme\" in doc && doc.heroTheme === \"white\");\n\tconst cityList =\n\t\tdoc && doc.agencyCityList\n\t\t\t? doc.agencyCityList\n\t\t\t: doc.page && doc.page.agencyCityList\n\t\t\t? doc.page.agencyCityList\n\t\t\t: {};\n\n\tuseEffect(() => {\n\t\tif (hasWindow) {\n\t\t\t[...navRef.current.querySelectorAll(\"a\")].forEach(linkElem => linkElem.addEventListener(\"click\", closeNav));\n\t\t\twindow.addEventListener(\"scroll\", throttle(onScroll, 100));\n\t\t\twindow.addEventListener(\"resize\", throttle(onResize, 100));\n\t\t\tsetVH();\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (hasWindow) {\n\t\t\t\t[...navRef.current.querySelectorAll(\"a\")].forEach(linkElem =>\n\t\t\t\t\tlinkElem.removeEventListener(\"click\", closeNav)\n\t\t\t\t);\n\t\t\t\twindow.removeEventListener(\"scroll\", throttle(onScroll, 100));\n\t\t\t\twindow.removeEventListener(\"resize\", throttle(onResize, 100));\n\t\t\t\tclearTimeout(resizeTm);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{navigationItems.map(({ id, href, title, secondary, tertiary }: INavItem, index: number) => (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t{(secondary || tertiary) && (\n\t\t\t\t\t\t\t\t\t\t toggleSubnav(id)}\n\t\t\t\t\t\t\t\t\t\t\tisOpen={openedSubnav === id}\n\t\t\t\t\t\t\t\t\t\t\taria-label={openedSubnav === id ? \"Sulje alivalikko\" : \"Avaa alivalikko\"}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{openedSubnav === id ? : }\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t{id === \"agencies\" && (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t{(secondary || tertiary) && (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{secondary && (\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t{secondary.title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/* renaming to avoid shadowed names */}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{secondary.links.map(({ id: sID, title: sTitle, href: sHref }) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{sTitle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{tertiary && (\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t{tertiary.map(({ title: tTitle, links: tLinks, id: tID }) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{tTitle ? tTitle : \"\\xa0\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/* renaming to avoid shadowed names */}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{tLinks.map(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t({ id: tlID, title: tlTitle, href: tlHref }) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{tlTitle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t

\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{index === 5 && }\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t))}\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n\nconst mapStateToProps = (state: IApplicationState) => ({\n\tdocument: state.document,\n});\n\nconst mapDispatchToProps = {\n\tdisableHover: sagaDisableHover,\n};\n\nconst SiteHeaderContainer = connect(\n\tmapStateToProps,\n\tmapDispatchToProps\n)(SiteHeader);\n\nexport default SiteHeaderContainer;\n","import styled from \"styled-components\";\nimport { lineHeight, buttons, media } from \"@utils/style-utils\";\n\nexport const Hero = styled.div`\n\tmargin-bottom: 40px;\n\toverflow: hidden;\n\tpadding: 180px 0 45px;\n\tposition: relative;\n\n\t@media (min-width: 1090px) {\n\t\tpadding: 250px 0 105px;\n\t}\n`;\n\nexport const HeroImage = styled.picture`\n\tdisplay: block;\n\theight: 100%;\n\tleft: 0;\n\tposition: absolute;\n\ttop: 0;\n\twidth: 100%;\n\n\timg {\n\t\tdisplay: block;\n\t\t/* height: 100%; */\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\tright: auto;\n\t\ttop: 0;\n\t\twidth: 100%;\n\n\t\t/* @supports (object-fit: cover) {\n\t\t\tobject-fit: cover;\n\t\t\twidth: 100%;\n\t\t} */\n\n\t\t/* @media (min-width: 970px) {\n\t\t\theight: auto;\n\t\t\tleft: auto;\n\t\t\tright: -20%;\n\t\t\twidth: 120%;\n\t\t} */\n\t}\n`;\n\nexport const HeroContainer = styled.div`\n\tmargin: 0 auto;\n\tmax-width: 1394px;\n\tpadding: 0 15px;\n`;\n\nexport const HeroContent = styled.div`\n\tpadding: 60px 0;\n\tposition: relative;\n\tmargin: 0 auto;\n\tmax-width: 633px;\n\ttext-align: center;\n\n\th1 {\n\t\tmargin: 0;\n\t\tposition: relative;\n\n\t\t&::before {\n\t\t\tcontent: \"404\";\n\t\t\tcolor: rgba(0, 0, 0, 0.05);\n\t\t\tfont-size: 200px;\n\t\t\tfont-weight: 500;\n\t\t\tleft: 50%;\n\t\t\tline-height: ${lineHeight(350, 401)};\n\t\t\tpointer-events: none;\n\t\t\tposition: absolute;\n\t\t\ttext-align: center;\n\t\t\ttop: 10px;\n\t\t\ttransform: translate(-50%, -50%);\n\n\t\t\t${media.sm`\n\t\t\t\tfont-size: 260px;\n\t\t\t`}\n\n\t\t\t@media (min-width: 1090px) {\n\t\t\t\tfont-size: 350px;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const CtaLinks = styled.div`\n\tmargin-top: 70px;\n\tposition: relative;\n\tz-index: 3;\n\n\t${media.sm`\n\t\talign-items: center;\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t`}\n\n\ta {\n\t\t${buttons.ctaLink}\n\t\tmargin: 0 12px 12px;\n\n\t\t@media (max-width: 575px) {\n\t\t\tdisplay: block;\n\t\t\tmargin: 0 auto 12px;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n`;\n\nexport const ApartmentBubblesContainer = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t${media.md`\n\t\tflex-direction: row;\n\t\tmargin: 0 auto;\n\t\tmax-width: 1394px;\n\t\tpadding: 0 15px;\n\t`}\n\n\t.apartment-bubbles {\n\t\tpadding-left: 15px;\n\n\t\t&::after {\n\t\t\tcontent: \"\\\\00a0\";\n\t\t}\n\n\t\t${media.md`\n\t\t\tflex-basis: calc(100% - 106px - 20px);\n\t\t\tflex-wrap: wrap;\n\t\t\tpadding-left: 0;\n\n\t\t\t&::after {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t`}\n\n\t\t${media.lg`\n\t\t\tflex-basis: calc(100% - 225px - 20px);\n\t\t`}\n\n\t\t${media.xl`\n\t\t\tflex-basis: calc(100% - 195px - 20px);\n\t\t\tflex-wrap: nowrap;\n\t\t`}\n\t}\n\n\t.recommendation-percentage {\n\t\tmargin: 0 15px;\n\n\t\t${media.md`\n\t\t\tflex-direction: column;\n\t\t\tmargin: 0;\n\t\t\tmargin-left: 20px;\n\t\t\ttext-align: center;\n\t\t\twidth: 106px;\n\n\t\t\tbig {\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t\tmargin-right: 0;\n\t\t\t}\n\t\t`}\n\n\t\t${media.lg`\n\t\t\twidth: 225px;\n\t\t`}\n\n\t\t${media.xl`\n\t\t\tflex-direction: row;\n\t\t\twidth: 195px;\n\n\t\t\tbig {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t\tmargin-right: 20px;\n\t\t\t}\n\t\t`}\n\t}\n`;\n","import React, { Fragment } from \"react\";\nimport { IApplicationState } from \"@redux\";\nimport { connect } from \"react-redux\";\nimport ApartmentBubbles from \"@components/Front/ApartmentBubbles\";\nimport RecommendationPercentage from \"@components/Front/RecommendationPercentage\";\nimport { getAssetUrl } from \"@utils/index\";\nimport { Hero, HeroContainer, HeroContent, HeroImage, CtaLinks, ApartmentBubblesContainer } from \"./styles\";\nimport { Link } from \"react-router-dom\";\n\nconst HeroPicture = () => {\n\tconst imagePath = \"/assets/images/km-2022/etusivu/\";\n\tconst sources = [\n\t\t[\"(min-width: 1024px)\", \"KM-front-hero\"],\n\t\t[\"(min-width: 768px)\", \"KM-front-hero-tablet\"],\n\t\t[null, \"KM-front-hero-mobile\"],\n\t];\n\n\tconst makeSrcSet = (src: string, ext: string) => {\n\t\treturn `${getAssetUrl(src + ext)} 1x, ${getAssetUrl(src + \"@2x\" + ext)} 2x`;\n\t};\n\n\treturn (\n\t\t\n\t\t\t{sources.map(([media, name], index: number) => {\n\t\t\t\tconst props = { ...(media && { media }) };\n\t\t\t\treturn (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t})}\n\t\t\t\n\t\t\n\t);\n};\n\nconst NotFoundPage = ({ doc }) => {\n\tconst { propertyStatistics } = doc || { propertyStatistics: null };\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t

Emme löytäneet hakemaasi.

\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tHae asuntoja\n\t\t\t\t\t\t\tHae välittäjää\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\t);\n};\n\nconst mapStateToProps = (state: IApplicationState) => ({\n\tdoc: state.document,\n});\n\nexport default connect(mapStateToProps)(NotFoundPage);\n","interface IFooterLink {\n\thref: string;\n\ttitle: string;\n\ttarget?: string;\n}\n\ninterface IFooterLinkGroup {\n\tlinks: IFooterLink[];\n\ttitle: string;\n}\n\nconst footerMainLinks: IFooterLinkGroup[] = [\n\t{\n\t\tlinks: [\n\t\t\t{ href: \"/ketjuohjaus\", title: \"Ketjuohjaus\" },\n\t\t\t{ href: \"/tutustu-kiinteistomaailmaan\", title: \"Tutustu Kiinteistömaailmaan\" },\n\t\t\t{ href: \"/palvelut-rakennuttajille\", title: \"Palvelut rakennuttajille\" },\n\t\t\t{ href: \"/vastuullisuus\", title: \"Vastuullisuus\" },\n\t\t\t{ href: \"/tietosuoja\", title: \"Tietosuojaseloste\" },\n\t\t],\n\t\ttitle: \"Kiinteistömaailma\",\n\t},\n\t{\n\t\tlinks: [\n\t\t\t{ href: \"/etsi-myymala\", title: \"Lähin Kiinteistömaailma\" },\n\t\t\t{ href: \"/etsi-kiinteistonvalittaja\", title: \"Hae välittäjää\" },\n\t\t\t{ href: \"/yhteistyokumppanit\", title: \"Yhteistyökumppanit\" },\n\t\t\t{ href: \"/kotikansio\", title: \"Kotikansio\", target: \"_blank\" },\n\t\t\t{ href: \"/tietoa-evästeiden-käytöstä\", title: \"Tietoa evästeiden käytöstä\" },\n\t\t\t{ href: \"/evasteasetukset\", title: \"Evästeasetukset \"},\n\t\t],\n\t\ttitle: \"Asiakkaille\",\n\t},\n\t{\n\t\tlinks: [\n\t\t\t{ href: \"/tiedotteet\", title: \"Tiedotteet\" },\n\t\t\t{ href: \"/lyhyesti\", title: \"Kiinteistömaailma lyhyesti\" },\n\t\t\t{ href: \"/kuvapankki\", title: \"Kuvapankki\" },\n\t\t\t{ href: \"/yhteystiedot-medialle\", title: \"Yhteystiedot medialle\" },\n\t\t],\n\t\ttitle: \"Medialle\",\n\t},\n\t{\n\t\tlinks: [\n\t\t\t{ href: \"/yrittajaksi\", title: \"Yrittäjäksi\" },\n\t\t\t{ href: \"/kiinteistonvalittajaksi\", title: \"Välittäjäksi\" },\n\t\t\t{ href: \"/uusi-alalle\", title: \"Uusi alalle?\" },\n\t\t\t{ href: \"/avoimet-tyopaikat\", title: \"Avoimet työpaikat\" },\n\t\t],\n\t\ttitle: \"Rekrytointi\",\n\t},\n];\n\nexport default footerMainLinks;\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Container } from \"@components/Grid\";\nimport footerMainLinks from \"./FooterItems\";\nimport { animateScroll as scroll } from \"react-scroll\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\nimport {\n\tFooter,\n\tFooterTop,\n\tSpacer,\n\tFooterLinkGroups,\n\tLinkGroup,\n\tLinkGroupTitle,\n\tFooterLogo,\n\tFooterLogoStacked,\n\tBackToTop, SomeLinks, LogoAndLinks, SomeButton,\n} from \"./styles\";\n\nconst SiteFooter = () => {\n\tconst scrollToTop = () => {\n\t\tscroll.scrollToTop();\n\t};\n\n\tconst currentYear = new Date().getFullYear();\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\tPå Svenska\n\t\t\t\t\tIn English\n\t\t\t\t\t\n\t\t\t\t\tAnna palautetta\n\t\t\t\t\t\n\t\t\t\t\t\tSivun alkuun\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t{footerMainLinks.map(({ title, links }, index) => (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t

\n\t\t\t\t\tKiinteistomaailma.fi -palvelun tai tietojen käyttäminen muihin kuin yksityisiin tarkoituksiin on\n\t\t\t\t\tkielletty ilman Kiinteistömaailma Oy:n antamaa kirjallista lupaa.{\" \"}\n\t\t\t\t\tSivun käyttöehdot\n\t\t\t\t

\n\t\t\t\t

Kiinteistömaailma Oy © {currentYear}

\n\t\t\t
\n\t\t
\n\t);\n};\n\nexport default SiteFooter;\n","export interface ISelection {\n\tdisabled?: boolean;\n\tlabel: string;\n\t/** Order can be used to \"manually\" sort selections instead of alphabetical sort by label in sagas */\n\torder?: number;\n\tselected?: boolean;\n\tvalue: any;\n\ttitle?: string;\n\t[key: string]: any;\n}\n\nexport const selectableRental: ISelection[] = [\n\t{ label: \"Myyntikohteet\", value: false },\n\t{ label: \"Vuokrakohteet\", value: true },\n];\n\nexport const selectableRooms: ISelection[] = [\n\t{ label: \"1h\", value: 1 },\n\t{ label: \"2h\", value: 2 },\n\t{ label: \"3h\", value: 3 },\n\t{ label: \"4h\", value: 4 },\n\t{ label: \"5h+\", value: 5 },\n];\n\n/* Building types\n1 => 'Kerrostalo',\n2 => 'Rivitalo',\n3 => 'Omakotitalo',\n4 => 'Vapaa-ajan asunto',\n5 => 'Tontti',\n6 => 'Autopaikka',\n7 => 'Liikerakennus',\n8 => 'Puutalo',\n9 => 'Luhtitalo',\n10 => 'Pienkerrostalo',\n11 => 'Paritalo',\n12 => 'Erillistalo',\n13 => 'Maa- tai metsätila',\n14 => 'Toimitila',\n15 => 'Varasto',\n16 => 'Venepaikka',\n17 => 'Autotalli',\n*/\n\nexport const selectableHouseTypes: ISelection[] = [\n\t{ label: \"Kerros-/luhtitalo\", title: \"kerrostaloasunnot\", order: 0, value: \"kerrostaloasunnot\", buildingType: [1, 9, 10] },\n\t{ label: \"Rivitalo/paritalo\", title: \"rivitalot ja paritalot\", order: 1, value: \"rivitalot-paritalot\", buildingType: [2, 11] },\n\t{ label: \"Omakoti-/erillistalo\", title: \"omakotitalot\", order: 2, value: \"omakotitalot\", buildingType: [3, 8, 12] },\n\t{ label: \"Maa- tai metsätila\", title: \"maatilat ja metsätilat\", order: 3, value: \"maatilat-metsatilat\", buildingType: [13] },\n\t{ label: \"Tontti\", order: 4, title: \"tontit\", value: \"tontit\", buildingType: [5] },\n\t{ label: \"Vapaa-ajan asunto\", title: \"mökit ja vapaa-ajan asunnot\", order: 5, value: \"vapaa-ajan_asunnot\", buildingType: [4] },\n\t{ label: \"Toimitila\", order: 6, title: \"toimitilat\", value: \"toimitilat\", buildingType: [7, 14] },\n\t{ label: \"Autotalli\", order: 7, title: \"autotallit\", value: \"autotallit\", buildingType: [6, 17] },\n\t{ label: \"Muut\", order: 8, \"title\": \"muut\", value: \"muut\", buildingType: [15, 16] },\n];\n\nexport const selectableAreaTypes: ISelection[] = [\n\t{ label: \"Asuinpinta-ala\", order: 0, value: \"living\" },\n\t{ label: \"Kokonaispinta-ala\", order: 1, value: \"total\" },\n];\n\nexport const selectableNewConstruction: ISelection[] = [\n\t{ label: \"Vain uudiskohteet\", order: 0, value: true },\n\t{ label: \"Ei uudiskohteita\", order: 1, value: false },\n];\n\nexport const selectableValueListing: ISelection[] = [\n\t{ label: \"Vain arvokohteet\", order: 0, value: true },\n\t{ label: \"Ei arvokohteita\", order: 1, value: false },\n];\n\nexport const selectableConditions: ISelection[] = [\n\t{ label: \"Hyvä\", order: 2, value: [\"Hyvä\", \"Erittäin hyvä\"] },\n\t{ label: \"Tyydyttävä\", order: 3, value: \"Tyydyttävä\" },\n\t{ label: \"Välttävä\", order: 4, value: [\"Välttävä\", \"Huono\"] },\n];\n\nexport const selectableFeatures: ISelection[] = [\n\t{ label: \"Hissi\", value: \"elevator\" },\n\t{ label: \"Järvi- tai merinäköala\", value: \"seaOrLakeView\" },\n\t{ label: \"Maalämpö\", value: \"geothermalHeating\" },\n\t{ label: \"Oma ranta\", value: \"privateShore\" },\n\t{ label: \"Oma sauna\", value: \"sauna\" },\n\t{ label: \"Parveke\", value: \"balcony\" },\n\t{ label: \"Senioriasunto\", value: \"seniorHousing\" },\n];\n\nexport const selectableSorting: ISelection[] = [\n\t{\n\t\tlabel: \"Uusin ilmoitus ensin\",\n\t\torder: 0,\n\t\tsortOrder: \"desc\",\n\t\tvalue: \"latestPublishTimestamp.desc\",\n\t},\n\t{\n\t\tlabel: \"Vanhin ilmoitus ensin\",\n\t\torder: 1,\n\t\tsortOrder: \"asc\",\n\t\tvalue: \"latestPublishTimestamp.asc\",\n\t},\n\t{\n\t\tlabel: \"Halvin ensin\",\n\t\torder: 2,\n\t\tsortOrder: \"asc\",\n\t\tvalue: \"salesPriceUnencumbered.asc\",\n\t},\n\t{\n\t\tlabel: \"Kallein ensin\",\n\t\torder: 3,\n\t\tsortOrder: \"desc\",\n\t\tvalue: \"salesPriceUnencumbered.desc\",\n\t},\n\t{\n\t\tlabel: \"Pienin ensin\",\n\t\torder: 4,\n\t\tsortOrder: \"asc\",\n\t\tvalue: \"sortArea.asc\",\n\t},\n\t{\n\t\tlabel: \"Suurin ensin\",\n\t\torder: 5,\n\t\tsortOrder: \"desc\",\n\t\tvalue: \"sortArea.desc\",\n\t},\n\t/* do we need this anymore?\n\t{\n\t\tlabel: \"Lähimmät ensin\",\n\t\torder: 10,\n\t\tsortOrder: undefined,\n\t\tvalue: \"nearest\",\n\t}, */\n];\n","import styled from \"styled-components\";\nimport bg from \"@images/brand-identity/graphics/footer-bg.svg\";\nimport bgDesktop from \"@images/brand-identity/graphics/footer-bg-desktop.svg\";\nimport { color, emSpacing, lineHeight, breakpoints } from \"@utils/style-utils\";\nimport { Container } from \"@components/Grid\";\nimport LogoHorizontal from \"@components/Logos/LogoHorizontal\";\nimport LogoStacked from \"@components/Logos/LogoStacked\";\nimport backToTop from \"@images/km-2019/back-to-top.svg\";\n\nexport const Footer = styled.footer`\n\tbackground-image: url(${bg});\n\tbackground-position: right bottom;\n\tbackground-repeat: no-repeat;\n\tbackground-size: auto 200px;\n\tpadding-bottom: 25rem;\n\tpadding-top: 13rem;\n\n\t@media (min-width: ${breakpoints.lgx}) {\n\t\tbackground-image: url(${bgDesktop});\n\t\tbackground-size: auto;\n\t}\n\n\tp {\n\t\tcolor: ${color(\"grey\", 3)};\n\t\tfont-size: 15px;\n\t\tmax-width: 662px;\n\n\t\ta {\n\t\t\tcolor: ${color(\"grey\", 3)};\n\t\t\ttext-decoration: underline;\n\n\t\t\t&:hover {\n\t\t\t\tcolor: ${color(\"grey\", 1)};\n\t\t\t}\n\t\t}\n\t}\n\n\t@media print {\n\t\tbackground-image: none;\n\t}\n`;\n\nexport const FooterTop = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\n\t@media (min-width: ${breakpoints.xsm}) {\n\t\tflex-wrap: nowrap;\n\t}\n\n\tspan.spacer {\n\t\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\t\tmargin: 22px 0;\n\n\t\t@media (min-width: ${breakpoints.xsm}) {\n\t\t\tborder: 0;\n\t\t\tmargin: 0;\n\t\t\tflex-grow: 10;\n\t\t}\n\t}\n\n\ta {\n\t\talign-self: center;\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t\tcursor: pointer;\n\t\tflex: 1 1 50%;\n\t\tfont-size: 13px;\n\t\tfont-weight: bold;\n\t\tline-height: ${lineHeight(13, 18)};\n\t\tletter-spacing: ${emSpacing(0.03)};\n\t\ttext-decoration: none;\n\t\ttext-transform: uppercase;\n\t\ttransition: color 150ms;\n\n\t\t+ a {\n\t\t\t@media (min-width: ${breakpoints.xsm}) {\n\t\t\t\tmargin: 0 0 0 25px;\n\t\t\t}\n\t\t}\n\n\t\t&:hover {\n\t\t\tcolor: ${color(\"greenBright\", 2)};\n\t\t}\n\n\t\t&:nth-child(2) {\n\t\t\ttext-align: right;\n\t\t}\n\t\t&:nth-child(3) {\n\t\t\twidth: 100%;\n\t\t}\n\t\t&:nth-child(5) {\n\t\t\ttext-align: right;\n\t\t}\n\n\t\t@media (min-width: ${breakpoints.xsm}) {\n\t\t\tflex: 1;\n\t\t\twhite-space: nowrap;\n\n\t\t\t&:nth-child(2) {\n\t\t\t\ttext-align: left;\n\t\t\t}\n\t\t\t&:nth-child(3) {\n\t\t\t\twidth: auto;\n\t\t\t}\n\t\t\t&:nth-child(5) {\n\t\t\t\ttext-align: left;\n\t\t\t}\n\t\t}\n\t}\n\n\t@media print {\n\t\tdisplay: none;\n\t}\n`;\n\nexport const BackToTop = styled.button`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tbackground: transparent;\n\tborder-radius: 0;\n\tborder: 0;\n\tcolor: ${color(\"greenBright\", 1)};\n\tcursor: pointer;\n\tflex: 1 1 50%;\n\tfont-size: 13px;\n\tfont-weight: bold;\n\tletter-spacing: ${emSpacing(0.03)};\n\tline-height: ${lineHeight(13, 18)};\n\tmargin: 0;\n\toutline: 0;\n\tpadding: 0;\n\tposition: relative;\n\ttext-align: right;\n\ttext-decoration: none;\n\ttext-transform: uppercase;\n\ttransition: color 150ms;\n\n\t@media (min-width: ${breakpoints.xsm}) {\n\t\tbackground-image: url(${backToTop});\n\t\tbackground-position: 50% 50%;\n\t\tbackground-repeat: no-repeat;\n\t\tdisplay: block;\n\t\theight: 20px;\n\t\tmargin: 0 0 0 65px;\n\t\tflex: 0 0 auto;\n\t\ttext-align: left;\n\t\ttext-indent: -999em;\n\t\twhite-space: normal;\n\t\twidth: 13px;\n\n\t\t&::before {\n\t\t\tbackground: ${color(\"grey\", 5)};\n\t\t\tcontent: \"\";\n\t\t\tdisplay: block;\n\t\t\theight: 19px;\n\t\t\tleft: -32px;\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\twidth: 1px;\n\t\t}\n\t}\n\n\t.is-pointer & {\n\t\t&:hover {\n\t\t\topacity: 0.9;\n\t\t}\n\t}\n`;\n\nexport const Spacer = styled.span`\n\tbackground: ${color(\"grey\", 5)};\n\tdisplay: block;\n\theight: 1px;\n\tmargin: 20px auto 43px;\n\twidth: 100%;\n\n\t@media (min-width: ${breakpoints.xsm}) {\n\t\tmargin: 45px auto;\n\t}\n`;\n\nexport const FooterLinkGroups = styled.div`\n\tdisplay: grid;\n\tgrid-gap: 30px;\n\tgrid-template-columns: repeat(2, 1fr);\n\n\t@media (min-width: 768px) {\n\t\tgrid-template-columns: repeat(4, 1fr);\n\t}\n\n\t@media (min-width: 992px) {\n\t\tgrid-template-columns: repeat(6, 1fr);\n\t}\n`;\n\nexport const LinkGroup = styled.div`\n\tul {\n\t\tlist-style: none;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\n\t\tli {\n\t\t\tpadding: 0;\n\t\t\tmargin: 0 0 19px;\n\n\t\t\ta {\n\t\t\t\tcolor: ${color(\"grey\", 2)};\n\t\t\t\tfont-size: 14px;\n\t\t\t\ttext-decoration: none;\n\t\t\t\ttransition: color 150ms;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t@media print {\n\t\tdisplay: none;\n\t}\n`;\n\nexport const LinkGroupTitle = styled.h4`\n\tcolor: ${color(\"grey\", 2)};\n\tfont-size: 13px;\n\tfont-weight: bold;\n\tline-height: 18px;\n\tletter-spacing: ${emSpacing(0.03)};\n\tmargin: 0 0 14px;\n\ttext-transform: uppercase;\n`;\n\nexport const LogoAndLinks = styled.div`\n\tgrid-column: 1 / -1;\n\tmargin: 0 0 2rem;\n\torder: -1;\n\twidth: auto;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: flex-start;\n\n\t@media (min-width: ${breakpoints.lg}) {\n\t\tgrid-column: span 2;\n\t\tjustify-self: end;\n\t\tmargin: 0;\n\t\torder: inherit;\n\t}\n\n\tjustify-self: center;\n\t@media (min-width: ${breakpoints.md}) {\n\t\tjustify-self: start;\n\t}\n`;\n\nexport const FooterLogo = styled(LogoHorizontal)`\n\tdisplay: none;\n\twidth: auto;\n\talign-self: center;\n\n\t@media (min-width: ${breakpoints.md}) {\n\t\tdisplay: block;\n\t}\n\n\t@media (min-width: ${breakpoints.lg}) {\n\t\theight: 35px;\n\t\talign-self: flex-end;\n\t}\n`;\n\nexport const FooterLogoStacked = styled(LogoStacked)`\n\tdisplay: block;\n\theight: 62px;\n\talign-self: center;\n\tmargin: 0 0 2rem;\n\twidth: auto;\n\n\t@media (min-width: ${breakpoints.md}) {\n\t\tdisplay: none;\n\t}\n`;\n\nexport const SomeLinks = styled.div`\n\tmargin: 1rem 0 0;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\n\t@media (min-width: ${breakpoints.md}) {\n\t\tmargin-top: 2rem;\n\t}\n\n\t@media print {\n\t\tdisplay: none;\n\t}\n`;\n\nexport const SomeButton = styled.a`\n\talign-items: center;\n\tbackground: ${color(\"greenBright\", 1)};\n\tborder-radius: 4px;\n\tbox-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n\tcolor: ${color(\"white\")};\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\tfont-size: 20px;\n\theight: 45px;\n\tmargin-right: 16px;\n\tjustify-content: center;\n\ttext-decoration: none;\n\ttransform: scale(1);\n\ttransition: transform 150ms, box-shadow 150ms;\n\twidth: 52px;\n\n\t&:last-of-type {\n\t\tmargin-right: 0;\n\t}\n\n\t&:hover {\n\t\tbox-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1);\n\t\ttransform: scale(1.1);\n\t}\n\n\t&:active {\n\t\tbox-shadow: 0px 1px 4px rgba(0, 0, 0, 0.05);\n\t\ttransform: scale(0.96);\n\t}\n\n\tspan svg {\n\t\tmax-width: 36px;\n\t}\n`;\n","import styled, { keyframes, css } from \"styled-components\";\nimport { color, grid, media, boxShadow, ribbon } from \"@utils/style-utils\";\n\nconst pulse = keyframes`\n\t0%, 100% {\n\t\topacity: 1;\n\t}\n\t50% {\n\t\topacity: 0.6;\n\t}\n`;\n\nexport const Placeholder = styled.div`\n\tanimation: ${pulse} 1s linear infinite;\n`;\n\nexport const PlaceholderInput = styled.div`\n\tbackground: ${color(\"grey\", 6)};\n\tborder-radius: 4px;\n\theight: 40px;\n\tmargin-bottom: 16px;\n\twidth: 100%;\n\n\t&:last-of-type {\n\t\tmargin-bottom: 0;\n\t}\n`;\n\nexport const PlaceholderTextarea = styled.div`\n\tbackground: ${color(\"grey\", 6)};\n\tborder-radius: 4px;\n\theight: 80px;\n\tmargin-top: 16px;\n\twidth: 100%;\n\n\t${media.md`\n\t\tmargin-top: 0;\n\t\theight: 100%;\n\t`};\n\n\t&::after {\n\t\tanimation-delay: 0.8s;\n\t}\n`;\n\nexport const PlaceholderGdpr = styled.div`\n\tbackground: ${color(\"greenDark\", 4)};\n\theight: 18px;\n\tmargin: 24px auto;\n\twidth: 120px;\n`;\n\nexport const PlaceholderButton = styled.div`\n\tbackground: ${color(\"greenBright\", 1)};\n\tborder-radius: 4px;\n\theight: 48px;\n\tmargin: 0 auto;\n\twidth: 195px;\n`;\n\nexport const FormWrapper = styled.div.attrs(props => ({\n\tclassName: \"contact-form\",\n\tid: \"ag-contact-form\",\n}))`\n\tbackground-color: ${props =>\n\t\tprops.color && props.color === \"green\" ? color(\"greenBright\", 5) : color(\"beige\", 4)};\n\tbackground-image: ${props =>\n\t\tprops.color && props.color === \"green\"\n\t\t\t? 'url(\"/assets/images/brand-identity/graphics/form-bg-pattern.png\")'\n\t\t\t: 'url(\"/assets/images/brand-identity/graphics/form-bg-pattern-beige@2x.png\")'};\n\tbackground-position: calc(50% + 2px) 100%;\n\tbackground-repeat: no-repeat;\n\tbackground-size: 1809px auto;\n\tpadding: 40px ${grid.gutterSmall / 2}px 0;\n\tposition: relative;\n\twidth: 100%;\n\n\t${media.md`\n\t\tpadding: 90px ${grid.gutter / 2}px 0;\n\t`};\n`;\n\nexport const FormContainer = styled.div.attrs(props => ({\n\tclassName: \"form-container\",\n}))`\n\tbackground: ${color(\"white\")};\n\tbox-shadow: ${boxShadow.hugeLight};\n\tmargin: 0 auto;\n\t/* min-height: 558px; */\n\tmax-width: 896px;\n\tpadding: 86px ${grid.gutter / 2}px 56px;\n\tposition: relative;\n\ttext-align: center;\n\ttop: 10px;\n\twidth: 100%;\n\n\t&::before {\n\t\t${ribbon};\n\t\tcontent: '';\n\t\theight: 6px;\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\twidth: 100%;\n\t}\n\n\ttextarea {\n\t\theight: 80px;\n\t\tmargin-top: 16px;\n\n\t\t${media.md`\n\t\t\theight: 100%;\n\t\t\tmargin-top: 0;\n\t\t`};\n\t}\n\n\tbutton[type=\"submit\"] {\n\t\ttext-align: center;\n\t\twidth: 195px;\n\t}\n`;\n\nexport const FormColumns = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin: 0 auto;\n\tmax-width: 662px;\n\n\t${media.md`\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t`};\n`;\n\nexport const FormColumn = styled.div`\n\tdisplay: flex;\n\tflex-basis: 100%;\n\tflex-direction: column;\n\n\t${media.md`\n\t\tflex-basis: calc((100% - ${grid.gutter}px) / 2);\n\t`};\n`;\n","import styled from \"styled-components\";\nimport { buttons, color, media } from \"@utils/style-utils\";\n\nexport const FrontHero = styled.div`\n\tmargin-bottom: 40px;\n\toverflow: hidden;\n\tposition: relative;\n\n\t${media.md`\n\t\tmargin-bottom: 60px;\n\t`};\n\n\t${media.lg`\n\t\tmargin-bottom: 72px;\n\t`};\n\n\t.hero-image {\n\t\tbackground-color: ${color(\"grey\", 7)};\n\t\theight: 100%;\n\t\tleft: 0;\n\t\t/* max-height: 952px; */\n\t\toverflow: hidden;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\twidth: 100%;\n\n\t\tmargin: 0 -1px; // without this, the image for some reason is not covering the whole width, but leaves 1px on each side\n\n\t\timg {\n\t\t\theight: 100%;\n\t\t\tleft: 50%;\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\ttransform: translate(-50%, -50%);\n\t\t\twidth: auto;\n\n\t\t\t@media (min-width: 1920px) {\n\t\t\t\theight: auto;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t@supports (object-fit: cover) {\n\t\t\t\theight: 100% !important;\n\t\t\t\tobject-fit: cover;\n\t\t\t\twidth: 100% !important;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const FrontHeroContent = styled.div`\n\tpadding: 100px 0;\n\tposition: relative;\n\tz-index: 99;\n\n\t${media.md`\n\t\tpadding: 130px 0;\n\t`};\n\n\t${media.lg`\n\t\tpadding: 188px 0;\n\t`};\n\n\t.front-hero-texts {\n\t\th1,\n\t\tp {\n\t\t\ttext-align: center;\n\t\t}\n\n\t\tp {\n\t\t\tmargin-bottom: 50px;\n\t\t}\n\n\t\t&.campaign-texts {\n\t\t\talign-items: center;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tjustify-content: center;\n\t\t\tmin-height: 80vh;\n\t\t\ttext-align: center;\n\n\t\t\t${media.md`\n\t\t\t\tmin-height: 65vh;\n\t\t\t`};\n\t\t}\n\n\t\t&.campaign-white {\n\t\t\tcolor: ${color(\"white\")};\n\n\t\t\th1 {\n\t\t\t\tcolor: ${color(\"white\")};\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const CampaignLink = styled.a`\n\t${buttons.ctaLink};\n`;\n\nexport const FrontHeroTabs = styled.div`\n\tbackground: ${color(\"white\")};\n\n\t&.front-campaign-search-tabs-container {\n\t\tmargin-bottom: 1em;\n\t}\n`;\n\nexport const TabButtons = styled.div`\n\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\tborder-top: 1px solid ${color(\"grey\", 5)};\n\tdisplay: flex;\n\n\t.tab-button {\n\t\talign-items: center;\n\t\tbackground: ${color(\"grey\", 6)};\n\t\tborder-right: 1px solid ${color(\"grey\", 5)};\n\t\tcolor: ${color(\"grey\", 3)};\n\t\tcursor: pointer;\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\tfont-weight: 500;\n\t\tpadding: 20px;\n\n\t\t${media.md`\n\t\t\tpadding: 25px 40px;\n\t\t`};\n\n\t\t&:hover {\n\t\t\tspan:first-of-type {\n\t\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t\t}\n\t\t}\n\n\t\t&:first-of-type {\n\t\t\tborder-left: 1px solid ${color(\"grey\", 5)};\n\t\t}\n\n\t\tspan:first-of-type {\n\t\t\tcolor: ${color(\"grey\", 3)};\n\t\t\tfont-size: 20px;\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-right: 8px;\n\t\t\ttransition: color 300ms;\n\n\t\t\tsvg {\n\t\t\t\tmax-width: 22px;\n\t\t\t}\n\t\t}\n\n\t\t&:not(.tab-button--active) {\n\t\t\t@media (max-width: 767px) {\n\t\t\t\tjustify-content: center;\n\n\t\t\t\tspan {\n\t\t\t\t\tmargin-right: 0;\n\t\t\t\t}\n\n\t\t\t\t.tab-button-text {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&--active {\n\t\t\tbackground: ${color(\"white\")};\n\t\t\tflex-grow: 4;\n\t\t\tpointer-events: none;\n\n\t\t\tspan:first-of-type {\n\t\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const TabContent = styled.div`\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-top: 0;\n\tpadding: 28px 20px;\n\tposition: relative;\n\tmin-height: 404px;\n\n\t${media.md`\n\t\tpadding: 33px;\n\t`};\n`;\n\nexport const Articles = styled.div`\n\tpadding: 40px 0;\n\n\t${media.md`\n\t\tpadding: 60px 0;\n\t`};\n\n\th2 {\n\t\tmargin: 0 auto 40px;\n\t\ttext-align: center;\n\n\t\t${media.lg`\n\t\t\tmargin-bottom: 60px;\n\t\t`};\n\t}\n`;\n\nexport const SuggestedApartments = styled.div`\n\tbackground: ${color(\"grey\", 7)};\n\tpadding: 30px 0;\n\n\t${media.md`\n\t\tpadding: 50px 0;\n\t`};\n\n\t${media.lg`\n\t\tpadding: 60px 0;\n\t`};\n\n\th2 {\n\t\tmargin: 0 auto 10px;\n\t\ttext-align: center;\n\n\t\t${media.md`\n\t\t\tmargin-bottom: 20px;\n\t\t`};\n\t}\n`;\n\nexport const ApartmentBubblesContainer = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin-bottom: 60px;\n\n\t${media.md`\n\t\tflex-direction: row;\n\t\tmargin: 0 auto 80px;\n\t\tmax-width: 1394px;\n\t\tpadding: 0 15px;\n\t`};\n\n\t.apartment-bubbles {\n\t\tpadding-left: 15px;\n\n\t\t&::after {\n\t\t\tcontent: \"\\\\00a0\";\n\t\t}\n\n\t\t${media.md`\n\t\t\tflex-basis: calc(100% - 106px - 20px);\n\t\t\tflex-wrap: wrap;\n\t\t\tpadding-left: 0;\n\n\t\t\t&::after {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t`};\n\n\t\t${media.lg`\n\t\t\tflex-basis: calc(100% - 225px - 20px);\n\t\t`};\n\n\t\t${media.xl`\n\t\t\tflex-basis: calc(100% - 195px - 20px);\n\t\t\tflex-wrap: nowrap;\n\t\t`};\n\t}\n\n\t.recommendation-percentage {\n\t\tmargin: 0 15px;\n\n\t\t${media.md`\n\t\t\tflex-direction: column;\n\t\t\tmargin: 0;\n\t\t\tmargin-left: 20px;\n\t\t\ttext-align: center;\n\t\t\twidth: 106px;\n\n\t\t\tbig {\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t\tmargin-right: 0;\n\t\t\t}\n\t\t`};\n\n\t\t${media.lg`\n\t\t\twidth: 225px;\n\t\t`};\n\n\t\t${media.xl`\n\t\t\tflex-direction: row;\n\t\t\twidth: 195px;\n\n\t\t\tbig {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t\tmargin-right: 20px;\n\t\t\t}\n\t\t`};\n\t}\n`;\n","import styled, { css } from \"styled-components\";\nimport { color, boxShadow, hexToRGB, media } from \"@utils/style-utils\";\n\nexport const AptBlock = styled.div`\n\tbackground: ${color(\"white\")};\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-radius: ${props => (props.theme.small ? \"5px\" : \"4px\")};\n\tbox-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n\tcursor: pointer;\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n\ttransform: scale(1);\n\ttransition: transform 150ms, box-shadow 150ms, border-color 150ms;\n\n\t@media (min-width: 550px) {\n\t\tflex-direction: row;\n\t}\n\n\t&:hover {\n\t\tborder-color: ${color(\"greenBasic\", 4)};\n\t\tbox-shadow: ${boxShadow.wide};\n\t}\n\n\t&:active {\n\t\tbox-shadow: ${boxShadow.wideActive};\n\t\ttransform: scale(0.98);\n\t}\n\n\ta {\n\t\tcolor: inherit;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tflex-grow: 1;\n\t\ttext-decoration: none;\n\t\twidth: 100%;\n\n\t\t${media.sm`\n\t\t\tflex-direction: row;\n\n\n\t\t${props =>\n\t\t\tprops.theme.small &&\n\t\t\tcss`\n\t\t\t\tflex-direction: column;\n\t\t\t`}\n\t\t`}\n\t}\n`;\n\nexport const AptBlockImage = styled.div`\n\tbackground: ${color(\"grey\", 6)};\n\tposition: relative;\n\toverflow: hidden;\n\n\t${({ theme: { small } }) =>\n\t\t!small &&\n\t\tcss`\n\t\t\theight: calc(100% + 1px);\n\t\t\tflex: 1 0 47%;\n\t\t`}\n\n\t&::before {\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\tpadding-bottom: ${props => (props.small ? (197 / 311) * 100 : (352 / 622) * 100)}%;\n\t}\n\n\timg {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t\tleft: 50%;\n\t\tobject-fit: cover;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\ttransform: translate(-50%, -50%);\n\t\twidth: 100%;\n\n\t\t&[src*=\"w_42\"] {\n\t\t\tfilter: url(#sharpBlur);\n\t\t}\n\t}\n`;\n\nexport const AptBlockIcons = styled.div`\n\tbottom: 16px;\n\tright: 16px;\n\tposition: absolute;\n\tz-index: 5;\n`;\n\nconst getColor = type => {\n\tswitch (type) {\n\t\tcase \"newConstruction\":\n\t\t\treturn color(\"blue\", 1);\n\t\tcase \"valueListing\":\n\t\t\treturn color(\"beige\", 1);\n\t\tcase \"onlineOffer\":\n\t\t\treturn color(\"greenBright\", 1);\n\t\tcase \"videoPresentation\":\n\t\t\treturn color(\"greenDark\", 1);\n\t\tdefault:\n\t\t\treturn color(\"greenBright\", 1);\n\t}\n};\n\nexport const AptBlockIcon = styled.span`\n\talign-items: center;\n\tbackground: ${color(\"white\")};\n\tborder-radius: 50%;\n\tbox-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);\n\tcolor: ${props => getColor(props.type)};\n\tfont-size: 14px;\n\tdisplay: flex;\n\theight: 24px;\n\tjustify-content: center;\n\tposition: relative;\n\twidth: 24px;\n\n\timg, svg {\n\t\tdisplay: block;\n\t\tleft: 50%;\n\t\tleft: calc(50% + 0.25px);\n\t\tmax-width: 16px;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\ttransform: translate(-50%, -50%);\n\t}\n\timg {\n\t\tmax-height: 16px;\n\t}\n\n\t+ span {\n\t\tmargin-top: 4px;\n\t}\n`;\n\nexport const AptBlockValueListing = styled.div`\n\tbackground-position: left top;\n\tbackground-repeat: no-repeat;\n\tbackground-size: 100% 100%;\n\theight: 60px;\n\tleft: 8px;\n\tpointer-events: none;\n\tposition: absolute;\n\ttop: 8px;\n\twidth: 60px;\n\tz-index: 5;\n`;\n\nexport const AptBlockOpenHouse = styled.span`\n\tbackground: ${hexToRGB(color(\"greenDark\", 1), 0.7)};\n\tbottom: 0;\n\tcolor: ${color(\"greenBright\", 3)};\n\tfont-size: 12px;\n\tfont-weight: 500;\n\tleft: 0;\n\tpadding: 6px 16px;\n\tposition: absolute;\n\ttext-align: left;\n\twidth: 100%;\n`;\n\nexport const AptBlockInfo = styled.div`\n\talign-content: space-between;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tflex-wrap: wrap;\n\tpadding: 16px;\n\ttext-decoration: none;\n\n\t${media.sm`\n\t\tpadding: ${({ theme }) => (theme.small ? \"16px\" : \"36px 16px 36px 24px\")};\n\n\n\t${props =>\n\t\t!props.theme.small &&\n\t\tcss`\n\t\t\tflex: 1 0 53%;\n\t\t\tmax-width: 53%;\n\t\t`}\n\t`}\n`;\n\nexport const Address = styled.span`\n\tcolor: ${color(\"grey\", 1)};\n\tdisplay: inline-flex;\n\tfont-size: 15px;\n\tflex: 3 0 60%;\n\tmargin-bottom: 20px;\n\ttext-align: left;\n\n\t${props =>\n\t\t!props.theme.small &&\n\t\tcss`\n\t\t\tflex: 3 0 55%;\n\t\t`}\n`;\n\nexport const Size = styled.span`\n\tcolor: ${color(\"greenBright\", 1)};\n\tflex: 1 0 40%;\n\tfont-feature-settings: \"tnum\" on, \"lnum\" on;\n\tfont-size: 20px;\n\tfont-weight: 500;\n\tdisplay: inline-flex;\n\tjustify-content: flex-end;\n\ttext-align: right;\n\n\t${props =>\n\t\t!props.theme.small &&\n\t\tcss`\n\t\t\tflex: 1 0 45%;\n\t\t`}\n`;\n\nexport const RoomTypes = styled.span`\n\tcolor: ${color(\"grey\", 1)};\n\tdisplay: inline-flex;\n\tflex: 3 0 60%;\n\tfont-size: 15px;\n\tfont-weight: 300;\n\tmax-width: 60%;\n\toverflow: hidden;\n\tpadding-right: 15px;\n\tposition: relative;\n\ttext-align: left;\n\twhite-space: nowrap;\n\n\t${props =>\n\t\t!props.theme.small &&\n\t\tcss`\n\t\t\tflex: 3 0 55%;\n\t\t`}\n\n\t&::after {\n\t\tbackground: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 60%);\n\t\tbottom: 0;\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 100%;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\twidth: 20px;\n\t}\n`;\n\nexport const Price = styled.span`\n\talign-items: flex-end;\n\tcolor: ${color(\"grey\", 1)};\n\tdisplay: inline-flex;\n\tflex: 1 0 40%;\n\tfont-feature-settings: \"tnum\" on, \"lnum\" on;\n\tfont-size: 15px;\n\tfont-weight: 500;\n\tjustify-content: flex-end;\n\ttext-align: right;\n\n\t${props =>\n\t\t!props.theme.small &&\n\t\tcss`\n\t\t\tflex: 1 0 45%;\n\t\t`}\n`;\n","import styled, { keyframes } from \"styled-components\";\nimport { color, media, textStyles, fontFamily } from \"@utils/style-utils\";\nimport { Container } from \"@components/Grid\";\n\nexport const Carousel = styled(Container)`\n\tmargin-bottom: 60px;\n\tmargin-top: 60px;\n\n\t${media.md`\n\t\tmargin-bottom: 90px;\n\t`}\n\n\t${media.lg`\n\t\tmargin-bottom: 120px;\n\t`}\n\n\t.swiper-button-next,\n\t.swiper-button-prev {\n\t\tdisplay: none !important;\n\t}\n\n\t.swiper-slide {\n\t\theight: auto !important;\n\n\t\t> div {\n\t\t\theight: 100%;\n\t\t}\n\t}\n`;\n\nexport const CarouselHeader = styled.div`\n\tdisplay: flex;\n\tmargin-bottom: 40px;\n\n\t.spacer {\n\t\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\t\tflex-grow: 1;\n\t\tmargin-bottom: 5px;\n\n\t\t@media (max-width: 500px) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n`;\n\nexport const CarouselTitle = styled.h2`\n\t${textStyles.H3Condensed}\n\tfont-size: 24px;\n\tmargin: 0;\n\tmargin-bottom: 56px;\n\n\t${media.md`\n\t\t${textStyles.H2}\n\t\tfont-family: ${fontFamily.base};\n\t\tmargin-bottom: 0 !important;\n\t\tmargin-right: 20px;\n\t`}\n`;\n\nexport const CarouselButtons = styled.div`\n\tdisplay: flex;\n\n\t@media (max-width: 500px) {\n\t\tdisplay: none;\n\t}\n\n\tbutton {\n\t\talign-items: center;\n\t\tborder: 0;\n\t\tbackground: rgba(255, 255, 255, 0);\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t\tcursor: pointer;\n\t\tdisplay: inline-flex;\n\t\tfont-size: 20px;\n\t\theight: 30px;\n\t\tmargin: 0;\n\t\tmargin-left: 20px;\n\t\toutline: 0;\n\t\tpadding: 0;\n\t\twidth: 20px;\n\n\t\tsvg {\n\t\t\tmax-width: 20px;\n\t\t\ttransform: scale(1);\n\t\t\ttransition: transform 150ms;\n\t\t}\n\n\t\t+ button {\n\t\t\tmargin-left: 5px;\n\t\t}\n\n\t\t&.properties-next,\n\t\t&.properties-prev {\n\t\t\tjustify-content: flex-end;\n\t\t}\n\n\t\t&.swiper-button-disabled {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&:hover {\n\t\t\tsvg {\n\t\t\t\ttransform: scale(1.2);\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const PlaceholderSlides = styled.div`\n\theight: 175px;\n\tposition: relative;\n\twidth: 100%;\n`;\n\nconst pulse = keyframes`\n\t0%, 100% {\n\t\topacity: 1;\n\t}\n\n\t50% {\n\t\topacity: 0.5;\n\t}\n`;\n\nexport const PlaceholderSlide = styled.div`\n\tanimation: ${pulse} 1.5s linear infinite;\n\tbackground: ${color(\"grey\", 6)};\n\tborder-radius: 4px;\n\theight: 100%;\n\tposition: absolute;\n\twidth: calc(90% - 5px);\n\n\t&:nth-of-type(1) {\n\t\tleft: 0;\n\t}\n\t&:nth-of-type(2) {\n\t\tleft: calc(90% + 5px);\n\t}\n\t&:nth-of-type(3),\n\t&:nth-of-type(4) {\n\t\tdisplay: none;\n\t}\n\n\t@media (max-width: 580px) {\n\t\twidth: 70%;\n\n\t\t&:nth-of-type(2) {\n\t\t\tleft: calc(70% + 20px);\n\t\t}\n\t}\n\n\t@media (max-width: 860px) {\n\t\twidth: calc(50% - 10px);\n\n\t\t&:nth-of-type(2) {\n\t\t\tleft: calc(50% + 10px);\n\t\t}\n\t}\n\n\t@media (max-width: 1130px) {\n\t\twidth: calc((100% - 40px) / 3);\n\n\t\t&:nth-of-type(2) {\n\t\t\tleft: 50%;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t&:nth-of-type(3) {\n\t\t\tdisplay: block;\n\t\t\tleft: auto;\n\t\t\tright: 0;\n\t\t}\n\t}\n\n\t@media (min-width: 1131px) {\n\t\twidth: calc((100% - 60px) / 4);\n\n\t\t&:nth-of-type(2) {\n\t\t\tleft: calc((100% - 60px) / 4 + 20px);\n\t\t}\n\n\t\t&:nth-of-type(3) {\n\t\t\tdisplay: block;\n\t\t\tleft: calc(((100% - 60px) / 4 + 20px) * 2);\n\t\t}\n\n\t\t&:nth-of-type(4) {\n\t\t\tdisplay: block;\n\t\t\tleft: auto;\n\t\t\tright: 0;\n\t\t}\n\t}\n\n\t@media (min-width: 1301px) {\n\t\twidth: calc((100% - 120px) / 4);\n\n\t\t&:nth-of-type(2) {\n\t\t\tleft: calc((100% - 120px) / 4 + 40px);\n\t\t}\n\n\t\t&:nth-of-type(3) {\n\t\t\tdisplay: block;\n\t\t\tleft: calc(((100% - 120px) / 4 + 40px) * 2);\n\t\t}\n\n\t\t&:nth-of-type(4) {\n\t\t\tdisplay: block;\n\t\t\tleft: auto;\n\t\t\tright: 0;\n\t\t}\n\t}\n`;\n","import React, { useRef, useState, useEffect } from \"react\";\nimport useOnScreen from \"@hooks/use-on-screen\";\n\ninterface IProps {\n\talt?: string;\n\tfallbackSrc?: string;\n\tthumb?: string;\n\tsrc: string;\n\t[key: string]: any;\n}\n\nconst Image = (props: IProps) => {\n\tconst { src, fallbackSrc = \"\", alt, lazy = false, thumb = null, ...restProps } = props;\n\tconst [imageSrc, setSrc] = useState(lazy ? (thumb ? thumb : undefined) : src);\n\tconst ref = useRef(null);\n\n\tconst onLoad = event => {\n\t\tevent.target.classList.remove(\"load-start\");\n\t\tevent.target.classList.add(\"loaded\");\n\t};\n\n\tconst visible = useOnScreen(ref, \"60px\");\n\n\tconst onError = event => {\n\t\tevent.target.setAttribute(\"data-errored-src\", src);\n\t\tif (event.target.getAttribute(\"data-errored-src\") === fallbackSrc) {\n\t\t\tevent.target.onError = null;\n\t\t\tevent.target.onerror = null;\n\t\t\tevent.target.src = \"\";\n\t\t} else {\n\t\t\tevent.target.src = fallbackSrc;\n\t\t\tevent.target.onerror = null;\n\t\t}\n\t\tevent.target.classList.add(\"errored\");\n\t};\n\n\tuseEffect(() => {\n\t\tif (lazy && visible && (!imageSrc || imageSrc === \"\" || imageSrc === thumb)) {\n\t\t\tsetSrc(src);\n\t\t\tref.current.classList.remove(\"lazy-thumb\");\n\t\t} else if (src && imageSrc && imageSrc !== src) {\n\t\t\tsetSrc(src);\n\t\t\tref.current.classList.remove(\"lazy-thumb\");\n\t\t\tref.current.classList.remove(\"lazy-image\");\n\t\t}\n\t}, [lazy, visible, src]);\n\n\treturn (\n\t\t\n\t);\n};\n\nexport default Image;\n","import styled, { keyframes } from \"styled-components\";\nimport { color, fontFamily } from \"@utils/style-utils\";\n\nexport const FormError = styled.div`\n\tcolor: ${color(\"coral\", 1)};\n\tfont-size: 13px;\n\tmargin-bottom: 5px;\n\tmargin-top: 3px;\n\ttext-align: left;\n`;\n\nexport const InputGroup = styled.div`\n\tcolor: ${color(\"greenBright\", 3)};\n\tfont-size: 14px;\n\tmargin-bottom: 16px;\n\tposition: relative;\n\ttext-align: left;\n\n\t&:last-of-type {\n\t\tmargin-bottom: 0;\n\t}\n\n\tsvg {\n\t\tfont-size: 14px;\n\t\theight: 33px;\n\t\tleft: 16px;\n\t\tmax-width: 17px;\n\t\tposition: absolute;\n\t\ttop: 3px;\n\t\t/* width: 17px !important; */\n\t\tz-index: 2;\n\t}\n\n\tinput, input[type=\"text\"] {\n\t\t-webkit-appearance: none;\n\t\t-moz-appearance: none;\n\t\tbackground: ${color(\"grey\", 7)};\n\t\tborder: 1px solid ${color(\"grey\", 5)};\n\t\tborder-radius: 4px;\n\t\tbox-shadow: none;\n\t\tcolor: ${color(\"grey\", 1)};\n\t\tfont-family: ${fontFamily.condensed};\n\t\tfont-size: 16px;\n\t\theight: 40px;\n\t\tline-height: 40px;\n\t\tpadding-left: 45px;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tz-index: 1;\n\n\t\t::placeholder {\n\t\t\tcolor: ${color(\"grey\", 2)};\n\t\t}\n\n\t\t&:focus {\n\t\t\toutline-color: ${color(\"greenBasic\", 3)};\n\t\t}\n\n\t\t&[data-white] {\n\t\t\tbackground: ${color(\"white\")};\n\t\t}\n\n\t\t&[disabled] {\n\t\t\topacity: 0.5;\n\t\t}\n\t}\n`;\n\nexport const GdprLink = styled.p.attrs(() => ({\n\tclassName: \"gdpr-link\",\n}))`\n\tfont-size: 14px;\n\tmargin: 24px auto;\n\ttext-align: center;\n\n\ta {\n\t\tcolor: ${color(\"greenDark\", 1)};\n\t\ttext-decoration: none;\n\n\t\t&:hover {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t}\n`;\n\nexport const Textarea = styled.textarea`\n\tbackground: ${color(\"grey\", 7)};\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-radius: 4px;\n\tcolor: ${color(\"grey\", 1)};\n\tfont-family: ${fontFamily.condensed};\n\tfont-size: 16px;\n\tresize: none;\n\tposition: relative;\n\twidth: 100%;\n\tz-index: 1;\n\n\t::placeholder {\n\t\tcolor: ${color(\"grey\", 3)};\n\t}\n\n\t&[disabled] {\n\t\topacity: 0.5;\n\t}\n\n\t&[data-white] {\n\t\tbackground: ${color(\"white\")};\n\t}\n`;\n\nexport const ThankYouMessage = styled.p`\n\tcolor: ${color(\"grey\", 1)};\n\tfont-family: ${fontFamily.condensed};\n\tfont-size: 18px;\n\tmargin-top: 40px;\n\ttext-align: center;\n\n\tspan {\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t\tdisplay: inline-block;\n\t\tfont-size: 20px;\n\t\tmargin-right: 20px;\n\n\t\tsvg {\n\t\t\tmax-width: 20px;\n\t\t}\n\t}\n`;\n\nconst pulse = keyframes`\n\t0%, 100% {\n\t\topacity: 1;\n\t}\n\t50% {\n\t\topacity: 0.6;\n\t}\n`;\n\nexport const Placeholder = styled.div`\n\tanimation: ${pulse} 1s linear infinite;\n`;\n\nexport const PlaceholderInput = styled.div.attrs(props => ({\n\tclassName: \"placeholder-input\",\n}))`\n\tbackground: ${color(\"grey\", 6)};\n\tborder-radius: 4px;\n\theight: 40px;\n\tmargin-bottom: 16px;\n\twidth: 100%;\n\n\t&:last-of-type {\n\t\tmargin-bottom: 0;\n\t}\n`;\n\nexport const PlaceholderTextarea = styled.div.attrs(props => ({\n\tclassName: \"placeholder-textarea\",\n}))`\n\tbackground: ${color(\"grey\", 6)};\n\tborder-radius: 4px;\n\theight: 80px;\n\tmargin-top: 16px;\n\twidth: 100%;\n`;\n\nexport const PlaceholderGdpr = styled.div.attrs(() => ({\n\tclassName: \"placeholder-gdpr\",\n}))`\n\tbackground: ${color(\"greenDark\", 4)};\n\theight: 18px;\n\tmargin: 24px auto;\n\twidth: 120px;\n`;\n\nexport const PlaceholderButton = styled.div.attrs(props => ({\n\tclassName: \"placeholder-button\",\n}))`\n\tbackground: ${color(\"greenBright\", 1)};\n\tborder-radius: 4px;\n\theight: 48px;\n\tmargin: 0 auto;\n\twidth: ${props => (props.width ? props.width : \"195px\")};\n`;\n\nexport const PlaceholderSelectable = styled.div.attrs(props => ({\n\tclassName: \"placeholder-selectable\",\n}))`\n\theight: 16px;\n\tmargin-bottom: 16px;\n\tposition: relative;\n\twidth: 100%;\n\n\t&::before {\n\t\tbackground: ${props => (props.isActive ? color(\"greenBright\", 4) : color(\"grey\", 6))};\n\t\tborder-radius: 50%;\n\t\tcontent: \"\";\n\t\theight: 16px;\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\twidth: 16px;\n\t}\n\n\t&::after {\n\t\tbackground: ${color(\"grey\", 6)};\n\t\tcontent: \"\";\n\t\theight: 16px;\n\t\tleft: 28px;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\twidth: calc(100% - 28px);\n\t}\n`;\n\nexport const PlaceholderText = styled.div.attrs(() => ({\n\tclassName: \"placeholder-text\",\n}))`\n\tbackground-color: ${color(\"grey\", 6)};\n\theight: 18px;\n\tmargin-bottom: 16px;\n\twidth: 80%;\n`;\n"],"sourceRoot":""}