{"version":3,"sources":["core/theme/colors/color-variables.ts","core/theme/colors/colors.ts","core/theme/mui-theme/overrides/mui-button.ts","core/theme/mui-theme/overrides/mui-popover.ts","core/theme/ui-variables/ui-variables.ts","core/theme/mui-theme/overrides/mui-drawer.ts","core/theme/mui-theme/overrides/mui-accordion.ts","core/theme/mui-theme/overrides/mui-switch.ts","core/theme/mui-theme/mui-theme.ts","core/theme/mui-theme/overrides/mui-form-control.ts","core/shared/appRoutes.ts","core/shared/components/language-switcher/language.data.ts","core/language-context.ts","environment.ts","analytics/matomo.ts","core/services/local-storage/local-store-namespace.ts","core/shared/hooks/useDataTrackingEnabled.ts","analytics/useAppAnalytics.ts","core/pages/home/applications/HomeApplications.styles.ts","assets/images/home/home-mobile-splash.png","assets/images/home/home-mobile-app.png","assets/images/home/home-web-planner.png","assets/images/home/home-application-external.svg","core/shared/appLinks.ts","core/shared/checkSafari.ts","core/pages/home/applications/home-applications.animations.ts","core/shared/hooks/useResize.ts","core/pages/home/applications/HomeApplications.tsx","core/pages/home/landing/HomeLanding.styles.ts","assets/images/home/home-landing-hero.jpg","assets/images/home/home-landing-scroll.svg","core/pages/home/landing/HomeLanding.tsx","core/pages/home/operators/HomeOperators.styles.ts","assets/images/logos/full-logo-api-white.svg","assets/images/logos/full-logo-challenge-white.svg","assets/images/home/home-laptop-challenge.png","assets/images/home/api-icons/api-charge-planner.svg","assets/images/home/api-icons/api-directions.svg","assets/images/home/api-icons/api-distance.svg","assets/images/home/api-icons/api-charging-station.svg","assets/images/home/api-icons/api-elevation.svg","assets/images/home/api-icons/api-geo-coding.svg","assets/images/home/api-icons/api-tile-service.svg","core/pages/home/operators/api-list-item/api-list-items.ts","core/pages/home/operators/api-list-item/ApiListItem.styles.ts","core/pages/home/operators/api-list-item/ApiListItem.tsx","core/services/contact-form-topic.service.ts","core/shared/components/GetCustomTranslation.tsx","core/pages/home/operators/home-operators.animations.ts","core/pages/home/operators/HomeOperators.tsx","core/pages/home/Home.tsx","core/pages/apps/store-buttons/StoreButtons.styles.ts","assets/images/apple-store.svg","core/pages/apps/store-buttons/buttons/AppleButton.tsx","assets/images/android-store.svg","core/pages/apps/store-buttons/buttons/GoogleButton.tsx","core/pages/apps/store-buttons/StoreButtons.tsx","core/pages/apps/landing/AppsLanding.styles.ts","assets/images/apps/apps-landing.png","core/pages/apps/landing/AppsLanding.tsx","core/pages/apps/route-details/AppsRouteDetails.styles.ts","assets/images/apps/apps-1.png","core/pages/apps/route-details/AppsRouteDetails.tsx","core/pages/apps/navigation/AppsNavigation.styles.ts","assets/images/apps/apps-2.png","core/pages/apps/navigation/AppsNavigation.tsx","core/pages/apps/charging/AppsCharging.styles.ts","assets/images/apps/apps-3.png","core/pages/apps/charging/AppsCharging.tsx","core/pages/apps/in-car/AppsInCar.styles.ts","assets/images/apps/apps-5.png","core/pages/apps/store-buttons/AppleStoreButtonSection.tsx","core/pages/apps/in-car/AppsInCar.tsx","core/pages/apps/web-planner/AppsWebPlanner.styles.ts","assets/images/apps/apps-6.png","core/pages/apps/web-planner/apps-web-planner.animations.ts","core/pages/apps/web-planner/AppsWebPlanner.tsx","core/pages/apps/AppsPage.tsx","core/pages/b2b/landing/B2BLanding.styles.ts","assets/images/b2b/b2b-landing-hero.png","core/pages/b2b/landing/B2BLanding.tsx","core/pages/b2b/apis/apis.data.ts","assets/images/b2b/api-icons/charge-planner-api.svg","assets/images/b2b/api-icons/directions-api.svg","assets/images/b2b/api-icons/elevation-api.svg","assets/images/b2b/api-icons/charging-station-api.svg","assets/images/b2b/api-icons/distance-matrix-api.svg","assets/images/b2b/api-icons/geo-coding-api.svg","assets/images/b2b/api-icons/tile-service-api.svg","core/pages/b2b/apis/B2BApis.styles.ts","core/pages/b2b/apis/B2BApis.tsx","assets/images/b2b/b2b-operator-hero.png","core/pages/b2b/operator/B2BOperator.styles.ts","assets/images/logos/full-logo-challenge-blue.svg","core/pages/b2b/operator/operator.data.ts","assets/images/b2b/operator-icons/operator-reward.svg","assets/images/b2b/operator-icons/operator-feedback.svg","assets/images/b2b/operator-icons/operator-question.svg","assets/images/b2b/operator-icons/operator-image.svg","core/pages/b2b/operator/B2BOperator.tsx","assets/images/b2b/slider-handle.svg","core/pages/b2b/white-label/B2BWhiteLabel.styles.ts","assets/images/logos/full-logo-whitelabel.svg","assets/images/b2b/whitelabel-0.png","assets/images/b2b/whitelabel-1.png","assets/images/b2b/whitelabel-2.png","assets/images/b2b/whitelabel-3.png","core/pages/b2b/white-label/B2BWhiteLabel.tsx","core/pages/b2b/B2BPage.tsx","core/pages/about/people/people.data.ts","assets/images/people/aleksandar-be.png","assets/images/people/dusan.png","assets/images/people/kristina.png","assets/images/people/miljan.png","assets/images/people/petar.png","assets/images/people/stefan.png","assets/images/people/jovana-fe.png","assets/images/people/joakim.png","assets/images/people/nenad.png","assets/images/people/milijan.png","assets/images/people/alexandru.png","assets/images/people/bogdan.png","assets/images/people/cristina.png","assets/images/people/norbert.png","assets/images/people/roxana.png","assets/images/people/vasile.png","assets/images/people/veronica.png","assets/images/people/gojko.png","assets/images/people/milos.png","assets/images/people/ivan-it.png","assets/images/people/jovan.png","assets/images/people/milan.png","assets/images/people/sofija.png","assets/images/people/aleksandar-qa.png","assets/images/people/jagoda.png","assets/images/people/nikola.png","assets/images/people/tijana-qa.png","assets/images/people/milena.png","assets/images/people/tijana-ux.png","assets/images/people/jovana-ux.png","assets/images/people/ivan-ux.png","assets/images/people/marina.png","assets/images/people/ivona.png","assets/images/people/elena.png","core/pages/about/landing/AboutLanding.styles.ts","core/pages/about/landing/AboutLanding.tsx","core/pages/about/people/AboutPeople.styles.ts","core/pages/about/people/person/Person.styles.ts","core/pages/about/people/person/Person.tsx","core/pages/about/people/AboutPeople.tsx","core/pages/about/AboutPage.tsx","core/shared/components/ScrollToTop.tsx","core/shared/components/footer/Footer.styles.ts","assets/images/logos/footer-logo-background.svg","core/shared/components/footer/contact-form/ContactForm.styles.ts","api/api.ts","core/services/http/contact-support.service.ts","api/axios-data.ts","core/services/error.service.ts","core/shared/components/footer/contact-form/ContactForm.tsx","core/shared/components/footer/footer-navigation/FooterNavigation.styles.ts","assets/images/logos/full-logo-blue.svg","core/shared/components/language-switcher/LanguageSwitcher.styles.ts","core/shared/components/language-switcher/LanguageSwitcher.tsx","core/shared/components/footer/footer-navigation/FooterNavigation.tsx","core/shared/components/footer/Footer.tsx","core/shared/components/error-snakcbar/ErrorSnackbar.styles.ts","core/shared/components/error-snakcbar/ErrorSnackbar.tsx","core/pages/legal/privacy-policy/DataTrackingPolicyRow.tsx","core/pages/legal/privacy-policy/PrivacyPolicy.styles.ts","core/pages/legal/privacy-policy/PrivacyPolicyEN.tsx","core/pages/legal/privacy-policy/PrivacyPolicyDE.tsx","core/pages/legal/imprint/Imprint.styles.ts","assets/images/legal/phone.svg","assets/images/legal/mail.svg","assets/images/legal/external-link.svg","core/pages/legal/imprint/ImprintEN.tsx","core/pages/legal/imprint/ImprintDE.tsx","core/pages/not-found/NotFound.styles.ts","assets/images/404-world.svg","core/pages/not-found/NotFoundPage.tsx","core/shared/hooks/useScroll.js","core/shared/components/header/header-links.data.ts","core/shared/components/header/desktop-header/DesktopHeader.styles.ts","core/shared/components/header/desktop-header/DesktopHeader.tsx","core/shared/components/header/mobile-header/MobileHeader.styles.ts","core/shared/components/header/mobile-header/MobileHeader.tsx","core/shared/components/header/Header.tsx","App.tsx","i18n.js","reportWebVitals.js","index.tsx"],"names":["lightTheme","primary","primaryContrast","primaryHover","primaryDisabled","accent","accentContrast","accentHover","accentDisabled","error","errorContrast","errorHover","errorDisabled","errorMessage","background","whiteContrast","blackContrast","text","textGrey","textApps","adminBlack","operatorGreen","apiOrange","darkTheme","colors","getColor","color","alpha","c","console","warn","getDarkerColor","howMuchDarker","getLighterColor","howMuchLighter","makeCSSVariables","colorName","hsl","hex","RGB","usedByHSL","r","g","b","length","red","green","blue","hexToRGB","Number","cmin","Math","min","cmax","max","delta","h","s","l","round","abs","toFixed","hue","saturation","luminosity","hexToHSL","root","document","documentElement","style","setProperty","CustomButton","fontSize","fontWeight","padding","height","borderRadius","width","marginRight","marginLeft","display","alignItems","opacity","pointerEvents","outlined","border","transition","textTransform","outlinedPrimary","contained","boxShadow","backgroundColor","marginBottom","containedPrimary","CustomPopover","getVar","v","uiVariables","headerHeight","headerLinkSpacing","maxWidth","mobileContentWidth","footerHeight","footerVerticalSpacing","contactFormWidth","b2bTileWidth","b2bTileHeight","CustomDrawer","flexDirection","justifyContent","CustomAccordion","rounded","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","CustomAccordionSummary","minHeight","content","fontStyle","CustomSwitch","margin","transitionDuration","transform","boxSizing","transitions","create","duration","muiTheme","createTheme","palette","createPalette","type","light","main","dark","contrastText","secondary","typography","fontFamily","join","htmlFontSize","spacing","props","MuiButton","size","MuiFilledInput","MuiFormControl","MuiFormHelperText","MuiIconButton","MuiInputBase","MuiInputLabel","MuiListItem","dense","MuiOutlinedInput","MuiFab","MuiTable","MuiTextField","MuiToolbar","variant","MuiTypography","MuiSelect","MuiMenuItem","MuiMenu","overrides","marginDense","marginTop","top","MuiPopover","MuiDrawer","MuiAccordion","MuiAccordionDetails","MuiAccordionSummary","MuiSwitch","APP_ROUTES","LANGUAGE_RESOURCES","en","translation","translationEN","de","translationDE","sr","translationSR","hu","translationHU","es","translationES","fr","translationFR","pl","translationPL","LANGUAGES","Object","keys","LanguageContext","createContext","languageContextValue","setLanguageContextValue","environment","services","applicationService","process","xApiKey","instrumentationKey","matomoSiteId","parseInt","matomoUrlBase","matomoInstance","createInstance","urlBase","siteId","disabled","configurations","disableCookies","erLocalStore","store","namespace","DATA_TRACKING_ENABLED","dataTrackingEnabledSubject","Subject","useDataTrackingEnabled","useState","has","get","set","enabled","setEnabled","useEffect","sub","subscribe","value","unsubscribe","next","useAppAnalytics","externalLibraryTrackEvent","useMatomo","trackEvent","trackingEnabled","useCallback","name","category","action","ApplicationsContainer","styled","div","MobileAppContainer","MobileAppImageWrapper","FrontPhoneImage","img","BackPhoneImage","MobileAppTextWrapper","ButtonsWrapper","WebAppContainer","WebAppTextContainer","LaptopRevealContainer","Reveal","WebAppLaptopImage","HomeApplicationsStyles","APP_LINKS","checkSafari","isSafari","navigator","userAgent","match","iOS","test","window","MSStream","slideInRight","keyframes","slideInRightTransY","slideInLeft","slideInLeftNoY","HomeApplicationsAnimations","useResize","innerWidth","innerHeight","windowSize","setWindowSize","handleResize","addEventListener","removeEventListener","HomeApplications","t","useTranslation","triggerOnce","fraction","src","backPhone","alt","className","frontPhone","direction","delay","Button","onClick","href","target","rel","to","externalLinkIcon","webImage","LandingContainer","TextContainer","Fade","HeroImageContainer","HeroImage","HomeLandingStyles","HomeLanding","scrollTo","mouseIcon","undefined","heroImage","OperatorsContainer","OperatorsHeading","h2","ApiContainer","ApiTextContainer","ButtonNoMargin","LogoImage","ApiListContainer","ApiListWrapper","ApiList","ListBlur","PortalContainer","PortalTextContainer","LaptopImageReveal","LaptopImage","HomeOperatorsStyles","API_LIST_ITEMS","icon","chargePlannerIcon","translationString","link","directionsIcon","distancePlannerIcon","chargingStationIcon","elevationIcon","geoCodingIcon","tilesIcon","ping","ItemContainer","a","Text","span","ApiIcon","ArrowIcon","ApiListItemStyles","ApiListItem","item","alert","contactFormTopicService","topic","asObservable","changeTopic","newTopicValue","GetCustomTranslation","translationKey","__html","DOMPurify","sanitize","slideInRightNoY","HomeOperatorsAnimations","HomeOperators","apiLogo","dangerouslySetInnerHTML","map","laptopImage","challengesLogo","HomePage","ButtonsContainer","StoreButtonsStyles","AppleButton","appleButtonIcon","GoogleButton","androidButtonIcon","StoreButtons","buttonClicked","delayAnimation","cascade","TextContainerFade","PhoneImage","AppsLandingStyles","AppsLanding","appsLandingImage","button","RouteDetailsContainer","RouteDetailsContent","TextWrapper","PhoneImageContainer","AppsRouteDetailsStyles","AppsRouteDetails","phoneImage","NavigationContainer","NavigationContent","AppsNavigationStyles","AppsNavigation","ChargingContainer","ChargingContent","AppsChargingStyles","AppsCharging","InCarContainer","Image","AppsInCarStyles","AppleStoreButtonSection","AppsInCar","carImage","WebPlannerContainer","TextWrapperFade","ImageReveal","AppsWebPlannerStyles","AppsWebPlannerAnimations","AppsWebPlanner","id","AppsPage","B2BLandingStyles","B2BLanding","B2B_APIS_DATA","title","B2BApisStyles","ApisContainer","ContentContainer","TilesContainer","Tile","B2BApis","isAllLoaded","setIsAllLoaded","Logo","index","body","scrollHeight","B2BOperatorStyles","OperatorContainer","operatorHeroImage","LandingTextContainer","ContentLogo","ContentTextContainer","B2B_OPERATOR_DATA","B2BOperator","logoBlue","B2BWhiteLabelStyles","WhiteLabelContainer","SliderContainer","Zoom","CustomSlider","SliderHandle","SliderSwitch","B2BWhiteLabel","sliderPosition","setSliderPosition","MockPink","sliderImage","setSliderImage","switchImage","image","left","Wireframe","right","slider","position","onChange","event","MockBlue","MockGreen","B2BPage","PEOPLE","management","engineers","job","creative","support","AboutLandingStyles","AboutLanding","numberOfPeople","AboutPeopleStyles","PeopleContainer","Content","PeopleGroupContainer","DescriptionText","p","PersonStyles","PersonContainer","PersonImageContainer","PersonImage","PersonName","PersonJob","Person","person","AboutPeople","AboutPage","ScrollToTop","useLocation","pathname","hash","setTimeout","querySelector","scrollIntoView","FooterStyles","FooterContainer","BackgroundLogoImage","Heading","FormContainer","LinksContainer","CustomInput","ContactFormStyles","CustomSelectInput","ErrorMessage","ButtonContainer","SendButton","SentMessage","baseURL","Axios","headers","contactSupport","axiosFetcher","post","pipe","response","data","toPromise","errorService","showError","errorTranslation","ContactForm","fullName","emailAddress","emailText","formState","setFormState","formErrors","setFormErrors","formFieldDirty","setFormFieldDirty","sent","loading","buttonState","setButtonState","nameFieldRef","useRef","location","resetForm","topicValue","current","focus","didGetNewDropdownValueBeforeReroute","checkForFullnameErrors","isBlur","fieldValue","trim","checkForEmailAddressErrors","emailRegex","checkForEmailTextErrors","getClasses","starterClasses","classes","push","getCustomInputClasses","fieldName","sendContactForm","TextField","inputRef","fullWidth","placeholder","label","onBlur","trimmedValue","handleEmailChange","FormControl","InputLabel","Select","labelId","MenuProps","anchorOrigin","vertical","horizontal","transformOrigin","getContentAnchorEl","MenuItem","multiline","object","property","anyTrue","anyFalse","CircularProgress","FooterNavigationStyles","MenuContainer","MenuHeading","StyledLink","MenuLink","NavLink","LanguageContainer","CopyrightContainer","CopyrightText","LanguageSwitcherStyles","SwitcherContainer","StyledButton","StyledMenuItem","LanguageSwitcher","i18n","useContext","lang","setLang","anchorEl","setAnchorEl","history","useHistory","switchLanguage","changeLanguage","languageString","path","indexOf","split","navigateToLegalPages","languageChanged","currentTarget","Menu","keepMounted","open","Boolean","onClose","sort","lng","FooterNavigation","language","JSON","stringify","blueLogo","Footer","footerColorClass","setFooterColorClass","backgroundLogo","StyledErrorSnackbar","ErrorSnackbar","Snackbar","StyledErrorSnackbarContent","StyledMessage","isOpen","setIsOpen","message","setMessage","handleClose","reason","errorCode","autoHideDuration","Container","RowContainer","DataTrackingPolicyRow","heading","dataTrackingEnabled","setDataTrackingEnabled","Switch","checked","_","e","stopPropagation","PrivacyPolicyStyles","Updated","PrivacyPolicyContainer","StyledDiv","PrivacyPolicyEN","Accordion","AccordionSummary","expandIcon","aria-controls","data-cy","AccordionDetails","paddingRight","PrivacyPolicyDE","ImprintStyles","ImprintContainer","SubtitleContainer","Divider","Row","StyledH4","h4","StyledH5","StyledText","StyledText2","StyledMiniRow","StyledIcon","ImprintEN","EmailIcon","PhoneIcon","ExternalLinkIcon","ImprintDE","NotFoundStyles","NotFoundContainer","NotFoundContent","NotFoundPage","world","useScroll","lastScrollTop","setLastScrollTop","getBoundingClientRect","bodyOffset","setBodyOffset","scrollY","setScrollY","scrollX","setScrollX","scrollDirection","setScrollDirection","listener","HeaderLinksData","route","exact","DesktopHeaderStyles","LanguageAbsoluteContainer","HeaderContainer","HeaderContent","LinkContainer","HeaderLink","HeaderLinkButton","HeaderLinkText","DesktopHeader","contactUsClicked","linkClicked","scrollActive","setScrollActive","scroll","getHeaderClasses","activeClassName","MobileHeaderStyles","MobileHeaderContainer","MobileHeaderContent","MobileHeaderLink","MobileHeaderLinkButton","MobileHeaderLinkText","StyledToggleButton","IconButton","MobileHeader","Drawer","anchor","Header","handleContactUsClick","handleLinkClick","linkText","App","languageProviderValue","log","variation","entries","key","hasOwnProperty","setThemeColor","currentLang","computedLanguage","MatomoProvider","ThemeProvider","theme","Provider","use","initReactI18next","init","resources","fallbackLng","keySeparator","interpolation","escapeValue","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.1ee98e63.chunk.js","sourcesContent":["export const lightTheme = {\n primary: '#0040FF',\n primaryContrast: '#FFFFFF',\n primaryHover: '#002699',\n primaryDisabled: '#CCE6FF',\n\n accent: '#33CCFF',\n accentContrast: '#FFFFFF',\n accentHover: '#0BA6DA',\n accentDisabled: '#E5F9FF',\n\n error: '#FF6A4C',\n errorContrast: '#FFFFFF',\n errorHover: '#992500',\n errorDisabled: '#FFB199',\n errorMessage: '#F2330D',\n\n // --------------------- Non MaterialUI colors --------------------- //\n background: '#F5F5F5',\n whiteContrast: '#F6F7F9',\n blackContrast: '#2B2F35',\n\n text: '#333D4D',\n textGrey: '#B3BDCC',\n textApps: '#52464B',\n\n adminBlack: '#14181F',\n operatorGreen: '#1DC969',\n apiOrange: '#FF7008',\n};\n\nexport const darkTheme = {\n primary: '#0040FF',\n primaryContrast: '#FFFFFF',\n primaryHover: '#002699',\n primaryDisabled: '#CCE6FF',\n\n accent: '#33CCFF',\n accentContrast: '#FFFFFF',\n accentHover: '#0BA6DA',\n accentDisabled: '#E5F9FF',\n\n error: '#FF6A4C',\n errorContrast: '#FFFFFF',\n errorHover: '#992500',\n errorDisabled: '#FFB199',\n errorMessage: '#F2330D',\n\n // --------------------- Non MaterialUI colors --------------------- //\n background: '#F5F5F5',\n whiteContrast: '#F6F7F9',\n blackContrast: '#2B2F35',\n\n text: '#333D4D',\n textGrey: '#B3BDCC',\n textApps: '#52464B',\n\n adminBlack: '#14181F',\n operatorGreen: '#1DC969',\n apiOrange: '#FF7008',\n};\n","// ****************************************************** TYPE ****************************************************** //\nimport { darkTheme, lightTheme } from './color-variables';\n\n// This helps with autocomplete and typechecking in components\nexport type Color = keyof typeof colors;\n\n// Set 'colors' to default theme -- in this case 'lightTheme'\nvar colors = lightTheme;\n\n// ****************************************************** COLOR FUNCTIONS ****************************************************** //\n// Returns 'color' with or without opacity , 'transparent' or 'inherit'\nexport function getColor(color: Color, alpha: number = 1) {\n // Get value from 'colors'\n const c = colors[color];\n\n // If color is 'transparent' or 'inherit' return 'transparent'\n if (c === 'transparent' || c === 'inherit') {\n return c;\n }\n\n // If 'c' is a real color\n // If 'alpha' is not in range [0-1] set it to '1'\n if (alpha > 1 || alpha < 0) {\n console.warn(\n `Alpha value '${alpha}' is not in range [0-1]. Falling back to 1. Please fix this in the code.`\n );\n alpha = 1;\n }\n\n return `hsla(var(--${color}-hue), calc(var(--${color}-saturation) * 1%), calc(var(--${color}-luminosity) * 1%), ${alpha})`;\n}\n\n// Returns darker shade of 'color' with or without opacity , 'transparent' or 'inherit'\nexport function getDarkerColor(\n color: Color,\n howMuchDarker: number,\n alpha: number = 1\n) {\n // Get value from 'colors'\n const c = colors[color];\n\n // If color is 'transparent' or 'inherit' return 'transparent'\n if (c === 'transparent' || c === 'inherit') {\n return c;\n }\n\n // If 'c' is a real color\n // If 'alpha' is not in range [0-1] set it to '1'\n if (alpha > 1 || alpha < 0) {\n console.warn(\n `Alpha value '${alpha}' is not in range [0-1]. Falling back to 1. Please fix this in the code.`\n );\n alpha = 1;\n }\n\n // If 'howMuchDarker' is not in range [0-100] set it to '0'\n if (howMuchDarker > 100 || howMuchDarker < 0) {\n console.warn(\n `Alpha value '${howMuchDarker}' is not in range [0-100]. Falling back to 0. Please fix this in the code.`\n );\n howMuchDarker = 0;\n }\n\n return `hsla(var(--${color}-hue), calc(var(--${color}-saturation) * 1%), calc((var(--${color}-luminosity) - ${howMuchDarker}) * 1%), ${alpha})`;\n}\n\n// Returns lighter shade of 'color' with or without opacity , 'transparent' or 'inherit'\nexport function getLighterColor(\n color: Color,\n howMuchLighter: number,\n alpha: number = 1\n) {\n // Get value from 'colors'\n const c = colors[color];\n\n // If color is 'transparent' or 'inherit' return 'transparent'\n if (c === 'transparent' || c === 'inherit') {\n return c;\n }\n\n // If 'c' is a real color\n // If 'alpha' is not in range [0-1] set it to '1'\n if (alpha > 1 || alpha < 0) {\n console.warn(\n `Alpha value '${alpha}' is not in range [0-1]. Falling back to 1. Please fix this in the code.`\n );\n alpha = 1;\n }\n\n // If 'howMuchLighter' is not in range [0-100] set it to '0'\n if (howMuchLighter > 100 || howMuchLighter < 0) {\n console.warn(\n `Alpha value '${howMuchLighter}' is not in range [0-100]. Falling back to 0. Please fix this in the code.`\n );\n howMuchLighter = 0;\n }\n\n return `hsla(var(--${color}-hue), calc(var(--${color}-saturation) * 1%), calc((var(--${color}-luminosity) + ${howMuchLighter}) * 1%), ${alpha})`;\n}\n\n// ****************************************************** GENERATE THEME FUNCTIONS ****************************************************** //\n// Setting application theme based on tenant\nexport function setThemeColor(variation: 'light' | 'dark') {\n if (variation === 'light') {\n colors = lightTheme;\n } else {\n colors = darkTheme;\n }\n\n for (const [key, value] of Object.entries(colors)) {\n if (!colors.hasOwnProperty(key)) continue;\n\n makeCSSVariables(value, key);\n }\n}\n\n// Setting color variables for material theme\nfunction makeCSSVariables(color: string, colorName: string) {\n const hsl = hexToHSL(color);\n\n const root = document.documentElement;\n\n // Not necessary for theming to work\n // Uncomment only if it helps testers know which colors we are using in the app\n root.style.setProperty(`--${colorName}`, `${color}`);\n\n root.style.setProperty(`--${colorName}-hue`, `${hsl.hue}`);\n root.style.setProperty(`--${colorName}-saturation`, `${hsl.saturation}`);\n root.style.setProperty(`--${colorName}-luminosity`, `${hsl.luminosity}`);\n}\n\n// Converts HEX value to HSL value\nfunction hexToHSL(hex: string) {\n // Convert hex to RGB first\n const RGB: {\n red: string | number;\n green: string | number;\n blue: string | number;\n } = hexToRGB(hex, true);\n\n // Then to HSL\n const red = Number(RGB.red) / 255;\n const green = Number(RGB.green) / 255;\n const blue = Number(RGB.blue) / 255;\n\n const cmin = Math.min(red, green, blue);\n\n const cmax = Math.max(red, green, blue);\n\n const delta = cmax - cmin;\n let h = 0;\n let s = 0;\n let l = 0;\n\n if (delta === 0) {\n h = 0;\n } else if (cmax === red) {\n h = ((green - blue) / delta) % 6;\n } else if (cmax === green) {\n h = (blue - red) / delta + 2;\n } else {\n h = (red - green) / delta + 4;\n }\n\n h = Math.round(h * 60);\n\n if (h < 0) {\n h += 360;\n }\n\n l = (cmax + cmin) / 2;\n s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));\n s = +(s * 100).toFixed(1);\n l = +(l * 100).toFixed(1);\n\n return { hue: h, saturation: s, luminosity: l };\n}\n\n// Converts HEX value to RGB value\nfunction hexToRGB(hex: string, usedByHSL?: boolean) {\n let r;\n let g;\n let b;\n\n // 3 digits -- (#f00 = red)\n if (hex.length === 4) {\n r = '0x' + hex[1] + hex[1];\n g = '0x' + hex[2] + hex[2];\n b = '0x' + hex[3] + hex[3];\n\n // 6 digits -- (#ff0000 = red)\n } else {\n r = '0x' + hex[1] + hex[2];\n g = '0x' + hex[3] + hex[4];\n b = '0x' + hex[5] + hex[6];\n }\n\n return {\n red: usedByHSL ? r : +r,\n green: usedByHSL ? g : +g,\n blue: usedByHSL ? b : +b,\n };\n}\n","/* ****************************************************** Imports ****************************************************** */\nimport { ButtonClassKey } from '@material-ui/core';\nimport { StyleRules } from '@material-ui/core';\nimport { getColor } from '../../colors/colors';\n\n/* ****************************************************** Override ****************************************************** */\nexport const CustomButton: Partial> | undefined =\n {\n /* ****************************************************** root ****************************************************** */\n root: {\n '&.erButton': {\n fontSize: '1.6rem',\n fontWeight: 700,\n padding: 0,\n height: 'unset',\n borderRadius: '2.8rem',\n // eslint-disable-next-line no-useless-computed-key\n ['@media (max-width: 499px)']: {\n width: '100% !important',\n marginRight: '0 !important',\n marginLeft: '0 !important',\n },\n\n '& a': {\n display: 'flex',\n alignItems: 'center',\n height: '6.5rem',\n padding: '0 3.5rem',\n color: 'inherit !important',\n },\n\n '& img': {\n marginLeft: '1rem',\n },\n\n '&.noLink': {\n display: 'flex',\n alignItems: 'center',\n height: '6.5rem',\n padding: '0 3.5rem',\n },\n\n '&:disabled.Mui-disabled': {\n opacity: '0.1',\n pointerEvents: 'none',\n },\n },\n },\n\n /* ****************************************************** outlined ****************************************************** */\n outlined: {\n color: `${getColor('primaryContrast')}`,\n border: `0.1rem solid ${getColor('primaryContrast', 0.1)}`,\n transition: '0.5s',\n textTransform: 'none',\n\n '&:disabled.Mui-disabled': {\n color: `${getColor('primaryContrast')}`,\n },\n\n '&:hover': {\n border: `0.1rem solid ${getColor('primaryContrast', 1)}`,\n },\n },\n\n /* ****************************************************** outlinedPrimary ****************************************************** */\n outlinedPrimary: {\n border: `0.1rem solid ${getColor('primary', 0.1)}`,\n\n '&:hover': {\n border: `0.1rem solid ${getColor('primary', 1)}`,\n },\n },\n\n /* ****************************************************** contained ****************************************************** */\n contained: {\n textTransform: 'uppercase',\n boxShadow: `0 1.8rem 4rem -1.2rem ${getColor(\n 'primaryContrast',\n 0.42\n )} !important`,\n color: `${getColor('primary')}`,\n backgroundColor: `${getColor('primaryContrast')}`,\n marginRight: '1.5rem',\n marginBottom: '2rem',\n\n '&:disabled.Mui-disabled': {\n color: `${getColor('primary')}`,\n backgroundColor: `${getColor('primaryContrast')}`,\n },\n\n '&.orange': {\n color: `${getColor('primaryContrast')}`,\n backgroundColor: `${getColor('apiOrange')}`,\n boxShadow: `0 1.8rem 4rem -1.2rem ${getColor(\n 'apiOrange',\n 0.42\n )} !important`,\n },\n\n '&.green': {\n color: `${getColor('primaryContrast')}`,\n backgroundColor: `${getColor('operatorGreen')}`,\n boxShadow: `0 1.8rem 4rem -1.2rem ${getColor(\n 'operatorGreen',\n 0.42\n )} !important`,\n },\n\n '&.white': {\n color: `${getColor('adminBlack')}`,\n backgroundColor: `${getColor('primaryContrast')}`,\n boxShadow: `0 1.8rem 4rem -1.2rem ${getColor(\n 'primaryContrast',\n 0.42\n )} !important`,\n\n '&:disabled.Mui-disabled': {\n color: `${getColor('adminBlack')}`,\n backgroundColor: `${getColor('primaryContrast')}`,\n },\n },\n\n '&.black': {\n color: `${getColor('primaryContrast')}`,\n backgroundColor: `${getColor('adminBlack')}`,\n boxShadow: `0 1.8rem 4rem -1.2rem ${getColor(\n 'adminBlack',\n 0.42\n )} !important`,\n\n '&:disabled.Mui-disabled': {\n color: `${getColor('primaryContrast')}`,\n backgroundColor: `${getColor('adminBlack')}`,\n },\n },\n },\n\n /* ****************************************************** containedPrimary ****************************************************** */\n containedPrimary: {\n boxShadow: `0 1.8rem 4rem -1.2rem ${getColor(\n 'primary',\n 0.42\n )} !important`,\n },\n };\n","/* ****************************************************** Imports ****************************************************** */\nimport { PopoverClassKey, StyleRules } from '@material-ui/core';\nimport { getColor } from '../../colors/colors';\n\n/* ****************************************************** Override ****************************************************** */\nexport const CustomPopover:\n | Partial>\n | undefined = {\n root: {\n '&.customSelectMenu': {\n '& .MuiPaper-root': {\n padding: '1.7rem 0',\n backgroundColor: getColor('primary'),\n color: getColor('primaryContrast'),\n borderRadius: '1.8rem',\n\n '& .MuiMenu-list': {\n padding: 0,\n\n '& .MuiMenuItem-dense': {\n padding: '1.5rem 2.4rem',\n fontSize: '1.8rem',\n },\n },\n },\n\n '&.black': {\n '& .MuiPaper-root': {\n backgroundColor: getColor('primaryContrast'),\n color: getColor('adminBlack'),\n },\n },\n\n '&.white': {\n '& .MuiPaper-root': {\n backgroundColor: getColor('adminBlack'),\n color: getColor('primaryContrast'),\n },\n },\n },\n },\n};\n","// ****************************************************** TYPE ****************************************************** //\nexport type UIVar = keyof typeof uiVariables;\n\n// ****************************************************** FUNCTIONS ****************************************************** //\nexport function getVar(v: UIVar) {\n return `var(${uiVariables[v]})`;\n}\n\n// ****************************************************** VARIABLES ****************************************************** //\nconst uiVariables = {\n headerHeight: '--headerHeight',\n headerLinkSpacing: '--headerLinkSpacing',\n maxWidth: '--maxWidth',\n mobileContentWidth: '--mobileContentWidth',\n footerHeight: '--footerHeight',\n footerVerticalSpacing: '--footerVerticalSpacing',\n contactFormWidth: '--contactFormWidth',\n b2bTileWidth: '--b2bTileWidth',\n b2bTileHeight: '--b2bTileHeight',\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { DrawerClassKey, StyleRules } from '@material-ui/core';\nimport { getColor } from '../../colors/colors';\nimport { getVar } from '../../ui-variables/ui-variables';\n\n/* ****************************************************** Override ****************************************************** */\nexport const CustomDrawer: Partial> | undefined =\n {\n root: {\n '&.headerDrawer': {\n '& .MuiDrawer-paper': {\n backgroundColor: getColor('primary'),\n padding: `${getVar('headerHeight')} 0 5rem 0`,\n // height: '100%',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n },\n\n '&.scrolled .MuiDrawer-paper': {\n padding: `10rem 0 5rem 0`,\n },\n\n '&.white .MuiDrawer-paper': {\n backgroundColor: getColor('background'),\n },\n\n '&.black .MuiDrawer-paper': {\n backgroundColor: getColor('adminBlack'),\n },\n },\n },\n };\n","import {\n AccordionClassKey,\n AccordionDetailsClassKey,\n AccordionSummaryClassKey,\n StyleRules,\n} from '@material-ui/core';\nimport { getColor } from '../../colors/colors';\n\nexport const CustomAccordion:\n | Partial>\n | undefined = {\n root: {\n '&.MuiPaper-elevation1': {\n boxShadow: 'none',\n background: 'none',\n },\n '&:before': {\n backgroundColor: getColor('text', 0.1),\n },\n },\n rounded: {\n '&:first-child': {\n borderTopLeftRadius: 0,\n borderTopRightRadius: 0,\n },\n '&:last-child': {\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n },\n },\n};\n\nexport const CustomAccordionDetails:\n | Partial>\n | undefined = {\n root: {\n display: 'block',\n },\n};\n\nexport const CustomAccordionSummary:\n | Partial>\n | undefined = {\n root: {\n minHeight: '5.8rem',\n '& .MuiIconButton-label': {\n color: getColor('text'),\n },\n },\n content: {\n color: getColor('text'),\n fontStyle: 'normal',\n fontWeight: 800,\n fontSize: '1.6rem',\n },\n};\n","import { StyleRules, SwitchClassKey } from '@material-ui/core';\nimport transitions from '@material-ui/core/styles/transitions';\nimport { getColor } from 'core/theme/colors/colors';\n\n// Configure switch/thumb size\nconst width = 52;\nconst height = 32;\nconst borderWidth = 2;\nconst thumbSize = height - 2 * borderWidth;\n\nexport const CustomSwitch: Partial> | undefined = {\n root: {\n width,\n height,\n padding: 0,\n '& .MuiSwitch-switchBase': {\n padding: 0,\n margin: borderWidth,\n transitionDuration: '300ms',\n '&.Mui-checked': {\n transform: `translateX(${width - height}px)`,\n color: '#fff',\n '& + .MuiSwitch-track': {\n backgroundColor: getColor('primary'),\n opacity: 1,\n border: 0,\n },\n '&.Mui-disabled + .MuiSwitch-track': {\n opacity: 0.5,\n },\n },\n '&.Mui-focusVisible .MuiSwitch-thumb': {\n color: getColor('primary'),\n border: '6px solid #fff',\n },\n '&.Mui-disabled .MuiSwitch-thumb': {},\n '&.Mui-disabled + .MuiSwitch-track': {\n opacity: 0.7,\n },\n },\n '& .MuiSwitch-thumb': {\n boxSizing: 'border-box',\n width: thumbSize,\n height: thumbSize,\n backgroundColor: '#fff',\n },\n '& .MuiSwitch-track': {\n borderRadius: height / 2,\n backgroundColor: getColor('textGrey'), // TODO: Add default grey variables to theme -> getColor('grey')\n opacity: 1,\n transition: transitions.create(['background-color'], {\n duration: 500,\n }),\n },\n },\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { createTheme } from '@material-ui/core/styles';\nimport createPalette from '@material-ui/core/styles/createPalette';\n\nimport { getColor, getDarkerColor, getLighterColor } from '../colors/colors';\nimport { CustomFormControl } from './overrides/mui-form-control';\nimport { CustomButton } from './overrides/mui-button';\nimport { CustomPopover } from './overrides/mui-popover';\nimport { CustomDrawer } from './overrides/mui-drawer';\nimport {\n CustomAccordion,\n CustomAccordionDetails,\n CustomAccordionSummary,\n} from './overrides/mui-accordion';\nimport { CustomSwitch } from './overrides/mui-switch';\n\n/* ****************************************************** Theme ****************************************************** */\nexport const muiTheme = createTheme({\n palette: createPalette({\n type: 'light',\n primary: {\n light: getLighterColor('primary', 20),\n main: getColor('primary'),\n dark: getDarkerColor('primary', 5),\n contrastText: getColor('primaryContrast'),\n },\n\n secondary: {\n light: getLighterColor('accent', 10),\n main: getColor('accent'),\n dark: getDarkerColor('accent', 5),\n contrastText: getColor('accentContrast'),\n },\n\n error: {\n light: getLighterColor('error', 20),\n main: getColor('error'),\n dark: getDarkerColor('error', 5),\n contrastText: getColor('errorContrast'),\n },\n }),\n typography: {\n fontFamily: ['OverPass', 'Roboto', 'sans-serif'].join(','),\n htmlFontSize: 10,\n },\n spacing: 5,\n props: {\n MuiButton: {\n size: 'small',\n },\n MuiFilledInput: {\n margin: 'dense',\n },\n MuiFormControl: {\n margin: 'dense',\n },\n MuiFormHelperText: {\n margin: 'dense',\n },\n MuiIconButton: {\n size: 'small',\n },\n MuiInputBase: {\n margin: 'dense',\n },\n MuiInputLabel: {\n margin: 'dense',\n },\n MuiListItem: {\n dense: true,\n },\n MuiOutlinedInput: {\n margin: 'dense',\n },\n MuiFab: {\n size: 'small',\n },\n MuiTable: {\n size: 'small',\n },\n MuiTextField: {\n margin: 'dense',\n },\n MuiToolbar: {\n variant: 'dense',\n },\n MuiTypography: {\n variant: 'body1',\n },\n MuiSelect: {\n variant: 'standard',\n },\n MuiMenuItem: {\n dense: true,\n },\n MuiMenu: {\n variant: 'menu',\n },\n },\n overrides: {\n MuiFormControl: CustomFormControl,\n MuiButton: CustomButton,\n MuiPopover: CustomPopover,\n MuiDrawer: CustomDrawer,\n MuiAccordion: CustomAccordion,\n MuiAccordionDetails: CustomAccordionDetails,\n MuiAccordionSummary: CustomAccordionSummary,\n MuiSwitch: CustomSwitch,\n },\n});\n","/* ****************************************************** Imports ****************************************************** */\nimport { FormControlClassKey, StyleRules } from '@material-ui/core';\n\n/* ****************************************************** Override ****************************************************** */\nexport const CustomFormControl:\n | Partial>\n | undefined = {\n marginDense: {\n '&.customInput': {\n marginTop: '0',\n marginBottom: '0',\n\n '& .MuiInput-formControl': {\n height: '2.5rem',\n marginTop: '1rem',\n },\n '& .MuiInput-underline': {\n '&:before': {\n border: 'none !important',\n },\n '&:after': {\n border: 'none !important',\n },\n },\n '& .MuiInputBase-inputMarginDense': {\n padding: '1rem 0 0 0',\n fontSize: '1.8rem',\n },\n '& .MuiInputLabel-marginDense': {\n transform: 'translate(0, 1.3rem) scale(1)',\n fontSize: '1.8rem',\n },\n '& .MuiInputLabel-shrink': {\n transform: 'translate(0, -0.35rem) scale(0.75)',\n },\n\n '&.customSelect': {\n '& .MuiInputLabel-shrink': {\n padding: '0 2.95rem',\n },\n '& .MuiInputBase-inputMarginDense': {\n padding: '1.5rem 2.5rem 0 2.5rem',\n },\n '& .MuiSelect-icon': {\n top: 'calc(50% - 1.6rem)',\n marginRight: '2.5rem',\n },\n '& .MuiSelect-select:focus': {\n backgroundColor: 'transparent',\n },\n },\n },\n },\n};\n","export const APP_ROUTES = {\n home: '/',\n apps: '/apps',\n b2b: '/b2b-offer',\n about: '/about-us',\n imprint: '/imprint',\n privacyPolicy: '/privacy',\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport translationEN from '../../../locales/en/translation.json';\nimport translationDE from '../../../locales/de/translation.json';\nimport translationSR from '../../../locales/sr/translation.json';\nimport translationHU from '../../../locales/hu/translation.json';\nimport translationES from '../../../locales/es/translation.json';\nimport translationFR from '../../../locales/fr/translation.json';\nimport translationPL from '../../../locales/pl/translation.json';\n\n/* ****************************************************** Resources ****************************************************** */\nexport const LANGUAGE_RESOURCES = {\n en: {\n translation: translationEN,\n },\n de: {\n translation: translationDE,\n },\n sr: {\n translation: translationSR,\n },\n hu: {\n translation: translationHU,\n },\n es: {\n translation: translationES,\n },\n fr: {\n translation: translationFR,\n },\n pl: {\n translation: translationPL,\n },\n};\n\n/* ****************************************************** Model ****************************************************** */\nexport type LanguageModel = keyof typeof LANGUAGE_RESOURCES;\n\n/* ****************************************************** Languages ****************************************************** */\nexport const LANGUAGES = Object.keys(LANGUAGE_RESOURCES) as LanguageModel[];\n","import { createContext, Dispatch, SetStateAction } from 'react';\nimport { LanguageModel } from './shared/components/language-switcher/language.data';\n\nexport interface LanguageContextModel {\n languageContextValue: LanguageModel;\n setLanguageContextValue: Dispatch> | any;\n}\n\nexport const LanguageContext = createContext({\n languageContextValue: 'en',\n setLanguageContextValue: null,\n});\n","export const environment = {\n services: {\n applicationService: process.env.REACT_APP_BASE_URL + '/application-api/v1',\n },\n xApiKey: process.env.REACT_APP_X_API_KEY,\n instrumentationKey: process.env.REACT_APP_APPINSIGHTS_KEY,\n matomoSiteId: parseInt(process.env.REACT_APP_MATOMO_SITE_ID as string, 10),\n matomoUrlBase: process.env.REACT_APP_MATOMO_URL_BASE,\n} as {\n services: {\n applicationService: string;\n };\n xApiKey: string;\n instrumentationKey: string;\n matomoSiteId: number;\n matomoUrlBase: string;\n};\n","import { createInstance } from '@datapunt/matomo-tracker-react';\nimport { environment } from '../environment';\n\n// Only track events when built/deployed, do not track for dev builds in localhost\nconst isProductionBuild = process.env.NODE_ENV === 'production';\n\nexport const matomoInstance = createInstance({\n urlBase: environment.matomoUrlBase,\n siteId: environment.matomoSiteId,\n disabled: !isProductionBuild,\n configurations: {\n disableCookies: true,\n },\n});\n","import store from 'store2';\n\nexport const erLocalStore = store.namespace('electricRoutes-web-marketing');\n","import { useEffect, useState } from 'react';\nimport { Subject } from 'rxjs';\nimport { erLocalStore } from '../../services/local-storage/local-store-namespace';\n\nconst DATA_TRACKING_ENABLED = 'data_tracking_enabled';\n\nconst dataTrackingEnabledSubject = new Subject();\n\n/**\n * This hook will expose the boolean value of the stored \"data tracking\"\n * flag for the toggle in Privacy Policy page.\n *\n * Additionally, it exposes a setter function to set the new value. By using\n * subjects/event-emitting, all hook instances will share the same value and\n * same boolean value and inform all other hook instances of changes to the\n * toggle.\n *\n * DISCUSS: Another implementation could be redux + redux-persist for more\n * \"react-looking\" code.\n */\nexport const useDataTrackingEnabled: () => [boolean, (val: boolean) => void] = () => {\n const [enabled, setEnabled] = useState(() => {\n // set initial value\n if (erLocalStore.has(DATA_TRACKING_ENABLED)) {\n // if user decision already exists in local storage, use that value\n return erLocalStore.get(DATA_TRACKING_ENABLED);\n } else {\n // otherwise, it's the initial usage of the app and the default\n // value should be set to true\n erLocalStore.set(DATA_TRACKING_ENABLED, true);\n return true;\n }\n });\n\n useEffect(() => {\n // we listen to toggle switch change from ANY component to keep them in sync\n const sub = dataTrackingEnabledSubject.subscribe((value) => {\n setEnabled(value);\n });\n\n return () => {\n sub.unsubscribe();\n };\n }, []);\n\n const setDataTrackingEnabled = (enabled: boolean) => {\n // when setting new toggle switch value, we both set the local state AND value in local storage\n erLocalStore.set(DATA_TRACKING_ENABLED, enabled);\n dataTrackingEnabledSubject.next(enabled);\n };\n\n return [enabled, setDataTrackingEnabled];\n};\n","import { useCallback } from 'react';\nimport { useMatomo } from '@datapunt/matomo-tracker-react';\nimport { useDataTrackingEnabled } from 'core/shared/hooks/useDataTrackingEnabled';\n\ntype AnalyticsEventCategory = 'Mobile & Web App' | 'B2B' | 'Home' | 'General';\n\ninterface AnalyticsEventParams {\n name?: string;\n category: AnalyticsEventCategory;\n action: string;\n}\n\nexport const useAppAnalytics = () => {\n const { trackEvent: externalLibraryTrackEvent } = useMatomo();\n const [trackingEnabled] = useDataTrackingEnabled();\n\n const trackEvent = useCallback(\n ({ name, category, action }: AnalyticsEventParams) => {\n if (!trackingEnabled) {\n return;\n }\n\n externalLibraryTrackEvent({\n name,\n category,\n action,\n });\n },\n [externalLibraryTrackEvent, trackingEnabled]\n );\n\n return {\n trackEvent,\n };\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { Reveal } from 'react-awesome-reveal';\n\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst ApplicationsContainer = styled.div`\n background-color: ${getColor('whiteContrast')};\n padding: 25rem 0 36rem 0;\n\n @media screen and (max-width: 1150px) {\n /* margin-top: -15rem; */\n padding: 15rem 0 24rem 0; // was 0 top\n }\n`;\n\nconst MobileAppContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n\n @media screen and (max-width: 1150px) {\n flex-direction: column;\n align-items: flex-start;\n }\n`;\n\nconst MobileAppImageWrapper = styled.div`\n position: relative;\n width: 51.5rem;\n\n & > div.frontPhone {\n animation-timing-function: cubic-bezier(0.455, 0.03, 0.515, 0.955);\n animation-fill-mode: both;\n position: absolute;\n top: calc(50% + 4.5rem);\n right: 0;\n transform: translateY(-50%);\n z-index: 2;\n\n //For responsive > FullHD\n height: 80.4rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n right: 7rem;\n height: 73.4rem;\n }\n @media screen and (max-width: 700px) {\n right: 12rem;\n height: 63.4rem;\n }\n @media screen and (max-width: 499px) {\n right: 0;\n height: 56.4rem;\n }\n @media screen and (max-width: 399px) {\n right: 5rem;\n height: 46.4rem;\n }\n\n & > img {\n transform: scale(1, 1) translateZ(0);\n }\n }\n\n @media screen and (max-width: 1150px) {\n margin: 0 auto 5rem auto;\n }\n\n @media screen and (max-width: 499px) {\n width: 272px; // 85vw of 320px screen (iPhone 5/SE)\n max-width: 272px;\n }\n`;\n\nconst FrontPhoneImage = styled.img`\n //For responsive > FullHD\n height: 80.4rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n height: 73.4rem;\n }\n @media screen and (max-width: 700px) {\n height: 63.4rem;\n }\n @media screen and (max-width: 499px) {\n height: 56.4rem;\n }\n @media screen and (max-width: 399px) {\n height: 46.4rem;\n }\n`;\n\nconst BackPhoneImage = styled.img`\n //For responsive > FullHD\n height: 97.6rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n height: 90.6rem;\n }\n @media screen and (max-width: 700px) {\n height: 80.6rem;\n }\n @media screen and (max-width: 499px) {\n height: 70.6rem;\n }\n @media screen and (max-width: 399px) {\n height: 60.6rem;\n }\n`;\n\nconst MobileAppTextWrapper = styled.div`\n width: 100%;\n max-width: 45rem;\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst ButtonsWrapper = styled.div`\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n\n img {\n margin-top: -0.5rem;\n //For responsive > FullHD\n height: 2.4rem;\n //For responsive > FullHD\n }\n`;\n\nconst WebAppContainer = styled.div`\n width: 100%;\n position: relative;\n margin-top: 32.5rem;\n\n & > div:first-of-type {\n width: 100%;\n max-width: 46rem;\n margin-left: calc((100% - ${getVar('maxWidth')}) / 2);\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n }\n\n @media screen and (max-width: 1150px) {\n display: flex;\n flex-direction: column-reverse;\n align-items: flex-start;\n margin-top: 5rem;\n }\n`;\n\nconst WebAppTextContainer = styled.div`\n width: 100%;\n max-width: 46rem;\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst LaptopRevealContainer = styled(Reveal)`\n position: absolute;\n right: 0;\n top: 50%;\n\n //For responsive > FullHD\n height: 70.8rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n position: relative;\n right: unset;\n top: unset;\n transform: unset;\n height: 63.8rem;\n margin-left: auto;\n margin-bottom: 5rem;\n }\n @media screen and (max-width: 700px) {\n height: unset;\n width: ${getVar('maxWidth')};\n }\n`;\n\nconst WebAppLaptopImage = styled.img`\n //For responsive > FullHD\n height: 70.8rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n height: 63.8rem;\n }\n @media screen and (max-width: 700px) {\n height: unset;\n width: ${getVar('maxWidth')};\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const HomeApplicationsStyles = {\n ApplicationsContainer,\n MobileAppContainer,\n MobileAppImageWrapper,\n FrontPhoneImage,\n BackPhoneImage,\n MobileAppTextWrapper,\n ButtonsWrapper,\n WebAppContainer,\n WebAppTextContainer,\n LaptopRevealContainer,\n WebAppLaptopImage,\n};\n","export default __webpack_public_path__ + \"static/media/home-mobile-splash.476ab3dc.png\";","export default __webpack_public_path__ + \"static/media/home-mobile-app.96cce55b.png\";","export default __webpack_public_path__ + \"static/media/home-web-planner.0fcb1023.png\";","export default __webpack_public_path__ + \"static/media/home-application-external.39a12fae.svg\";","export const APP_LINKS = {\n webPlanner: 'https://planner.electricroutes.com/',\n android:\n 'https://play.google.com/store/apps/details?id=com.electricroutes.planner',\n apple: 'https://apps.apple.com/app/id1575338568',\n};\n","export const checkSafari = () => {\n // Disabling eslint because of 'no-useless-escape' for regex\n //eslint-disable-next-line\n var isSafari = !!navigator.userAgent.match(/Version\\/[\\d\\.]+.*Safari/);\n var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\n\n return isSafari || iOS;\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { keyframes } from '@emotion/react';\n\n/* ****************************************************** Animations ****************************************************** */\nconst slideInRight = keyframes`\n 0% {\n opacity: 0;\n transform: translateX(-25rem) scale(0)\n }\n\n 100% {\n opacity: 1;\n transform: translateX(0) scale(1)\n }\n`;\n\nconst slideInRightTransY = keyframes`\n 0% {\n opacity: 0;\n transform: translateY(-50%) translateX(-25rem) scale(0)\n }\n\n 100% {\n opacity: 1;\n transform: translateY(-50%) translateX(0) scale(1)\n }\n`;\n\nconst slideInLeft = keyframes`\n 0% {\n opacity: 0;\n transform: translateY(-50%) translateX(25rem)\n }\n\n 100% {\n opacity: 1;\n transform: translateY(-50%) translateX(0)\n }\n`;\n\nconst slideInLeftNoY = keyframes`\n 0% {\n opacity: 0;\n transform: translateX(25rem)\n }\n\n 100% {\n opacity: 1;\n transform: translateX(0)\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const HomeApplicationsAnimations = {\n slideInRight,\n slideInRightTransY,\n slideInLeft,\n slideInLeftNoY,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useState, useEffect } from 'react';\n\n/* ****************************************************** Hook ****************************************************** */\nexport const useResize = () => {\n /* ****************************************************** State ****************************************************** */\n const [windowSize, setWindowSize] = useState({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n\n /* ****************************************************** Logic ****************************************************** */\n const handleResize = () => {\n setWindowSize({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n /* ****************************************************** useEffect ****************************************************** */\n useEffect(() => {\n window.addEventListener('resize', handleResize);\n\n handleResize();\n\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n /* ****************************************************** Return ****************************************************** */\n return windowSize;\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { Link, NavLink } from 'react-router-dom';\nimport { useAppAnalytics } from 'analytics';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@material-ui/core';\n\nimport { HomeApplicationsStyles } from './HomeApplications.styles';\n\nimport backPhone from '../../../../assets/images/home/home-mobile-splash.png';\nimport frontPhone from '../../../../assets/images/home/home-mobile-app.png';\nimport webImage from '../../../../assets/images/home/home-web-planner.png';\nimport externalLinkIcon from '../../../../assets/images/home/home-application-external.svg';\nimport { APP_LINKS } from '../../../shared/appLinks';\nimport { checkSafari } from '../../../shared/checkSafari';\nimport { APP_ROUTES } from '../../../shared/appRoutes';\nimport Reveal, { Fade } from 'react-awesome-reveal';\nimport { HomeApplicationsAnimations } from './home-applications.animations';\nimport { useResize } from '../../../shared/hooks/useResize';\n\n/* ****************************************************** Component ****************************************************** */\nexport const HomeApplications = () => {\n /* ****************************************************** State ****************************************************** */\n const { t } = useTranslation();\n\n const windowSize = useResize();\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n {/* --------------------- Mobile App --------------------- */}\n \n \n \n \n \n\n \n \n \n \n\n \n \n

{t('home.applications.mobile.top')}

\n

{t('home.applications.mobile.main')}

\n

{t('home.applications.mobile.sub')}

\n\n \n \n \n trackEvent({\n action: '[Home - Mobile App Section] Check Out In Stores Clicked',\n category: 'Home',\n })\n }\n >\n \n {t('home.applications.mobile.button.primary')}\n \n \n \n\n \n \n trackEvent({\n action: '[Home - Mobile App Section] View Features Clicked',\n category: 'Home',\n })\n }\n >\n \n {t('home.applications.mobile.button.secondary')}\n \n \n \n \n
\n
\n
\n\n {/* --------------------- Web App --------------------- */}\n \n \n \n

{t('home.applications.web.top')}

\n

{t('home.applications.web.main')}

\n

{t('home.applications.web.sub')}

\n\n \n \n \n trackEvent({\n action: '[Home - Web App Section] Open Web Planner Clicked',\n category: 'Home',\n })\n }\n >\n \n {t('home.applications.web.button.primary')}\n \"Open\n \n \n \n\n \n \n trackEvent({\n action: '[Home - Web App Section] Find Out More Clicked',\n category: 'Home',\n })\n }\n >\n \n {t('home.applications.web.button.secondary')}\n \n \n \n \n
\n
\n\n 1150\n ? HomeApplicationsAnimations.slideInLeft\n : HomeApplicationsAnimations.slideInLeftNoY\n }\n duration={1000}\n triggerOnce={true}\n >\n \n \n
\n
\n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { Fade } from 'react-awesome-reveal';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst LandingContainer = styled.div`\n position: relative;\n width: 100%;\n min-height: 100%;\n padding: calc(${getVar('headerHeight')} + 11rem) 0 13rem 0;\n background-color: ${getColor('primary')};\n color: ${getColor('primaryContrast')};\n\n @media screen and (max-width: 1200px) {\n padding: calc(${getVar('headerHeight')} + 8rem) 0 13rem 0;\n }\n\n @media screen and (max-height: 799px) {\n min-height: 930px;\n padding-top: calc(var(--headerHeight) + 3rem);\n }\n`;\n\nconst TextContainer = styled(Fade)`\n width: 100%;\n max-width: 44.5rem;\n margin-left: calc((100% - ${getVar('maxWidth')}) / 2);\n\n img {\n //For responsive > FullHD\n height: 3.5rem;\n //For responsive > FullHD\n }\n\n @media screen and (max-width: 1200px) {\n max-width: 60rem;\n position: relative;\n z-index: 2;\n }\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst HeroImageContainer = styled(Fade)`\n position: absolute;\n top: 24rem;\n right: 0;\n overflow: hidden;\n border-radius: 4rem 0 0 16rem;\n width: 70rem;\n height: 94.5rem;\n box-shadow: 0 0.4rem 24.4rem -1rem ${getColor('adminBlack', 0.23)};\n z-index: 998;\n\n @media screen and (max-width: 1200px) {\n top: 37rem;\n width: 55rem;\n height: 79.5rem;\n z-index: unset;\n }\n\n @media screen and (max-width: 1150px) {\n width: 100%;\n border-radius: 0;\n height: 100%;\n top: 0;\n mix-blend-mode: overlay;\n }\n`;\n\nconst HeroImage = styled.img`\n overflow: hidden;\n object-fit: cover;\n width: 100%;\n height: 100%;\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const HomeLandingStyles = {\n LandingContainer,\n TextContainer,\n HeroImageContainer,\n HeroImage,\n};\n","export default __webpack_public_path__ + \"static/media/home-landing-hero.b9e4115b.jpg\";","export default __webpack_public_path__ + \"static/media/home-landing-scroll.a30b1a38.svg\";","/* ****************************************************** Imports ****************************************************** */\nimport { useEffect } from 'react';\nimport { useAppAnalytics } from 'analytics';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@material-ui/core';\n\nimport { HomeLandingStyles } from './HomeLanding.styles';\n\nimport heroImage from '../../../../assets/images/home/home-landing-hero.jpg';\nimport mouseIcon from '../../../../assets/images/home/home-landing-scroll.svg';\nimport { useResize } from '../../../shared/hooks/useResize';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const HomeLanding = () => {\n /* ****************************************************** State ****************************************************** */\n const { t } = useTranslation();\n\n /* ****************************************************** useResize() ****************************************************** */\n const windowSize = useResize();\n\n useEffect(() => {}, [windowSize]);\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n

{t('home.landing.top')}

\n

{t('home.landing.main')}

\n

{t('home.landing.sub')}

\n\n \n {\n window.scrollTo(0, 1300);\n trackEvent({\n action: '[Home - Landing Section] Check Out Our Solutions Clicked',\n category: 'Home',\n });\n }}\n >\n {t('home.landing.button')}\n \"Scroll\n \n \n \n\n 1150 ? 'right' : undefined}\n duration={1000}\n triggerOnce={true}\n >\n \n \n
\n );\n};\n","import { Reveal } from 'react-awesome-reveal';\nimport { Button } from '@material-ui/core';\n/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst OperatorsContainer = styled.div`\n width: 100%;\n min-height: 100%;\n padding: 16.5rem 0 24rem 0;\n background-color: ${getColor('adminBlack')};\n color: ${getColor('textGrey')};\n\n h2 {\n color: ${getColor('primaryContrast')};\n }\n`;\n\nconst OperatorsHeading = styled.h2`\n width: 100%;\n max-width: 54rem;\n margin-left: calc((100% - ${getVar('maxWidth')}) / 2);\n margin-bottom: 19.5rem;\n\n @media screen and (max-width: 1150px) {\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst ApiContainer = styled.div`\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n display: flex;\n align-items: normal;\n justify-content: space-between;\n\n & > div {\n &:first-of-type {\n display: flex;\n }\n\n &:last-of-type {\n width: 53.1rem;\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n }\n }\n\n @media screen and (max-width: 1150px) {\n flex-direction: column;\n align-items: flex-start;\n }\n`;\n\nconst ApiTextContainer = styled.div`\n width: 47.5rem;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n margin-bottom: 10rem;\n }\n`;\n\nconst ButtonNoMargin = styled(Button)`\n margin: 0 !important;\n`;\n\nconst LogoImage = styled.img`\n margin-bottom: 4rem;\n //For responsive > FullHD\n height: 5.3rem;\n //For responsive > FullHD\n`;\n\nconst ButtonsWrapper = styled.div`\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst ApiListContainer = styled.div`\n width: 53.1rem;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst ApiListWrapper = styled.div`\n width: 100%;\n height: 49.5rem;\n overflow: hidden;\n position: relative;\n\n @media screen and (max-width: 1150px) {\n margin-bottom: 5rem;\n }\n`;\n\nconst ApiList = styled.div`\n width: 100%;\n height: 100%;\n padding-bottom: 14.5rem;\n padding-right: 1.5rem;\n overflow: auto;\n\n scrollbar-width: thin;\n scrollbar-color: transparent transparent;\n\n ::-webkit-scrollbar {\n width: 0%;\n height: 0;\n background: transparent;\n\n &-thumb {\n background: transparent;\n }\n }\n`;\n\nconst ListBlur = styled.div`\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 14.5rem;\n background: linear-gradient(\n 180deg,\n ${getColor('adminBlack', 0)} 0%,\n ${getColor('adminBlack')} 73.31%\n );\n pointer-events: none;\n`;\n\nconst PortalContainer = styled.div`\n position: relative;\n width: 100%;\n margin-top: 19.5rem;\n display: flex;\n flex-direction: row-reverse;\n\n & > div:last-of-type {\n width: 100%;\n max-width: 49rem;\n margin-right: calc((100% - ${getVar('maxWidth')}) / 2);\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n margin: 15rem 0 0 calc((100% - ${getVar('maxWidth')}) / 2);\n }\n }\n\n @media screen and (max-width: 1150px) {\n flex-direction: column;\n align-items: flex-start;\n }\n`;\n\nconst PortalTextContainer = styled.div`\n width: 100%;\n max-width: 49rem;\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst LaptopImageReveal = styled(Reveal)`\n position: absolute;\n left: 0;\n top: 50%;\n transform: translateY(-50%);\n\n //For responsive > FullHD\n height: 60.5rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n position: relative;\n left: unset;\n top: unset;\n transform: unset;\n }\n @media screen and (max-width: 700px) {\n height: unset;\n width: ${getVar('maxWidth')};\n }\n`;\n\nconst LaptopImage = styled.img`\n //For responsive > FullHD\n height: 60.5rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 700px) {\n height: unset;\n width: ${getVar('maxWidth')};\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const HomeOperatorsStyles = {\n OperatorsContainer,\n OperatorsHeading,\n ApiContainer,\n ApiTextContainer,\n ApiListContainer,\n ApiListWrapper,\n ApiList,\n ListBlur,\n ButtonNoMargin,\n LogoImage,\n ButtonsWrapper,\n PortalContainer,\n PortalTextContainer,\n LaptopImageReveal,\n LaptopImage,\n};\n","export default __webpack_public_path__ + \"static/media/full-logo-api-white.6cc5ca88.svg\";","export default __webpack_public_path__ + \"static/media/full-logo-challenge-white.99a794cd.svg\";","export default __webpack_public_path__ + \"static/media/home-laptop-challenge.c9b3da54.png\";","export default __webpack_public_path__ + \"static/media/api-charge-planner.ab1a1691.svg\";","export default __webpack_public_path__ + \"static/media/api-directions.048376c4.svg\";","export default __webpack_public_path__ + \"static/media/api-distance.a825c983.svg\";","export default __webpack_public_path__ + \"static/media/api-charging-station.2e07024c.svg\";","export default __webpack_public_path__ + \"static/media/api-elevation.a85fdb5e.svg\";","export default __webpack_public_path__ + \"static/media/api-geo-coding.1ae99edb.svg\";","export default __webpack_public_path__ + \"static/media/api-tile-service.ca77241e.svg\";","import { ApiListItemModel } from './api-list-item.model';\n\nimport chargePlannerIcon from '../../../../../assets/images/home/api-icons/api-charge-planner.svg';\nimport directionsIcon from '../../../../../assets/images/home/api-icons/api-directions.svg';\nimport distancePlannerIcon from '../../../../../assets/images/home/api-icons/api-distance.svg';\n//TODO: Unfinished Prod\nimport chargingStationIcon from '../../../../../assets/images/home/api-icons/api-charging-station.svg';\n// import routeIcon from '../../../../../assets/images/home/api-icons/api-route.svg';\nimport elevationIcon from '../../../../../assets/images/home/api-icons/api-elevation.svg';\nimport geoCodingIcon from '../../../../../assets/images/home/api-icons/api-geo-coding.svg';\nimport tilesIcon from '../../../../../assets/images/home/api-icons/api-tile-service.svg';\n\nexport const API_LIST_ITEMS: ApiListItemModel[] = [\n {\n icon: chargePlannerIcon,\n translationString: 'home.operators.api.chargePlanner',\n link: 'XXX',\n },\n {\n icon: directionsIcon,\n translationString: 'home.operators.api.directions',\n link: 'XXX',\n },\n {\n icon: distancePlannerIcon,\n translationString: 'home.operators.api.distance',\n link: 'XXX',\n },\n {\n icon: chargingStationIcon,\n translationString: 'home.operators.api.chargingStation',\n link: 'XXX',\n },\n //TODO: Unfinished Prod\n // {\n // icon: routeIcon,\n // translationString: 'home.operators.api.route',\n // link: 'XXX',\n // },\n {\n icon: elevationIcon,\n translationString: 'home.operators.api.elevation',\n link: 'XXX',\n },\n {\n icon: geoCodingIcon,\n translationString: 'home.operators.api.geoCoding',\n link: 'XXX',\n },\n {\n icon: tilesIcon,\n translationString: 'home.operators.api.tiles',\n link: 'XXX',\n },\n];\n","/* ****************************************************** Imports ****************************************************** */\nimport { keyframes } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { getColor } from '../../../../theme/colors/colors';\n\nconst ping = keyframes`\n 0% {box-shadow: 0 0 0 0 ${getColor('primaryContrast', 0.4)}}\n\n 70% {box-shadow: 0 0 0 3rem ${getColor('primaryContrast', 0)}}\n\n 100% {box-shadow: 0 0 0 0 ${getColor('primaryContrast', 0)}}\n`;\n\n/* ****************************************************** Styles ****************************************************** */\nconst ItemContainer = styled.a`\n //TODO: Unfinished Prod\n pointer-events: none;\n\n display: flex;\n align-items: center;\n\n width: 100%;\n height: 6.5rem;\n margin-bottom: 3.5rem;\n padding: 0 2.65rem;\n overflow: hidden;\n\n border-radius: 2.4rem;\n background-color: ${getColor('primaryContrast', 0.1)};\n\n font-size: 2rem;\n font-weight: 700;\n color: ${getColor('primaryContrast')};\n\n transition: 0.5s;\n\n &:last-of-type {\n margin-bottom: 0;\n }\n\n &:hover {\n background-color: ${getColor('apiOrange', 0.5)};\n\n & img.arrow {\n animation: ${ping} 1.5s infinite;\n }\n }\n`;\n\nconst Text = styled.span`\n flex: auto;\n margin: 0.5rem 2rem 0 2rem;\n`;\n\nconst ApiIcon = styled.img`\n //For responsive > FullHD\n height: 3.2rem;\n //For responsive > FullHD\n`;\n\nconst ArrowIcon = styled.img`\n border-radius: 50%;\n width: 2rem;\n //For responsive > FullHD\n height: 2rem;\n //For responsive > FullHD\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const ApiListItemStyles = {\n ItemContainer,\n Text,\n ApiIcon,\n ArrowIcon,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { ApiListItemModel } from './api-list-item.model';\nimport { ApiListItemStyles } from './ApiListItem.styles';\n\n//TODO: Unfinished Prod\n// import arrowIcon from '../../../../../assets/images/home/api-icons/api-list-arrow.svg';\n\n/* ****************************************************** Component ****************************************************** */\nexport const ApiListItem = (item: ApiListItemModel) => {\n /* ****************************************************** State ****************************************************** */\n const { t } = useTranslation();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n\n \n {t(item.translationString)}\n \n\n {/*\n //TODO: Unfinished Prod\n */}\n {/* */}\n \n );\n};\n","import { ContactFormTopicModel } from '../shared/components/footer/contact-form/contact-form.model';\nimport { Subject, Observable } from 'rxjs';\n\nconst alert = new Subject();\n\nconst changeTopic = (newTopicValue: ContactFormTopicModel): void => {\n alert.next(newTopicValue);\n};\n\nexport const contactFormTopicService: {\n topic: Observable;\n changeTopic(newTopicValue: ContactFormTopicModel): void;\n} = {\n topic: alert.asObservable() as Observable,\n changeTopic,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport DOMPurify from 'dompurify';\n\n/* ****************************************************** Component ****************************************************** */\nexport const GetCustomTranslation = (translationKey: string) => {\n /* ****************************************************** Component ****************************************************** */\n const { t } = useTranslation();\n\n /* ****************************************************** Template ****************************************************** */\n return { __html: DOMPurify.sanitize(t(translationKey)) };\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { keyframes } from '@emotion/react';\n\n/* ****************************************************** Animations ****************************************************** */\nconst slideInRight = keyframes`\n 0% {\n opacity: 0;\n transform: translateY(-50%) translateX(-25rem)\n }\n\n 100% {\n opacity: 1;\n transform: translateY(-50%) translateX(0)\n }\n`;\n\nconst slideInRightNoY = keyframes`\n 0% {\n opacity: 0;\n transform: translateX(-25rem)\n }\n\n 100% {\n opacity: 1;\n transform: translateX(0)\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const HomeOperatorsAnimations = {\n slideInRight,\n slideInRightNoY,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { Button } from '@material-ui/core';\n\nimport { useTranslation } from 'react-i18next';\n\nimport { HomeOperatorsStyles } from './HomeOperators.styles';\n\nimport apiLogo from '../../../../assets/images/logos/full-logo-api-white.svg';\nimport challengesLogo from '../../../../assets/images/logos/full-logo-challenge-white.svg';\nimport laptopImage from '../../../../assets/images/home/home-laptop-challenge.png';\nimport { API_LIST_ITEMS } from './api-list-item/api-list-items';\nimport { ApiListItem } from './api-list-item/ApiListItem';\n\nimport { NavLink } from 'react-router-dom';\nimport { APP_ROUTES } from '../../../shared/appRoutes';\nimport { contactFormTopicService } from '../../../services/contact-form-topic.service';\nimport { GetCustomTranslation } from '../../../shared/components/GetCustomTranslation';\nimport { useAppAnalytics } from 'analytics';\nimport { Fade } from 'react-awesome-reveal';\nimport { HomeOperatorsAnimations } from './home-operators.animations';\nimport { useResize } from '../../../shared/hooks/useResize';\n\n/* ****************************************************** Component ****************************************************** */\nexport const HomeOperators = () => {\n /* ****************************************************** State ****************************************************** */\n const { t } = useTranslation();\n\n const windowSize = useResize();\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n {t('home.operators.heading')}\n \n \n\n {/* --------------------- API --------------------- */}\n \n \n \n
\n \n\n \n

\n
\n\n \n \n \n trackEvent({\n action: '[Home - API Section] Contact Our Experts Clicked',\n category: 'Home',\n })\n }\n >\n {\n contactFormTopicService.changeTopic('ROUTING_APIS');\n }}\n >\n {t('home.operators.api.button.secondary')}\n \n \n \n \n
\n
\n\n \n \n \n \n {API_LIST_ITEMS.map((item) => (\n \n ))}\n \n\n \n \n\n \n \n \n trackEvent({\n action: '[Home - API Section] View All API Clicked',\n category: 'Home',\n })\n }\n >\n {t('home.operators.api.button.primary')}\n \n \n \n \n \n
\n\n {/* --------------------- OPERATOR PORTAL --------------------- */}\n \n 1150\n ? HomeOperatorsAnimations.slideInRight\n : HomeOperatorsAnimations.slideInRightNoY\n }\n duration={1000}\n triggerOnce\n >\n \n \n\n \n \n \n\n \n

\n\n \n \n \n trackEvent({\n action: '[Home - Operator Portal Section] Request Access Clicked',\n category: 'Home',\n })\n }\n >\n {\n contactFormTopicService.changeTopic('OPERATOR_PORTAL');\n }}\n >\n {t('home.operators.operator.button.primary')}\n \n \n \n\n \n \n trackEvent({\n action: '[Home - Operator Portal Section] Find Out More Clicked',\n category: 'Home',\n })\n }\n >\n \n {t('home.operators.operator.button.secondary')}\n \n \n \n \n
\n
\n
\n
\n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { HomeApplications } from './applications/HomeApplications';\nimport { HomeLanding } from './landing/HomeLanding';\nimport { HomeOperators } from './operators/HomeOperators';\n\n/* ****************************************************** Component ****************************************************** */\nexport const HomePage = () => {\n /* ****************************************************** Template ****************************************************** */\n return (\n <>\n \n \n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\n\n/* ****************************************************** Styles ****************************************************** */\nconst ButtonsContainer = styled.div`\n margin-top: 4rem;\n display: flex;\n\n div {\n transform-origin: center;\n\n &:not(:last-of-type) {\n margin-right: 1.5rem;\n }\n }\n\n a,\n img {\n display: inline-block;\n //For responsive > FullHD\n height: 4rem;\n //For responsive > FullHD\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const StoreButtonsStyles = {\n ButtonsContainer,\n};\n","export default __webpack_public_path__ + \"static/media/apple-store.041a1ac2.svg\";","import appleButtonIcon from 'assets/images/apple-store.svg';\nimport { APP_LINKS } from 'core/shared/appLinks';\n\nexport const AppleButton = ({ onClick }: { onClick: () => void }) => {\n return (\n \n \"Apple\n \n );\n};\n","export default __webpack_public_path__ + \"static/media/android-store.65ccd7c5.svg\";","import androidButtonIcon from 'assets/images/android-store.svg';\nimport { APP_LINKS } from 'core/shared/appLinks';\n\nexport const GoogleButton = ({ onClick }: { onClick: () => void }) => {\n return (\n \n \"Android\n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\n\nimport { StoreButtonsStyles } from './StoreButtons.styles';\n\nimport { Zoom } from 'react-awesome-reveal';\nimport { AppleButton } from './buttons/AppleButton';\nimport { GoogleButton } from './buttons/GoogleButton';\n\n/* ****************************************************** Component ****************************************************** */\nexport const StoreButtons = ({\n buttonClicked,\n delayAnimation,\n}: {\n buttonClicked: (val: 'apple' | 'google') => void;\n delayAnimation?: number;\n}) => {\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n buttonClicked('apple')} />\n buttonClicked('google')} />\n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { Fade } from 'react-awesome-reveal';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst LandingContainer = styled.div`\n position: relative;\n width: 100%;\n min-height: 100%;\n padding: calc(${getVar('headerHeight')} + 8rem) 0 19rem 0;\n background-color: ${getColor('background')};\n color: ${getColor('textApps')};\n display: flex;\n justify-content: flex-end;\n\n @media screen and (max-width: 1150px) {\n justify-content: flex-start;\n }\n`;\n\nconst TextContainerFade = styled(Fade)`\n width: 100%;\n max-width: 49rem;\n margin-right: calc((100% - ${getVar('maxWidth')}) / 2);\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n margin-left: calc((100% - ${getVar('maxWidth')}) / 2);\n margin-right: unset;\n position: relative;\n z-index: 2;\n }\n`;\n\nconst TextContainer = styled.div`\n width: 100%;\n max-width: 49rem;\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst PhoneImage = styled.img`\n position: absolute;\n left: calc((100% - ${getVar('maxWidth')}) / 2);\n top: calc(${getVar('headerHeight')} - 8rem);\n z-index: 998;\n\n //For responsive > FullHD\n height: 98.3rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1;\n opacity: 0.3;\n height: 100%;\n }\n\n @media screen and (max-width: 700px) {\n height: unset;\n width: 100%;\n bottom: 0;\n top: unset;\n transform: translateX(-50%);\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const AppsLandingStyles = {\n LandingContainer,\n TextContainerFade,\n TextContainer,\n PhoneImage,\n};\n","export default __webpack_public_path__ + \"static/media/apps-landing.8e526f72.png\";","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\n\nimport { StoreButtons } from '../store-buttons/StoreButtons';\n\nimport { AppsLandingStyles } from './AppsLanding.styles';\nimport appsLandingImage from '../../../../assets/images/apps/apps-landing.png';\nimport { GetCustomTranslation } from '../../../shared/components/GetCustomTranslation';\nimport { useAppAnalytics } from 'analytics';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const AppsLanding = () => {\n /* ****************************************************** Component ****************************************************** */\n const { t } = useTranslation();\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n const handleButtonClicked = (button: string) => {\n if (button === 'apple') {\n trackEvent({\n action: '[Mobile & Web App - Landing Section] App Store Button Clicked',\n category: 'Mobile & Web App',\n });\n } else {\n trackEvent({\n action: '[Mobile & Web App - Landing Section] Google Play Button Clicked',\n category: 'Mobile & Web App',\n });\n }\n };\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n \n\n \n \n \n

{t('apps.landing.sub')}

\n\n \n
\n
\n
\n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\n\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst RouteDetailsContainer = styled.div`\n background-color: ${getColor('primaryContrast')};\n padding: 19rem 0 25rem 0;\n`;\n\nconst RouteDetailsContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n\n @media screen and (max-width: 1150px) {\n flex-direction: column-reverse;\n align-items: flex-start;\n }\n`;\n\nconst TextWrapper = styled.div`\n width: 100%;\n max-width: 45rem;\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst PhoneImageContainer = styled.div`\n position: relative;\n width: 63.5rem;\n\n @media screen and (max-width: 1150px) {\n margin-bottom: 5rem;\n width: 100%;\n display: flex;\n justify-content: center;\n }\n`;\n\nconst PhoneImage = styled.img`\n //For responsive > FullHD\n height: 70rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 800px) {\n height: 65rem;\n }\n\n @media screen and (max-width: 700px) {\n height: unset;\n width: 100%;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const AppsRouteDetailsStyles = {\n RouteDetailsContainer,\n RouteDetailsContent,\n TextWrapper,\n PhoneImageContainer,\n PhoneImage,\n};\n","export default __webpack_public_path__ + \"static/media/apps-1.59eb7e66.png\";","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\n\nimport { StoreButtons } from '../store-buttons/StoreButtons';\n\nimport { AppsRouteDetailsStyles } from './AppsRouteDetails.styles';\nimport phoneImage from '../../../../assets/images/apps/apps-1.png';\nimport { GetCustomTranslation } from '../../../shared/components/GetCustomTranslation';\nimport { useAppAnalytics } from 'analytics';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const AppsRouteDetails = () => {\n /* ****************************************************** Component ****************************************************** */\n const { t } = useTranslation();\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n const handleButtonClicked = (button: string) => {\n if (button === 'apple') {\n trackEvent({\n action: '[Mobile & Web App - Step By Step Section] App Store Button Clicked',\n category: 'Mobile & Web App',\n });\n } else {\n trackEvent({\n action: '[Mobile & Web App - Step By Step Section] Google Play Button Clicked',\n category: 'Mobile & Web App',\n });\n }\n };\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n \n

{t('apps.routeDetails.top')}

\n \n

\n\n \n
\n
\n\n \n \n \n \n \n
\n
\n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\n\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst NavigationContainer = styled.div`\n background-color: ${getColor('background')};\n padding: 19rem 0 25rem 0;\n`;\n\nconst NavigationContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n\n @media screen and (max-width: 1150px) {\n flex-direction: column;\n align-items: flex-start;\n }\n`;\n\nconst TextWrapper = styled.div`\n width: 100%;\n max-width: 45rem;\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst PhoneImageContainer = styled.div`\n position: relative;\n width: 63.5rem;\n\n @media screen and (max-width: 1150px) {\n margin-bottom: 5rem;\n width: 100%;\n display: flex;\n justify-content: center;\n }\n`;\n\nconst PhoneImage = styled.img`\n margin-left: -10rem;\n //For responsive > FullHD\n height: 72rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n margin-left: unset;\n }\n\n @media screen and (max-width: 800px) {\n height: 67rem;\n }\n\n @media screen and (max-width: 700px) {\n height: unset;\n width: 100%;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const AppsNavigationStyles = {\n NavigationContainer,\n NavigationContent,\n TextWrapper,\n PhoneImageContainer,\n PhoneImage,\n};\n","export default __webpack_public_path__ + \"static/media/apps-2.37b95048.png\";","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\n\nimport { StoreButtons } from '../store-buttons/StoreButtons';\n\nimport { AppsNavigationStyles } from './AppsNavigation.styles';\nimport phoneImage from '../../../../assets/images/apps/apps-2.png';\nimport { GetCustomTranslation } from '../../../shared/components/GetCustomTranslation';\nimport { useAppAnalytics } from 'analytics';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const AppsNavigation = () => {\n /* ****************************************************** Component ****************************************************** */\n const { t } = useTranslation();\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n const handleButtonClicked = (button: string) => {\n if (button === 'apple') {\n trackEvent({\n action: '[Mobile & Web App - Navigation Section] App Store Button Clicked',\n category: 'Mobile & Web App',\n });\n } else {\n trackEvent({\n action: '[Mobile & Web App - Navigation Section] Google Play Button Clicked',\n category: 'Mobile & Web App',\n });\n }\n };\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n \n \n \n \n\n \n \n \n

{t('apps.navigation.sub')}

\n\n \n
\n
\n
\n
\n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\n\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst ChargingContainer = styled.div`\n background-color: ${getColor('primaryContrast')};\n padding: 19rem 0 25rem 0;\n`;\n\nconst ChargingContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n\n @media screen and (max-width: 1150px) {\n flex-direction: column-reverse;\n align-items: flex-start;\n }\n`;\n\nconst TextWrapper = styled.div`\n width: 100%;\n max-width: 47rem;\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst PhoneImageContainer = styled.div`\n position: relative;\n width: 63.5rem;\n\n @media screen and (max-width: 1150px) {\n margin-bottom: 5rem;\n width: 100%;\n display: flex;\n justify-content: center;\n }\n`;\n\nconst PhoneImage = styled.img`\n //For responsive > FullHD\n height: 70rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 800px) {\n height: 65rem;\n }\n\n @media screen and (max-width: 700px) {\n height: unset;\n width: 100%;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const AppsChargingStyles = {\n ChargingContainer,\n ChargingContent,\n TextWrapper,\n PhoneImageContainer,\n PhoneImage,\n};\n","export default __webpack_public_path__ + \"static/media/apps-3.7ffcdb1e.png\";","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\n\nimport { StoreButtons } from '../store-buttons/StoreButtons';\n\nimport { AppsChargingStyles } from './AppsCharging.styles';\nimport phoneImage from '../../../../assets/images/apps/apps-3.png';\nimport { useAppAnalytics } from 'analytics';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const AppsCharging = () => {\n /* ****************************************************** Component ****************************************************** */\n const { t } = useTranslation();\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n const handleButtonClicked = (button: string) => {\n if (button === 'apple') {\n trackEvent({\n action: '[Mobile & Web App - Charging Stop Section] App Store Button Clicked',\n category: 'Mobile & Web App',\n });\n } else {\n trackEvent({\n action: '[Mobile & Web App - Charging Stop Section] Google Play Button Clicked',\n category: 'Mobile & Web App',\n });\n }\n };\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n \n

{t('apps.charging.main')}

\n

{t('apps.charging.sub')}

\n\n \n
\n
\n\n \n \n \n \n \n
\n
\n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\n\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst InCarContainer = styled.div`\n position: relative;\n background-color: ${getColor('background')};\n padding: 25rem 0;\n\n @media screen and (max-width: 1150px) {\n display: flex;\n flex-direction: column-reverse;\n align-items: flex-start;\n padding: 20rem 0;\n }\n`;\n\nconst TextWrapper = styled.div`\n width: 100%;\n max-width: 45rem;\n margin-left: calc((100% - ${getVar('maxWidth')}) / 2);\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst Image = styled.img`\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n right: 0;\n //For responsive > FullHD\n height: 49.2rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n position: relative;\n top: unset;\n right: unset;\n transform: unset;\n margin: 0 0 10rem auto;\n }\n\n @media screen and (max-width: 800px) {\n height: 44.2rem;\n }\n\n @media screen and (max-width: 700px) {\n height: unset;\n width: ${getVar('maxWidth')};\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const AppsInCarStyles = {\n InCarContainer,\n TextWrapper,\n Image,\n};\n","export default __webpack_public_path__ + \"static/media/apps-5.62d4061a.png\";","import { StoreButtonsStyles } from './StoreButtons.styles';\n\nimport { Zoom } from 'react-awesome-reveal';\nimport { AppleButton } from './buttons/AppleButton';\n\n/**\n * Duplicate of StoreButtons, but displaying only Apple/App Store button.\n *\n * TODO: Once Android Auto app starts getting marketed and StoreButtons replaces\n * this component in AppsInCar to show both Google and Apple buttons, this\n * whole component can be deleted.\n */\nexport const AppleStoreButtonSection = ({\n buttonClicked,\n delayAnimation,\n}: {\n buttonClicked: (val: 'apple' | 'google') => void;\n delayAnimation?: number;\n}) => {\n return (\n \n \n buttonClicked('apple')} />\n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { useAppAnalytics } from 'analytics';\nimport { AppsInCarStyles } from './AppsInCar.styles';\nimport carImage from '../../../../assets/images/apps/apps-5.png';\nimport { GetCustomTranslation } from '../../../shared/components/GetCustomTranslation';\nimport { AppleStoreButtonSection } from '../store-buttons/AppleStoreButtonSection';\n\n/* ****************************************************** Component ****************************************************** */\nexport const AppsInCar = () => {\n /* ****************************************************** Component ****************************************************** */\n const { t } = useTranslation();\n\n const { trackEvent } = useAppAnalytics();\n\n const handleButtonClicked = (button: string) => {\n if (button === 'apple') {\n trackEvent({\n action: '[Mobile & Web App - Apps In Car Section] App Store Button Clicked',\n category: 'Mobile & Web App',\n });\n } else {\n trackEvent({\n action: '[Mobile & Web App - Apps In Car Section] Google Play Button Clicked',\n category: 'Mobile & Web App',\n });\n }\n };\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n

{t('apps.inCar.sub')}

\n\n {/* Once Android Auto is supported, replace AppleStoreButtonSection with StoreButtons used in the rest of the sections */}\n \n
\n\n \n
\n );\n};\n","import { Reveal, Fade } from 'react-awesome-reveal';\n/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\n\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst WebPlannerContainer = styled.div`\n position: relative;\n background-color: ${getColor('primaryContrast')};\n padding: 19rem 0 25rem 0;\n\n @media screen and (max-width: 1150px) {\n display: flex;\n flex-direction: column-reverse;\n align-items: flex-start;\n padding: 15rem 0;\n }\n`;\n\nconst TextWrapperFade = styled(Fade)`\n width: 100%;\n max-width: 45rem;\n margin-left: calc((100% - ${getVar('maxWidth')}) / 2);\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst TextWrapper = styled.div`\n width: 100%;\n max-width: 45rem;\n\n & > div {\n transform-origin: center;\n display: inline-block;\n }\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst ImageReveal = styled(Reveal)`\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n right: 0;\n\n //For responsive > FullHD\n height: 70.8rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n position: relative;\n top: unset;\n right: unset;\n transform: unset;\n margin: 0 0 10rem auto;\n height: 60.8rem;\n }\n\n @media screen and (max-width: 800px) {\n height: 55.8rem;\n }\n\n @media screen and (max-width: 700px) {\n height: unset;\n width: ${getVar('maxWidth')};\n }\n`;\n\nconst Image = styled.img`\n //For responsive > FullHD\n height: 70.8rem;\n //For responsive > FullHD\n\n @media screen and (max-width: 1150px) {\n height: 60.8rem;\n }\n\n @media screen and (max-width: 800px) {\n height: 55.8rem;\n }\n\n @media screen and (max-width: 700px) {\n height: unset;\n width: ${getVar('maxWidth')};\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const AppsWebPlannerStyles = {\n WebPlannerContainer,\n TextWrapperFade,\n TextWrapper,\n ImageReveal,\n Image,\n};\n","export default __webpack_public_path__ + \"static/media/apps-6.2dd4a30c.png\";","/* ****************************************************** Imports ****************************************************** */\nimport { keyframes } from '@emotion/react';\n\n/* ****************************************************** Animations ****************************************************** */\nconst slideInLeft = keyframes`\n 0% {\n opacity: 0;\n transform: translateY(-50%) translateX(25rem)\n }\n\n 100% {\n opacity: 1;\n transform: translateY(-50%) translateX(0)\n }\n`;\n\nconst slideInLeftNoY = keyframes`\n 0% {\n opacity: 0;\n transform: translateX(25rem)\n }\n\n 100% {\n opacity: 1;\n transform: translateX(0)\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const AppsWebPlannerAnimations = {\n slideInLeft,\n slideInLeftNoY,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@material-ui/core';\nimport { APP_LINKS } from '../../../shared/appLinks';\n\nimport { AppsWebPlannerStyles } from './AppsWebPlanner.styles';\nimport laptopImage from '../../../../assets/images/apps/apps-6.png';\nimport { GetCustomTranslation } from '../../../shared/components/GetCustomTranslation';\nimport { useAppAnalytics } from 'analytics';\nimport { useResize } from '../../../shared/hooks/useResize';\nimport { AppsWebPlannerAnimations } from './apps-web-planner.animations';\nimport { Zoom } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const AppsWebPlanner = () => {\n /* ****************************************************** Component ****************************************************** */\n const { t } = useTranslation();\n\n const windowSize = useResize();\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n \n

{t('apps.webPlanner.sub')}

\n\n \n \n trackEvent({\n action: '[Mobile & Web App - Web Planner Section] Open In Web Clicked',\n category: 'Mobile & Web App',\n })\n }\n >\n \n {t('apps.webPlanner.button')}\n \n \n \n
\n
\n\n 1150\n ? AppsWebPlannerAnimations.slideInLeft\n : AppsWebPlannerAnimations.slideInLeftNoY\n }\n duration={1500}\n triggerOnce\n >\n \n \n
\n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { AppsLanding } from './landing/AppsLanding';\nimport { AppsRouteDetails } from './route-details/AppsRouteDetails';\nimport { AppsNavigation } from './navigation/AppsNavigation';\nimport { AppsCharging } from './charging/AppsCharging';\n//TODO: Unfinished Prod\n// import { AppsCarData } from './car-data/AppsCarData';\nimport { AppsInCar } from './in-car/AppsInCar';\nimport { AppsWebPlanner } from './web-planner/AppsWebPlanner';\n\n/* ****************************************************** Component ****************************************************** */\nexport const AppsPage = () => {\n /* ****************************************************** Template ****************************************************** */\n return (\n <>\n \n \n \n \n {/*\n //TODO: Unfinished Prod\n */}\n {/* */}\n \n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { Fade } from 'react-awesome-reveal';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst LandingContainer = styled.div`\n position: relative;\n width: 100%;\n min-height: 100%;\n padding: calc(${getVar('headerHeight')} + 11rem) 0 13rem 0;\n background-color: ${getColor('adminBlack')};\n color: ${getColor('primaryContrast')};\n\n & > div:first-of-type {\n @media screen and (max-width: 1150px) {\n position: relative;\n z-index: 2;\n }\n }\n\n @media screen and (max-width: 1200px) {\n padding: calc(${getVar('headerHeight')} + 8rem) 0 13rem 0;\n }\n\n @media screen and (max-height: 799px) {\n min-height: 930px;\n }\n`;\n\nconst TextContainer = styled.div`\n width: 100%;\n max-width: 46.5rem;\n margin-left: calc((100% - ${getVar('maxWidth')}) / 2);\n\n img {\n //For responsive > FullHD\n height: 3.5rem;\n //For responsive > FullHD\n }\n\n @media screen and (max-width: 1200px) {\n max-width: 60rem;\n position: relative;\n z-index: 2;\n }\n\n @media screen and (max-width: 1150px) {\n width: ${getVar('mobileContentWidth')};\n max-width: ${getVar('maxWidth')};\n }\n\n h1 {\n margin-bottom: 4.5rem;\n }\n`;\n\nconst HeroImageContainer = styled(Fade)`\n position: absolute;\n top: 24rem;\n right: 0;\n overflow: hidden;\n border-radius: 4rem 0 0 16rem;\n width: 70rem;\n height: 94.5rem;\n box-shadow: 0 0.4rem 24.4rem -1rem ${getColor('primaryContrast', 0.23)};\n z-index: 998;\n\n @media screen and (max-width: 1200px) {\n top: 37rem;\n width: 55rem;\n height: 79.5rem;\n z-index: unset;\n }\n\n @media screen and (max-width: 1150px) {\n width: 100%;\n border-radius: 0;\n height: 100%;\n top: 0;\n mix-blend-mode: overlay;\n }\n`;\n\nconst HeroImage = styled.img`\n overflow: hidden;\n object-fit: cover;\n width: 100%;\n height: 100%;\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const B2BLandingStyles = {\n LandingContainer,\n TextContainer,\n HeroImageContainer,\n HeroImage,\n};\n","export default __webpack_public_path__ + \"static/media/b2b-landing-hero.37b77284.png\";","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@material-ui/core';\n\nimport { B2BLandingStyles } from './B2BLanding.styles';\n\nimport heroImage from '../../../../assets/images/b2b/b2b-landing-hero.png';\nimport mouseIcon from '../../../../assets/images/home/home-landing-scroll.svg';\nimport { useResize } from '../../../shared/hooks/useResize';\nimport { useEffect } from 'react';\nimport { useAppAnalytics } from 'analytics';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const B2BLanding = () => {\n /* ****************************************************** State ****************************************************** */\n const { t } = useTranslation();\n\n /* ****************************************************** useResize() ****************************************************** */\n const windowSize = useResize();\n\n useEffect(() => {}, [windowSize]);\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n

{t('b2b.landing.top')}

\n

{t('b2b.landing.main')}

\n {/*

{t('b2b.landing.sub')}

*/}\n\n \n {\n window.scrollTo(0, windowSize.height + 150);\n trackEvent({\n action: '[B2B Offer - Landing Section] Check Out Our Solutions Clicked',\n category: 'B2B',\n });\n }}\n >\n {t('b2b.landing.button')}\n \"Scroll\n \n \n
\n
\n\n 1150 ? 'right' : undefined}\n duration={1000}\n triggerOnce={true}\n >\n \n \n
\n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport ImageChargePlanner from '../../../../assets/images/b2b/api-icons/charge-planner-api.svg';\nimport ImageDirections from '../../../../assets/images/b2b/api-icons/directions-api.svg';\nimport ImageElevation from '../../../../assets/images/b2b/api-icons/elevation-api.svg';\nimport ImageChargingStation from '../../../../assets/images/b2b/api-icons/charging-station-api.svg';\nimport ImageDistanceMatrix from '../../../../assets/images/b2b/api-icons/distance-matrix-api.svg';\nimport ImageGeoCoding from '../../../../assets/images/b2b/api-icons/geo-coding-api.svg';\n// import ImageRouteAlong from '../../../../assets/images/b2b/api-icons/route-along-api.svg';\nimport ImageTileService from '../../../../assets/images/b2b/api-icons/tile-service-api.svg';\n\n/* ****************************************************** Export ****************************************************** */\nexport const B2B_APIS_DATA: {\n icon: string;\n title: string;\n text: string;\n}[] = [\n {\n icon: ImageChargePlanner,\n title: 'b2b.apis.chargePlanner.title',\n text: 'b2b.apis.chargePlanner.text',\n },\n {\n icon: ImageDirections,\n title: 'b2b.apis.directions.title',\n text: 'b2b.apis.directions.text',\n },\n {\n icon: ImageElevation,\n title: 'b2b.apis.elevation.title',\n text: 'b2b.apis.elevation.text',\n },\n {\n icon: ImageChargingStation,\n title: 'b2b.apis.chargingStation.title',\n text: 'b2b.apis.chargingStation.text',\n },\n {\n icon: ImageDistanceMatrix,\n title: 'b2b.apis.distanceMatrix.title',\n text: 'b2b.apis.distanceMatrix.text',\n },\n {\n icon: ImageGeoCoding,\n title: 'b2b.apis.geoCoding.title',\n text: 'b2b.apis.geoCoding.text',\n },\n // {\n // icon: ImageRouteAlong,\n // title: 'b2b.apis.routeAlong.title',\n // text: 'b2b.apis.routeAlong.text',\n // },\n {\n icon: ImageTileService,\n title: 'b2b.apis.tileService.title',\n text: 'b2b.apis.tileService.text',\n },\n];\n","export default __webpack_public_path__ + \"static/media/charge-planner-api.f2232b88.svg\";","export default __webpack_public_path__ + \"static/media/directions-api.9e3085d9.svg\";","export default __webpack_public_path__ + \"static/media/elevation-api.0843f346.svg\";","export default __webpack_public_path__ + \"static/media/charging-station-api.4bf198f1.svg\";","export default __webpack_public_path__ + \"static/media/distance-matrix-api.8b30dbd7.svg\";","export default __webpack_public_path__ + \"static/media/geo-coding-api.a32a987d.svg\";","export default __webpack_public_path__ + \"static/media/tile-service-api.a3c190bb.svg\";","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { Fade } from 'react-awesome-reveal';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst ApisContainer = styled.div`\n width: 100%;\n min-height: 100%;\n padding: 40rem 0 23rem 0;\n background-color: ${getColor('adminBlack')};\n color: ${getColor('primaryContrast')};\n\n @media screen and (max-width: 1150px) {\n padding: 20rem 0;\n }\n`;\n\nconst ContentContainer = styled.div`\n width: 100%;\n max-width: ${getVar('maxWidth')};\n height: 100%;\n margin-inline: auto;\n`;\n\nconst LogoImage = styled.img`\n display: block;\n margin: 0 auto;\n width: 35.1rem;\n height: 5.3rem;\n`;\n\nconst TextContainer = styled.div`\n margin: 12.5rem 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n\n h2,\n p {\n max-width: 58rem;\n }\n\n p {\n color: ${getColor('textGrey')};\n margin-top: 1.5rem;\n margin-bottom: 0;\n }\n`;\n\nconst TilesContainer = styled.div`\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n width: 100%;\n margin-inline: auto;\n max-width: ${getVar('maxWidth')};\n`;\n\nconst Tile = styled(Fade)`\n width: ${getVar('b2bTileWidth')};\n min-height: ${getVar('b2bTileHeight')};\n margin-bottom: calc(${getVar('maxWidth')} - (2 * ${getVar('b2bTileWidth')}));\n border-radius: 2.4rem;\n padding: 5.5rem 4.5rem;\n background-color: ${getColor('blackContrast')};\n\n &:nth-of-type(even) {\n margin-left: calc(${getVar('maxWidth')} - (2 * ${getVar('b2bTileWidth')}));\n }\n\n &.hide {\n display: none;\n }\n\n img {\n width: 12rem;\n height: 12rem;\n display: block;\n margin: 0 auto;\n }\n\n h4 {\n text-align: center;\n margin-top: 6rem;\n margin-bottom: 3rem;\n }\n\n p {\n font-size: 1.8rem;\n text-align: center;\n font-weight: 300;\n }\n\n @media screen and (max-width: 1200px) {\n max-width: calc(50% - 2.5rem);\n margin-bottom: 5rem;\n\n &:nth-of-type(even) {\n margin-left: 5rem;\n }\n }\n\n @media screen and (max-width: 1023px) {\n max-width: 100%;\n\n &:nth-of-type(even) {\n margin-left: 0;\n }\n }\n`;\n\nconst ButtonsContainer = styled.div`\n margin-top: 8rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n\n & > button.MuiButton-root.erButton {\n min-width: 42rem;\n margin-right: 0;\n\n &.noLink {\n margin-bottom: 3.5rem;\n }\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const B2BApisStyles = {\n ApisContainer,\n ContentContainer,\n LogoImage,\n TextContainer,\n TilesContainer,\n Tile,\n ButtonsContainer,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { useState } from 'react';\nimport { Button } from '@material-ui/core';\n\nimport { GetCustomTranslation } from '../../../shared/components/GetCustomTranslation';\nimport { contactFormTopicService } from '../../../services/contact-form-topic.service';\nimport { B2B_APIS_DATA } from './apis.data';\n\nimport { B2BApisStyles } from './B2BApis.styles';\nimport Logo from '../../../../assets/images/logos/full-logo-api-white.svg';\nimport { useAppAnalytics } from 'analytics';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const B2BApis = () => {\n /* ****************************************************** State ****************************************************** */\n const [isAllLoaded, setIsAllLoaded] = useState(false);\n\n const { t } = useTranslation();\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n\n \n \n \n

{t('b2b.apis.sub')}

\n
\n
\n\n {/*\n I decided to go with 'display: none' rather than not rendering at all\n Because this way the pictures/icons will be loaded and ready to go before user clicks 'Load more'\n */}\n \n {B2B_APIS_DATA.map((item, index) => (\n 3 && !isAllLoaded ? 'hide' : ''}\n direction={index % 2 === 0 ? 'left' : 'right'}\n duration={1000}\n triggerOnce={true}\n >\n
\n \"\"\n\n

{t(item.title)}

\n\n

{t(item.text)}

\n
\n \n ))}\n
\n\n \n {!isAllLoaded ? (\n {\n setIsAllLoaded(true);\n trackEvent({\n action: '[B2B Offer - ER APIs Section] Load More Clicked',\n category: 'B2B',\n });\n }}\n >\n {t('b2b.apis.loadMore')}\n \n ) : null}\n\n {\n window.scrollTo(0, document.body.scrollHeight);\n contactFormTopicService.changeTopic('ROUTING_APIS');\n trackEvent({\n action: '[B2B Offer - ER APIs Section] Contact Our Experts Clicked',\n category: 'B2B',\n });\n }}\n >\n {t('b2b.apis.contactOurExperts')}\n \n \n
\n
\n );\n};\n","export default __webpack_public_path__ + \"static/media/b2b-operator-hero.b82e18d7.png\";","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\n\nimport { getColor } from '../../../theme/colors/colors';\n\nimport operatorHeroImage from '../../../../assets/images/b2b/b2b-operator-hero.png';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Styles ****************************************************** */\nconst OperatorContainer = styled.div`\n width: 100%;\n min-height: 100%;\n padding: 0 0 22rem 0;\n background-color: ${getColor('primaryContrast')};\n color: ${getColor('text')};\n`;\n\nconst LandingContainer = styled.div`\n width: 100%;\n min-height: 936px;\n background-image: url(${operatorHeroImage});\n background-position: top right;\n background-repeat: no-repeat;\n background-size: auto 936px;\n padding: 11.5rem calc((100% - ${getVar('maxWidth')}) / 2) 17.5rem\n calc((100% - ${getVar('maxWidth')}) / 2);\n position: relative;\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n height: 100%;\n background: ${getColor('primaryContrast')};\n top: 0;\n left: 0;\n opacity: 0;\n }\n\n @media screen and (max-width: 1350px) {\n &::before {\n opacity: 0.8;\n }\n }\n`;\n\nconst LandingTextContainer = styled.div`\n position: relative;\n width: 100%;\n max-width: 47.5rem;\n\n img {\n width: 32.2rem;\n height: 4.6rem;\n margin-bottom: 12.5rem;\n }\n\n button {\n margin: 0;\n margin-top: 5.6rem;\n }\n\n @media screen and (max-width: 1350px) {\n max-width: 70rem;\n }\n\n @media screen and (max-width: 1050px) {\n max-width: ${getVar('maxWidth')};\n }\n`;\n\nconst ContentContainer = styled.div`\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 12.5rem auto 0 auto;\n`;\n\nconst ContentLogo = styled.img`\n display: block;\n margin: 0 auto 12.5rem auto;\n width: 32.2rem;\n height: 4.6rem;\n`;\n\nconst ContentTextContainer = styled.div`\n width: 100%;\n max-width: 55rem;\n text-align: center;\n margin: 0 auto 11rem auto;\n`;\n\nconst TilesContainer = styled.div`\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n width: 100%;\n margin-inline: auto;\n max-width: ${getVar('maxWidth')};\n`;\n\nconst Tile = styled(Fade)`\n width: ${getVar('b2bTileWidth')};\n min-height: 35rem;\n //TODO: Unfinished Prod\n /* min-height: ${getVar('b2bTileHeight')}; */\n margin-bottom: calc(${getVar('maxWidth')} - (2 * ${getVar('b2bTileWidth')}));\n border-radius: 2.4rem;\n padding: 5.5rem 4.5rem;\n background-color: ${getColor('whiteContrast')};\n\n &:nth-of-type(even) {\n margin-left: calc(${getVar('maxWidth')} - (2 * ${getVar('b2bTileWidth')}));\n }\n\n &.hide {\n display: none;\n }\n\n img {\n width: 12rem;\n height: 12rem;\n display: block;\n margin: 0 auto;\n }\n\n h4 {\n text-align: center;\n margin-top: 6rem;\n margin-bottom: 3rem;\n //TODO\n max-width: 28rem;\n margin-inline: auto;\n }\n\n p {\n font-size: 1.8rem;\n text-align: center;\n font-weight: 300;\n }\n\n @media screen and (max-width: 1200px) {\n max-width: calc(50% - 2.5rem);\n margin-bottom: 5rem;\n\n &:nth-of-type(even) {\n margin-left: 5rem;\n }\n }\n\n @media screen and (max-width: 1023px) {\n max-width: 100%;\n\n &:nth-of-type(even) {\n margin-left: 0;\n }\n }\n`;\n\nconst ButtonsContainer = styled.div`\n margin-top: 8rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n\n & > button.MuiButton-root.erButton {\n min-width: 42rem;\n margin-right: 0;\n\n &.noLink {\n margin-bottom: 3.5rem;\n }\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const B2BOperatorStyles = {\n OperatorContainer,\n LandingContainer,\n LandingTextContainer,\n ContentContainer,\n ContentLogo,\n ContentTextContainer,\n TilesContainer,\n Tile,\n ButtonsContainer,\n};\n","export default __webpack_public_path__ + \"static/media/full-logo-challenge-blue.28618bc2.svg\";","/* ****************************************************** Imports ****************************************************** */\nimport ImageReward from '../../../../assets/images/b2b/operator-icons/operator-reward.svg';\nimport ImageFeedback from '../../../../assets/images/b2b/operator-icons/operator-feedback.svg';\nimport ImageQuestion from '../../../../assets/images/b2b/operator-icons/operator-question.svg';\nimport ImageImages from '../../../../assets/images/b2b/operator-icons/operator-image.svg';\n\n/* ****************************************************** Export ****************************************************** */\nexport const B2B_OPERATOR_DATA: {\n icon: string;\n title: string;\n text: string;\n}[] = [\n {\n icon: ImageReward,\n title: 'b2b.operator.reward.title',\n text: 'b2b.operator.reward.text',\n },\n {\n icon: ImageFeedback,\n title: 'b2b.operator.feedback.title',\n text: 'b2b.operator.feedback.text',\n },\n {\n icon: ImageQuestion,\n title: 'b2b.operator.question.title',\n text: 'b2b.operator.question.text',\n },\n {\n icon: ImageImages,\n title: 'b2b.operator.images.title',\n text: 'b2b.operator.images.text',\n },\n];\n","export default __webpack_public_path__ + \"static/media/operator-reward.90eab690.svg\";","export default __webpack_public_path__ + \"static/media/operator-feedback.c65f88f2.svg\";","export default __webpack_public_path__ + \"static/media/operator-question.4659f0b8.svg\";","export default __webpack_public_path__ + \"static/media/operator-image.ffe85d30.svg\";","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@material-ui/core';\n\nimport { GetCustomTranslation } from '../../../shared/components/GetCustomTranslation';\nimport { contactFormTopicService } from '../../../services/contact-form-topic.service';\n\nimport { B2BOperatorStyles } from './B2BOperator.styles';\nimport logoBlue from '../../../../assets/images/logos/full-logo-challenge-blue.svg';\nimport { B2B_OPERATOR_DATA } from './operator.data';\nimport { useAppAnalytics } from 'analytics';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const B2BOperator = () => {\n /* ****************************************************** State ****************************************************** */\n const { t } = useTranslation();\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n \n \"ElectricRoutes\n\n \n

{t('b2b.operator.landing.sub')}

\n\n \n {\n window.scrollTo(0, document.body.scrollHeight);\n contactFormTopicService.changeTopic('OPERATOR_PORTAL');\n trackEvent({\n action: '[B2B Offer - Operator Portal Section] Contact Our Experts Clicked',\n category: 'B2B',\n });\n }}\n >\n {t('b2b.operator.landing.contactOurExperts')}\n \n \n
\n
\n
\n\n \n \n {B2B_OPERATOR_DATA.map((item, index) => (\n \n
\n \"\"\n\n

{t(item.title)}

\n {/*\n //TODO: Unfinished Prod\n */}\n {/*

{t(item.text)}

*/}\n
\n \n ))}\n
\n\n \n {\n window.scrollTo(0, document.body.scrollHeight);\n contactFormTopicService.changeTopic('OPERATOR_PORTAL');\n trackEvent({\n action: '[B2B Offer - Operator Portal Section] Request Access Clicked',\n category: 'B2B',\n });\n }}\n >\n {t('b2b.operator.content.requestAccess')}\n \n \n
\n
\n );\n};\n","export default __webpack_public_path__ + \"static/media/slider-handle.b0186752.svg\";","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { Zoom } from 'react-awesome-reveal';\n\nimport SliderHandle from '../../../../assets/images/b2b/slider-handle.svg';\n\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst WhiteLabelContainer = styled.div`\n width: 100%;\n min-height: 100%;\n padding: 11rem 0 23rem 0;\n background-color: ${getColor('adminBlack')};\n color: ${getColor('primaryContrast')};\n`;\n\nconst ContentContainer = styled.div`\n width: 100%;\n max-width: ${getVar('maxWidth')};\n height: 100%;\n margin-inline: auto;\n`;\n\nconst LogoImage = styled.img`\n display: block;\n margin: 0 auto;\n width: 30.5rem;\n height: 2rem;\n margin-bottom: 11rem;\n`;\n\nconst TextContainer = styled.div`\n margin: 12.5rem auto;\n width: 100%;\n max-width: 65rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n\n h2,\n p {\n max-width: 73.5rem;\n }\n\n p {\n color: ${getColor('textGrey')};\n font-size: 1.8rem;\n margin-top: 1.5rem;\n }\n`;\n\nconst SliderContainer = styled(Zoom)`\n width: 100%;\n height: 68.5rem;\n box-shadow: 0 2.3rem 7rem ${getColor('primaryContrast', 0.15)};\n border-radius: 1.8rem;\n overflow: hidden;\n\n div {\n width: 100%;\n height: 100%;\n }\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n object-position: center;\n }\n\n @media screen and (max-width: 1150px) {\n height: 60rem;\n }\n\n @media screen and (max-width: 1000px) {\n height: 50vw;\n }\n\n @media screen and (max-width: 700px) {\n height: 53vw;\n }\n`;\n\nconst CustomSlider = styled.div`\n position: relative;\n width: 0.6rem !important;\n background-color: ${getColor('primaryContrast')};\n filter: drop-shadow(0 0 1rem ${getColor('text', 0.5)});\n cursor: grab;\n z-index: 2;\n\n &:active {\n cursor: grabbing;\n }\n\n &::before {\n content: '';\n position: absolute;\n z-index: -1;\n top: 50%;\n left: 50%;\n width: 6.4rem;\n height: 6.4rem;\n transform: translate(-50%, -50%);\n background-image: url(${SliderHandle});\n background-position: center;\n background-repeat: no-repeat;\n background-size: 6.4rem 6.4rem;\n }\n`;\n\nconst ButtonsContainer = styled.div`\n width: 100%;\n margin-top: 11rem;\n display: flex;\n align-items: center;\n justify-content: center;\n\n button {\n margin-right: 0;\n margin-bottom: 0;\n }\n`;\n\nconst SliderSwitch = styled.div`\n width: 4.5rem;\n height: 4.5rem;\n border-radius: 50%;\n cursor: pointer;\n background-color: currentColor;\n\n &.middle {\n margin: 0 2rem;\n }\n\n &.active {\n box-shadow: 0 0 2rem 0;\n border: 2px solid ${getColor('primaryContrast')};\n pointer-events: none;\n }\n\n &:hover {\n box-shadow: 0 0 2rem 0;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const B2BWhiteLabelStyles = {\n WhiteLabelContainer,\n ContentContainer,\n LogoImage,\n TextContainer,\n SliderContainer,\n CustomSlider,\n ButtonsContainer,\n SliderSwitch,\n};\n","export default __webpack_public_path__ + \"static/media/full-logo-whitelabel.e59e3c9e.svg\";","export default __webpack_public_path__ + \"static/media/whitelabel-0.bc36a031.png\";","export default __webpack_public_path__ + \"static/media/whitelabel-1.48761f99.png\";","export default __webpack_public_path__ + \"static/media/whitelabel-2.f6588961.png\";","export default __webpack_public_path__ + \"static/media/whitelabel-3.62c16969.png\";","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { useState } from 'react';\nimport TwentyTwenty from 'react-twentytwenty';\nimport { Button } from '@material-ui/core';\n\nimport { contactFormTopicService } from '../../../services/contact-form-topic.service';\n\nimport { B2BWhiteLabelStyles } from './B2BWhiteLabel.styles';\nimport Logo from '../../../../assets/images/logos/full-logo-whitelabel.svg';\nimport Wireframe from '../../../../assets/images/b2b/whitelabel-0.png';\nimport MockBlue from '../../../../assets/images//b2b/whitelabel-1.png';\nimport MockPink from '../../../../assets/images//b2b/whitelabel-2.png';\nimport MockGreen from '../../../../assets/images//b2b/whitelabel-3.png';\nimport { useAppAnalytics } from 'analytics';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const B2BWhiteLabel = () => {\n /* ****************************************************** State ****************************************************** */\n const [sliderPosition, setSliderPosition] = useState(0.5);\n const [sliderImage, setSliderImage] = useState(MockPink);\n\n const { t } = useTranslation();\n\n /* ****************************************************** Logic ****************************************************** */\n const switchImage = (image: string) => {\n setSliderImage(image);\n setSliderPosition(0.5);\n };\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n\n \n \n

{t('b2b.whiteLabel.main')}

\n

{t('b2b.whiteLabel.sub')}

\n
\n
\n\n \n }\n right={\"\"}\n slider={}\n position={sliderPosition}\n onChange={(event: number) => setSliderPosition(event > 0.995 ? 0.995 : event)}\n />\n \n\n \n switchImage(MockBlue)}\n style={{ color: '#33CCFF' }}\n className={sliderImage === MockBlue ? 'active' : ''}\n />\n switchImage(MockPink)}\n style={{ color: '#D76CA2' }}\n className={sliderImage === MockPink ? 'active middle' : 'middle'}\n />\n switchImage(MockGreen)}\n style={{ color: '#01D17B' }}\n className={sliderImage === MockGreen ? 'active' : ''}\n />\n \n\n \n {\n window.scrollTo(0, document.body.scrollHeight);\n contactFormTopicService.changeTopic('WHITE_LABEL');\n trackEvent({\n action: '[B2B Offer - White Label Section] Contact Our Experts Clicked',\n category: 'B2B',\n });\n }}\n >\n {t('b2b.whiteLabel.contactOurExperts')}\n \n \n
\n
\n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { B2BLanding } from './landing/B2BLanding';\nimport { B2BApis } from './apis/B2BApis';\nimport { B2BOperator } from './operator/B2BOperator';\nimport { B2BWhiteLabel } from './white-label/B2BWhiteLabel';\n\n/* ****************************************************** Component ****************************************************** */\nexport const B2BPage = () => {\n /* ****************************************************** Template ****************************************************** */\n return (\n <>\n \n \n \n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { PersonModel } from './person/person.model';\n\n/* ****************************************************** Images ****************************************************** */\n// ---------- Management\n// Project Manager\n// import rafael from '../../../../assets/images/people/rafael.png';\n// import martin from '../../../../assets/images/people/martin.png';\n// import jeanMarc from '../../../../assets/images/people/jeanmarc.png';\n\n// Consultant\n// import sebastian from '../../../../assets/images/people/sebastian.png';\n// import arne from '../../../../assets/images/people/arne.png';\n// import johanna from '../../../../assets/images/people/johanna.png';\n\n// ---------- Engineers\n// Backend Developer\nimport aleksandarBE from '../../../../assets/images/people/aleksandar-be.png';\nimport dusan from '../../../../assets/images/people/dusan.png';\nimport kristina from '../../../../assets/images/people/kristina.png';\nimport miljan from '../../../../assets/images/people/miljan.png';\nimport petar from '../../../../assets/images/people/petar.png';\nimport stefan from '../../../../assets/images/people/stefan.png';\n\n// Frontend Developer\nimport jovanaFE from '../../../../assets/images/people/jovana-fe.png';\nimport joakim from '../../../../assets/images/people/joakim.png';\nimport nenad from '../../../../assets/images/people/nenad.png';\nimport milijan from '../../../../assets/images/people/milijan.png';\n\n// Mobile Developer\nimport alexandru from '../../../../assets/images/people/alexandru.png';\nimport bogdan from '../../../../assets/images/people/bogdan.png';\nimport cristina from '../../../../assets/images/people/cristina.png';\nimport norbert from '../../../../assets/images/people/norbert.png';\nimport roxana from '../../../../assets/images/people/roxana.png';\nimport vasile from '../../../../assets/images/people/vasile.png';\nimport veronica from '../../../../assets/images/people/veronica.png';\n\n// DevOps\n// import djordje from '../../../../assets/images/people/djordje.png';\nimport gojko from '../../../../assets/images/people/gojko.png';\nimport milos from '../../../../assets/images/people/milos.png';\n\n// IT Ops\nimport ivanIT from '../../../../assets/images/people/ivan-it.png';\nimport jovan from '../../../../assets/images/people/jovan.png';\nimport milan from '../../../../assets/images/people/milan.png';\nimport sofija from '../../../../assets/images/people/sofija.png';\n\n// Quality Assurance\nimport aleksandarQA from '../../../../assets/images/people/aleksandar-qa.png';\nimport jagoda from '../../../../assets/images/people/jagoda.png';\nimport nikola from '../../../../assets/images/people/nikola.png';\nimport tijanaQA from '../../../../assets/images/people/tijana-qa.png';\n\n// SCRUM Master\nimport milena from '../../../../assets/images/people/milena.png';\n\n// ---------- Creative\nimport tijanaUX from '../../../../assets/images/people/tijana-ux.png';\nimport jovanaUX from '../../../../assets/images/people/jovana-ux.png';\nimport ivanUX from '../../../../assets/images/people/ivan-ux.png';\n\n// ----------Support\nimport marina from '../../../../assets/images/people/marina.png';\nimport ivona from '../../../../assets/images/people/ivona.png';\nimport elena from '../../../../assets/images/people/elena.png';\n\n/* ****************************************************** Model ****************************************************** */\ninterface PeopleModel {\n management: PersonModel[];\n engineers: PersonModel[];\n creative: PersonModel[];\n support: PersonModel[];\n}\n\n/* ****************************************************** Data ****************************************************** */\nexport const PEOPLE: PeopleModel = {\n management: [\n // Project Manager\n // {\n // name: 'Rafael',\n // job: 'PM',\n // image: rafael,\n // },\n // {\n // name: 'Martin',\n // job: 'PM',\n // image: martin,\n // },\n // {\n // name: 'Jean Marc',\n // job: 'PM',\n // image: jeanMarc,\n // },\n // Consultant\n // {\n // name: 'Sebastian',\n // job: 'CONSULTANT',\n // image: sebastian,\n // },\n // {\n // name: 'Arne',\n // job: 'CONSULTANT',\n // image: arne,\n // },\n // {\n // name: 'Johanna',\n // job: 'CONSULTANT',\n // image: false,\n // },\n ],\n engineers: [\n // Backend Developer\n {\n name: 'Aleksandar',\n job: 'BE',\n image: aleksandarBE,\n },\n {\n name: 'Dušan',\n job: 'BE',\n image: dusan,\n },\n {\n name: 'Kristina',\n job: 'BE',\n image: kristina,\n },\n {\n name: 'Miljan',\n job: 'BE',\n image: miljan,\n },\n {\n name: 'Petar',\n job: 'BE',\n image: petar,\n },\n {\n name: 'Stefan',\n job: 'BE',\n image: stefan,\n },\n // Frontend Developer\n {\n name: 'Jovana',\n job: 'FE',\n image: jovanaFE,\n },\n {\n name: 'Joakim',\n job: 'FE',\n image: joakim,\n },\n {\n name: 'Nenad',\n job: 'FE',\n image: nenad,\n },\n {\n name: 'Milijan',\n job: 'FE',\n image: milijan,\n },\n // Mobile Developer\n {\n name: 'Alexandru',\n job: 'MOBILE',\n image: alexandru,\n },\n {\n name: 'Bogdan',\n job: 'MOBILE',\n image: bogdan,\n },\n {\n name: 'Cristina',\n job: 'MOBILE',\n image: cristina,\n },\n {\n name: 'Norbert',\n job: 'MOBILE',\n image: norbert,\n },\n {\n name: 'Roxana',\n job: 'MOBILE',\n image: roxana,\n },\n {\n name: 'Vasile',\n job: 'MOBILE',\n image: vasile,\n },\n {\n name: 'Veronica',\n job: 'MOBILE',\n image: veronica,\n },\n // DevOps\n {\n name: 'Đorđe',\n job: 'DEVOPS',\n image: false,\n },\n {\n name: 'Gojko',\n job: 'DEVOPS',\n image: gojko,\n },\n {\n name: 'Miloš',\n job: 'DEVOPS',\n image: milos,\n },\n // IT Ops\n {\n name: 'Ivan',\n job: 'ITOPS',\n image: ivanIT,\n },\n {\n name: 'Jovan',\n job: 'ITOPS',\n image: jovan,\n },\n {\n name: 'Milan',\n job: 'ITOPS',\n image: milan,\n },\n {\n name: 'Sofija',\n job: 'ITOPS',\n image: sofija,\n },\n // Quality Assurance\n {\n name: 'Aleksandar',\n job: 'QA',\n image: aleksandarQA,\n },\n {\n name: 'Jagoda',\n job: 'QA',\n image: jagoda,\n },\n {\n name: 'Nikola',\n job: 'QA',\n image: nikola,\n },\n {\n name: 'Tijana',\n job: 'QA',\n image: tijanaQA,\n },\n //SCRUM Master\n {\n name: 'Milena',\n job: 'SCRUM',\n image: milena,\n },\n ],\n creative: [\n {\n name: 'Tijana',\n job: 'UX',\n image: tijanaUX,\n },\n {\n name: 'Jovana',\n job: 'UX',\n image: jovanaUX,\n },\n {\n name: 'Ivan',\n job: 'UX',\n image: ivanUX,\n },\n ],\n support: [\n {\n name: 'Marina',\n job: 'SUPPORT',\n image: marina,\n },\n {\n name: 'Ivona',\n job: 'SUPPORT',\n image: ivona,\n },\n {\n name: 'Elena',\n job: 'SUPPORT',\n image: elena,\n },\n ],\n};\n","export default __webpack_public_path__ + \"static/media/aleksandar-be.213b318f.png\";","export default __webpack_public_path__ + \"static/media/dusan.8e162463.png\";","export default __webpack_public_path__ + \"static/media/kristina.c24f60d1.png\";","export default __webpack_public_path__ + \"static/media/miljan.b92dc112.png\";","export default __webpack_public_path__ + \"static/media/petar.f1ca66d9.png\";","export default __webpack_public_path__ + \"static/media/stefan.31f1a034.png\";","export default __webpack_public_path__ + \"static/media/jovana-fe.9def876a.png\";","export default __webpack_public_path__ + \"static/media/joakim.9a19c528.png\";","export default __webpack_public_path__ + \"static/media/nenad.7930a41a.png\";","export default __webpack_public_path__ + \"static/media/milijan.5f7f82f4.png\";","export default __webpack_public_path__ + \"static/media/alexandru.c34613d0.png\";","export default __webpack_public_path__ + \"static/media/bogdan.5454b0ff.png\";","export default __webpack_public_path__ + \"static/media/cristina.88e97e35.png\";","export default __webpack_public_path__ + \"static/media/norbert.e345bfbb.png\";","export default __webpack_public_path__ + \"static/media/roxana.e70f5340.png\";","export default __webpack_public_path__ + \"static/media/vasile.fde74fc6.png\";","export default __webpack_public_path__ + \"static/media/veronica.e202e1bc.png\";","export default __webpack_public_path__ + \"static/media/gojko.04386bda.png\";","export default __webpack_public_path__ + \"static/media/milos.d23de72e.png\";","export default __webpack_public_path__ + \"static/media/ivan-it.7fdd2c0c.png\";","export default __webpack_public_path__ + \"static/media/jovan.fd5407e0.png\";","export default __webpack_public_path__ + \"static/media/milan.a7ffaac4.png\";","export default __webpack_public_path__ + \"static/media/sofija.eb21776e.png\";","export default __webpack_public_path__ + \"static/media/aleksandar-qa.93451aa5.png\";","export default __webpack_public_path__ + \"static/media/jagoda.58fbb9d5.png\";","export default __webpack_public_path__ + \"static/media/nikola.887b5219.png\";","export default __webpack_public_path__ + \"static/media/tijana-qa.32db2761.png\";","export default __webpack_public_path__ + \"static/media/milena.a35eabca.png\";","export default __webpack_public_path__ + \"static/media/tijana-ux.3f8bba8a.png\";","export default __webpack_public_path__ + \"static/media/jovana-ux.2f0d665e.png\";","export default __webpack_public_path__ + \"static/media/ivan-ux.c9e52257.png\";","export default __webpack_public_path__ + \"static/media/marina.334c4e97.png\";","export default __webpack_public_path__ + \"static/media/ivona.be7b4a55.png\";","export default __webpack_public_path__ + \"static/media/elena.dfe3edab.png\";","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst LandingContainer = styled.div`\n width: 100%;\n height: 80%;\n padding: ${getVar('headerHeight')} 0 13rem 0;\n background-color: ${getColor('primary')};\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst Text = styled.h2`\n color: ${getColor('primaryContrast')};\n text-align: center;\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const AboutLandingStyles = {\n LandingContainer,\n Text,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { Fade } from 'react-awesome-reveal';\nimport { useTranslation } from 'react-i18next';\nimport { PEOPLE } from '../people/people.data';\nimport { AboutLandingStyles } from './AboutLanding.styles';\n\n/* ****************************************************** Component ****************************************************** */\nexport const AboutLanding = () => {\n /* ****************************************************** State ****************************************************** */\n const { t } = useTranslation();\n\n const countPeople = () => {\n return (\n PEOPLE.management.length +\n PEOPLE.engineers.length +\n PEOPLE.creative.length +\n PEOPLE.support.length +\n ' '\n );\n };\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n {t('about.landing', { numberOfPeople: countPeople() })}\n \n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst PeopleContainer = styled.div`\n width: 100%;\n padding: 13rem 0;\n background-color: ${getColor('background')};\n`;\n\nconst Content = styled.div`\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n color: ${getColor('adminBlack')};\n\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n flex-wrap: wrap;\n`;\n\nconst PeopleGroupContainer = styled.div`\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n\n &:not(:last-of-type) {\n margin-bottom: 9.5rem;\n }\n`;\n\nconst DescriptionText = styled.p`\n font-size: 1.8rem;\n font-weight: 400;\n margin-bottom: 5rem;\n margin-top: 1rem;\n width: 100%;\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const AboutPeopleStyles = {\n PeopleContainer,\n Content,\n PeopleGroupContainer,\n DescriptionText,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { getColor } from '../../../../theme/colors/colors';\n\n/* ****************************************************** Styles ****************************************************** */\nconst PersonContainer = styled.div`\n margin-bottom: 4rem;\n\n &:not(:last-of-type) {\n margin-right: 3.3rem;\n\n @media screen and (max-width: 516px) {\n margin-right: 1.5rem;\n }\n }\n`;\n\nconst PersonImageContainer = styled.div`\n width: 15rem;\n height: 19.4rem;\n margin-bottom: 1rem;\n background-color: ${getColor('textGrey', 0.2)};\n border-radius: 1.4rem;\n box-shadow: 0 0.4rem 1.2rem ${getColor('adminBlack', 0.12)};\n`;\n\nconst PersonImage = styled.img`\n width: 15rem;\n height: 19.4rem;\n`;\n\nconst PersonName = styled.p`\n font-size: 1.8rem;\n font-weight: 700;\n`;\n\nconst PersonJob = styled.p`\n font-size: 1.2rem;\n font-weight: 400;\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const PersonStyles = {\n PersonContainer,\n PersonImageContainer,\n PersonImage,\n PersonName,\n PersonJob,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { PersonModel } from './person.model';\nimport { PersonStyles } from './Person.styles';\n\n/* ****************************************************** Component ****************************************************** */\nexport const Person = (person: PersonModel) => {\n /* ****************************************************** State ****************************************************** */\n const { t } = useTranslation();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n {person.image ? (\n \n ) : null}\n \n {person.name}\n \n {t('about.people.' + person.job)}\n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { AboutPeopleStyles } from './AboutPeople.styles';\nimport { PEOPLE } from './people.data';\nimport { Person } from './person/Person';\n\n/* ****************************************************** Component ****************************************************** */\nexport const AboutPeople = () => {\n /* ****************************************************** State ****************************************************** */\n const { t } = useTranslation();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n {/* \n

{t('about.management.title')}

\n \n {t('about.management.text')}\n \n\n {PEOPLE.management.map((person) => (\n \n ))}\n
*/}\n\n \n

{t('about.engineers.title')}

\n \n {t('about.engineers.text')}\n \n\n {PEOPLE.engineers.map((person) => (\n \n ))}\n
\n\n \n

{t('about.creative.title')}

\n \n {t('about.creative.text')}\n \n\n {PEOPLE.creative.map((person) => (\n \n ))}\n
\n\n \n

{t('about.support.title')}

\n \n {t('about.support.text')}\n \n\n {PEOPLE.support.map((person) => (\n \n ))}\n
\n
\n
\n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { AboutLanding } from './landing/AboutLanding';\nimport { AboutPeople } from './people/AboutPeople';\n\n/* ****************************************************** Component ****************************************************** */\nexport const AboutPage = () => {\n /* ****************************************************** Template ****************************************************** */\n return (\n <>\n \n \n \n );\n};\n","import { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport const ScrollToTop = () => {\n const { pathname, hash } = useLocation();\n\n useEffect(() => {\n if (hash && pathname) {\n // window.scrollTo(0, 0);\n\n setTimeout(() => {\n document.querySelector(hash)?.scrollIntoView(true);\n }, 100);\n // 1000\n\n return;\n }\n\n window.scrollTo(0, 0);\n }, [pathname, hash]);\n\n return null;\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst FooterContainer = styled.div`\n position: relative;\n width: 100%;\n padding: ${getVar('footerVerticalSpacing')} 0;\n background-color: ${getColor('primary')};\n color: ${getColor('primaryContrast')};\n overflow: hidden;\n\n & *:not(.erButton) {\n color: ${getColor('primaryContrast')};\n }\n\n & .erButton * {\n color: inherit !important;\n }\n\n &.white {\n background-color: ${getColor('primaryContrast')};\n color: ${getColor('adminBlack')};\n\n & *:not(.erButton) {\n color: ${getColor('adminBlack')};\n }\n\n & .erButton > span {\n color: inherit;\n }\n }\n\n &.black {\n background-color: ${getColor('adminBlack')};\n }\n\n @media screen and (max-width: 1150px) {\n padding: ${getVar('footerVerticalSpacing')} 0 20rem 0;\n }\n\n @media screen and (max-width: 499px) {\n padding-bottom: 25rem;\n }\n`;\n\nconst BackgroundLogoImage = styled.img`\n position: absolute;\n top: 0;\n right: 0;\n opacity: 0.1;\n //For responsive > FullHD\n height: 106rem;\n //For responsive > FullHD\n\n &.no-opacity {\n opacity: 1;\n }\n`;\n\nconst Heading = styled.p`\n margin-left: calc((100% - ${getVar('maxWidth')}) / 2);\n margin-bottom: 6rem;\n position: relative;\n width: 100%;\n max-width: ${getVar('maxWidth')};\n`;\n\nconst ContentContainer = styled.div`\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n display: flex;\n align-items: normal;\n justify-content: space-between;\n position: relative;\n\n @media screen and (max-width: 1150px) {\n flex-direction: column-reverse;\n }\n`;\n\nconst FormContainer = styled.div`\n width: ${getVar('contactFormWidth')};\n\n @media screen and (max-width: 1150px) {\n width: 100%;\n max-width: 70rem;\n margin-top: 10rem;\n }\n`;\n\nconst LinksContainer = styled.div`\n display: flex;\n width: calc(100% - ${getVar('contactFormWidth')} - 12.5rem);\n\n @media screen and (max-width: 1150px) {\n width: 100%;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const FooterStyles = {\n FooterContainer,\n BackgroundLogoImage,\n Heading,\n ContentContainer,\n FormContainer,\n LinksContainer,\n};\n","export default __webpack_public_path__ + \"static/media/footer-logo-background.1e4939dc.svg\";","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { Button } from '@material-ui/core';\n\nimport { getColor } from '../../../../theme/colors/colors';\n\n/* ****************************************************** Styles ****************************************************** */\nconst CustomInput = styled.div`\n position: relative;\n width: 100%;\n background: ${getColor('whiteContrast', 0.1)};\n padding: 0.5rem 2.5rem;\n border-radius: 1.8rem;\n height: 7.2rem;\n display: flex;\n align-items: center;\n margin-bottom: 3.2rem;\n color: ${getColor('primaryContrast')};\n\n & * {\n color: ${getColor('primaryContrast')} !important;\n }\n\n &.blackText {\n background: ${getColor('whiteContrast')};\n color: ${getColor('adminBlack')};\n\n & *:not(.errorMessage) {\n color: ${getColor('adminBlack')} !important;\n }\n }\n\n &.textarea {\n height: 28rem;\n margin-bottom: 0;\n\n & .MuiFormControl-marginDense.customInput .MuiInput-formControl,\n & textarea {\n height: calc(28rem - 9rem) !important;\n font-size: 2rem !important;\n }\n\n & .MuiFormControl-marginDense.customInput .MuiInput-formControl {\n margin-top: 3rem;\n }\n\n & .MuiFormControl-marginDense.customInput .MuiInputLabel-marginDense {\n font-weight: 700;\n font-size: 2rem;\n }\n }\n\n &:focus-within {\n box-shadow: inset 0 0 0 0.1rem currentColor;\n }\n\n &.error {\n box-shadow: inset 0 0 0 0.2rem ${getColor('error')};\n\n .MuiFormControl-marginDense.customInput .MuiInputLabel-marginDense {\n color: ${getColor('error')} !important;\n }\n }\n`;\n\nconst CustomSelectInput = styled(CustomInput)`\n padding: 0.5rem 0;\n`;\n\nconst ErrorMessage = styled.div`\n &.errorMessage {\n position: absolute;\n color: ${getColor('error')} !important;\n left: 2.5rem;\n bottom: -2rem;\n font-size: 1.2rem;\n }\n`;\n\nconst ButtonContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n margin-top: 3.2rem;\n`;\n\nconst SendButton = styled(Button)`\n &.erButton.noLink {\n min-width: 18.5rem !important;\n margin: 0;\n }\n`;\n\nconst SentMessage = styled.span`\n display: flex;\n\n & > svg {\n margin-left: 1.5rem;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const ContactFormStyles = {\n CustomInput,\n CustomSelectInput,\n ErrorMessage,\n ButtonContainer,\n SendButton,\n SentMessage,\n};\n","import Axios from 'axios-observable';\nimport { environment } from '../environment';\n\nconst createApi = (baseURL: string) => {\n return Axios.create({\n baseURL,\n headers: { 'x-api-key': environment.xApiKey },\n });\n};\n\nexport const applicationService = createApi(\n environment.services.applicationService\n);\n","/* ****************************************************** Imports ****************************************************** */\nimport { AxiosObservable } from 'axios-observable/dist/axios-observable.interface';\nimport { axiosData } from '../../../api/axios-data';\nimport { applicationService } from '../../../api/api';\n\nimport { ContactFormModel } from './../../shared/components/footer/contact-form/contact-form.model';\n\n/* ****************************************************** Service ****************************************************** */\nexport const contactSupport = (body: ContactFormModel): Promise => {\n return axiosData((): AxiosObservable => {\n return applicationService.post('/support', body);\n })().toPromise();\n};\n","import { AxiosObservable } from 'axios-observable/dist/axios-observable.interface';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { AxiosResponse } from 'axios';\n\ninterface AxiosFetcher {\n (...args: any[]): AxiosObservable;\n}\n\ninterface DataFetcher {\n (...args: any[]): Observable;\n}\n\nexport function axiosData(axiosFetcher: AxiosFetcher): DataFetcher {\n return (...params) =>\n axiosFetcher(...params).pipe(\n map((response: AxiosResponse) => response.data)\n );\n}\n","import { Subject, Observable } from 'rxjs';\n\nconst alert = new Subject();\n\nconst showError = (errorTranslation: string): void => {\n alert.next(errorTranslation);\n};\n\nexport const errorService: {\n error: Observable;\n showError(errorTranslation: string): void;\n} = {\n error: alert.asObservable() as Observable,\n showError,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation } from 'react-router';\n\nimport {\n CircularProgress,\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n TextField,\n} from '@material-ui/core';\n\nimport { APP_ROUTES } from '../../../appRoutes';\nimport { ContactFormModel, ContactFormTopicModel } from './contact-form.model';\nimport { ContactFormStyles } from './ContactForm.styles';\nimport CheckRoundedIcon from '@material-ui/icons/CheckRounded';\nimport { contactSupport } from '../../../../services/http/contact-support.service';\nimport { errorService } from '../../../../services/error.service';\nimport { contactFormTopicService } from '../../../../services/contact-form-topic.service';\nimport { useRef } from 'react';\n\n/* ****************************************************** Component ****************************************************** */\nexport const ContactForm = () => {\n /* ****************************************************** State ****************************************************** */\n const [formState, setFormState] = useState({\n fullName: '',\n emailAddress: '',\n emailText: '',\n topic: 'OTHER',\n });\n\n const [formErrors, setFormErrors] = useState({\n fullName: false,\n emailAddress: false,\n emailText: false,\n topic: false,\n });\n\n const [formFieldDirty, setFormFieldDirty] = useState({\n fullName: false,\n emailAddress: false,\n emailText: false,\n });\n\n const [buttonState, setButtonState] = useState({\n sent: false,\n loading: false,\n });\n\n const nameFieldRef = useRef(null);\n\n const { t } = useTranslation();\n\n /* ****************************************************** useLocation() ****************************************************** */\n const location = useLocation();\n\n useEffect(() => {\n resetForm(location.hash === '#contactUs');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [location]);\n\n /* ****************************************************** useEffect() ****************************************************** */\n useEffect(() => {\n const sub = contactFormTopicService.topic.subscribe(\n (topicValue: ContactFormTopicModel) => {\n setFormState({ ...formState, topic: topicValue });\n nameFieldRef.current.focus();\n }\n );\n return () => {\n sub.unsubscribe();\n };\n }, [formState]);\n\n /* ****************************************************** Change handlers ****************************************************** */\n // ------------------- Full Name\n const handleNameChange = (value: string) => {\n checkForFullnameErrors(false, value.trim());\n\n setFormState({ ...formState, fullName: value });\n };\n\n // ------------------- Email Address\n const handleEmailChange = (value: string) => {\n const trimmedValue = value.trim();\n\n checkForEmailAddressErrors(false, trimmedValue);\n\n setFormState({ ...formState, emailAddress: trimmedValue });\n };\n\n // ------------------- Topic\n const handleTopicChange = (value: typeof formState.topic) => {\n setFormState({ ...formState, topic: value });\n };\n\n // ------------------- Email Text\n const handleTextChange = (value: string) => {\n checkForEmailTextErrors(false, value.trim());\n\n setFormState({ ...formState, emailText: value });\n };\n\n // Reset Form\n const resetForm = (didGetNewDropdownValueBeforeReroute: boolean = false) => {\n setFormState({\n fullName: '',\n emailAddress: '',\n emailText: '',\n topic: didGetNewDropdownValueBeforeReroute ? formState.topic : 'OTHER',\n });\n\n setFormErrors({\n fullName: false,\n emailAddress: false,\n emailText: false,\n topic: false,\n });\n\n setFormFieldDirty({\n fullName: false,\n emailAddress: false,\n emailText: false,\n });\n };\n\n /* ****************************************************** Validation handlers ****************************************************** */\n // ------------------- Full Name\n const checkForFullnameErrors = (isBlur: boolean, value?: string) => {\n const fieldValue = value || formState.fullName;\n\n // Check if form field is 'dirty'\n if (!formFieldDirty.fullName && isBlur) {\n setFormFieldDirty({ ...formFieldDirty, fullName: true });\n\n setFormErrors({\n ...formErrors,\n fullName: !fieldValue.trim(),\n });\n\n return;\n }\n\n // Error validation\n setFormErrors({\n ...formErrors,\n fullName: !fieldValue.trim() && formFieldDirty.fullName,\n });\n // Set Form State\n setFormState({ ...formState, fullName: fieldValue });\n };\n\n // ------------------- Email Address\n const checkForEmailAddressErrors = (isBlur: boolean, value?: string) => {\n const fieldValue = value || formState.emailAddress;\n\n const emailRegex = /\\S+@\\S+\\.\\S+/;\n\n // Check if form field is 'dirty'\n if (!formFieldDirty.emailAddress && isBlur) {\n setFormFieldDirty({ ...formFieldDirty, emailAddress: true });\n\n setFormErrors({\n ...formErrors,\n emailAddress: !emailRegex.test(fieldValue),\n });\n\n return;\n }\n\n // Error validation\n setFormErrors({\n ...formErrors,\n emailAddress: !emailRegex.test(fieldValue) && formFieldDirty.emailAddress,\n });\n // Set Form State\n setFormState({ ...formState, emailAddress: fieldValue });\n };\n\n // ------------------- Email Text\n const checkForEmailTextErrors = (isBlur: boolean, value?: string) => {\n const fieldValue = value || formState.emailText;\n\n // Check if form field is 'dirty'\n if (!formFieldDirty.emailText && isBlur) {\n setFormFieldDirty({ ...formFieldDirty, emailText: true });\n // Error validation\n setFormErrors({\n ...formErrors,\n emailText: !fieldValue.trim(),\n });\n\n return;\n }\n\n // Error validation\n setFormErrors({\n ...formErrors,\n emailText: !fieldValue.trim() && formFieldDirty.emailText,\n });\n // Set Form State\n setFormState({ ...formState, emailText: fieldValue });\n };\n\n // Checks if any value inside of an object is false, null, ...\n // Needed for 'Submit' button\n const anyFalse = (object: any) => {\n for (var property in object) {\n if (!object[property]) {\n return true;\n }\n }\n\n return false;\n };\n\n const anyTrue = (object: any) => {\n for (var property in object) {\n if (object[property]) {\n return true;\n }\n }\n\n return false;\n };\n\n /* ****************************************************** Style logic ****************************************************** */\n const getClasses = (starterClasses = '') => {\n const classes = [starterClasses];\n\n switch (location.pathname) {\n case APP_ROUTES.apps:\n classes.push('black');\n break;\n case APP_ROUTES.b2b:\n classes.push('white');\n break;\n }\n\n return classes.join(' ');\n };\n\n const getCustomInputClasses = (\n fieldName: 'fullName' | 'emailAddress' | 'emailText' | 'topic',\n starterClasses = ''\n ) => {\n const classes = [starterClasses];\n\n if (location.pathname === APP_ROUTES.apps) {\n classes.push('blackText');\n }\n\n if (formErrors[fieldName]) {\n classes.push('error');\n }\n\n return classes.join(' ');\n };\n\n const renderButtonContent = () => {\n if (buttonState.loading) {\n return ;\n }\n\n if (buttonState.sent) {\n return (\n \n {t('contactForm.sent')} \n \n );\n }\n\n return t('contactForm.submit');\n };\n\n /* ****************************************************** API Call ****************************************************** */\n const sendContactForm = async () => {\n setButtonState({ ...buttonState, loading: true });\n\n try {\n await contactSupport(formState);\n\n // Close loader and show 'Message sent'\n setButtonState({ sent: true, loading: false });\n\n // Reset form\n resetForm();\n\n // Remove 'Message sent'\n setTimeout(() => {\n setButtonState({ sent: false, loading: false });\n }, 4000);\n } catch (error) {\n setButtonState({ sent: false, loading: false });\n\n errorService.showError('contactForm.error.backend');\n\n // setButtonState({ sent: true, loading: false });\n // setTimeout(() => {\n // setButtonState({ sent: false, loading: false });\n // }, 40000);\n // resetForm();\n }\n };\n\n /* ****************************************************** Template ****************************************************** */\n return (\n
\n {/* --------------------- NAME --------------------- */}\n \n handleNameChange(event.target.value)}\n onBlur={() => checkForFullnameErrors(true)}\n />\n\n {formErrors.fullName ? (\n \n {t('contactForm.error.name')}\n \n ) : null}\n \n\n {/* --------------------- E-MAIL --------------------- */}\n \n handleEmailChange(event.target.value)}\n onBlur={() => checkForEmailAddressErrors(true)}\n />\n\n {formErrors.emailAddress ? (\n \n {formState.emailAddress.trim()\n ? t('contactForm.error.mail.format')\n : t('contactForm.error.mail.required')}\n \n ) : null}\n \n\n {/* --------------------- TOPIC --------------------- */}\n \n \n {t('contactForm.topic')}\n handleTopicChange(event.target.value)}\n MenuProps={{\n anchorOrigin: {\n vertical: 'bottom',\n horizontal: 'left',\n },\n transformOrigin: {\n vertical: 'top',\n horizontal: 'left',\n },\n getContentAnchorEl: null,\n className: getClasses('customSelectMenu'),\n }}\n >\n {t('ROUTING_APIS')}\n \n {t('OPERATOR_PORTAL')}\n \n {t('WHITE_LABEL')}\n {/*\n //TODO: Unfinished Prod\n */}\n {/* {t('SDK')} */}\n {t('OTHER')}\n \n \n \n\n {/* --------------------- TEXT --------------------- */}\n \n handleTextChange(event.target.value)}\n onBlur={() => checkForEmailTextErrors(true)}\n multiline\n />\n\n {formErrors.emailText ? (\n \n {t('contactForm.error.text')}\n \n ) : null}\n \n\n {/* --------------------- SUBMIT --------------------- */}\n \n sendContactForm()}\n >\n {renderButtonContent()}\n \n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { NavLink } from 'react-router-dom';\n\n/* ****************************************************** Styles ****************************************************** */\nconst NavigationContainer = styled.div`\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n flex-direction: column;\n flex-wrap: wrap;\n padding-top: 2rem;\n width: 100%;\n`;\n\nconst LinksContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n`;\n\nconst MenuContainer = styled.div`\n width: 50%;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n\n &.legal {\n margin-top: 6rem;\n }\n`;\n\nconst MenuHeading = styled.p`\n font-weight: 700;\n font-size: 2rem;\n`;\n\nconst StyledLink = styled.a`\n font-weight: 400;\n font-size: 1.6rem;\n margin-top: 3.5rem;\n display: block;\n\n &[href]:hover {\n text-decoration: underline;\n }\n`;\n\nconst MenuLink = styled(NavLink)`\n font-weight: 400;\n font-size: 1.6rem;\n margin-top: 3.5rem;\n display: block;\n\n &[href]:hover {\n text-decoration: underline;\n }\n`;\n\nconst LanguageContainer = styled.div`\n margin-top: 2.5rem;\n\n & > div {\n margin-left: -1rem;\n justify-content: flex-end;\n\n /* & > button.MuiIconButton-root {\n font-size: 1.6rem;\n font-weight: 400;\n } */\n }\n`;\n\nconst CopyrightContainer = styled.div`\n width: 100%;\n display: flex;\n align-items: center;\n margin-top: 6rem;\n\n @media screen and (max-width: 1150px) {\n position: absolute;\n bottom: -15rem;\n }\n\n @media screen and (max-width: 499px) {\n flex-wrap: wrap;\n bottom: -20rem;\n }\n`;\n\nconst CopyrightText = styled.p`\n font-size: 1.6rem;\n font-weight: 400;\n opacity: 0.4;\n width: 50%;\n\n & > span {\n display: block;\n width: 20rem;\n }\n\n @media screen and (max-width: 1150px) {\n width: 100%;\n }\n\n @media screen and (max-width: 499px) {\n & > span {\n width: 100%;\n margin-bottom: 3rem;\n }\n }\n`;\n\nconst LogoImage = styled.img`\n //For responsive > FullHD\n height: 5.2rem;\n //For responsive > FullHD\n\n &.white {\n filter: brightness(0) invert(1);\n }\n\n @media screen and (max-width: 499px) {\n height: 4.2rem;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const FooterNavigationStyles = {\n NavigationContainer,\n LinksContainer,\n MenuContainer,\n MenuHeading,\n StyledLink,\n MenuLink,\n LanguageContainer,\n CopyrightContainer,\n CopyrightText,\n LogoImage,\n};\n","export default __webpack_public_path__ + \"static/media/full-logo-blue.f93046e2.svg\";","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { Button, MenuItem } from '@material-ui/core';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst SwitcherContainer = styled.div`\n display: flex;\n align-items: center;\n flex-direction: row-reverse;\n width: 100%;\n max-width: ${getVar('maxWidth')};\n`;\n\nconst StyledButton = styled(Button)`\n &.MuiButton-root {\n font-size: 1.4rem;\n font-weight: 800;\n color: currentColor;\n text-transform: none;\n border-radius: 1rem;\n padding: 0.8rem 1.2rem;\n }\n`;\n\nconst StyledMenuItem = styled(MenuItem)`\n &.active {\n color: ${getColor('primary')};\n font-weight: bold;\n pointer-events: none;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const LanguageSwitcherStyles = {\n SwitcherContainer,\n StyledButton,\n StyledMenuItem,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useContext } from 'react';\nimport { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router';\nimport { Menu } from '@material-ui/core';\n\nimport { APP_ROUTES } from '../../appRoutes';\n\nimport { LANGUAGES, LanguageModel } from './language.data';\nimport { LanguageContext } from '../../../language-context';\nimport { LanguageSwitcherStyles } from './LanguageSwitcher.styles';\n\n/* ****************************************************** Component ****************************************************** */\nexport const LanguageSwitcher = (props: any) => {\n /* ****************************************************** State ****************************************************** */\n const { i18n } = useTranslation();\n\n const { languageContextValue, setLanguageContextValue } =\n useContext(LanguageContext);\n\n const [lang, setLang] = useState(languageContextValue);\n const [anchorEl, setAnchorEl] = useState(null);\n\n const { t } = useTranslation();\n\n /* ****************************************************** useEffect() ****************************************************** */\n useEffect(() => {\n setLang(languageContextValue);\n }, [languageContextValue]);\n\n /* ****************************************************** useHistory() ****************************************************** */\n const history = useHistory();\n\n const navigateToLegalPages = (languageString: LanguageModel) => {\n const path = history.location.pathname;\n\n if (\n path.indexOf(APP_ROUTES.imprint) !== -1 ||\n path.indexOf(APP_ROUTES.privacyPolicy) !== -1\n ) {\n history.push(\n path.split('-')[0] + '-' + (languageString === 'de' ? 'de' : 'en')\n );\n }\n };\n\n /* ****************************************************** Logic ****************************************************** */\n const switchLanguage = (value: LanguageModel) => {\n setLang(value);\n i18n.changeLanguage(value);\n setLanguageContextValue(value);\n navigateToLegalPages(value);\n\n setAnchorEl(null);\n\n props.languageChanged(value);\n };\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n {\n setAnchorEl(event.currentTarget);\n }}\n size=\"medium\"\n >\n {t(`language.${lang}`)}\n \n\n {\n setAnchorEl(null);\n }}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n >\n {(LANGUAGES as LanguageModel[]).sort().map((lng) => (\n switchLanguage(lng)}\n className={lang === lng ? 'active' : ''}\n >\n {t(`language.${lng}`)}\n \n ))}\n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { FooterNavigationStyles } from './FooterNavigation.styles';\n\nimport blueLogo from '../../../../../assets/images/logos/full-logo-blue.svg';\nimport { APP_ROUTES } from '../../../appRoutes';\nimport { useLocation } from 'react-router';\nimport { useEffect } from 'react';\nimport { LanguageSwitcher } from '../../language-switcher/LanguageSwitcher';\nimport { useAppAnalytics } from 'analytics';\nimport { LanguageModel } from '../../language-switcher/language.data';\n\n/* ****************************************************** Component ****************************************************** */\nexport const FooterNavigation = () => {\n /* ****************************************************** State ****************************************************** */\n const { t, i18n } = useTranslation();\n\n const location = useLocation();\n\n /* ****************************************************** useEffect() ****************************************************** */\n useEffect(() => {}, [location]);\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n {/* --------------------- Mobile & Web App --------------------- */}\n \n \n {t('footer.menu.mobileAndWeb')}\n \n\n \n trackEvent({\n action: '[Footer] Mobile App Clicked',\n category: 'General',\n })\n }\n >\n {t('footer.menu.mobileApp')}\n \n\n \n trackEvent({\n action: '[Footer] Web App Clicked',\n category: 'General',\n })\n }\n >\n {t('footer.menu.webApp')}\n \n \n\n {/* --------------------- Operator Portal --------------------- */}\n \n \n {t('footer.menu.operatorPortal')}\n \n\n \n trackEvent({\n action: '[Footer] Operator Portal Clicked',\n category: 'General',\n })\n }\n >\n {t('footer.menu.challenge')}\n \n\n \n trackEvent({\n action: '[Footer] API Portal Clicked',\n category: 'General',\n })\n }\n >\n {t('footer.menu.api')}\n \n \n\n {/* --------------------- Legal --------------------- */}\n \n \n trackEvent({\n action: '[Footer] Data Policy Clicked',\n category: 'General',\n })\n }\n >\n {t('footer.menu.dataPolicy')}\n \n\n \n trackEvent({\n action: '[Footer] Imprint Clicked',\n category: 'General',\n })\n }\n >\n {t('footer.menu.imprint')}\n \n\n \n {t('footer.menu.pressKit')}\n \n \n\n {/* --------------------- Language --------------------- */}\n \n \n \n trackEvent({\n action: 'Language changed',\n name: JSON.stringify({ lang }),\n category: 'General',\n })\n }\n />\n \n \n \n\n {/* --------------------- Copyright --------------------- */}\n \n \n {t('footer.menu.copyright')}\n \n\n \n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation } from 'react-router';\n\nimport { FooterStyles } from './Footer.styles';\n\nimport backgroundLogo from '../../../../assets/images/logos/footer-logo-background.svg';\nimport { ContactForm } from './contact-form/ContactForm';\nimport { APP_ROUTES } from '../../appRoutes';\nimport { FooterNavigation } from './footer-navigation/FooterNavigation';\nimport { Fade } from 'react-awesome-reveal';\n\n/* ****************************************************** Component ****************************************************** */\nexport const Footer = () => {\n /* ****************************************************** State ****************************************************** */\n const [footerColorClass, setFooterColorClass] = useState('');\n\n const { t } = useTranslation();\n\n const location = useLocation();\n\n /* ****************************************************** useEffect() ****************************************************** */\n useEffect(() => {\n switch (location.pathname) {\n case APP_ROUTES.apps:\n setFooterColorClass('white');\n break;\n case APP_ROUTES.b2b:\n setFooterColorClass('black');\n break;\n default:\n setFooterColorClass('');\n }\n }, [location]);\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n\n \n \n {t('footer.heading')}\n \n \n\n \n \n \n \n \n \n \n \n \n );\n};\n","import styled from '@emotion/styled';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport { getColor } from '../../../theme/colors/colors';\nimport { Button } from '@material-ui/core';\n\nconst ErrorSnackbar = styled(Snackbar)`\n background: ${getColor('error')};\n border-radius: 0.8rem;\n max-width: 50rem;\n`;\n\nconst StyledErrorSnackbarContent = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst StyledMessage = styled.div`\n color: ${getColor('errorContrast')};\n padding: 1.5rem 3rem;\n font-weight: 400;\n font-size: 1.4rem;\n`;\n\nconst StyledButton = styled(Button)`\n height: 6.4rem;\n color: ${getColor('errorContrast')} !important;\n`;\n\nexport const StyledErrorSnackbar = {\n ErrorSnackbar,\n StyledErrorSnackbarContent,\n StyledMessage,\n StyledButton,\n};\n","/************************************************* Imports *************************************************/\nimport { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { errorService } from '../../../services/error.service';\nimport { StyledErrorSnackbar } from './ErrorSnackbar.styles';\n\n/************************************************* Component *************************************************/\nexport const ErrorSnackbar = () => {\n /************************************************* State *************************************************/\n const [isOpen, setIsOpen] = useState(false);\n const [message, setMessage] = useState('');\n\n const [t] = useTranslation();\n\n /************************************************* Logic *************************************************/\n const handleClose = useCallback(\n (event?: React.SyntheticEvent, reason?: string) => {\n if (reason === 'clickaway') {\n return;\n }\n\n setIsOpen(false);\n },\n []\n );\n\n /************************************************* Use Effect *************************************************/\n useEffect(() => {\n const sub = errorService.error.subscribe((errorCode: string) => {\n setIsOpen(true);\n setMessage(errorCode);\n });\n return () => {\n sub.unsubscribe();\n };\n }, [t]);\n\n /************************************************* Template *************************************************/\n return (\n \n \n \n {t(message)}\n \n \n

OK

\n
\n
\n \n );\n};\n","import styled from '@emotion/styled';\nimport { Switch } from '@material-ui/core';\nimport { useDataTrackingEnabled } from 'core/shared/hooks/useDataTrackingEnabled';\nimport { FunctionComponent } from 'react';\n\n// to vertically align accordion row content\nconst Container = styled.div`\n display: flex;\n align-items: center;\n width: 100%;\n`;\n\n// to position switch at the far right end\nconst RowContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n flex: 1;\n`;\n\nexport const DataTrackingPolicyRow: FunctionComponent<{ heading: string }> = ({ heading }) => {\n const [dataTrackingEnabled, setDataTrackingEnabled] = useDataTrackingEnabled();\n\n return (\n \n {heading}\n \n {\n setDataTrackingEnabled(value);\n }}\n onClick={(e) => {\n // prevent expanding of accordion on toggle\n e.stopPropagation();\n }}\n />\n \n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst LandingContainer = styled.div`\n width: 100%;\n background-color: ${getColor('primary')};\n padding: calc(${getVar('headerHeight')} + 10rem) 0 ${getVar('headerHeight')} 0;\n`;\n\nconst Heading = styled.h2`\n color: ${getColor('primaryContrast')};\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n`;\n\nconst Updated = styled.p`\n color: ${getColor('primaryContrast')};\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 3rem auto 0 auto;\n font-size: 1.8rem;\n`;\n\nconst PrivacyPolicyContainer = styled.div`\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n padding: 15rem 0;\n\n & .noAccordion {\n margin-bottom: 3rem;\n padding: 0 1rem;\n\n @media screen and (max-width: 400px) {\n padding: 0 2rem;\n }\n }\n\n & .privacyParagraph {\n font-size: 1.6rem;\n font-weight: 400;\n line-height: 2rem;\n padding-bottom: 3rem;\n\n &.quote {\n padding: 0 3rem 3rem 3rem;\n font-style: italic;\n\n @media screen and (max-width: 400px) {\n padding: 0 1rem;\n }\n\n &:last-child {\n padding: 0 3rem 3rem 3rem;\n\n @media screen and (max-width: 400px) {\n padding: 0 1rem 3rem 1rem;\n }\n }\n }\n\n &:last-child {\n padding: 0;\n\n @media screen and (max-width: 400px) {\n padding: 0;\n }\n }\n\n & span {\n display: block;\n }\n }\n\n & h5 {\n line-height: 2rem;\n padding: 2rem 0 3rem 0;\n font-size: 1.6rem;\n font-weight: 800;\n\n @media screen and (max-width: 400px) {\n padding: 2rem 1rem 3rem 1rem;\n }\n }\n\n & ul {\n list-style-type: disc;\n padding: 0 3rem 3rem 6rem;\n font-size: 1.6rem;\n margin-top: -1rem;\n\n @media screen and (max-width: 400px) {\n padding: 0 1rem 3rem 2rem;\n }\n\n & li {\n margin-top: 1rem;\n }\n }\n`;\n\nconst StyledDiv = styled.div``;\n\nconst StyledLink = styled.a`\n &[href] {\n color: ${getColor('primary')};\n text-decoration: underline;\n cursor: pointer;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const PrivacyPolicyStyles = {\n LandingContainer,\n Heading,\n Updated,\n PrivacyPolicyContainer,\n StyledDiv,\n StyledLink,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { Accordion, AccordionDetails, AccordionSummary } from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\n\nimport { DataTrackingPolicyRow } from './DataTrackingPolicyRow';\nimport { PrivacyPolicyStyles } from './PrivacyPolicy.styles';\n\n/* ****************************************************** Component ****************************************************** */\nexport const PrivacyPolicyEN = () => {\n /* ****************************************************** Template ****************************************************** */\n return (\n <>\n \n \n Data Privacy Policy\n \n Updated 09/29/2021\n \n\n \n
\n

\n ElectricRoutes GmbH (\"ElectricRoutes\" or \"we\") makes \"ElectricRoutes\" available to you\n on the website{' '}\n \n https://www.electricroutes.com\n {' '}\n („Website“).\n

\n

\n With the following privacy policy for the Website, we explain to you what personal data\n we collect, for what purposes we process it and what rights you have when you visit the\n Website and use the \"ElectricRoutes\" service via the Website. The protection of your\n personal data is important to us.\n

\n

\n According to the EU General Data Protection Regulation (\"GDPR\"), personal data is any\n information relating to an identified or identifiable natural person (\"data subject\").\n An identifiable natural person is one who can be identified, directly or indirectly, in\n particular by reference to an identifier such as a name, an identification number,\n location data, an online identifier or one or more particular personal characteristics.\n This means that both your personal data, such as your name, your postal address or your\n e-mail address, and the technical data created or processed when you use the website,\n which can be assigned to you, such as the IP address, the operating system, the browser\n of your terminal device or your user behavior, are personal data.\n

\n
\n\n \n {/* ------------------- HEADING 1 ------------------- */}\n \n }\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n data-cy=\"privacy-accordion-1\"\n >\n {'1. Responsible for Data Protection'}\n \n \n

\n Responsible under data protection law for the collection and processing of your\n personal data when visiting and using the website is\n

\n

\n ElectricRoutes GmbH\n Heilbronner Straße 86\n 70191 Stuttgart\n

\n

\n \n E-Mail: \n \n contact@electricroutes.com\n \n \n \n Phone: \n \n +49 711 252 749-0\n \n \n

\n
\n
\n\n {/* ------------------- HEADING 2 ------------------- */}\n \n }\n aria-controls=\"panel2a-content\"\n id=\"panel2a-header\"\n data-cy=\"privacy-accordion-2\"\n >\n {'2. Data Protection Officer'}\n \n \n

\n If you have any questions, concerns or suggestions regarding data protection on our\n website, you can contact our data protection officer at any time:\n

\n\n

\n SICODA GmbH\n Oliver Gönner c/o DSB – P3 group GmbH\n

\n\n

\n Rochusstraße 198\n 53123 Bonn\n

\n\n

\n \n E-Mail: \n \n datenschutz.global@p3-group.com\n \n \n \n Phone: \n \n +49 228 286 140 60\n \n \n

\n\n

\n You can also assert your data subject rights with our data protection officer. You\n can find more information on this in section 8.\n

\n
\n
\n\n {/* ------------------- HEADING 3 ------------------- */}\n \n }\n aria-controls=\"panel3a-content\"\n id=\"panel3a-header\"\n >\n {'3. Purposes and Legal Bases of Data Processing - Automatically Collected Data'}\n \n \n

\n The visit and purely informational use of our website is possible without you\n yourself (for example, by registering or submitting in online forms) personal data,\n such as your name, postal address or e-mail address, or we collect such personal\n data.\n

\n

\n However, in order for you to view our website and use it in a user-friendly,\n effective, stable and secure manner, we automatically collect and process the\n necessary (pseudonymous) technical data in interaction with your terminal device and\n your browser.\n

\n\n
3.1 Automatic Data Collection and Processing by Web Servers
\n\n

\n In order to be able to show you the individual web pages belonging to our website,\n our web servers automatically collect and process the following personal data\n transmitted by your browser:\n

\n\n
    \n
  • IP address of your accessing terminal device,
  • \n
  • Name and URL of the file accessed,
  • \n
  • date and time of access,
  • \n
  • mount of data transferred,
  • \n
  • message as to whether the file was retrieved successfully,
  • \n
  • \n Recognition data (type, version and language) of the browser and operating system\n used by your accessing end device,\n
  • \n
  • \n URL of the referring website, if accessed via link, and additionally search term,\n if accessed via search engine, and\n
  • \n
  • name of your Internet access provider
  • \n
\n\n

\n The legal basis for this data processing is Art. 6 para. 1 sentence 1 lit. b) GDPR.\n The data processing is necessary for the implementation of pre-contractual measures\n that take place upon your request, as such pre-contractual measures also include\n website visits.\n

\n\n

\n The (pseudonymous) technical communication data collected and processed to enable\n the use of the website (connection establishment) is temporarily stored by our web\n servers in log files, so-called server log files. We use the server log files for\n internal system-related purposes, in particular for technical administration and to\n ensure the stability and security of our web servers and website, e.g. to identify\n and track unauthorized or abusive access attempts to our web servers via the stored\n IP address. We also use the server log files for statistical purposes in order to\n record and evaluate access to our website and its content in a pseudonymous manner\n and, on this basis, to be able to design and optimize our website in a more\n needs-oriented, user-friendly and effective manner. The legal basis for this data\n processing of the server log files is Article 6 (1) sentence 1 lit. f) GDPR, which\n permits the processing of personal data in the context of our \"legitimate\n interests\", unless your fundamental rights, freedoms or interests prevail. Our\n legitimate interests are the easy and secure administration of our website or the\n measurement, analysis and improvement of our website.\n

\n\n
3.2 Map display by \"Google Maps“
\n\n

\n With your consent, your personal route will be displayed when using \"ElectricRoutes\"\n within the map service \"Google Maps\". \"Google Maps\" is a service of Google Ireland\n Limited, Gordon House, 4 Barrow St, Dublin, D04 E5W5, Ireland (\"Google\").\n

\n

\n The legal basis for the use of \"Google Maps\" on our website is Article 6 (1)\n sentence 1 lit. a{')'} GDPR, which permits the processing of personal data with the\n consent of the data subject.\n

\n

\n Within ElectricRoutes, you have the option to activate \"Google Maps\" by providing\n the following declaration of consent:\n

\n\n

Activation of the Google Maps service

\n

\n In order to display your route in Google Maps, your consent is required. By clicking\n the \"Agree\" button, you consent to Google Maps being activated and to data about\n your use of \"ElectricRoutes\" being transferred to Google. Please note that the use\n of Google Maps may also result in data transfers to Google servers in the USA and\n thus to a country outside the European Union without a comparable level of data\n protection.\n

\n

\n For more information about the nature and purposes of data processing within the\n framework of Google Maps and about your rights, please refer to the privacy policy (\n \n https://policies.google.com/privacy\n \n ).\n

\n\n

\n If you give this consent, Google will receive the information that you have accessed\n the website concerned. Furthermore, Google receives access to the (pseudonymous)\n technical communication data mentioned in section 3.1 and possibly further personal\n data such as your location data or data about the use of other pages of this\n website. The data transfer to Google takes place regardless of whether you have a\n user account with Google via which you are logged in or not.\n

\n

\n If you are logged in to Google, your data will be directly assigned to your account.\n If you do not want the assignment to your profile at Google, you must log out before\n calling up pages with Google Maps. Google stores your data as usage profiles and\n uses them for the purpose of tailoring its offers, advertising and/or market\n research. Such an evaluation of your data, in particular for the provision of\n needs-based advertising, takes place on a pseudonymous basis even if you are not\n logged in to Google or do not have a Google user account. You have the right to\n object to the creation of these (pseudonymous) user profiles, whereby you must\n contact Google to exercise this right.\n

\n

\n We have no influence on the data collection and processing carried out by Google and\n are not responsible for it. We are neither aware of this data processing nor of all\n its purposes and storage periods. Please note that when using \"Google Maps\", data\n may also be transferred to servers of Google LLC in the USA, a third country outside\n the European Union and the European Economic Area. If you do not wish data to be\n transferred to Google, you should not consent to the use of \"Google Maps\". The\n display of your personal route by \"ElectricRoutes\" is not possible in this case.\n

\n

\n Google's terms of use can be found at \n \n https://www.google.de/intl/de/policies/terms/regional.html\n \n , and the additional terms of use for Google Maps can be found at \n \n https://www.google.com/intl/de_US/help/terms_maps.html\n \n . Detailed information on data protection in connection with the use of Google Maps\n can be found at \n \n https://www.google.de/intl/de/policies/privacy/\n \n . If you wish to object to data collection and processing by Google, you can do so\n at \n \n https://adssettings.google.com/authenticated\n \n .\n

\n\n
3.3 Location Query by Browser
\n\n

\n Via the corresponding dialog box in your browser, you have the option of enabling\n the use of your location by \"ElectricRoutes\". In this case, your browser\n automatically sends us information about your approximate location upon request. We\n process your location data exclusively for navigation and location display as part\n of \"ElectricRoutes\".\n

\n

\n You can revoke your consent at any time with future effect by deactivating the\n release of your location for the website in your browser settings.\n

\n

\n The legal basis for the automatic collection and use of your location data on our\n website is Art. 6 (1) sentence 1 lit. a{')'}\n GDPR, which permits the processing of personal data with the consent of the data\n subject.\n

\n
\n
\n\n {/* ------------------- HEADING 4 ------------------- */}\n \n }\n aria-controls=\"panel4a-content\"\n id=\"panel4a-header\"\n >\n {'4. Purposes and Legal Bases of Data Processing - Data Provided by You'}\n \n \n

\n The use of certain functions and offers on our website, in particular route planning\n with \"ElectricRoutes\", is only possible on the basis of personal data. We only\n process such data if you provide it to us yourself or expressly consent to the\n collection of this data.\n

\n\n
4.1 Data processing within the scope of \"ElectricRoutes“
\n

\n For route planning with \"ElectricRoutes\", we process the data you provide us with in\n the corresponding input fields, namely\n

\n\n
    \n
  • Start and destination locations,
  • \n
  • vehicle type (make and model),
  • \n
  • preferred battery charging criteria,
  • \n
  • Battery charge (State of Charge, SoC),
  • \n
  • Charging station selection criteria.
  • \n
\n\n

\n The data you enter and - if you have consented via your browser - the automatically\n collected location data are processed by us to calculate a route and offer you\n individualized navigation. In doing so, our service calculates an optimized route\n based on your information, including charging stops that are matched to the charging\n curve of your vehicle. We have no way of assigning this data to you personally.\n

\n

\n The legal basis for the data processing for route calculation and navigation within\n the scope of \"ElectricRoutes\" is Art. 6 (1) sentence 1 lit. b{')'} GDPR. The\n processing of your personal data is necessary to provide you with the\n \"ElectricRoutes\" service. Insofar as you have given your consent to the location\n query through your browser, we process your location data on the basis of Art. 6 (1)\n sentence 1 lit. a{')'} GDPR, which permits the processing of personal data with the\n consent of the data subject.\n

\n

\n We store the data generated when using \"ElectricRoutes\" in such an anonymized form\n that it is no longer possible to establish a personal reference. We perform\n statistical analyses of this anonymized data in order to learn more about the use of\n E-Mobility and to be able to improve our service. The anonymization of the data is\n based on our legitimate interest according to Art. 6 (1) sentence 1 lit. f{')'}\n GDPR to be able to statistically evaluate the data in anonymized form.\n

\n

\n As part of the \"ElectricRoutes Community\", you also have the option of rating\n charging stations according to predefined criteria. We store your rating and make it\n available to other ElectricRoutes users in the status information for the charging\n station in question. Your rating remains anonymous - other users will not see your\n name or other identifying characteristics. We reserve the right to ensure that only\n one rating per user can be stored by processing (pseudonymous) characteristics such\n as the device ID. Data processing in connection with ratings is carried out on the\n basis of Art. 6 (1) sentence 1 lit. f{')'}\n GDPR, which permits the processing of personal data in the context of our\n \"legitimate interests\", unless your fundamental rights, freedoms or interests\n prevail. Our legitimate interests are the provision of an objective rating system\n for charging stations within the framework of our service \"ElectricRoutes“.\n

\n\n
4.2 Communication via E-Mail
\n\n

\n If you contact us by e-mail, we will process your request and your e-mail address\n exclusively for processing your request and possible queries.\n

\n

\n The legal basis for the processing of your messages and your email address is Art. 6\n para. 1 sentence 1 letter b{')'} GDPR.\n

\n
\n
\n\n {/* ------------------- HEADING 5 ------------------- */}\n \n }\n aria-controls=\"panel5a-content\"\n id=\"panel5a-header\"\n >\n {'5. Recipients of Personal Data'}\n \n \n

\n The personal data collected by us in the course of your visit to our website will\n generally not be passed on to other recipients or transmitted in any other way,\n unless this is expressly stated in the data protection declaration. Exceptions to\n this are mandatory transfers of personal data to government institutions and\n authorities and private rights holders on the basis of statutory provisions or\n judicial or official decisions, as well as the necessary disclosure to government\n institutions and authorities in the event of attacks on our legal assets for the\n purposes of legal or criminal prosecution.\n

\n

\n However, in the operation of our website and the provision and processing of\n individual website functions and offers, we sometimes use external technical and\n other service providers who support us in the provision of our services and have\n been carefully selected by us. To the extent necessary, these service providers\n engaged by us process your personal data within the scope of their respective\n assignment in accordance with our instructions for the purposes stated in this data\n protection notice. They are contractually obligated to strictly comply with this\n privacy notice, the applicable statutory data protection provisions and our\n instructions (so-called order processors pursuant to Art. 28 GDPR). The same applies\n to any subcontractors, insofar as our processors use such with our prior consent.\n

\n

\n We use order processors in particular for hosting the website and our route\n navigation database.\n

\n
\n
\n\n {/* ------------------- HEADING 6 ------------------- */}\n \n }\n aria-controls=\"panel6a-content\"\n id=\"panel6a-header\"\n >\n {'6. Processing of Personal Data in \"Third Countries“'}\n \n \n

\n We process the personal data collected on the website within the member states of\n the European Union. A transfer of personal data to other \"third countries\", i.e.\n countries outside the European Union and the European Economic Area, only takes\n place if we explicitly inform you of this in this privacy policy.\n

\n

\n The use of \"Google Maps\" described in section 3.2. may result in data transfers to\n the USA. The collection and processing of data by \"Google Maps\" is carried out\n exclusively with your consent in accordance with Art. 6 para. 1 sentence 1 lit. a\n {')'} GDPR in conjunction with Art. 49 para.1 lit. a{')'} GDPR.\n

\n
\n
\n\n {/* ------------------- HEADING 7 ------------------- */}\n \n }\n aria-controls=\"panel7a-content\"\n id=\"panel7a-header\"\n >\n {'7. Duration of the Storage'}\n \n \n

\n In general, we only store personal data for as long as is necessary to fulfill the\n purpose of the respective data processing or until you request us to delete the\n personal data for other legitimate reasons (see Art. 17 (1) GDPR). After expiration\n of these storage periods or upon your legitimate request for deletion, we check in\n each case whether certain personal data are still needed for (other) legitimate\n purposes and, if not, whether a deletion of the personal data is precluded by\n contractual or statutory retention periods. In these cases, the personal data\n affected by this will continue to be stored for as long as necessary to fulfill this\n (other) legitimate purpose, or for the duration of the respective contractual or\n legal retention period for these purposes. For other purposes, however, they are\n blocked and then finally deleted after the expiry of the respective last contractual\n or legal retention period.\n

\n

\n The technical communication data contained in the server log files (see section 3.1)\n are deleted after 90 days at the latest.\n

\n

\n The storage period of the data transferred to Google can be found in Google's\n privacy policy (see section 3.2).\n

\n

\n We store and process the data generated when using \"ElectricRoutes\" without\n reference to individuals (see section 4.1).\n

\n

\n If you contact us by e-mail, we will only store the message you send and your e-mail\n address for as long as is necessary to process your request and possible queries\n (see section 4.2). Your data will be deleted no later than six months after you last\n contacted us, unless we are entitled or obliged to continue storing your message\n and/or your e-mail address.\n

\n
\n
\n\n {/* ------------------- HEADING 8 ------------------- */}\n \n }\n aria-controls=\"panel8a-content\"\n id=\"panel8a-header\"\n >\n {'8. Your Rights (Data Subject Rights)'}\n \n \n

\n Insofar as the legal requirements according to Art. 15 et seq. GDPR, you have the\n following rights with regard to your personal data stored by us (so-called data\n subject rights):\n

\n\n
    \n
  • \n You can request information from us at any time as to whether personal data and\n which categories of personal data about you are stored by us, for which purposes\n these are processed and which recipients or categories of recipients may receive\n them. Furthermore, you can request the other information listed in Art. 15 GDPR\n about your personal data from us (right to information).\n
  • \n
  • \n In accordance with the legal requirements, you also have a right to rectification\n (Art. 16 GDPR), a right to erasure (Art. 17 GDPR) and a right to restriction of\n processing (blocking) (Art. 18 GDPR) of your personal data.\n
  • \n
  • \n You further have the right, pursuant to Art. 20 GDPR, to receive from us the\n personal data concerning you that you have provided to us in a structured,\n commonly used and machine-readable format. You may also transfer this personal\n data or have it transferred to other responsible parties (right to data\n portability).\n
  • \n
  • You also have the right to revoke your granted consent at any time.
  • \n
  • \n \n In addition, you have the right to object to data processing based on the\n legitimate interests of the controller or a third party pursuant to Art. 6 (1)\n sentence 1 lit. f{')'} GDPR, if the legal requirements pursuant to Art. 21 GDPR\n are met.\n \n
  • \n
\n\n

\n To assert your data subject rights, you can contact us at any time at one of the\n addresses given in sections 1. and 2.\n

\n

\n Furthermore, pursuant to Art. 77 (1) GDPR, you have the right to lodge a complaint\n with a supervisory authority, in particular in the member state of your residence,\n workplace or the place of the alleged infringement, if you are of the opinion that\n the processing of personal data concerning you violates the GDPR.\n

\n
\n
\n\n {/* ------------------- HEADING 9 ------------------- */}\n \n }\n aria-controls=\"panel9a-content\"\n id=\"panel9a-header\"\n data-cy=\"privacy-accordion-9\"\n >\n {'9. Data Security'}\n \n \n

\n We use extensive technical and organizational precautions to protect your personal\n data stored and processed by us against misuse, accidental or intentional\n manipulation, loss, access by unauthorized persons and other data security risks.\n Our data security precautions are continuously improved in line with technological\n developments. The transmission of personal data is encrypted in accordance with the\n current state of the art.\n

\n

\n Our employees are obligated by us to maintain confidentiality and to comply with the\n relevant data protection regulations.\n

\n
\n
\n\n {/* ------------------- HEADING 10 ------------------- */}\n \n }\n aria-controls=\"panel10a-content\"\n id=\"panel10a-header\"\n >\n {'10. Modification of the Privacy Policy'}\n \n \n

\n We can adapt this data protection notice to changed factual or legal circumstances\n at any time and will always publish the latest version of this data protection\n notice here. You can tell when this privacy notice was last changed by the date\n (\"Last updated\") at the beginning of this privacy notice.\n

\n
\n
\n\n {/* ------------------- HEADING 11 ------------------- */}\n \n \n \n \n \n
\n
\n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { Accordion, AccordionDetails, AccordionSummary } from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\n\nimport { DataTrackingPolicyRow } from './DataTrackingPolicyRow';\nimport { PrivacyPolicyStyles } from './PrivacyPolicy.styles';\n\n/* ****************************************************** Component ****************************************************** */\nexport const PrivacyPolicyDE = () => {\n /* ****************************************************** Template ****************************************************** */\n return (\n <>\n \n Datenschutz\n Zuletzt aktualisiert 29.09.2021\n \n\n \n
\n

\n Die ElectricRoutes GmbH („ElectricRoutes“ oder „wir“) stellt Ihnen „ElectricRoutes“ auf\n der Website{' '}\n \n https://www.electricroutes.com\n {' '}\n („Website“) zur Verfügung.\n

\n

\n Mit der folgenden Datenschutzerklärung für die Website erläutern wir Ihnen, welche\n personenbezogenen Daten wir erheben, zu welchen Zwecken wir diese verarbeiten und welche\n Rechte Ihnen zustehen, wenn Sie die Website besuchen und den Dienst „ElectricRoutes“\n über die Website nutzen. Der Schutz Ihrer personenbezogenen Daten ist uns ein wichtiges\n Anliegen.\n

\n

\n Nach der EU-Datenschutz-Grundverordnung („DSGVO“) sind personenbezogene Daten alle\n Informationen, die sich auf eine identifizierte oder identifizierbare natürliche Person\n („betroffene Person”) beziehen. Als identifizierbar wird eine natürliche Person\n angesehen, die direkt oder indirekt, insbesondere mittels Zuordnung zu einer Kennung wie\n einem Namen, zu einer Kennnummer, zu Standortdaten, zu einer Online-Kennung oder zu\n einem oder mehreren besonderen persönlichen Merkmalen identifiziert werden kann. Damit\n sind sowohl Ihre persönlichen Daten, wie z.B. Ihr Name, Ihre Postanschrift oder Ihre\n E-Mail-Adresse, als auch die bei Nutzung der Website entstehenden bzw. verarbeiteten\n technischen Daten, die Ihnen zugeordnet werden können, wie z.B. die IP-Adresse, das\n Betriebssystem, der Browser Ihres Endgeräts oder Ihr Nutzerverhalten, personenbezogene\n Daten.\n

\n
\n\n \n {/* ------------------- HEADING 1 ------------------- */}\n \n }\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n data-cy=\"privacy-accordion-1\"\n >\n {'1. Datenschutzrechtlich Verantwortlicher'}\n \n \n

\n Datenschutzrechtlich verantwortlich für die Erhebung und Verarbeitung Ihrer\n personenbezogenen Daten bei Besuch und Nutzung der Website ist die\n

\n

\n ElectricRoutes GmbH\n Heilbronner Straße 86\n 70191 Stuttgart\n

\n

\n \n E-Mail: \n \n contact@electricroutes.com\n \n \n \n Telefon: \n \n +49 711 252 749-0\n \n \n

\n
\n
\n\n {/* ------------------- HEADING 2 ------------------- */}\n \n }\n aria-controls=\"panel2a-content\"\n id=\"panel2a-header\"\n data-cy=\"privacy-accordion-2\"\n >\n {'2. Datenschutzbeauftragter'}\n \n \n

\n Sofern Sie Fragen, Anliegen oder Anregungen zum Datenschutz betreffend unsere\n Website haben, können Sie sich jederzeit an unseren Datenschutzbeauftragten wenden:\n

\n\n

\n SICODA GmbH\n Oliver Gönner c/o DSB – P3 group GmbH\n

\n\n

\n Rochusstraße 198\n 53123 Bonn\n

\n\n

\n \n E-Mail: \n \n datenschutz.global@p3-group.com\n \n \n \n Telefon: \n \n +49 228 286 140 60\n \n \n

\n\n

\n Bei unserem Datenschutzbeauftragten können Sie auch Ihre Betroffenenrechte geltend\n machen. Nähere Informationen dazu finden Sie im Abschnitt 8.\n

\n
\n
\n\n {/* ------------------- HEADING 3 ------------------- */}\n \n }\n aria-controls=\"panel3a-content\"\n id=\"panel3a-header\"\n >\n {'3. Zwecke und Rechtsgrundlagen der Datenverarbeitung – Automatisch erhobene Daten'}\n \n \n

\n Der Besuch und die rein informatorische Nutzung unserer Website sind möglich, ohne\n dass Sie selbst (etwa durch Registrierung oder Übermittlung in Online-Formularen)\n persönliche Daten, wie z.B. Ihren Namen, Ihre Postanschrift oder Ihre\n E-Mail-Adresse, angeben müssen oder wir solche persönlichen Daten erheben.\n

\n

\n Damit Sie unsere Website betrachten sowie benutzerfreundlich, effektiv, stabil und\n sicher nutzen können, erheben und verarbeiten wir jedoch automatisch in\n Zusammenwirken mit Ihrem Endgerät und Ihrem Browser die hierfür erforderlichen\n (pseudonymen) technischen Daten.\n

\n\n
3.1 Automatische Datenerhebung und –verarbeitung durch Webserver
\n\n

\n Um Ihnen die einzelnen zu unserer Website gehörenden Webseiten anzeigen zu können,\n werden von unseren Webservern automatisch folgende personenbezogenen Daten erhoben\n und verarbeitet, die von Ihrem Browser übermittelt werden:\n

\n\n
    \n
  • IP-Adresse Ihres zugreifenden Endgeräts,
  • \n
  • Name und URL der abgerufenen Datei,
  • \n
  • Datum und Uhrzeit des Zugriffs,
  • \n
  • übertragene Datenmenge,
  • \n
  • Meldung, ob der Abruf der Datei erfolgreich war,
  • \n
  • \n Erkennungsdaten (Typ, Version und Sprache) des verwendeten Browsers und\n Betriebssystems Ihres zugreifenden Endgeräts,\n
  • \n
  • \n URL der verweisenden Webseite, wenn Zugriff über Link erfolgte, und zusätzlich\n Suchbegriff, wenn Zugriff über Suchmaschine erfolgte, und\n
  • \n
  • Name Ihres Internet-Zugangs-Providers
  • \n
\n\n

\n Rechtsgrundlage für diese Datenverarbeitungen ist Art. 6 Abs. 1 Satz 1 lit. b)\n DSGVO. Die Datenverarbeitungen sind zur Durchführung vorvertraglicher Maßnahmen, die\n auf Ihre Anfrage erfolgen, erforderlich, da zu solchen vorvertraglichen Maßnahmen\n auch Website-Besuche gehören.\n

\n\n

\n Die zur Ermöglichung der Nutzung der Website (Verbindungsaufbau) erhobenen und\n verarbeiteten (pseudonymen) technischen Kommunikationsdaten werden von unseren\n Webservern temporär in Protokolldateien, sog. Server-Logfiles, gespeichert. Wir\n nutzen die Server-Logfiles zu internen systembezogenen Zwecken, insbesondere zur\n technischen Administration und zur Gewährleistung der Stabilität und Sicherheit\n unserer Webserver und Website, z.B. um über die gespeicherte IP-Adresse unzulässige\n oder missbräuchliche Zugriffsversuche auf unsere Webserver zu identifizieren und\n nachzuverfolgen. Wir verwenden die Server-Logfiles ferner zu statistischen Zwecken,\n um die Zugriffe auf unsere Website und deren Inhalte pseudonymisiert erfassen und\n auswerten sowie auf dieser Basis unsere Website bedarfsgerechter,\n benutzerfreundlicher und effektiver gestalten und optimieren zu können.\n Rechtsgrundlage für diese Datenverarbeitungen der Server-Logfiles ist Art. 6 Abs. 1\n Satz 1 lit. f) DSGVO, der die Verarbeitung von personenbezogenen Daten im Rahmen\n unserer „berechtigten Interessen“ gestattet, soweit nicht Ihre Grundrechte,\n Grundfreiheiten oder Interessen überwiegen. Unsere berechtigten Interessen bestehen\n in der leichten und sicheren Administration unserer Website bzw. in der Messung,\n Analyse und Verbesserung unserer Website.\n

\n\n
3.2 Kartendarstellung durch „Google Maps“
\n\n

\n Mit Ihrer Einwilligung wird Ihre persönliche Route bei der Nutzung von\n „ElectricRoutes“ innerhalb des Kartendienstes „Google Maps“ angezeigt. „Google Maps“\n ist ein Angebot der Google Ireland Limited, Gordon House, 4 Barrow St, Dublin, D04\n E5W5, Irland (“Google”).\n

\n

\n Rechtsgrundlage für die Nutzung von „Google Maps“ auf unserer Website ist Art. 6\n Abs. 1 Satz 1 lit. a{')'} DSGVO, der die Verarbeitung von personenbezogenen Daten\n mit der Einwilligung der betroffenen Person gestattet.\n

\n

\n Im Rahmen von ElectricRoutes haben Sie die Möglichkeit, „Google Maps“ zu aktivieren,\n indem Sie die folgende Einwilligungserklärung abgeben:\n

\n\n

Aktivierung des Kartendienstes Google Maps

\n

\n Um Ihre Route in Google Maps anzeigen zu können, ist Ihre Zustimmung erforderlich.\n Mit einem Klick auf die Schaltfläche „Zustimmen“ willigen Sie ein, dass Google Maps\n aktiviert wird und Daten über Ihre Nutzung von „ElectricRoutes“ an Google übertragen\n werden. Bitte beachten Sie, dass es bei der Nutzung von Google Maps auch zu\n Datenübertragungen an Server von Google in den USA kommen kann und somit in ein Land\n außerhalb der Europäischen Union ohne vergleichbares Datenschutzniveau.\n

\n

\n Weitere Informationen über die Art und die Zwecke der Datenverarbeitung im Rahmen\n von Google Maps sowie über Ihre Rechte finden Sie in der Datenschutzerklärung (\n \n https://policies.google.com/privacy?hl=de\n \n ).\n

\n\n

\n Falls Sie diese Einwilligung abgeben, erhält Google die Information, dass Sie die\n betroffene Website aufgerufen haben. Ferner erhält Google Zugriff auf die im\n Abschnitt 3.1 genannten (pseudonymen) technischen Kommunikationsdaten und ggf.\n weitere personenbezogene Daten wie z.B. Ihre Standortdaten oder Daten über die\n Nutzung weiterer Seiten dieser Website. Die Datenübermittlung an Google erfolgt\n unabhängig davon, ob Sie bei Google ein Nutzerkonto haben, über das Sie eingeloggt\n sind, oder nicht.{' '}\n

\n

\n Wenn Sie bei Google eingeloggt sind, werden Ihre Daten direkt Ihrem Konto\n zugeordnet. Wenn Sie die Zuordnung zu Ihrem Profil bei Google nicht wünschen, müssen\n Sie sich vor Aufruf von Seiten mit Google Maps ausloggen. Google speichert Ihre\n Daten als Nutzungsprofile und nutzt sie für Zwecke der bedarfsgerechten Gestaltung\n seiner Angebote, der Werbung und/oder der Marktforschung. Eine solche Auswertung\n Ihrer Daten insbesondere zur Erbringung von bedarfsgerechter Werbung erfolgt auf\n pseudonymer Basis selbst dann, wenn Sie nicht bei Google eingeloggt sind oder gar\n kein Google Nutzerkonto haben. Ihnen steht ein Widerspruchsrecht gegen die Bildung\n dieser (pseudonymen) Nutzerprofile zu, wobei Sie sich zu dessen Ausübung an Google\n richten müssen.{' '}\n

\n

\n Wir haben keinen Einfluss auf die von Google vorgenommenen Datenerhebungen und\n verarbeitungen und sind dafür auch nicht verantwortlich. Uns sind weder diese\n Datenverarbeitungen noch deren sämtliche Zwecke sowie Speicherfristen bekannt. Bitte\n beachten Sie, dass es bei der Nutzung von „Google Maps“ auch zu Datenübertragungen\n an Server der Google LLC in den USA kommen kann, einem Drittland außerhalb der\n Europäischen Union und des Europäischen Wirtschaftsraums. Wenn Sie die\n Datenübermittlung an Google nicht wünschen, sollten Sie der Nutzung von „Google\n Maps“ nicht zustimmen. Die Anzeige Ihrer persönlichen Route durch „ElectricRoutes“\n ist in diesem Fall nicht möglich.\n

\n

\n Die Nutzungsbedingungen von Google finden Sie unter \n \n https://www.google.de/intl/de/policies/terms/regional.html\n \n , die zusätzlichen Nutzungsbedingungen für Google Maps finden Sie unter \n \n https://www.google.com/intl/de_US/help/terms_maps.html\n \n . Ausführliche Informationen zum Datenschutz im Zusammenhang mit der Verwendung von\n Google Maps finden Sie unter \n \n https://www.google.de/intl/de/policies/privacy/\n \n . Möchten Sie einer Datenerhebung und verarbeitung durch Google widersprechen,\n können Sie dies unter {' '}\n \n https://adssettings.google.com/authenticated\n \n  einstellen.\n

\n\n
3.3 Standortabfrage durch Browser
\n\n

\n Über das entsprechende Dialogfeld in Ihrem Browser haben Sie die Möglichkeit, die\n Nutzung Ihres Standortes durch „ElectricRoutes“ freizugeben. In diesem Fall sendet\n Ihr Browser uns auf Abfrage automatisch Informationen über ihren ungefähren\n Standort. Wir verarbeiten Ihre Standortdaten ausschließlich für die Navigation und\n die Standortanzeige im Rahmen von „ElectricRoutes“.\n

\n

\n Sie können Ihre Einwilligung jederzeit mit Wirkung für die Zukunft widerrufen, indem\n Sie die Freigabe Ihres Standorts für die Website in den Einstellungen Ihres Browsers\n deaktivieren.\n

\n

\n Rechtsgrundlage für die automatische Erhebung und Nutzung Ihrer Standortdaten auf\n unserer Website ist Art. 6 Abs. 1 Satz 1 lit. a{')'}\n DSGVO, der die Verarbeitung von personenbezogenen Daten mit der Einwilligung der\n betroffenen Person gestattet.\n

\n
\n
\n\n {/* ------------------- HEADING 4 ------------------- */}\n \n }\n aria-controls=\"panel4a-content\"\n id=\"panel4a-header\"\n >\n {\n '4. Zwecke und Rechtsgrundlagen der Datenverarbeitung – Von Ihnen bereitgestellte Daten '\n }\n \n \n

\n Die Nutzung bestimmter Funktionen und Angebote unserer Website, insbesondere die\n Routenplanung mit „ElectricRoutes“, ist nur auf der Grundlage personenbezogener\n Daten möglich. Wir verarbeiten solche Daten nur, wenn Sie uns diese selbst mitteilen\n oder der Erhebung dieser Daten ausdrücklich zustimmen\n

\n\n
4.1 Datenverarbeitung im Rahmen von „ElectricRoutes“
\n

\n Für die Routenplanung mit „ElectricRoutes“ verarbeiten wir die Daten, die Sie uns in\n den entsprechenden Eingabefeldern zur Verfügung stellen, nämlich\n

\n\n
    \n
  • Start- und Zielstandorte,
  • \n
  • Fahrzeugtyp (Marke und Modell),
  • \n
  • bevorzugte Ladekriterien der Batterie,
  • \n
  • Akkuladung (State of Charge, SoC),
  • \n
  • Kriterien zur Auswahl der Ladestationen.
  • \n
\n\n

\n Die von Ihnen eingegebenen Daten sowie – falls Sie über Ihren Browser eingewilligt\n haben – die automatisiert erhobenen Standortdaten werden von uns verarbeitet, um\n eine Route zu berechnen und Ihnen eine individualisierte Navigation anbieten zu\n können. Dabei berechnet unser Dienst basierend auf Ihren Angaben eine optimierte\n Route inklusive Ladestopps, die auf die Ladekurve Ihres Fahrzeugs abgestimmt sind.\n Wir haben keine Möglichkeit diese Daten Ihrer Person zuzuordnen.\n

\n

\n Rechtsgrundlage für die Datenverarbeitungen zur Routenberechnung und Navigation im\n Rahmen von „ElectricRoutes“ ist Art. 6 Abs. 1 Satz 1 lit. b{')'} DSGVO. Die\n Verarbeitung Ihrer personenbezogenen Daten ist erforderlich, um Ihnen den Dienst\n „ElectricRoutes“ zur Verfügung stellen zu können. Soweit Sie Ihre Einwilligung in\n die Standortabfrage durch Ihren Browser erteilt haben, verarbeiten wir Ihre\n Standortdaten auf der Grundlage von Art. 6 Abs. 1 Satz 1 lit. a{')'} DSGVO, der die\n Verarbeitung von personenbezogenen Daten mit der Einwilligung der betroffenen Person\n gestattet.\n

\n

\n Die bei der Nutzung von „ElectricRoutes“ anfallenden Daten speichern wir so\n anonymisiert, dass kein Personenbezug mehr hergestellt werden kann. Wir führen\n statistische Auswertungen dieser anonymisierten Daten durch, um mehr über die\n Nutzung von E Mobilität zu erfahren und um unseren Dienst verbessern zu können. Die\n Anonymisierung der Daten basiert auf unserem berechtigten Interesse nach Art. 6 Abs.\n 1 Satz 1 lit. f{')'} DSGVO, die Daten in anonymisierter Form statistisch auswerten\n zu können.\n

\n

\n Sie haben im Rahmen der „ElectricRoutes Community“ ferner die Möglichkeit,\n Ladestationen nach vordefinierten Kriterien zu bewerten. Wir speichern Ihre\n Bewertung und stellen sie anderen „ElectricRoutes“-Nutzern bei den\n Statusinformationen für die betroffene Ladestation zum Abruf zur Verfügung. Ihre\n Bewertung bleibt dabei anonym – anderen Nutzern werden weder Ihr Name noch sonstige\n identifizierende Merkmale angezeigt. Wir behalten uns vor, über die Verarbeitung\n (pseudonymer) Merkmale wie beispielsweise der Geräte-ID sicherzustellen, dass\n lediglich eine Bewertung pro Nutzer hinterlegt werden kann. Die Datenverarbeitungen\n im Zusammenhang mit Bewertungen erfolgen auf der Grundlage von Art. 6 Abs. 1 Satz 1\n lit. f{')'} DSGVO, der die Verarbeitung von personenbezogenen Daten im Rahmen\n unserer „berechtigten Interessen“ gestattet, soweit nicht Ihre Grundrechte,\n Grundfreiheiten oder Interessen überwiegen. Unsere berechtigten Interessen bestehen\n in der Bereitstellung eines objektiven Bewertungssystems für Ladesäulen im Rahmen\n unseres Dienstes „ElectricRoutes“.\n

\n\n
4.2 Kommunikation per E-Mail
\n\n

\n Wenn Sie per E-Mail Kontakt zu uns aufzunehmen, verarbeiten wir Ihre Anfrage sowie\n Ihre E Mail-Adresse ausschließlich zur Bearbeitung Ihres Anliegens und möglicher\n Rückfragen.\n

\n

\n Die Rechtsgrundlage für die Verarbeitung Ihrer Mitteilungen und Ihrer E-Mail-Adresse\n ist Art. 6 Abs. 1 Satz 1 Buchst. b{')'} DSGVO.\n

\n
\n
\n\n {/* ------------------- HEADING 5 ------------------- */}\n \n }\n aria-controls=\"panel5a-content\"\n id=\"panel5a-header\"\n >\n {'5. Empfänger von personenbezogenen Daten'}\n \n \n

\n Die von uns im Rahmen Ihres Besuchs auf unserer Website erhobenen personenbezogenen\n Daten werden grundsätzlich nicht an andere Empfänger weitergegeben oder in sonstiger\n Weise übermittelt, soweit dies nicht in der Datenschutzerklärung ausdrücklich\n angegeben wird. Ausgenommen hiervon sind zwingend erforderliche Übermittlungen\n personenbezogener Daten an staatliche Einrichtungen und Behörden sowie private\n Rechteinhaber auf der Grundlage gesetzlicher Vorschriften oder gerichtlicher bzw.\n behördlicher Entscheidungen sowie die erforderliche Weitergabe an staatliche\n Einrichtungen und Behörden im Fall von Angriffen auf unsere Rechtsgüter zu Zwecken\n der Rechts- oder Strafverfolgung.\n

\n

\n Beim Betrieb unserer Website und der Erbringung und Abwicklung einzelner\n Website-Funktionen und Angebote bedienen wir uns jedoch zum Teil externer\n technischer und sonstiger Dienstleister, die uns bei der Erbringung unserer\n Leistungen unterstützen und von uns sorgfältig ausgewählt wurden. Soweit\n erforderlich, verarbeiten diese von uns eingeschalteten Dienstleister Ihre\n personenbezogen Daten im Rahmen ihres jeweiligen Auftrags gemäß unseren Anweisungen\n zu den in diesen Datenschutzhinweisen genannten Zwecken. Sie sind vertraglich zur\n strikten Einhaltung dieser Datenschutzerklärung, der geltenden gesetzlichen\n Datenschutzbestimmungen und unserer Weisungen verpflichtet (sog. Auftragsverarbeiter\n gemäß Art. 28 DSGVO). Dasselbe gilt für etwaige Unterauftragnehmer, soweit sich\n unsere Auftragsverarbeiter mit unserer vorherigen Zustimmung solcher bedienen.\n

\n

\n Auftragsverarbeiter werden von uns insbesondere zum Hosting der Website und unserer\n Routennavigationsdatenbank eingesetzt.\n

\n
\n
\n\n {/* ------------------- HEADING 6 ------------------- */}\n \n }\n aria-controls=\"panel6a-content\"\n id=\"panel6a-header\"\n >\n {'6. Verarbeitung von personenbezogenen Daten in „Drittländern“'}\n \n \n

\n Wir verarbeiten die auf der Website erhobenen personenbezogenen Daten innerhalb der\n Mitgliedstaaten der Europäischen Union. Eine Übermittlung personenbezogener Daten in\n sonstige „Drittländer“, also in Länder außerhalb der Europäischen Union und des\n Europäischen Wirtschaftsraums, findet nur statt, wenn wir Ihnen dies in dieser\n Datenschutzerklärung ausdrücklich mitteilen.\n

\n

\n Bei der im Abschnitt 3.2. beschriebenen Nutzung von „Google Maps“ kann es zu\n Datenübermittlungen in die USA kommen. Die Datenerhebung und –verarbeitung durch\n „Google Maps“ erfolgt ausschließlich mit Ihrer Einwilligung gemäß Art. 6 Abs. 1 Satz\n 1 lit. a{')'} DSGVO in Verbindung mit Art. 49 Abs.1 lit. a{')'} DSGVO.\n

\n
\n
\n\n {/* ------------------- HEADING 7 ------------------- */}\n \n }\n aria-controls=\"panel7a-content\"\n id=\"panel7a-header\"\n >\n {'7. Dauer der Speicherung'}\n \n \n

\n Generell speichern wir personenbezogene Daten nur solange, wie dies zur Erfüllung\n des Zwecks der jeweiligen Datenverarbeitung erforderlich ist, oder bis Sie von uns\n aus anderen berechtigen Gründen eine Löschung der personenbezogenen Daten verlangen\n (siehe Art. 17 Abs. 1 DSGVO). Nach Ablauf dieser Speicherfristen bzw. auf Ihr\n berechtigtes Löschungsverlangen hin prüfen wir jeweils, ob bestimmte\n personenbezogene Daten noch für (andere) legitime Zwecke benötigt werden und, falls\n nicht, ob einer Löschung der personenbezogenen Daten vertragliche oder gesetzliche\n Aufbewahrungsfristen entgegenstehen. In diesen Fällen werden die davon betroffenen\n personenbezogenen Daten solange, wie zur Erfüllung dieses (anderen) legitime Zweckes\n erforderlich, bzw. für die Dauer der jeweiligen vertraglichen oder gesetzlichen\n Aufbewahrungsfrist für diese Zwecke weitergespeichert. Für andere Zwecke werden sie\n jedoch gesperrt und dann nach Ablauf der jeweils letzten vertraglichen oder\n gesetzlichen Aufbewahrungsfrist endgültig gelöscht.\n

\n

\n Die in den Server-Logfiles enthaltenen technischen Kommunikationsdaten (siehe\n Abschnitt 3.1) werden nach spätestens 90 Tagen gelöscht.\n

\n

\n Die Speicherdauer der an Google übermittelten Daten können Sie der\n Datenschutzerklärung von Google entnehmen (siehe Abschnitt 3.2).\n

\n

\n Die bei der Nutzung von „ElectricRoutes“ anfallenden Daten speichern und verarbeiten\n wir ohne Personenbezug (siehe Abschnitt 4.1).\n

\n

\n Falls Sie per E-Mail Kontakt zu uns aufnehmen, speichern wir die von Ihnen gesandte\n Nachricht sowie Ihre E-Mail-Adresse nur solange, wie dies zur Bearbeitung Ihres\n Anliegens und möglicher Rückfragen erforderlich ist (siehe Abschnitt 4.2). Ihre\n Daten werden spätestens sechs Monate nach Ihrer letzten Kontaktaufnahme gelöscht, es\n sei denn, wir sind zur weiteren Speicherung Ihrer Nachricht und/oder Ihrer\n E-Mail-Adresse berechtigt oder verpflichtet.\n

\n
\n
\n\n {/* ------------------- HEADING 8 ------------------- */}\n \n }\n aria-controls=\"panel8a-content\"\n id=\"panel8a-header\"\n >\n {'8. Ihre Rechte (Betroffenenrechte)'}\n \n \n

\n Soweit die gesetzlichen Voraussetzungen nach den Art. 15 ff. DSGVO vorliegen, haben\n Sie hinsichtlich Ihrer bei uns gespeicherten personenbezogenen Daten folgende Rechte\n (sog. Betroffenenrechte):\n

\n\n
    \n
  • \n Sie können jederzeit bei uns Auskunft darüber verlangen, ob personenbezogene Daten\n und welche Kategorien personenbezogener Daten über Sie bei uns gespeichert sind,\n zu welchen Zwecken diese verarbeitet werden und welche Empfänger oder Kategorien\n von Empfängern diese ggf. erhalten. Ferner können Sie die weiteren in Art. 15\n DSGVO aufgezählten Informationen zu Ihren personenbezogenen Daten bei uns erfragen\n (Recht auf Auskunft).\n
  • \n
  • \n Gemäß den gesetzlichen Voraussetzungen haben Sie außerdem ein Recht auf\n Berichtigung (Art. 16 DSGVO), ein Recht auf Löschung (Art. 17 DSGVO) und ein Recht\n auf Einschränkung der Verarbeitung (Sperrung) (Art. 18 DSGVO) Ihrer\n personenbezogenen Daten.\n
  • \n
  • \n Sie haben weiter gemäß Art. 20 DSGVO das Recht, die Sie betreffenden\n personenbezogenen Daten, die Sie uns bereitgestellt haben, in einem\n strukturierten, gängigen und maschinenlesbaren Format von uns zu erhalten. Sie\n können diese personenbezogenen Daten auch an andere Verantwortliche übermitteln\n oder übermitteln lassen (Recht auf Datenübertragbarkeit).\n
  • \n
  • \n Sie haben auch Anspruch auf jederzeitigen Widerruf Ihrer erteilten Einwilligungen.\n
  • \n
  • \n \n Darüber hinaus haben Sie das Recht, bei Datenverarbeitungen, die nach Art. 6\n Abs. 1 Satz 1 lit. f{')'} DSGVO auf den berechtigten Interessen des\n Verantwortlichen oder eines Dritten beruhen, bei Vorliegen der gesetzlichen\n Voraussetzungen nach Art. 21 DSGVO der Datenverarbeitung zu widersprechen.\n \n
  • \n
\n\n

\n Zur Geltendmachung Ihrer Betroffenenrechte können Sie sich jederzeit unter einer der\n in den Abschnitten 1. und 2. angegebenen Adressen an uns wenden.\n

\n

\n Ferner haben Sie gemäß Art. 77 Abs. 1 DSGVO das Recht auf Beschwerde bei einer\n Aufsichtsbehörde, insbesondere in dem Mitgliedstaat ihres Aufenthaltsorts, ihres\n Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes, wenn Sie der Ansicht sind,\n dass die Verarbeitung der Sie betreffenden personenbezogenen Daten gegen die DSGVO\n verstößt.\n

\n
\n
\n\n {/* ------------------- HEADING 9 ------------------- */}\n \n }\n aria-controls=\"panel9a-content\"\n id=\"panel9a-header\"\n data-cy=\"privacy-accordion-9\"\n >\n {'9. Datensicherheit'}\n \n \n

\n Wir setzen umfangreiche technische und organisatorische Vorkehrungen ein, um Ihre\n bei uns gespeicherten und verarbeiteten personenbezogenen Daten gegen Missbrauch,\n zufällige oder vorsätzliche Manipulationen, Verlust, den Zugriff unberechtigter\n Personen und gegen sonstige Datensicherheitsrisiken zu schützen. Unsere Vorkehrungen\n zur Datensicherheit werden entsprechend der technologischen Entwicklung fortlaufend\n verbessert. Die Übermittlung von personenbezogenen Daten erfolgt verschlüsselt nach\n aktuellem Stand der Technik\n

\n

\n Unsere Mitarbeiter sind von uns zur Wahrung der Vertraulichkeit und zur Einhaltung\n der maßgeblichen datenschutzrechtlichen Vorschriften verpflichtet.\n

\n
\n
\n\n {/* ------------------- HEADING 10 ------------------- */}\n \n }\n aria-controls=\"panel10a-content\"\n id=\"panel10a-header\"\n >\n {'10. Änderung der Datenschutzerklärung'}\n \n \n

\n Wir können diese Datenschutzhinweise jederzeit an veränderte tatsächliche oder\n rechtliche Gegebenheiten anpassen und werden jeweils die neueste Version dieser\n Datenschutzhinweise an dieser Stelle veröffentlichen. Wann diese Datenschutzhinweise\n zuletzt geändert wurden, können Sie an der Datumsangabe („Zuletzt aktualisiert“) am\n Anfang dieser Datenschutzhinweise erkennen\n

\n
\n
\n\n {/* ------------------- HEADING 11 ------------------- */}\n \n \n {/* TODO: Replace with correct German translation */}\n \n \n \n
\n
\n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { getColor } from '../../../theme/colors/colors';\nimport { getVar } from '../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst LandingContainer = styled.div`\n width: 100%;\n background-color: ${getColor('primary')};\n padding: calc(${getVar('headerHeight')} + 10rem) 0 ${getVar('headerHeight')} 0;\n`;\n\nconst Heading = styled.h2`\n color: ${getColor('primaryContrast')};\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n`;\n\nconst ImprintContainer = styled.div`\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n padding: 7.8rem 0 15rem 0;\n`;\n\nconst SubtitleContainer = styled.div`\n margin-bottom: 2.4rem;\n margin-top: 7.2rem;\n`;\n\nconst Divider = styled.div`\n height: 0.1rem;\n margin-bottom: 2.4rem;\n background-color: ${getColor('adminBlack', 0.3)};\n`;\n\nconst Row = styled.div`\n padding: 2.4rem 0;\n display: flex;\n align-items: flex-start;\n justify-content: flex-start;\n border-bottom: 0.1rem solid ${getColor('adminBlack', 0.05)};\n\n @media screen and (max-width: 750px) {\n flex-direction: column;\n }\n`;\n\nconst StyledH4 = styled.h4`\n font-style: normal;\n font-weight: 700;\n font-size: 1.8rem;\n color: ${getColor('text')};\n`;\n\nconst StyledH5 = styled.div`\n font-style: normal;\n font-weight: 800;\n font-size: 1.6rem;\n color: ${getColor('text')};\n width: 40%;\n\n @media screen and (max-width: 750px) {\n width: 100%;\n }\n`;\n\nconst StyledText = styled.div`\n font-style: normal;\n font-weight: normal;\n font-size: 1.6rem;\n color: ${getColor('text')};\n width: 60%;\n\n @media screen and (max-width: 750px) {\n width: 100%;\n margin-top: 1rem;\n }\n`;\n\nconst StyledText2 = styled.div`\n font-style: normal;\n font-weight: normal;\n font-size: 1.6rem;\n color: ${getColor('text')};\n border-bottom: 0.1rem solid ${getColor('adminBlack', 0.05)};\n padding: 2.4rem 0;\n`;\n\nconst StyledMiniRow = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n margin-bottom: 1.6rem;\n`;\n\nconst StyledIcon = styled.img`\n margin-right: 1rem;\n`;\n\nconst StyledLink = styled.a`\n &[href] {\n color: ${getColor('primary')};\n text-decoration: underline;\n cursor: pointer;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const ImprintStyles = {\n ImprintContainer,\n LandingContainer,\n Heading,\n SubtitleContainer,\n Divider,\n Row,\n StyledH4,\n StyledH5,\n StyledText,\n StyledText2,\n StyledMiniRow,\n StyledIcon,\n StyledLink,\n};\n","export default __webpack_public_path__ + \"static/media/phone.22e8098e.svg\";","export default __webpack_public_path__ + \"static/media/mail.c51674ec.svg\";","export default __webpack_public_path__ + \"static/media/external-link.f04c4f16.svg\";","/* ****************************************************** Imports ****************************************************** */\nimport { ImprintStyles } from './Imprint.styles';\n\nimport PhoneIcon from '../../../../assets/images/legal/phone.svg';\nimport EmailIcon from '../../../../assets/images/legal/mail.svg';\nimport ExternalLinkIcon from '../../../../assets/images/legal/external-link.svg';\n\n/* ****************************************************** Component ****************************************************** */\nexport const ImprintEN = () => {\n /* ****************************************************** Template ****************************************************** */\n return (\n <>\n \n \n Imprint\n \n \n\n \n \n \n Information according to § 5 para. 1 of the Telemedia Act:\n \n \n \n \n Provider name:\n \n ElectricRoutes GmbH\n \n \n \n Address:\n \n
Heilbronner Str. 86
\n
70191 Stuttgart
\n
Deutschland
\n
\n
\n \n \n Authorized representative managing director:\n \n Andreas Bisenius\n \n \n Registry Court:\n \n Amtsgericht Stuttgart\n \n \n \n Register number:\n HRB 780686\n \n \n Contact details:\n \n \n \n \n contact@electricroutes.com\n \n \n \n \n \n +49 711 252 749-0\n \n \n \n \n \n https://www.electricroutes.com\n \n \n \n \n\n \n \n Consumer Dispute Resolution\n \n \n \n \n

\n The European Commission provides an online platform for online\n dispute resolution, which can be found at \n \n http://ec.europa.eu/consumers/odr/.\n \n

\n
\n

\n ElectricRoutes GmbH is neither willing nor obliged to participate in\n dispute resolution proceedings before a consumer arbitration board.\n

\n
\n

\n Additional information on professional liability insurance pursuant\n to Section 2 (1) No. 11 of the Ordinance on Information Duties for\n Service Providers (DL-InfoV):\n

\n
\n \n \n Name and address of the insurer:\n \n \n
AIG Europe S.A.
\n
Direktion für Deutschland
\n
Neue Mainzer Straße 46 – 50
\n
60311 Frankfurt
\n
\n
\n \n Spatial scope:\n \n Worldwide insurance coverage\n \n \n\n \n Copyright notice\n \n \n \n

\n The content available on our website is generally subject to\n copyright protection. Any unauthorized use (in particular copying,\n editing or distribution) of this copyright-protected content is\n therefore prohibited.\n

\n
\n

\n The Charger data for routing is provided in cooperation with\n CIRRANTiC GmbH (\n \n https://cirrantic.com\n \n ). Use of functions and details of the Charger data is only\n permitted for route planning with ElectricRoutes webapp and app for\n end users. Automated queries of the Charger data\n (bots/scraping/crawling) and all commercial uses of the functions\n and Charger data are not permitted. More information on Charger data\n is available at MOOVILITY Webapp (\n \n https://moovility.com\n \n ) and App (\n \n https://moovility.com/app\n \n ).\n

\n
\n
\n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { ImprintStyles } from './Imprint.styles';\n\nimport PhoneIcon from '../../../../assets/images/legal/phone.svg';\nimport EmailIcon from '../../../../assets/images/legal/mail.svg';\nimport ExternalLinkIcon from '../../../../assets/images/legal/external-link.svg';\n\n/* ****************************************************** Component ****************************************************** */\nexport const ImprintDE = () => {\n /* ****************************************************** Template ****************************************************** */\n return (\n <>\n \n \n Impressum\n \n \n\n \n \n \n Angaben gemäß § 5 Abs. 1 des Telemediengesetzes:\n \n \n \n \n Name des Anbieters:\n \n ElectricRoutes GmbH\n \n \n \n Anschrift:\n \n
Heilbronner Str. 86
\n
70191 Stuttgart
\n
Deutschland
\n
\n
\n \n \n Vertretungsberechtigte Geschäftsführer:\n \n Andreas Bisenius\n \n \n Registergericht:\n \n Amtsgericht Stuttgart\n \n \n \n Registernummer:\n HRB 780686\n \n \n \n Umsatzsteuer-Id.-Nr. (§ 27a UStG).:\n \n DE264948656\n \n \n Kontaktdaten:\n \n \n \n \n contact@electricroutes.com\n \n \n \n \n \n +49 711 252 749-0\n \n \n \n \n \n https://www.electricroutes.com\n \n \n \n \n\n \n \n Verbraucherstreitbeilegung\n \n \n \n \n

\n Die Europäische Kommission stellt eine Online-Plattform zur\n Online-Streitbeilegung zur Verfügung, welche unter \n \n http://ec.europa.eu/consumers/odr/\n {' '}\n zu finden ist.\n

\n
\n

\n Die ElectricRoutes GmbH ist weder bereit noch verpflichtet, an\n Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle\n teilzunehmen.\n

\n
\n

\n Zusätzliche Informationen zur Berufshaftpflichtversicherung gemäß §\n 2 Abs. 1 Nr. 11 der Verordnung über Informationspflichten für\n Dienstleistungserbringer (DL-InfoV):\n

\n
\n \n \n Name und Anschrift des Versicherers:\n \n \n
AIG Europe S.A.
\n
Direktion für Deutschland
\n
Neue Mainzer Straße 46 – 50
\n
60311 Frankfurt
\n
\n
\n \n \n Räumlicher Geltungsbereich:\n \n \n Weltweiter Versicherungsschutz\n \n \n\n \n Urheberrechtshinweis\n \n \n \n

\n Die auf unserer Internetseite vorhandenen Inhalte unterliegen in der\n Regel dem Schutz des Urheberrechts. Jede unberechtigte Verwendung\n (insbesondere die Vervielfältigung, Bearbeitung oder Verbreitung)\n dieser urheberrechtsgeschützten Inhalte ist daher untersagt.\n

\n
\n

\n Die Charger-Daten für das Routing werden in Kooperation mit\n CIRRANTiC GmbH (\n \n https://cirrantic.com\n \n ) bereitgestellt. Eine Verwendung von Funktionen und Details der\n Charger-Daten ist nur für die Routenplanung mit ElectricRoutes\n Webapp und App für Endnutzer zulässig. Automatisierte Abfragen der\n Charger-Daten (Bots/Scraping/Crawling) sowie alle kommerzielle\n Verwendungen der Funktionen und Charger-Daten sind nicht gestattet.\n Mehr Informationen zu den Charger-Daten sind unter MOOVILITY Webapp\n (\n \n https://moovility.com\n \n ) und App (\n \n https://moovility.com/app\n \n ) verfügbar.\n

\n
\n
\n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\nimport { getColor } from '../../theme/colors/colors';\nimport { getVar } from '../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst NotFoundContainer = styled.div`\n background-color: ${getColor('primary')};\n padding: calc(${getVar('headerHeight')} + 12rem) 0;\n min-height: 100%;\n`;\n\nconst NotFoundContent = styled.div`\n position: relative;\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n color: ${getColor('primaryContrast')};\n text-align: center;\n\n p {\n font-weight: 700;\n font-size: 2rem;\n margin-bottom: 2rem;\n }\n\n img {\n position: absolute;\n top: -12rem;\n left: 0;\n width: 100%;\n }\n`;\n\nconst ButtonsWrapper = styled.div`\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n justify-content: center;\n margin-top: 5rem;\n\n button {\n margin-right: 1.5rem;\n margin-bottom: 3rem;\n\n &:last-of-type {\n margin-right: 0;\n text-transform: none !important;\n }\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const NotFoundStyles = {\n NotFoundContainer,\n NotFoundContent,\n ButtonsWrapper,\n};\n","export default __webpack_public_path__ + \"static/media/404-world.05358b3a.svg\";","/* ****************************************************** Imports ****************************************************** */\nimport { NotFoundStyles } from './NotFound.styles';\n\nimport world from '../../../assets/images/404-world.svg';\nimport { Button } from '@material-ui/core';\nimport { NavLink } from 'react-router-dom';\nimport { APP_ROUTES } from '../../shared/appRoutes';\nimport { useTranslation } from 'react-i18next';\nimport { APP_LINKS } from '../../shared/appLinks';\n\n/* ****************************************************** Component ****************************************************** */\nexport const NotFoundPage = () => {\n const { t } = useTranslation();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \"\"\n

{t('404.top')}

\n

{t('404.main')}

\n\n \n \n \n \n
\n
\n );\n};\n","/**\n * useScroll React custom hook\n * Usage:\n * const { scrollX, scrollY, scrollDirection } = useScroll();\n */\n\nimport { useState, useEffect } from 'react';\n\nexport function useScroll() {\n const [lastScrollTop, setLastScrollTop] = useState(0);\n const [bodyOffset, setBodyOffset] = useState(\n document.body.getBoundingClientRect()\n );\n const [scrollY, setScrollY] = useState(bodyOffset.top);\n const [scrollX, setScrollX] = useState(bodyOffset.left);\n const [scrollDirection, setScrollDirection] = useState();\n\n const listener = (e) => {\n setBodyOffset(document.body.getBoundingClientRect());\n setScrollY(-bodyOffset.top);\n setScrollX(bodyOffset.left);\n setScrollDirection(lastScrollTop > -bodyOffset.top ? 'down' : 'up');\n setLastScrollTop(-bodyOffset.top);\n };\n\n useEffect(() => {\n window.addEventListener('scroll', listener);\n return () => {\n window.removeEventListener('scroll', listener);\n };\n });\n\n return {\n scrollY,\n scrollX,\n scrollDirection,\n };\n}\n","import { APP_ROUTES } from './../../appRoutes';\ninterface HeaderLinkDataModel {\n text: string;\n route: string;\n exact?: boolean;\n}\n\nexport const HeaderLinksData: HeaderLinkDataModel[] = [\n {\n text: 'header.home',\n route: APP_ROUTES.home,\n exact: true,\n },\n {\n text: 'header.apps',\n route: APP_ROUTES.apps,\n },\n {\n text: 'header.b2b',\n route: APP_ROUTES.b2b,\n },\n {\n text: 'header.about',\n route: APP_ROUTES.about,\n },\n];\n","/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\n\nimport { NavLink } from 'react-router-dom';\n\nimport { getColor } from '../../../../theme/colors/colors';\nimport { getVar } from '../../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst LanguageAbsoluteContainer = styled.div`\n position: absolute;\n top: 3rem;\n right: calc((100% - ${getVar('maxWidth')}) / 2);\n z-index: 1000;\n color: ${getColor('primaryContrast')};\n\n &.blue {\n color: ${getColor('primary')};\n }\n\n @media (min-width: 1251px) and (max-height: 640px) {\n top: 0.5rem;\n }\n`;\n\nconst HeaderContainer = styled.div`\n width: 100%;\n height: ${getVar('headerHeight')};\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n padding: 0;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 999;\n pointer-events: none;\n\n & a,\n & button {\n pointer-events: auto;\n }\n\n &.scrolled {\n position: fixed;\n background: ${getColor('primary')};\n top: -10rem;\n\n &.show {\n transition: 0.2s;\n top: 0;\n }\n\n &.white {\n background: ${getColor('background')};\n }\n\n &.black {\n background: ${getColor('adminBlack')};\n }\n\n height: 10rem;\n }\n`;\n\nconst HeaderContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n`;\n\nconst LogoImage = styled.img`\n //For responsive > FullHD\n height: 5.2rem;\n //For responsive > FullHD\n\n &.white {\n filter: brightness(0) invert(1);\n }\n`;\n\nconst LinkContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst HeaderLink = styled(NavLink)`\n font-size: 1.6rem;\n font-weight: 700;\n margin-right: calc(${getVar('headerLinkSpacing')} * 1.25);\n color: ${getColor('primaryContrast')};\n padding: 0 ${getVar('headerLinkSpacing')};\n\n &.blueText {\n color: ${getColor('primary')};\n\n & > span::after {\n background-color: ${getColor('primary')};\n }\n }\n\n &:hover > span::after,\n &.active > span::after {\n opacity: 1;\n }\n`;\n\nconst HeaderLinkButton = styled.button`\n font-size: 1.6rem;\n font-weight: 700;\n color: ${getColor('primaryContrast')};\n margin-right: 0;\n box-shadow: inset 0 0 0 0.1rem ${getColor('primaryContrast', 0.3)};\n border-radius: ${getVar('headerLinkSpacing')};\n padding: ${getVar('headerLinkSpacing')}\n calc(${getVar('headerLinkSpacing')} * 2);\n cursor: pointer;\n background: transparent;\n\n &:hover {\n box-shadow: inset 0 0 0 0.2rem ${getColor('primaryContrast', 1)};\n }\n\n &.blueText {\n color: ${getColor('primary')};\n box-shadow: inset 0 0 0 0.1rem ${getColor('primary', 1)};\n\n &:hover {\n box-shadow: inset 0 0 0 0.2rem ${getColor('primary', 1)};\n }\n }\n`;\n\nconst HeaderLinkText = styled.span`\n position: relative;\n padding: ${getVar('headerLinkSpacing')} 0;\n\n &::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n width: 4.2rem;\n height: 0.2rem;\n background-color: ${getColor('primaryContrast')};\n border-radius: 0 0 0.4rem 0.4rem;\n opacity: 0;\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const DesktopHeaderStyles = {\n LanguageAbsoluteContainer,\n HeaderContainer,\n HeaderContent,\n LogoImage,\n LinkContainer,\n HeaderLink,\n HeaderLinkButton,\n HeaderLinkText,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { NavLink, useLocation } from 'react-router-dom';\nimport { useEffect, useState } from 'react';\n\nimport { useScroll } from '../../../hooks/useScroll';\n\nimport logoBlue from '../../../../../assets/images/logos/full-logo-blue.svg';\n\nimport { HeaderLinksData } from '../header-links.data';\nimport { DesktopHeaderStyles } from './DesktopHeader.styles';\nimport { APP_ROUTES } from '../../../appRoutes';\nimport { LanguageSwitcher } from '../../language-switcher/LanguageSwitcher';\nimport { contactFormTopicService } from '../../../../services/contact-form-topic.service';\nimport { useAppAnalytics } from 'analytics';\nimport { LanguageModel } from '../../language-switcher/language.data';\n\n/* ****************************************************** Component ****************************************************** */\nexport const DesktopHeader = ({ contactUsClicked, linkClicked }: any) => {\n /* ****************************************************** State ****************************************************** */\n const [scrollActive, setScrollActive] = useState(false);\n\n const { t } = useTranslation();\n\n /* ****************************************************** useScroll() ****************************************************** */\n const scroll = useScroll();\n\n useEffect(() => {\n setScrollActive(scroll.scrollY > 100);\n }, [scroll]);\n\n /* ****************************************************** useLocation() ****************************************************** */\n const location = useLocation();\n\n useEffect(() => {}, [location]);\n\n /* ****************************************************** Logic ****************************************************** */\n const getHeaderClasses = () => {\n const classes = [];\n\n switch (location.pathname) {\n case APP_ROUTES.apps:\n classes.push('white');\n break;\n case APP_ROUTES.b2b:\n classes.push('black');\n break;\n }\n\n if (scrollActive) {\n if (scroll.scrollDirection === 'down') {\n classes.push('show');\n }\n classes.push('scrolled');\n }\n\n return classes.join(' ');\n };\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n <>\n \n \n trackEvent({\n action: 'Language changed',\n name: JSON.stringify({ lang }),\n category: 'General',\n })\n }\n />\n \n\n \n \n \n \n \n\n \n {HeaderLinksData.map((link) => (\n linkClicked(link.text)}\n key={link.route}\n to={link.route}\n activeClassName=\"active\"\n exact={link.exact}\n className={location.pathname === APP_ROUTES.apps ? 'blueText' : ''}\n >\n \n {t(link.text)}\n \n \n ))}\n\n {\n contactFormTopicService.changeTopic('OTHER');\n window.scrollTo(0, document.body.scrollHeight);\n contactUsClicked();\n }}\n >\n {t('header.contact')}\n \n \n \n \n \n );\n};\n","import { IconButton } from '@material-ui/core';\n/* ****************************************************** Imports ****************************************************** */\nimport styled from '@emotion/styled';\n\nimport { NavLink } from 'react-router-dom';\n\nimport { getColor } from '../../../../theme/colors/colors';\nimport { getVar } from '../../../../theme/ui-variables/ui-variables';\n\n/* ****************************************************** Styles ****************************************************** */\nconst LanguageAbsoluteContainer = styled.div`\n margin-left: calc((100% - ${getVar('maxWidth')}) / 2);\n color: ${getColor('primaryContrast')};\n\n &.blue {\n color: ${getColor('primary')};\n }\n`;\n\nconst MobileHeaderContainer = styled.div`\n width: 100%;\n height: ${getVar('headerHeight')};\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: center;\n padding: 0;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1400;\n pointer-events: none;\n\n & a,\n & button {\n pointer-events: auto;\n }\n\n &.scrolled {\n position: fixed;\n background: ${getColor('primary')};\n top: -10rem;\n\n &.show {\n transition: 0.2s;\n top: 0;\n }\n\n &.white {\n background: ${getColor('background')};\n }\n\n &.black {\n background: ${getColor('adminBlack')};\n }\n\n height: 10rem;\n }\n`;\n\nconst MobileHeaderContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n max-width: ${getVar('maxWidth')};\n margin: 0 auto;\n`;\n\nconst LogoImage = styled.img`\n //For responsive > FullHD\n height: 5.2rem;\n //For responsive > FullHD\n\n &.white {\n filter: brightness(0) invert(1);\n }\n\n @media screen and (max-width: 360px) {\n height: 4.5rem;\n }\n`;\n\nconst LinkContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 100%;\n`;\n\nconst MobileHeaderLink = styled(NavLink)`\n font-size: 1.6rem;\n font-weight: 700;\n color: ${getColor('primaryContrast')};\n padding: 3rem calc((100% - ${getVar('maxWidth')}) / 2);\n text-transform: uppercase;\n width: 100%;\n\n &.blueText {\n color: ${getColor('primary')};\n\n &:hover {\n background-color: ${getColor('primary', 0.1)};\n }\n\n &.active {\n box-shadow: inset 0.3rem 0 0 ${getColor('primary')};\n background-color: ${getColor('primary', 0.1)};\n }\n }\n\n &:hover {\n background-color: ${getColor('primaryContrast', 0.1)};\n }\n\n &.active {\n box-shadow: inset 0.3rem 0 0 ${getColor('primaryContrast')};\n background-color: ${getColor('primaryContrast', 0.1)};\n }\n`;\n\nconst MobileHeaderLinkButton = styled.button`\n font-size: 1.6rem;\n font-weight: 700;\n color: ${getColor('primaryContrast')};\n box-shadow: inset 0 0 0 0.1rem ${getColor('primaryContrast', 0.3)} !important;\n border-radius: ${getVar('headerLinkSpacing')};\n padding: ${getVar('headerLinkSpacing')}\n calc(${getVar('headerLinkSpacing')} * 2);\n background-color: transparent !important;\n width: auto;\n margin: 3rem 0 10rem calc((100% - var(--maxWidth)) / 2);\n cursor: pointer;\n background: transparent;\n\n &:hover {\n box-shadow: inset 0 0 0 0.2rem ${getColor('primaryContrast', 1)} !important;\n }\n\n &.blueText {\n color: ${getColor('primary')};\n box-shadow: inset 0 0 0 0.1rem ${getColor('primary', 1)} !important;\n\n &:hover {\n box-shadow: inset 0 0 0 0.2rem ${getColor('primary', 1)} !important;\n }\n }\n\n @media screen and (max-height: 640px) {\n margin-bottom: 5rem;\n }\n`;\n\nconst MobileHeaderLinkText = styled.span``;\n\nconst StyledToggleButton = styled(IconButton)`\n &.MuiIconButton-root {\n width: 6rem;\n height: 6rem;\n color: ${getColor('primaryContrast')};\n\n &.blueText {\n color: ${getColor('primary')};\n }\n\n svg {\n width: 4rem;\n height: 4rem;\n }\n }\n`;\n\n/* ****************************************************** Export ****************************************************** */\nexport const MobileHeaderStyles = {\n LanguageAbsoluteContainer,\n MobileHeaderContainer,\n MobileHeaderContent,\n LogoImage,\n LinkContainer,\n MobileHeaderLink,\n MobileHeaderLinkButton,\n MobileHeaderLinkText,\n StyledToggleButton,\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { useTranslation } from 'react-i18next';\nimport { NavLink, useLocation } from 'react-router-dom';\nimport { useEffect, useState } from 'react';\n\nimport { useScroll } from '../../../hooks/useScroll';\n\nimport logoBlue from '../../../../../assets/images/logos/full-logo-blue.svg';\n\nimport { HeaderLinksData } from '../header-links.data';\nimport { MobileHeaderStyles } from './MobileHeader.styles';\nimport { APP_ROUTES } from '../../../appRoutes';\nimport { LanguageSwitcher } from '../../language-switcher/LanguageSwitcher';\n\nimport { Drawer } from '@material-ui/core';\nimport MenuIcon from '@material-ui/icons/Menu';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { contactFormTopicService } from '../../../../services/contact-form-topic.service';\nimport { useAppAnalytics } from 'analytics';\nimport { LanguageModel } from '../../language-switcher/language.data';\n\n/* ****************************************************** Component ****************************************************** */\nexport const MobileHeader = ({ contactUsClicked, linkClicked }: any) => {\n /* ****************************************************** State ****************************************************** */\n const [isOpen, setIsOpen] = useState(false);\n const [scrollActive, setScrollActive] = useState(false);\n\n const { t } = useTranslation();\n\n /* ****************************************************** useScroll() ****************************************************** */\n const scroll = useScroll();\n\n useEffect(() => {\n setScrollActive(scroll.scrollY > 100);\n }, [scroll]);\n\n /* ****************************************************** useLocation() ****************************************************** */\n const location = useLocation();\n\n useEffect(() => {}, [location]);\n\n /* ****************************************************** Logic ****************************************************** */\n const getHeaderClasses = () => {\n const classes = [];\n\n switch (location.pathname) {\n case APP_ROUTES.apps:\n classes.push('white');\n break;\n case APP_ROUTES.b2b:\n classes.push('black');\n break;\n }\n\n if (scrollActive) {\n if (scroll.scrollDirection === 'down') {\n classes.push('show');\n }\n classes.push('scrolled');\n }\n\n return classes.join(' ');\n };\n\n const handleClose = () => {\n setIsOpen(false);\n };\n\n const toggleHeader = () => {\n setIsOpen(!isOpen);\n };\n\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n /* ****************************************************** Template ****************************************************** */\n return (\n <>\n \n \n {HeaderLinksData.map((link) => (\n {\n linkClicked(link.text);\n handleClose();\n }}\n >\n \n {t(link.text)}\n \n \n ))}\n\n {\n contactFormTopicService.changeTopic('OTHER');\n window.scrollTo(0, document.body.scrollHeight);\n contactUsClicked();\n handleClose();\n }}\n >\n {t('header.contact')}\n \n \n\n \n \n trackEvent({\n action: 'Language changed',\n name: JSON.stringify({ lang }),\n category: 'General',\n })\n }\n />\n \n \n\n \n \n \n \n \n\n \n {isOpen ? : }\n \n \n \n \n );\n};\n","import { DesktopHeader } from './desktop-header/DesktopHeader';\nimport { MobileHeader } from './mobile-header/MobileHeader';\nimport { useAppAnalytics } from 'analytics';\nimport { useEffect } from 'react';\nimport { useResize } from '../../hooks/useResize';\n\nexport const Header = () => {\n /* *************************************************** APP INSIGHTS **************************************************** */\n const { trackEvent } = useAppAnalytics();\n\n const handleContactUsClick = () => {\n trackEvent({ action: '[Header] Contact Us Clicked', category: 'General' });\n };\n\n const handleLinkClick = (linkText: string) => {\n switch (linkText) {\n case 'header.home':\n trackEvent({ action: '[Header] Home Clicked', category: 'General' });\n break;\n case 'header.apps':\n trackEvent({ action: '[Header] Mobile & Web App Clicked', category: 'General' });\n break;\n case 'header.b2b':\n trackEvent({ action: '[Header] B2B Offer Clicked', category: 'General' });\n break;\n case 'header.about':\n trackEvent({ action: '[Header] About Us Clicked', category: 'General' });\n }\n };\n\n /* ****************************************************** useResize() ****************************************************** */\n const windowSize = useResize();\n\n useEffect(() => {}, [windowSize]);\n\n return (\n <>\n {windowSize.width > 1250 ? (\n \n ) : (\n \n )}\n \n );\n};\n","/* ****************************************************** Imports ****************************************************** */\nimport { HashRouter as Router, Switch, Route } from 'react-router-dom';\nimport { useEffect } from 'react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MatomoProvider } from '@datapunt/matomo-tracker-react';\n\nimport { ThemeProvider } from '@material-ui/core/styles';\nimport { setThemeColor } from './core/theme/colors/colors';\nimport { muiTheme } from './core/theme/mui-theme/mui-theme';\n\nimport { APP_ROUTES } from './core/shared/appRoutes';\n\nimport { LanguageModel, LANGUAGES } from './core/shared/components/language-switcher/language.data';\nimport { LanguageContext, LanguageContextModel } from './core/language-context';\n\nimport { HomePage } from './core/pages/home/Home';\nimport { AppsPage } from './core/pages/apps/AppsPage';\nimport { B2BPage } from './core/pages/b2b/B2BPage';\nimport { AboutPage } from './core/pages/about/AboutPage';\nimport { ScrollToTop } from './core/shared/components/ScrollToTop';\nimport { Footer } from './core/shared/components/footer/Footer';\nimport { ErrorSnackbar } from './core/shared/components/error-snakcbar/ErrorSnackbar';\nimport { PrivacyPolicyEN } from './core/pages/legal/privacy-policy/PrivacyPolicyEN';\nimport { PrivacyPolicyDE } from './core/pages/legal/privacy-policy/PrivacyPolicyDE';\nimport { ImprintEN } from './core/pages/legal/imprint/ImprintEN';\nimport { ImprintDE } from './core/pages/legal/imprint/ImprintDE';\nimport { NotFoundPage } from './core/pages/not-found/NotFoundPage';\nimport { Header } from './core/shared/components/header/Header';\nimport { matomoInstance } from './analytics';\n\n/* ****************************************************** Component ****************************************************** */\nexport const App = () => {\n /* ****************************************************** Language and context ****************************************************** */\n const { i18n } = useTranslation();\n\n const [languageContextValue, setLanguageContextValue] = useState('en');\n\n const languageProviderValue: LanguageContextModel = {\n languageContextValue,\n setLanguageContextValue,\n };\n\n /* ****************************************************** Custom console.log() ****************************************************** */\n useEffect(() => {\n // Custom console log on first page load\n console.log(\n `%cRide. Charge. Repeat.`,\n 'color:#0040FF; font-family: Roboto; font-size: 24px; font-weight: bold'\n );\n console.log(\n '%cELECTRIC ROUTES',\n 'background-image: url(https://www.electricroutes.com/static/media/full-logo-blue.f93046e2.svg);background-repeat:no-repeat; background-position: 0 13px ;padding: 2rem 15rem;color:transparent'\n );\n }, []);\n\n /* ****************************************************** useEffect() ****************************************************** */\n useEffect(() => {\n setThemeColor('light');\n\n /* Set language for translation */\n const currentLang: any = navigator.language.split('-')[0];\n\n const computedLanguage: LanguageModel =\n LANGUAGES.indexOf(currentLang) !== -1 ? currentLang : 'en';\n\n i18n.changeLanguage(computedLanguage);\n\n setLanguageContextValue(computedLanguage);\n }, [i18n]);\n\n /* ****************************************************** Template ****************************************************** */\n return (\n \n \n \n \n \n
\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n