{"version":3,"file":"js/21140-f36b32dbb68eed7b0f90.js","mappings":"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","sources":["webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/node_modules/@strava/react-hooks/src/use-window-scroll-top/useWindowScrollTop.hook.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/node_modules/@strava/constants/src/appConstants.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/node_modules/@strava/ui/clsx/clsx.ts","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/state/FrontDoorsPageContainerContext.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/node_modules/@strava/ui/StravaLogo/StravaLogo.tsx","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/node_modules/@strava/ui/Button/styles.module.scss?ddea","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/node_modules/@strava/ui/Button/Button.tsx","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/node_modules/@strava/ui/Button/LinkButton.tsx","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/Header/components/DesktopNav/DesktopNav.module.scss?1042","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/IconButton/IconButton.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/Header/components/DesktopNav/DesktopNav.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/node_modules/@strava/icons/dist/NavigationMenuNormalLarge.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/node_modules/@strava/icons/dist/ActionsCancelNormalMedium.js","webpack://StravaModern/./node_modules/react-modern-drawer/dist/index.modern.js","webpack://StravaModern/../src/observe.ts","webpack://StravaModern/../src/InView.tsx","webpack://StravaModern/./node_modules/@strava/smart-banner-ui/node_modules/@strava/ui/Button/styles.module.scss?db9d","webpack://StravaModern/./node_modules/@strava/smart-banner-ui/node_modules/@strava/ui/Button/Button.tsx","webpack://StravaModern/./node_modules/@strava/smart-banner-ui/node_modules/@strava/ui/Button/LinkButton.tsx","webpack://StravaModern/./node_modules/@strava/smart-banner-ui/node_modules/@strava/ui/clsx/clsx.ts","webpack://StravaModern/./node_modules/@strava/smart-banner-ui/node_modules/@strava/icons/dist/ActionsCancelNormalXsmall.js","webpack://StravaModern/./node_modules/@strava/smart-banner-ui/node_modules/@strava/constants/src/appConstants.js","webpack://StravaModern/./node_modules/@strava/smart-banner-ui/SmartBanner.module.scss?b4e9","webpack://StravaModern/./node_modules/@strava/smart-banner-ui/SmartBanner.js","webpack://StravaModern/../src/useInView.tsx","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/Header/components/MobileNav/MobileNav.module.scss?e3fc","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/CallToAction/CallToAction.module.scss?5e00","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/CallToAction/CallToAction.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/Header/components/MobileNav/MobileNav.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/Header/Header.module.scss?a94b","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/Header/Header.js","webpack://StravaModern/./node_modules/@strava/shared-ui/node_modules/@strava/react-hooks/src/use-safe-state/useSafeState.hook.ts","webpack://StravaModern/./node_modules/@strava/shared-ui/node_modules/@strava/react-hooks/src/use-localized-images/constants.js","webpack://StravaModern/./node_modules/@strava/shared-ui/node_modules/@strava/constants/src/appConstants.js","webpack://StravaModern/./node_modules/@strava/shared-ui/node_modules/@strava/react-hooks/src/use-localized-images/helpers.js","webpack://StravaModern/./node_modules/@strava/shared-ui/node_modules/@strava/react-hooks/src/use-localized-images/useLocalizedImages.hook.js","webpack://StravaModern/./node_modules/@strava/shared-ui/src/AppStoreBadges/components/Badge/Badge.js","webpack://StravaModern/./node_modules/@strava/shared-ui/src/AppStoreBadges/constants.js","webpack://StravaModern/./node_modules/@strava/shared-ui/src/AppStoreBadges/AppStoreBadges.js","webpack://StravaModern/./node_modules/@strava/shared-ui/src/AppStoreBadges/helpers.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/Footer/components/SocialLink/SocialLink.module.scss?d34c","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/Footer/components/SocialLink/SocialLink.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/Footer/Footer.module.scss?33d7","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/components/Footer/Footer.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/state/FrontDoorsPageContainer.actions.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/state/FrontDoorsPageContainer.reducer.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/FrontDoorsPageContainer.module.scss?3c7e","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/FrontDoorsPageContainer.js","webpack://StravaModern/./node_modules/@strava/front-doors-page-container-ui/helpers/getDefaultEventHandlers.js"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\n\nexport const useWindowScrollTop = () => {\n const [windowScrollTop, setWindowScrollTop] = useState(0);\n\n const onScroll = useCallback(() => {\n setWindowScrollTop(window.scrollY);\n }, []);\n\n useEffect(() => {\n window?.addEventListener('scroll', onScroll);\n return () => {\n window?.removeEventListener('scroll', onScroll);\n };\n }, [onScroll]);\n\n return [windowScrollTop, onScroll];\n};\n\nexport default useWindowScrollTop;\n","export const YOUNGEST_AGE_ON_PLATFORM = 13;\n\nexport const YOUNGEST_AGE_FOR_HEALTH_AND_PROMO = 16;\n\nexport const GENDER = Object.freeze({\n man: 'man',\n woman: 'woman',\n preferNotSay: 'prefer_not_say',\n nonBinary: 'nonbinary'\n});\n\nexport const LOCALE = Object.freeze({\n deDE: 'de-DE',\n enUS: 'en-US',\n enGB: 'en-GB',\n esES: 'es-ES',\n es419: 'es-419',\n frFR: 'fr-FR',\n itIT: 'it-IT',\n jaJP: 'ja-JP',\n koKR: 'ko-KR',\n nlNL: 'nl-NL',\n ptBR: 'pt-BR',\n ptPT: 'pt-PT',\n ruRU: 'ru-RU',\n zhCN: 'zh-CN',\n zhTW: 'zh-TW'\n});\n\n// If a language has more than one locale, the first in the list is the default\nexport const LANGUAGE_LOCALES = Object.freeze({\n de: [LOCALE.deDE],\n // en is intentionally omitted here since English is the global default\n es: [LOCALE.esES, LOCALE.es419],\n fr: [LOCALE.frFR],\n it: [LOCALE.itIT],\n ja: [LOCALE.jaJP],\n ko: [LOCALE.koKR],\n nl: [LOCALE.nlNL],\n pt: [LOCALE.ptPT, LOCALE.ptBR],\n ru: [LOCALE.ruRU],\n zh: [LOCALE.zhCN, LOCALE.zhTW]\n});\n\nexport const EXPERIMENT_COHORTS = Object.freeze({\n control: 'control',\n variantA: 'variant-a',\n variantB: 'variant-b'\n});\n\nexport const MOBILE_OS = Object.freeze({\n android: 'android',\n iPhone: 'iphone',\n iPad: 'ipad'\n});\n\nexport const SUPPORTED_BROWSERS = Object.freeze({\n chrome: 'chrome',\n firefox: 'firefox',\n safari: 'safari'\n});\n\n// universal link paths from 'apple-app-site-association' file in active\nexport const APPLE_APP_LINK_PATHS = [\n '/dashboard',\n '/activities/*',\n '/athletes/*',\n '/segments/*',\n '/challenges/*',\n '/videos/*',\n '/routes/*',\n '/premium/*',\n '/settings/*',\n '/shop/*',\n '/athlete/*',\n '/clubs/*',\n '/summit/join',\n '/summit/perks',\n '/oauth/mobile/authorize'\n];\n\nexport const ATHLETES_VISIBILITY = Object.freeze({\n optedOut: 'opted_out' // Strava::Athletes::Visibility::OPTED_OUT\n});\n\nexport default {\n YOUNGEST_AGE_ON_PLATFORM,\n YOUNGEST_AGE_FOR_HEALTH_AND_PROMO,\n GENDER,\n LOCALE,\n EXPERIMENT_COHORTS,\n MOBILE_OS,\n SUPPORTED_BROWSERS,\n APPLE_APP_LINK_PATHS,\n ATHLETES_VISIBILITY\n};\n","type Value = string | number | boolean | undefined | null;\ntype MixObject = {\n [key: string]: boolean | Mix | undefined | null;\n};\ntype MixArray = Array;\ntype Mix = Value | MixObject | MixArray;\n\nfunction toVal(mix: Mix): string {\n let k,\n y,\n str = '';\n\n if (typeof mix === 'string' || typeof mix === 'number') {\n str += mix;\n } else if (typeof mix === 'object') {\n if (Array.isArray(mix)) {\n for (k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((y = toVal(mix[k]))) {\n str && (str += ' ');\n str += y;\n }\n }\n }\n } else {\n for (k in mix) {\n if (!mix || mix[k]) {\n str && (str += ' ');\n str += k;\n }\n }\n }\n }\n\n return str;\n}\n\nexport function clsx(..._args: Mix[]): string {\n let i = 0,\n tmp,\n x,\n str = '';\n\n while (i < arguments.length) {\n if ((tmp = arguments[i++])) {\n if ((x = toVal(tmp))) {\n str && (str += ' ');\n str += x;\n }\n }\n }\n return str;\n}\n\nexport default clsx;\n","import React, { createContext, useContext } from 'react';\n\nconst FrontDoorsPageContainerContext = createContext();\nFrontDoorsPageContainerContext.displayName = 'FrontDoorsPageContainerContext';\n\nexport const useFrontDoorsPageContainerContext = () => {\n const context = useContext(FrontDoorsPageContainerContext);\n if (!context) {\n throw new Error(\n 'useFrontDoorsPageContainerContext must be used within the FrontDoorsPageContainerContext.Provider'\n );\n }\n return context;\n};\n\nexport const FrontDoorsPageContainerContextProvider = (props) => (\n \n);\n\nexport default FrontDoorsPageContainerContext;\n","import React from 'react';\nimport { color } from '@strava/ui-tokens/js';\nimport clsx from '../clsx';\n\nexport interface StravaLogoProps {\n alt?: string;\n className?: string;\n width: string | number;\n height: string | number;\n fill: string;\n style: React.CSSProperties;\n}\n\nfunction StravaLogo({\n className,\n alt = 'Strava',\n width = 'auto',\n height = 'auto',\n fill = color.colorCoreO3,\n style,\n ...props\n}: StravaLogoProps) {\n return (\n \n {alt}\n \n \n );\n}\n\nexport default StravaLogo;\n","// extracted by mini-css-extract-plugin\nexport default {\"btn\":\"Button--btn--uCOMP\",\"default\":\"Button--default--LDTwy\",\"primary\":\"Button--primary--uxskA\",\"primaryOutline\":\"Button--primaryOutline--Igbur\",\"secondary\":\"Button--secondary--KXL9Y\",\"icon\":\"Button--icon--tz2va\",\"text\":\"Button--text--y7f7I\"};","import React from 'react';\nimport clsx from 'clsx';\n\nimport styles from './styles.module.scss';\n\nexport interface ButtonProps extends React.ComponentPropsWithoutRef<'button'> {\n children: React.ReactNode;\n variant?:\n | 'default'\n | 'primary'\n | 'primaryOutline'\n | 'secondary'\n | 'icon'\n | 'text';\n className?: string;\n}\n\nconst Button = React.forwardRef(\n ({ children, className, variant = 'default', ...props }, ref) => (\n \n {children}\n \n )\n);\n\nexport default Button;\n","import clsx from 'clsx';\nimport React, { ComponentPropsWithoutRef, forwardRef } from 'react';\n\nimport styles from './styles.module.scss';\nimport { ButtonProps } from './Button';\n\nexport type LinkButtonProps = ButtonProps & ComponentPropsWithoutRef<'a'>;\n\nconst LinkButton = forwardRef(\n ({ href, children, className, variant = 'default', ...otherProps }, ref) => {\n return (\n \n {children}\n \n );\n }\n);\n\nexport default LinkButton;\n","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"DesktopNav--container--c+Nru\",\"item\":\"DesktopNav--item--fO4GZ\",\"loginBtn\":\"DesktopNav--loginBtn--mOl73\",\"signupBtn\":\"DesktopNav--signupBtn--eUI6+\"};","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@strava/ui/Button';\n\nconst IconButton = ({\n children,\n onClick,\n ariaLabel,\n className,\n ...options\n}) => {\n return (\n \n {children}\n \n );\n};\n\nIconButton.defaultProps = {\n className: null\n};\n\nIconButton.propTypes = {\n children: PropTypes.node.isRequired,\n onClick: PropTypes.func.isRequired,\n ariaLabel: PropTypes.string.isRequired,\n className: PropTypes.string\n};\n\nexport default IconButton;\n","import React from 'react';\nimport StravaLogo from '@strava/ui/StravaLogo';\nimport Button from '@strava/ui/Button';\nimport { EXPERIMENT_COHORTS } from '@strava/constants/src/appConstants';\nimport { useFrontDoorsPageContainerContext } from '../../../../state/FrontDoorsPageContainerContext';\nimport styles from './DesktopNav.module.scss';\nimport IconButton from '../../../IconButton';\n\nconst DesktopNav = () => {\n const {\n t,\n state,\n onDesktopHeaderLoginBtnClick,\n onDesktopHeaderSignupBtnClick,\n onDesktopHeaderLogoClick\n } = useFrontDoorsPageContainerContext();\n const { cohort, menuConfig } = state;\n const { showLoginOptionOnly } = menuConfig;\n\n const handleLoginBtnClick = () => {\n onDesktopHeaderLoginBtnClick();\n window.location.href = '/login';\n };\n\n const handleSignupBtnClick = () => {\n onDesktopHeaderSignupBtnClick();\n window.location.href = '/register';\n };\n\n const handleLogoClick = () => {\n onDesktopHeaderLogoClick();\n window.location.href = '/';\n };\n\n // TODO - cleanup after experiment https://strava.atlassian.net/browse/ACQN-301\n const signupBtnCopy = () => {\n // join_us -> 'Join For Free'\n const key = cohort === EXPERIMENT_COHORTS.variantA ? 'join_now' : 'join_us';\n return t(`header.${key}`);\n };\n\n return (\n
\n
\n \n \n \n
\n
\n \n {t('header.log_in')}\n \n {!showLoginOptionOnly && (\n \n {signupBtnCopy()}\n \n )}\n
\n
\n );\n};\n\nexport default DesktopNav;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgNavigationMenuNormalLarge = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgNavigationMenuNormalLarge.defaultProps = {\n color: \"currentColor\",\n size: 48,\n title: undefined,\n titleId: undefined,\n};\nSvgNavigationMenuNormalLarge.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgNavigationMenuNormalLarge;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgActionsCancelNormalMedium = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgActionsCancelNormalMedium.defaultProps = {\n color: \"currentColor\",\n size: 32,\n title: undefined,\n titleId: undefined,\n};\nSvgActionsCancelNormalMedium.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgActionsCancelNormalMedium;\n","import React, { useRef, useEffect, useMemo } from 'react';\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nvar getDirectionStyle = function getDirectionStyle(dir, size) {\n switch (dir) {\n case 'left':\n return {\n top: 0,\n left: 0,\n transform: 'translate3d(-100%, 0, 0)',\n width: size,\n height: '100vh'\n };\n\n case 'right':\n return {\n top: 0,\n right: 0,\n transform: 'translate3d(100%, 0, 0)',\n width: size,\n height: '100vh'\n };\n\n case 'bottom':\n return {\n left: 0,\n right: 0,\n bottom: 0,\n transform: 'translate3d(0, 100%, 0)',\n width: '100%',\n height: size\n };\n\n case 'top':\n return {\n left: 0,\n right: 0,\n top: 0,\n transform: 'translate3d(0, -100%, 0)',\n width: '100%',\n height: size\n };\n\n default:\n return {};\n }\n};\n\nvar EZDrawer = function EZDrawer(props) {\n var open = props.open,\n _props$onClose = props.onClose,\n onClose = _props$onClose === void 0 ? function () {} : _props$onClose,\n children = props.children,\n style = props.style,\n _props$enableOverlay = props.enableOverlay,\n enableOverlay = _props$enableOverlay === void 0 ? true : _props$enableOverlay,\n _props$overlayColor = props.overlayColor,\n overlayColor = _props$overlayColor === void 0 ? '#000' : _props$overlayColor,\n _props$overlayOpacity = props.overlayOpacity,\n overlayOpacity = _props$overlayOpacity === void 0 ? 0.4 : _props$overlayOpacity,\n _props$zIndex = props.zIndex,\n zIndex = _props$zIndex === void 0 ? 100 : _props$zIndex,\n _props$duration = props.duration,\n duration = _props$duration === void 0 ? 500 : _props$duration,\n direction = props.direction,\n _props$size = props.size,\n size = _props$size === void 0 ? 250 : _props$size,\n className = props.className,\n customIdSuffix = props.customIdSuffix,\n _props$lockBackground = props.lockBackgroundScroll,\n lockBackgroundScroll = _props$lockBackground === void 0 ? false : _props$lockBackground;\n var bodyRef = useRef(null);\n useEffect(function () {\n var updatePageScroll = function updatePageScroll() {\n bodyRef.current = window.document.querySelector('body');\n\n if (bodyRef.current && lockBackgroundScroll) {\n if (open) {\n bodyRef.current.style.overflow = 'hidden';\n } else {\n bodyRef.current.style.overflow = '';\n }\n }\n };\n\n updatePageScroll();\n }, [open]);\n var idSuffix = useMemo(function () {\n return customIdSuffix || (Math.random() + 1).toString(36).substring(7);\n }, [customIdSuffix]);\n var overlayStyles = {\n backgroundColor: \"\" + overlayColor,\n opacity: \"\" + overlayOpacity,\n zIndex: zIndex\n };\n\n var drawerStyles = _extends({\n zIndex: zIndex + 1,\n transitionDuration: duration + \"ms\"\n }, getDirectionStyle(direction, size), style);\n\n return React.createElement(\"div\", {\n id: 'EZDrawer' + idSuffix,\n className: 'EZDrawer'\n }, React.createElement(\"input\", {\n type: 'checkbox',\n id: 'EZDrawer__checkbox' + idSuffix,\n className: 'EZDrawer__checkbox',\n onChange: onClose,\n checked: open\n }), React.createElement(\"nav\", {\n role: 'navigation',\n id: 'EZDrawer__container' + idSuffix,\n style: drawerStyles,\n className: 'EZDrawer__container ' + className\n }, children), enableOverlay && React.createElement(\"label\", {\n htmlFor: 'EZDrawer__checkbox' + idSuffix,\n id: 'EZDrawer__overlay' + idSuffix,\n className: 'EZDrawer__overlay',\n style: overlayStyles\n }));\n};\n\nexport default EZDrawer;\n//# sourceMappingURL=index.modern.js.map\n","import type { ObserverInstanceCallback } from './index';\n\nconst observerMap = new Map<\n string,\n {\n id: string;\n observer: IntersectionObserver;\n elements: Map>;\n }\n>();\n\nconst RootIds: WeakMap = new WeakMap();\nlet rootId = 0;\n\nlet unsupportedValue: boolean | undefined = undefined;\n\n/**\n * What should be the default behavior if the IntersectionObserver is unsupported?\n * Ideally the polyfill has been loaded, you can have the following happen:\n * - `undefined`: Throw an error\n * - `true` or `false`: Set the `inView` value to this regardless of intersection state\n * **/\nexport function defaultFallbackInView(inView: boolean | undefined) {\n unsupportedValue = inView;\n}\n\n/**\n * Generate a unique ID for the root element\n * @param root\n */\nfunction getRootId(root: IntersectionObserverInit['root']) {\n if (!root) return '0';\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\n\n/**\n * Convert the options to a string Id, based on the values.\n * Ensures we can reuse the same observer when observing elements with the same options.\n * @param options\n */\nexport function optionsToId(options: IntersectionObserverInit) {\n return Object.keys(options)\n .sort()\n .filter(\n (key) => options[key as keyof IntersectionObserverInit] !== undefined,\n )\n .map((key) => {\n return `${key}_${\n key === 'root'\n ? getRootId(options.root)\n : options[key as keyof IntersectionObserverInit]\n }`;\n })\n .toString();\n}\n\nfunction createObserver(options: IntersectionObserverInit) {\n // Create a unique ID for this observer instance, based on the root, root margin and threshold.\n let id = optionsToId(options);\n let instance = observerMap.get(id);\n\n if (!instance) {\n // Create a map of elements this observer is going to observe. Each element has a list of callbacks that should be triggered, once it comes into view.\n const elements = new Map>();\n let thresholds: number[] | readonly number[];\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n // While it would be nice if you could just look at isIntersecting to determine if the component is inside the viewport, browsers can't agree on how to use it.\n // -Firefox ignores `threshold` when considering `isIntersecting`, so it will never be false again if `threshold` is > 0\n const inView =\n entry.isIntersecting &&\n thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n\n // @ts-ignore support IntersectionObserver v2\n if (options.trackVisibility && typeof entry.isVisible === 'undefined') {\n // The browser doesn't support Intersection Observer v2, falling back to v1 behavior.\n // @ts-ignore\n entry.isVisible = inView;\n }\n\n elements.get(entry.target)?.forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n\n // Ensure we have a valid thresholds array. If not, use the threshold from the options\n thresholds =\n observer.thresholds ||\n (Array.isArray(options.threshold)\n ? options.threshold\n : [options.threshold || 0]);\n\n instance = {\n id,\n observer,\n elements,\n };\n\n observerMap.set(id, instance);\n }\n\n return instance;\n}\n\n/**\n * @param element - DOM Element to observe\n * @param callback - Callback function to trigger when intersection status changes\n * @param options - Intersection Observer options\n * @param fallbackInView - Fallback inView value.\n * @return Function - Cleanup function that should be triggered to unregister the observer\n */\nexport function observe(\n element: Element,\n callback: ObserverInstanceCallback,\n options: IntersectionObserverInit = {},\n fallbackInView = unsupportedValue,\n) {\n if (\n typeof window.IntersectionObserver === 'undefined' &&\n fallbackInView !== undefined\n ) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio:\n typeof options.threshold === 'number' ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds,\n });\n return () => {\n // Nothing to cleanup\n };\n }\n // An observer with the same options can be reused, so lets use this fact\n const { id, observer, elements } = createObserver(options);\n\n // Register the callback listener for this element\n let callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n\n callbacks.push(callback);\n observer.observe(element);\n\n return function unobserve() {\n // Remove the callback from the callback list\n callbacks.splice(callbacks.indexOf(callback), 1);\n\n if (callbacks.length === 0) {\n // No more callback exists for element, so destroy it\n elements.delete(element);\n observer.unobserve(element);\n }\n\n if (elements.size === 0) {\n // No more elements are being observer by this instance, so destroy it\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n","import * as React from 'react';\nimport type { IntersectionObserverProps, PlainChildrenProps } from './index';\nimport { observe } from './observe';\n\ntype State = {\n inView: boolean;\n entry?: IntersectionObserverEntry;\n};\n\nfunction isPlainChildren(\n props: IntersectionObserverProps | PlainChildrenProps,\n): props is PlainChildrenProps {\n return typeof props.children !== 'function';\n}\n\n/**\n ## Render props\n\n To use the `` component, you pass it a function. It will be called\n whenever the state changes, with the new value of `inView`. In addition to the\n `inView` prop, children also receive a `ref` that should be set on the\n containing DOM element. This is the element that the IntersectionObserver will\n monitor.\n\n If you need it, you can also access the\n [`IntersectionObserverEntry`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry)\n on `entry`, giving you access to all the details about the current intersection\n state.\n\n ```jsx\n import { InView } from 'react-intersection-observer';\n\n const Component = () => (\n \n {({ inView, ref, entry }) => (\n
\n

{`Header inside viewport ${inView}.`}

\n
\n )}\n
\n );\n\n export default Component;\n ```\n\n ## Plain children\n\n You can pass any element to the ``, and it will handle creating the\n wrapping DOM element. Add a handler to the `onChange` method, and control the\n state in your own component. Any extra props you add to `` will be\n passed to the HTML element, allowing you set the `className`, `style`, etc.\n\n ```jsx\n import { InView } from 'react-intersection-observer';\n\n const Component = () => (\n console.log('Inview:', inView)}>\n

Plain children are always rendered. Use onChange to monitor state.

\n
\n );\n\n export default Component;\n ```\n */\nexport class InView extends React.Component<\n IntersectionObserverProps | PlainChildrenProps,\n State\n> {\n constructor(props: IntersectionObserverProps | PlainChildrenProps) {\n super(props);\n this.state = {\n inView: !!props.initialInView,\n entry: undefined,\n };\n }\n\n componentDidUpdate(prevProps: IntersectionObserverProps) {\n // If a IntersectionObserver option changed, reinit the observer\n if (\n prevProps.rootMargin !== this.props.rootMargin ||\n prevProps.root !== this.props.root ||\n prevProps.threshold !== this.props.threshold ||\n prevProps.skip !== this.props.skip ||\n prevProps.trackVisibility !== this.props.trackVisibility ||\n prevProps.delay !== this.props.delay\n ) {\n this.unobserve();\n this.observeNode();\n }\n }\n\n componentWillUnmount() {\n this.unobserve();\n this.node = null;\n }\n\n node: Element | null = null;\n _unobserveCb: (() => void) | null = null;\n\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView,\n } = this.props;\n\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay,\n },\n fallbackInView,\n );\n }\n\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n\n handleNode = (node?: Element | null) => {\n if (this.node) {\n // Clear the old observer, before we start observing a new element\n this.unobserve();\n\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n // Reset the state if we get a new node, and we aren't ignoring updates\n this.setState({ inView: !!this.props.initialInView, entry: undefined });\n }\n }\n\n this.node = node ? node : null;\n this.observeNode();\n };\n\n handleChange = (inView: boolean, entry: IntersectionObserverEntry) => {\n if (inView && this.props.triggerOnce) {\n // If `triggerOnce` is true, we should stop observing the element.\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n // Store the current State, so we can pass it to the children in the next render update\n // There's no reason to update the state for plain children, since it's not used in the rendering.\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n // If the user is actively listening for onChange, always trigger it\n this.props.onChange(inView, entry);\n }\n };\n\n render() {\n const { children } = this.props;\n if (typeof children === 'function') {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props as PlainChildrenProps;\n\n return React.createElement(\n as || 'div',\n { ref: this.handleNode, ...props },\n children,\n );\n }\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"btn\":\"Button--btn--ioOdD\",\"default\":\"Button--default--BRVHD\",\"primary\":\"Button--primary--i3WKp\",\"primaryOutline\":\"Button--primaryOutline--0VEUP\",\"secondary\":\"Button--secondary--Hqzix\",\"icon\":\"Button--icon--M+ZI8\",\"text\":\"Button--text--dGDlJ\"};","import React from 'react';\nimport clsx from 'clsx';\n\nimport styles from './styles.module.scss';\n\nexport interface ButtonProps extends React.ComponentPropsWithoutRef<'button'> {\n children: React.ReactNode;\n variant?:\n | 'default'\n | 'primary'\n | 'primaryOutline'\n | 'secondary'\n | 'icon'\n | 'text';\n className?: string;\n}\n\nconst Button = React.forwardRef(\n ({ children, className, variant = 'default', ...props }, ref) => (\n \n {children}\n \n )\n);\n\nexport default Button;\n","import clsx from 'clsx';\nimport React, { ComponentPropsWithoutRef, forwardRef } from 'react';\n\nimport styles from './styles.module.scss';\nimport { ButtonProps } from './Button';\n\nexport type LinkButtonProps = ButtonProps & ComponentPropsWithoutRef<'a'>;\n\nconst LinkButton = forwardRef(\n ({ href, children, className, variant = 'default', ...otherProps }, ref) => {\n return (\n \n {children}\n \n );\n }\n);\n\nexport default LinkButton;\n","type Value = string | number | boolean | undefined | null;\ntype MixObject = {\n [key: string]: boolean | Mix | undefined | null;\n};\ntype MixArray = Array;\ntype Mix = Value | MixObject | MixArray;\n\nfunction toVal(mix: Mix): string {\n let k,\n y,\n str = '';\n\n if (typeof mix === 'string' || typeof mix === 'number') {\n str += mix;\n } else if (typeof mix === 'object') {\n if (Array.isArray(mix)) {\n for (k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((y = toVal(mix[k]))) {\n str && (str += ' ');\n str += y;\n }\n }\n }\n } else {\n for (k in mix) {\n if (!mix || mix[k]) {\n str && (str += ' ');\n str += k;\n }\n }\n }\n }\n\n return str;\n}\n\nexport function clsx(..._args: Mix[]): string {\n let i = 0,\n tmp,\n x,\n str = '';\n\n while (i < arguments.length) {\n if ((tmp = arguments[i++])) {\n if ((x = toVal(tmp))) {\n str && (str += ' ');\n str += x;\n }\n }\n }\n return str;\n}\n\nexport default clsx;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgActionsCancelNormalXsmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgActionsCancelNormalXsmall.defaultProps = {\n color: \"currentColor\",\n size: 16,\n title: undefined,\n titleId: undefined,\n};\nSvgActionsCancelNormalXsmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgActionsCancelNormalXsmall;\n","export const YOUNGEST_AGE_ON_PLATFORM = 13;\n\nexport const YOUNGEST_AGE_FOR_HEALTH_AND_PROMO = 16;\n\nexport const GENDER = Object.freeze({\n man: 'man',\n woman: 'woman',\n preferNotSay: 'prefer_not_say',\n nonBinary: 'nonbinary'\n});\n\nexport const LOCALE = Object.freeze({\n deDE: 'de-DE',\n enUS: 'en-US',\n enGB: 'en-GB',\n esES: 'es-ES',\n es419: 'es-419',\n frFR: 'fr-FR',\n itIT: 'it-IT',\n jaJP: 'ja-JP',\n koKR: 'ko-KR',\n nlNL: 'nl-NL',\n ptBR: 'pt-BR',\n ptPT: 'pt-PT',\n ruRU: 'ru-RU',\n zhCN: 'zh-CN',\n zhTW: 'zh-TW'\n});\n\n// If a language has more than one locale, the first in the list is the default\nexport const LANGUAGE_LOCALES = Object.freeze({\n de: [LOCALE.deDE],\n // en is intentionally omitted here since English is the global default\n es: [LOCALE.esES, LOCALE.es419],\n fr: [LOCALE.frFR],\n it: [LOCALE.itIT],\n ja: [LOCALE.jaJP],\n ko: [LOCALE.koKR],\n nl: [LOCALE.nlNL],\n pt: [LOCALE.ptPT, LOCALE.ptBR],\n ru: [LOCALE.ruRU],\n zh: [LOCALE.zhCN, LOCALE.zhTW]\n});\n\nexport const EXPERIMENT_COHORTS = Object.freeze({\n control: 'control',\n variantA: 'variant-a',\n variantB: 'variant-b'\n});\n\nexport const MOBILE_OS = Object.freeze({\n android: 'android',\n iPhone: 'iphone',\n iPad: 'ipad'\n});\n\nexport const SUPPORTED_BROWSERS = Object.freeze({\n chrome: 'chrome',\n firefox: 'firefox',\n safari: 'safari'\n});\n\n// universal link paths from 'apple-app-site-association' file in active\nexport const APPLE_APP_LINK_PATHS = [\n '/dashboard',\n '/activities/*',\n '/athletes/*',\n '/segments/*',\n '/challenges/*',\n '/videos/*',\n '/routes/*',\n '/premium/*',\n '/settings/*',\n '/shop/*',\n '/athlete/*',\n '/clubs/*',\n '/summit/join',\n '/summit/perks',\n '/oauth/mobile/authorize'\n];\n\nexport const ATHLETES_VISIBILITY = Object.freeze({\n optedOut: 'opted_out' // Strava::Athletes::Visibility::OPTED_OUT\n});\n\nexport default {\n YOUNGEST_AGE_ON_PLATFORM,\n YOUNGEST_AGE_FOR_HEALTH_AND_PROMO,\n GENDER,\n LOCALE,\n EXPERIMENT_COHORTS,\n MOBILE_OS,\n SUPPORTED_BROWSERS,\n APPLE_APP_LINK_PATHS,\n ATHLETES_VISIBILITY\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"smart-banner-ui--wrapper--8LVP-\",\"smartBanner\":\"smart-banner-ui--smartBanner--a9rNI\",\"appInfo\":\"smart-banner-ui--appInfo--5Nk-F\",\"btn\":\"smart-banner-ui--btn--JwtOK\",\"closeBtn\":\"smart-banner-ui--closeBtn--kuyi3\"};","import React, {\n useEffect,\n useState,\n useCallback,\n useMemo,\n forwardRef\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { useInView } from 'react-intersection-observer';\nimport Button, { LinkButton } from '@strava/ui/Button';\nimport clsx from '@strava/ui/clsx';\nimport {\n useStravaAnalytics,\n useStravaTranslations,\n useStravaBranch\n} from '@strava/container-context';\n\nimport ActionsCancelNormalXsmall from '@strava/icons/ActionsCancelNormalXsmall';\nimport { color } from '@strava/ui-tokens/js';\nimport { MOBILE_OS } from '@strava/constants/src/appConstants';\nimport { isLocalStorageAvailable } from '@strava/utils/src/utils';\nimport styles from './SmartBanner.module.scss';\n\nimport iOSIcon from './assets/icon-ios-app.svg';\nimport androidIcon from './assets/icon-android-app.svg';\n\nexport const I18N_PREFIX = 'microfrontends.mobile_app_download_banner';\nexport const HIDE_BANNER_STORAGE_KEY = 'hide-mobile-app-download-banner';\n\nconst SmartBanner = forwardRef(\n ({ page, category, mobileOS, showCloseBtn, className }, ref) => {\n const { hasApp, appLink, isProcessing } = useStravaBranch();\n const { track: _track } = useStravaAnalytics();\n const { t: _t } = useStravaTranslations();\n\n const [inViewRef, inView] = useInView({ threshold: 0 });\n\n const [hideBanner, setHideBanner] = useState(false);\n\n const track = useCallback(\n (fields = {}) => {\n _track({\n category,\n page,\n ...fields,\n properties: {\n ...fields.properties\n }\n });\n },\n [_track, category, page]\n );\n\n const t = useMemo(\n () => (key, params) => _t(`${I18N_PREFIX}.${key}`, { ...params }),\n [_t]\n );\n\n const getAppInfoCopy = () => {\n if (\n [MOBILE_OS.iPhone, MOBILE_OS.android].includes(mobileOS?.toLowerCase())\n ) {\n return t(`app.${mobileOS.toLowerCase()}`);\n }\n return t('no_app');\n };\n\n useEffect(() => {\n let hide = false;\n if (isLocalStorageAvailable()) {\n hide = localStorage?.getItem(HIDE_BANNER_STORAGE_KEY) === 'true';\n }\n\n if (!hide && inView) {\n track({ element: 'smartbanner', action: 'screen_enter' });\n }\n setHideBanner(hide);\n }, [track, inView]);\n\n const handleCloseBanner = () => {\n track({\n element: 'dismiss_smartbanner',\n action: 'click'\n });\n setHideBanner(true);\n if (isLocalStorageAvailable()) {\n localStorage?.setItem(HIDE_BANNER_STORAGE_KEY, true);\n }\n\n // allows active to remove placeholder spacing when smartbanner is hidden\n document.dispatchEvent(new Event('removeSmartbanner'));\n };\n\n if (hideBanner) {\n return null;\n }\n\n return (\n \n
\n {showCloseBtn && (\n \n \n \n )}\n\n \n\n
\n
Strava
\n
{getAppInfoCopy()}
\n
\n \n track({\n element: hasApp ? 'open_app' : 'download_app',\n action: 'click',\n properties: {\n url: appLink\n }\n })\n }\n >\n {hasApp ? t('open') : t('download')}\n \n
\n \n );\n }\n);\n\nSmartBanner.defaultProps = {\n mobileOS: null,\n className: null,\n showCloseBtn: true\n};\n\nSmartBanner.propTypes = {\n page: PropTypes.string.isRequired,\n category: PropTypes.string.isRequired,\n mobileOS: PropTypes.string,\n className: PropTypes.string,\n showCloseBtn: PropTypes.bool\n};\n\nexport default SmartBanner;\n","import * as React from 'react';\nimport type { InViewHookResponse, IntersectionOptions } from './index';\nimport { observe } from './observe';\n\ntype State = {\n inView: boolean;\n entry?: IntersectionObserverEntry;\n};\n\n/**\n * React Hooks make it easy to monitor the `inView` state of your components. Call\n * the `useInView` hook with the (optional) [options](#options) you need. It will\n * return an array containing a `ref`, the `inView` status and the current\n * [`entry`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry).\n * Assign the `ref` to the DOM element you want to monitor, and the hook will\n * report the status.\n *\n * @example\n * ```jsx\n * import React from 'react';\n * import { useInView } from 'react-intersection-observer';\n *\n * const Component = () => {\n * const { ref, inView, entry } = useInView({\n * threshold: 0,\n * });\n *\n * return (\n *
\n *

{`Header inside viewport ${inView}.`}

\n *
\n * );\n * };\n * ```\n */\nexport function useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange,\n}: IntersectionOptions = {}): InViewHookResponse {\n const [ref, setRef] = React.useState(null);\n const callback = React.useRef();\n const [state, setState] = React.useState({\n inView: !!initialInView,\n entry: undefined,\n });\n\n // Store the onChange callback in a `ref`, so we can access the latest instance\n // inside the `useEffect`, but without triggering a rerender.\n callback.current = onChange;\n\n React.useEffect(\n () => {\n // Ensure we have node ref, and that we shouldn't skip observing\n if (skip || !ref) return;\n\n let unobserve: (() => void) | undefined;\n unobserve = observe(\n ref,\n (inView, entry) => {\n setState({\n inView,\n entry,\n });\n if (callback.current) callback.current(inView, entry);\n\n if (entry.isIntersecting && triggerOnce && unobserve) {\n // If it should only trigger once, unobserve the element after it's inView\n unobserve();\n unobserve = undefined;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay,\n },\n fallbackInView,\n );\n\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay,\n ],\n );\n\n const entryTarget = state.entry?.target;\n const previousEntryTarget = React.useRef();\n if (\n !ref &&\n entryTarget &&\n !triggerOnce &&\n !skip &&\n previousEntryTarget.current !== entryTarget\n ) {\n // If we don't have a node ref, then reset the state (unless the hook is set to only `triggerOnce` or `skip`)\n // This ensures we correctly reflect the current state - If you aren't observing anything, then nothing is inView\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: undefined,\n });\n }\n\n const result = [setRef, state.inView, state.entry] as InViewHookResponse;\n\n // Support object destructuring, by adding the specific values.\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n\n return result;\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"MobileNav--container--JdlQg\",\"menuDrawer\":\"MobileNav--menuDrawer--Fd+rF\",\"menuDrawerBtn\":\"MobileNav--menuDrawerBtn--8Pz9K\",\"left\":\"MobileNav--left--6QiY+\",\"right\":\"MobileNav--right--GmFUF\",\"logo\":\"MobileNav--logo--jj2HY\",\"headerCallToAction\":\"MobileNav--headerCallToAction--GhNOg\",\"drawerCallToAction\":\"MobileNav--drawerCallToAction--9780N\",\"menuBtn\":\"MobileNav--menuBtn--405MM\",\"isOpen\":\"MobileNav--isOpen--ZzcYD\"};","// extracted by mini-css-extract-plugin\nexport default {\"callToAction\":\"CallToAction--callToAction--zDaZ8\"};","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from '@strava/ui/clsx';\nimport { LinkButton } from '@strava/ui/Button';\nimport { useStravaBranch } from '@strava/container-context';\n\nimport styles from './CallToAction.module.scss';\n\nconst CallToAction = ({ label, className, dataCy, onClick }) => {\n const { appLink, isProcessing } = useStravaBranch();\n\n return (\n \n {label}\n \n );\n};\n\nCallToAction.propTypes = {\n label: PropTypes.string.isRequired,\n className: PropTypes.string,\n dataCy: PropTypes.string,\n onClick: PropTypes.func\n};\n\nCallToAction.defaultProps = {\n className: undefined,\n dataCy: undefined,\n onClick: () => {}\n};\n\nexport default CallToAction;\n","import React, { useState, useEffect, useRef } from 'react';\nimport clsx from '@strava/ui/clsx';\nimport Button from '@strava/ui/Button';\nimport NavigationMenuNormalLarge from '@strava/icons/NavigationMenuNormalLarge';\nimport ActionsCancelNormalLarge from '@strava/icons/ActionsCancelNormalMedium';\nimport Drawer from 'react-modern-drawer';\nimport StravaLogo from '@strava/ui/StravaLogo';\nimport { getMobileOS } from '@strava/utils';\nimport SmartBanner from '@strava/smart-banner-ui';\nimport { useFrontDoorsPageContainerContext } from '../../../../state/FrontDoorsPageContainerContext';\nimport styles from './MobileNav.module.scss';\nimport 'react-modern-drawer/dist/index.css';\nimport IconButton from '../../../IconButton';\n\nimport CallToAction from '../../../CallToAction';\n\nconst MobileNav = () => {\n const [isMenuOpen, toggleMenu] = useState(false);\n const mobileAppDownloadBannerRef = useRef();\n const {\n t,\n state,\n onMobileHeaderLogoClick,\n onMobileHeaderMenuOpen,\n onMobileHeaderMenuClose,\n onMobileHeaderSignupBtnClick,\n onMobileHeaderMenuSignupBtnClick,\n onMobileHeaderMenuLoginBtnClick\n } = useFrontDoorsPageContainerContext();\n const { page, category, userAgent, showSmartBanner, branch, url } = state;\n const [forceSmartBanner, setForceSmartbanner] = useState(false);\n\n const handleLoginBtnClick = () => {\n onMobileHeaderMenuLoginBtnClick();\n window.location.href = '/login';\n };\n\n const handleLogoClick = () => {\n onMobileHeaderLogoClick();\n window.location.href = '/';\n };\n\n const handleMenuToggle = () => {\n if (isMenuOpen) {\n onMobileHeaderMenuClose();\n } else {\n onMobileHeaderMenuOpen();\n }\n toggleMenu(!isMenuOpen);\n };\n\n // disables scroll when the menu is open\n useEffect(() => {\n if (!document?.body?.style) {\n return () => {};\n }\n document.body.style.overflow = isMenuOpen ? 'hidden' : 'scroll';\n document.body.style.width = '100%';\n return () => {\n document.body.style.overflow = 'scroll';\n };\n }, [isMenuOpen]);\n\n // For development only - use query param to force the smartbanner to show\n // on a page.\n useEffect(() => {\n if (window?.location?.href) {\n const [, queryParams] = window.location.href.split('?');\n const searchParams = new URLSearchParams(queryParams);\n setForceSmartbanner(!!searchParams.get('force_smartbanner'));\n }\n }, [url]);\n\n return (\n <>\n {(showSmartBanner || forceSmartBanner) && (\n \n )}\n
\n
\n \n {isMenuOpen ? (\n \n ) : (\n \n )}\n \n
\n \n \n \n
\n
\n\n
\n \n
\n \n \n {t('header.log_in')}\n \n \n \n
\n \n );\n};\n\nexport default MobileNav;\n","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"Header--container--R-v2A\",\"isScrolling\":\"Header--isScrolling--LW5RU\",\"menu\":\"Header--menu--CaRj2\",\"items\":\"Header--items--ZjIvC\"};","import React, { forwardRef } from 'react';\nimport clsx from '@strava/ui/clsx';\nimport { useFrontDoorsPageContainerContext } from '../../state/FrontDoorsPageContainerContext';\nimport DesktopNav from './components/DesktopNav';\nimport MobileNav from './components/MobileNav';\n\nimport styles from './Header.module.scss';\n\nconst Header = forwardRef((_, ref) => {\n const { state } = useFrontDoorsPageContainerContext();\n\n const isScrolling = state.windowScrollTop > 0;\n\n return (\n \n \n \n );\n});\n\nexport default Header;\n","import {\n Dispatch,\n SetStateAction,\n useRef,\n useCallback,\n useEffect,\n useState\n} from 'react';\n\n/**\n * The `useSafeState` hook acts the same as React's `useState`,\n * where we can set the initial state, and it returns (1) the current state,\n * and (2) the state setter.\n *\n * But with `useSafeState`, it will only set the state when the component is mounted\n * in order to prevent memory leaks and avoid this warning:\n * \"Warning: Can’t perform a React state update on an unmounted component.\"\n * When a component is unmounted, we don't want to set the state.\n *\n * This helps when we have async behavior where we call an async API call,\n * then based on the async response, we set the state. But if the component\n * unmounts before the API call resolves, we don't want to set the state.\n * */\n// eslint-disable-next-line import/prefer-default-export\nexport const useSafeState = (\n initialState: S | (() => S)\n): [S, Dispatch>] => {\n const mountedRef = useRef(false);\n const [state, setState] = useState(initialState);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const setSafeState = useCallback(\n (args) => (mountedRef.current ? setState(args) : () => {}),\n []\n );\n\n return [state, setSafeState];\n};\n","export const DEFAULT_LOCALIZED_IMAGES_SIZES = [\n { id: 'lg', value: 'large', minVw: '1200px' },\n { id: 'md', value: 'medium', minVw: '992px' },\n { id: 'sm', value: 'small', minVw: '768px' },\n { id: 'xs', value: 'xsmall', minVw: '0px' }\n];\n\nexport const DEFAULT_LOCALIZED_IMAGES_FORMATS = ['webp', 'png'];\n\nexport const DEFAULT_LOCALIZED_IMAGES_RESOLUTIONS = ['1x', '2x'];\n\nexport const DEFAULT_LOCALIZED_IMAGES_DIRECTORY = 'shared';\n\nexport const DEFAULT_LOCALIZED_IMAGES_SIZES_ORDER = [\n 'xl',\n 'lg',\n 'md',\n 'sm',\n 'xs'\n];\n\nexport const DEFAULT_LOCALIZED_IMAGES_FORMATS_ORDER = ['webp', 'png', 'jpg'];\n","export const YOUNGEST_AGE_ON_PLATFORM = 13;\n\nexport const YOUNGEST_AGE_FOR_HEALTH_AND_PROMO = 16;\n\nexport const GENDER = Object.freeze({\n man: 'man',\n woman: 'woman',\n preferNotSay: 'prefer_not_say',\n nonBinary: 'nonbinary'\n});\n\nexport const LOCALE = Object.freeze({\n deDE: 'de-DE',\n enUS: 'en-US',\n enGB: 'en-GB',\n esES: 'es-ES',\n es419: 'es-419',\n frFR: 'fr-FR',\n itIT: 'it-IT',\n jaJP: 'ja-JP',\n koKR: 'ko-KR',\n nlNL: 'nl-NL',\n ptBR: 'pt-BR',\n ptPT: 'pt-PT',\n ruRU: 'ru-RU',\n zhCN: 'zh-CN',\n zhTW: 'zh-TW'\n});\n\n// If a language has more than one locale, the first in the list is the default\nexport const LANGUAGE_LOCALES = Object.freeze({\n de: [LOCALE.deDE],\n // en is intentionally omitted here since English is the global default\n es: [LOCALE.esES, LOCALE.es419],\n fr: [LOCALE.frFR],\n it: [LOCALE.itIT],\n ja: [LOCALE.jaJP],\n ko: [LOCALE.koKR],\n nl: [LOCALE.nlNL],\n pt: [LOCALE.ptPT, LOCALE.ptBR],\n ru: [LOCALE.ruRU],\n zh: [LOCALE.zhCN, LOCALE.zhTW]\n});\n\nexport const EXPERIMENT_COHORTS = Object.freeze({\n control: 'control',\n variantA: 'variant-a',\n variantB: 'variant-b'\n});\n\nexport const MOBILE_OS = Object.freeze({\n android: 'android',\n iPhone: 'iphone',\n iPad: 'ipad'\n});\n\nexport const SUPPORTED_BROWSERS = Object.freeze({\n chrome: 'chrome',\n firefox: 'firefox',\n safari: 'safari'\n});\n\n// universal link paths from 'apple-app-site-association' file in active\nexport const APPLE_APP_LINK_PATHS = [\n '/dashboard',\n '/activities/*',\n '/athletes/*',\n '/segments/*',\n '/challenges/*',\n '/videos/*',\n '/routes/*',\n '/premium/*',\n '/settings/*',\n '/shop/*',\n '/athlete/*',\n '/clubs/*',\n '/summit/join',\n '/summit/perks',\n '/oauth/mobile/authorize'\n];\n\nexport const ATHLETES_VISIBILITY = Object.freeze({\n optedOut: 'opted_out' // Strava::Athletes::Visibility::OPTED_OUT\n});\n\nexport default {\n YOUNGEST_AGE_ON_PLATFORM,\n YOUNGEST_AGE_FOR_HEALTH_AND_PROMO,\n GENDER,\n LOCALE,\n EXPERIMENT_COHORTS,\n MOBILE_OS,\n SUPPORTED_BROWSERS,\n APPLE_APP_LINK_PATHS,\n ATHLETES_VISIBILITY\n};\n","import { LOCALE } from '@strava/constants/src/appConstants';\n\nexport const sortImagesBySizeAndFormat =\n (sizeOrder, formatOrder) => (image1, image2) => {\n const { size: image1Size, format: image1Format } = image1;\n const { size: image2Size, format: image2Format } = image2;\n\n // Sort images by size\n if (sizeOrder.indexOf(image1Size?.id) > sizeOrder.indexOf(image2Size?.id)) {\n return 1;\n }\n\n if (sizeOrder.indexOf(image1Size?.id) < sizeOrder.indexOf(image2Size?.id)) {\n return -1;\n }\n\n // Sort images by format\n if (formatOrder.indexOf(image1Format) > formatOrder.indexOf(image2Format)) {\n return 1;\n }\n\n if (formatOrder.indexOf(image1Format) < formatOrder.indexOf(image2Format)) {\n return -1;\n }\n\n return 0;\n };\n\nexport const getImageLocaleDirectory = (locale, defaultDirectory) => {\n if (!locale) {\n return defaultDirectory;\n }\n\n return Object.values(LOCALE).includes(locale) ? locale : LOCALE.enUS;\n};\n\nexport const getImageLocale = (locale) => {\n if (!locale) {\n return null;\n }\n\n return Object.values(LOCALE).includes(locale) ? locale : LOCALE.enUS;\n};\n\nexport default {\n getImageLocaleDirectory,\n getImageLocale,\n sortImagesBySizeAndFormat\n};\n","import { useEffect } from 'react';\nimport { useSafeState } from '../use-safe-state';\nimport {\n DEFAULT_LOCALIZED_IMAGES_SIZES,\n DEFAULT_LOCALIZED_IMAGES_FORMATS,\n DEFAULT_LOCALIZED_IMAGES_RESOLUTIONS,\n DEFAULT_LOCALIZED_IMAGES_DIRECTORY,\n DEFAULT_LOCALIZED_IMAGES_SIZES_ORDER,\n DEFAULT_LOCALIZED_IMAGES_FORMATS_ORDER\n} from './constants';\nimport {\n getImageLocale,\n getImageLocaleDirectory,\n sortImagesBySizeAndFormat\n} from './helpers';\n\n/**\n * This hook accepts a 'key' and additional optional params and returns an array of localized image assets.\n * For each image asset a callback is called to load the asset.\n * @param {Object} params\n * @param {string} params.key - string representing collection of image files e.g. 'Strava.com-Home-Screen1'\n * @param {string} params.locale - locale to use in filename / filepath e.g. 'de-DE' (optional, if none provided, defaults to 'defaultDirectory')\n * @param {Array=} params.sizes - sizes to use for a given asset. e.g. [{ id: 'lg', value: 'large', minVw: '1200px' }, { id: 'md', value: 'medium', minVw: '992px' }]\n * @param {Array=} params.formats - formats to use for a given asset. e.g. ['webp', 'png']\n * @param {Array=} params.resolutions - resolutions to use for a given asset e.g. ['1x', '2x']\n * @param {string=} params.defaultDirectory - directory to use if no locale provided. Defaults to 'shared'\n * @param {Function=} params.imageImportCallback - Callback function; called for each image instance. Params passed: imageLocaleDirectory, imageKey, imageSize, imageFormat, imageResolution, imageLocale\n * @param {Function=} params.logError - Error handling function\n * @returns {Array} images\n */\n\nexport const useLocalizedImages = ({\n key,\n locale,\n sizes = DEFAULT_LOCALIZED_IMAGES_SIZES,\n formats = DEFAULT_LOCALIZED_IMAGES_FORMATS,\n resolutions = DEFAULT_LOCALIZED_IMAGES_RESOLUTIONS,\n defaultDirectory = DEFAULT_LOCALIZED_IMAGES_DIRECTORY,\n imageImportCallback = () => {},\n logError\n}) => {\n const [images, setImages] = useSafeState([]);\n\n useEffect(() => {\n // Import asset from dynamic filepath\n const importImage = async (imageData) => {\n try {\n return imageImportCallback(imageData);\n } catch (error) {\n logError(new Error(`Error in imageImportCallback, Error: ${error}`));\n return null;\n }\n };\n\n const initImages = async () => {\n sizes.forEach((size) => {\n formats.forEach((format) => {\n resolutions.forEach(async (resolution) => {\n // Import file\n const file = await importImage({\n imageLocaleDirectory: getImageLocaleDirectory(\n locale,\n defaultDirectory\n ),\n imageKey: key,\n imageSize: size,\n imageFormat: format,\n imageResolution: resolution,\n imageLocale: getImageLocale(locale)\n });\n\n if (file) {\n // Update state with new image\n setImages((prevImages) => [\n ...prevImages,\n { size, format, resolution, file }\n ]);\n }\n });\n });\n });\n };\n\n initImages();\n }, [\n key,\n locale,\n formats,\n sizes,\n resolutions,\n imageImportCallback,\n logError,\n defaultDirectory,\n setImages\n ]);\n\n // Note: Sorting the images before returning as the order is not guranteed due to async import operations.\n // Order is important for use cases such as tags within elements\n return images.sort(\n sortImagesBySizeAndFormat(\n DEFAULT_LOCALIZED_IMAGES_SIZES_ORDER,\n DEFAULT_LOCALIZED_IMAGES_FORMATS_ORDER\n )\n );\n};\n\nexport default useLocalizedImages;\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nconst Badge = ({\n badge,\n imgTagFallbackConfig = { size: 'md', format: 'png', resolution: '1x' },\n onClick\n}) => {\n const [sources, setSources] = useState({});\n const [fallbackImgSrc, setFallbackImgSrc] = useState(null);\n const { id, url, images, isLazy, alt } = badge;\n\n useEffect(() => {\n const getSourceData = () => {\n const imgWebp1x = images.find(\n (image) => image.resolution === '1x' && image.format === 'webp'\n )?.file;\n const imgWebp2x = images.find(\n (image) => image.resolution === '2x' && image.format === 'webp'\n )?.file;\n const imgPng1x = images.find(\n (image) => image.resolution === '1x' && image.format === 'png'\n )?.file;\n const imgPng2x = images.find(\n (image) => image.resolution === '2x' && image.format === 'png'\n )?.file;\n\n return {\n ...((imgWebp1x || imgWebp2x) && {\n webp: [\n ...(imgWebp1x ? [`${imgWebp1x} 1x`] : []),\n ...(imgWebp2x ? [`${imgWebp2x} 2x`] : [])\n ].join(', ')\n }),\n ...((imgPng1x || imgPng2x) && {\n png: [\n ...(imgPng1x ? [`${imgPng1x} 1x`] : []),\n ...(imgPng2x ? [`${imgPng2x} 2x`] : [])\n ].join(', ')\n })\n };\n };\n\n const sourceData = getSourceData();\n\n setSources(sourceData);\n }, [images]);\n\n useEffect(() => {\n if (!fallbackImgSrc) {\n const defaultImage = images.find(\n (image) =>\n image.resolution === imgTagFallbackConfig.resolution &&\n image.format === imgTagFallbackConfig.format &&\n image.size.id === imgTagFallbackConfig.size\n );\n\n if (defaultImage?.file) {\n setFallbackImgSrc(defaultImage.file);\n }\n }\n }, [images, imgTagFallbackConfig, fallbackImgSrc]);\n\n return (\n onClick(id)} data-cy={id}>\n \n {Object.entries(sources).map(([key, value]) => (\n \n ))}\n \n \n \n );\n};\n\nBadge.propTypes = {\n badge: PropTypes.shape({\n id: PropTypes.string.isRequired,\n url: PropTypes.string,\n images: PropTypes.arrayOf(\n PropTypes.shape({\n file: PropTypes.string,\n format: PropTypes.string,\n resolution: PropTypes.string,\n size: PropTypes.shape({\n id: PropTypes.string,\n value: PropTypes.string,\n minVw: PropTypes.string\n })\n })\n ),\n isLazy: PropTypes.bool,\n alt: PropTypes.string\n }).isRequired,\n imgTagFallbackConfig: PropTypes.shape({\n size: PropTypes.oneOf(['xs', 'sm', 'md', 'lg']),\n format: PropTypes.oneOf(['png', 'webp']),\n resolution: PropTypes.oneOf(['1x', '2x'])\n }),\n onClick: PropTypes.func.isRequired\n};\n\nBadge.defaultProps = {\n imgTagFallbackConfig: undefined\n};\n\nexport default Badge;\n","export const APP_STORE_BADGE_SIZES = [{ id: 'md', value: '', minVw: '0px' }];\n\nexport const APP_STORES = Object.freeze({\n google: 'google',\n apple: 'apple',\n unknown: 'unknown'\n});\n","import React, { useCallback } from 'react';\nimport { useLocalizedImages } from '@strava/react-hooks/src/use-localized-images';\nimport { useStravaBranch } from '@strava/container-context';\nimport Badge from './components/Badge';\nimport { APP_STORES, APP_STORE_BADGE_SIZES } from './constants';\nimport { mobileOsToAppStore } from './helpers';\n\nimport {\n useStravaErrorLogging,\n useStravaTranslations\n} from '@strava/container-context';\n\nconst AppStoreBadges = ({ onBadgeClick, className, userAgent }) => {\n const { t, getLanguage } = useStravaTranslations();\n const locale = getLanguage();\n\n const { logError } = useStravaErrorLogging();\n const { appLink } = useStravaBranch();\n\n // Note: Example path (locale provided) - './media/de-DE/app-store-de-DE@1x.png`\n const importBadgeImage = useCallback(\n async ({\n imageLocaleDirectory,\n imageKey,\n imageFormat,\n imageResolution,\n imageLocale\n }) => {\n // Create dynamic path to file\n const path = `${imageLocaleDirectory}/${imageKey}-${\n imageLocale ? `${imageLocale}` : ''\n }@${imageResolution}.${imageFormat}`;\n\n try {\n // Import file\n return (\n await import(\n /* webpackMode: \"eager\" */\n /* webpackExports: [\"default\", \"named\"] */\n `./media/${path}`\n )\n ).default;\n } catch (error) {\n logError(error);\n return null;\n }\n },\n [logError]\n );\n\n const appleBadgeImages = useLocalizedImages({\n key: 'app-store',\n locale,\n imageImportCallback: importBadgeImage,\n logError,\n sizes: APP_STORE_BADGE_SIZES\n });\n\n const googleBadgeImages = useLocalizedImages({\n key: 'play-store',\n locale,\n imageImportCallback: importBadgeImage,\n logError,\n sizes: APP_STORE_BADGE_SIZES\n });\n\n const appStore = mobileOsToAppStore(userAgent);\n\n return (\n
    \n {[APP_STORES.apple, APP_STORES.unknown].includes(appStore) && (\n
  • \n \n
  • \n )}\n {[APP_STORES.google, APP_STORES.unknown].includes(appStore) && (\n
  • \n \n
  • \n )}\n
\n );\n};\n\nexport default AppStoreBadges;\n","import { getMobileOS } from '@strava/utils';\nimport { MOBILE_OS } from '@strava/constants/src/appConstants';\nimport { APP_STORES } from './constants';\n\nexport const mobileOsToAppStore = (userAgent) => {\n switch (getMobileOS(userAgent)) {\n case MOBILE_OS.android:\n return APP_STORES.google;\n case MOBILE_OS.iPhone:\n case MOBILE_OS.iPad:\n return APP_STORES.apple;\n default:\n return APP_STORES.unknown;\n }\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"socialLink\":\"SocialLink--socialLink--HOKPx\"};","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport styles from './SocialLink.module.scss';\n\nconst SocialLink = ({ url, image, altText, target, rel }) => {\n return (\n \n {altText}\n \n );\n};\n\nSocialLink.propTypes = {\n url: PropTypes.string.isRequired,\n image: PropTypes.string.isRequired,\n altText: PropTypes.string.isRequired,\n target: PropTypes.string,\n rel: PropTypes.string\n};\n\nSocialLink.defaultProps = {\n target: '_blank',\n rel: 'noopener noreferrer'\n};\n\nexport default SocialLink;\n","// extracted by mini-css-extract-plugin\nexport default {\"footer\":\"Footer--footer--PjFQL\",\"cpraComplianceCta\":\"Footer--cpraComplianceCta--QQWeV\",\"container\":\"Footer--container--1gwsQ\",\"privacySocial\":\"Footer--privacySocial--FpGo3\",\"social\":\"Footer--social--54oRo\",\"links\":\"Footer--links--OtNG1\",\"highlight\":\"Footer--highlight--s9hb0\"};","import React, { useMemo } from 'react';\nimport StravaLogo from '@strava/ui/StravaLogo';\nimport { EXPERIMENT_COHORTS } from '@strava/constants/src/appConstants';\nimport CPRAComplianceCTA from '@strava/cpra-compliance-cta';\nimport clsx from '@strava/ui/clsx';\nimport AppStoreBadges from '@strava/shared-ui/src/AppStoreBadges';\nimport SocialLink from './components/SocialLink';\nimport { useFrontDoorsPageContainerContext } from '../../state/FrontDoorsPageContainerContext';\n\nimport socialTwitterImage from '../../media/social_tw.svg';\nimport socialYouTubeImage from '../../media/social_yt.svg';\nimport socialInstagramImage from '../../media/social_ig.svg';\nimport socialLinkedInImage from '../../media/social_li.svg';\nimport socialFacebookImage from '../../media/social_fb.svg';\n\nimport styles from './Footer.module.scss';\n\nconst Footer = () => {\n const { t, state, onFooterAppStoreBadgeClick } =\n useFrontDoorsPageContainerContext();\n const { cohort, dataSharingOptedOut, cpraI18nPrefix, menuConfig, userAgent } =\n state;\n const { showLoginOptionOnly } = menuConfig;\n\n const socialLinks = useMemo(\n () => [\n {\n id: 1,\n url: 'https://twitter.com/strava',\n image: socialTwitterImage,\n altText: t('footer.social.alt.twitter')\n },\n {\n id: 2,\n url: 'https://www.youtube.com/stravainc',\n image: socialYouTubeImage,\n altText: t('footer.social.alt.youtube')\n },\n {\n id: 3,\n url: 'https://www.instagram.com/strava/',\n image: socialInstagramImage,\n altText: t('footer.social.alt.instagram')\n },\n {\n id: 4,\n url: 'https://www.linkedin.com/company/strava-inc.',\n image: socialLinkedInImage,\n altText: t('footer.social.alt.linkedin')\n },\n {\n id: 5,\n url: 'https://www.facebook.com/Strava',\n image: socialFacebookImage,\n altText: t('footer.social.alt.facebook')\n }\n ],\n [t]\n );\n\n // TODO - cleanup after experiment https://strava.atlassian.net/browse/ACQN-301\n const signUpLinkCopy = () => {\n // join_us -> 'Join For Free'\n const key =\n cohort === EXPERIMENT_COHORTS.variantA\n ? 'header.join_now'\n : 'footer.links.join_us';\n return t(key);\n };\n\n return (\n \n );\n};\n\nexport default Footer;\n","export const UPDATE_WINDOW_SCROLL_TOP = 'UPDATE_WINDOW_SCROLL_TOP';\n\nexport default {\n UPDATE_WINDOW_SCROLL_TOP\n};\n","import { UPDATE_WINDOW_SCROLL_TOP } from './FrontDoorsPageContainer.actions';\n\nexport const reducer = (state, action) => {\n switch (action.type) {\n case UPDATE_WINDOW_SCROLL_TOP: {\n const { windowScrollTop } = action.payload;\n return {\n ...state,\n windowScrollTop\n };\n }\n default: {\n return { ...state };\n }\n }\n};\n\nexport default { reducer };\n","// extracted by mini-css-extract-plugin\nexport default {\"body\":\"front-doors-page-container-ui--body--0zUDy\"};","import React, {\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef\n} from 'react';\nimport PropTypes from 'prop-types';\nimport {\n useStravaAnalytics,\n useStravaErrorLogging,\n useStravaTranslations\n} from '@strava/container-context';\nimport { useWindowScrollTop } from '@strava/react-hooks/src/use-window-scroll-top';\nimport { EXPERIMENT_COHORTS } from '@strava/constants/src/appConstants';\nimport clsx from '@strava/ui/clsx';\nimport Header from './components/Header';\nimport Footer from './components/Footer';\nimport { FrontDoorsPageContainerContextProvider } from './state/FrontDoorsPageContainerContext';\nimport { reducer } from './state/FrontDoorsPageContainer.reducer';\nimport { UPDATE_WINDOW_SCROLL_TOP } from './state/FrontDoorsPageContainer.actions';\nimport styles from './FrontDoorsPageContainer.module.scss';\n\n/**\n *\n * @param {string} cohort - Defaults to control. Front-door pages can only have one experiment\n * running on them at a time because we depend on snowplow cookies for cohorting. This\n * prop is built-in to be reusable for any pages that need to show different treatments based\n * on the cohort in which an athlete is placed.\n *\n * @param {object} authorizationUrls - (optional) urls to be used for facebook, google, apple and email sign-up\n * options\n *\n * @param {boolean} showSmartBanner - Controls whether the smartbanner should be shown on the mobile-web version of the page.\n * Default is false (hide).\n *\n * @param {string} userAgent - Request user agent. This is required for SSR (nextJS apps).\n *\n * @param {string} cpraI18nPrefix - (optional) path to 'cpra_compliance_cta' translations, if different from just `legal` (as is the\n * case for when the FrontDoorsPageContainer is used in active instead of a nextjs app)\n *\n * @param {boolean} menuConfig.showLoginOptionOnly - (optional) true if we want to hide the `register` options, such as on the `/register` page.\n * Will also adjust styling for the login option so it gets primary/highlighted styling. Defaults to false.\n *\n * @param {function} onScreenEnter - (optional) Callback function, called on screen enter\n *\n * @param {function} onDesktopHeaderLogoClick - (optional) Callback function, called when athlete clicks on Strava logo on desktop header\n *\n * @param {function} onDesktopHeaderLoginBtnClick - (optional) Callback function, called when athlete clicks on 'Login' on desktop header\n *\n * @param {function} onDesktopHeaderSignupBtnClick - (optional) Callback function, called when athlete clicks on 'Join for Free' on desktop header\n *\n * @param {function} onMobileHeaderLogoClick - (optional) Callback function, called when athlete clicks on Strava logo on mobile header\n *\n * @param {function} onMobileHeaderSignupBtnClick - (optional) Callback function, called when athlete clicks on 'Get the App' on mobile header\n *\n * @param {function} onMobileHeaderMenuOpen - (optional) Callback function, called when athlete opens the menu on mobile header\n *\n * @param {function} onMobileHeaderMenuClose - (optional) Callback function, called when athlete closes the menu on mobile header\n *\n * @param {function} onMobileHeaderMenuLoginBtnClick - (optional) Callback function, called when athlete clicks on 'Login' in the menu on mobile header\n *\n * @param {function} onMobileHeaderMenuSignupBtnClick - (optional) Callback function, called when athlete clicks on 'Get the App' in the menu on mobile header\n *\n * @param {function} onFooterAppStoreBadgeClick - (optional) Callback function, called when athlete clicks on App store badges on footer\n *\n */\nconst FrontDoorsPageContainer = ({\n children,\n locale,\n page,\n category,\n showSmartBanner,\n dataSharingOptedOut,\n cohort,\n cpraI18nPrefix,\n userAgent,\n className,\n header,\n footer,\n menuConfig,\n onScreenEnter,\n onDesktopHeaderLogoClick,\n onDesktopHeaderLoginBtnClick,\n onDesktopHeaderSignupBtnClick,\n onMobileHeaderLogoClick,\n onMobileHeaderSignupBtnClick,\n onMobileHeaderMenuOpen,\n onMobileHeaderMenuClose,\n onMobileHeaderMenuLoginBtnClick,\n onMobileHeaderMenuSignupBtnClick,\n onFooterAppStoreBadgeClick\n}) => {\n const { track: _track } = useStravaAnalytics();\n const { t: _t } = useStravaTranslations();\n const noop = () => {};\n\n const { showHeader } = header;\n const { showFooter } = footer;\n\n const {\n logError,\n setTags = noop,\n setContext = noop\n } = useStravaErrorLogging();\n\n const [windowScrollTop] = useWindowScrollTop();\n\n // override translations helper function\n const t = useMemo(\n () => (key, params) =>\n _t(`front_doors_page_container_ui.${key}`, { ...params }),\n [_t]\n );\n\n const headerRef = useRef();\n\n // override analytics helper function\n const track = useCallback(\n (fields = {}) => {\n _track({\n category,\n page,\n ...fields,\n properties: {\n ...fields.properties\n }\n });\n },\n [_track, category, page]\n );\n\n const [state, dispatch] = useReducer(reducer, {\n category,\n cohort,\n headerRef,\n locale,\n page,\n userAgent,\n windowScrollTop,\n dataSharingOptedOut,\n cpraI18nPrefix,\n header,\n footer,\n menuConfig,\n showSmartBanner\n });\n\n const providerState = useMemo(\n () => ({\n state,\n dispatch,\n track,\n t,\n logError,\n onScreenEnter,\n onDesktopHeaderLogoClick,\n onDesktopHeaderLoginBtnClick,\n onDesktopHeaderSignupBtnClick,\n onMobileHeaderLogoClick,\n onMobileHeaderSignupBtnClick,\n onMobileHeaderMenuOpen,\n onMobileHeaderMenuClose,\n onMobileHeaderMenuLoginBtnClick,\n onMobileHeaderMenuSignupBtnClick,\n onFooterAppStoreBadgeClick\n }),\n [\n logError,\n state,\n t,\n track,\n onScreenEnter,\n onDesktopHeaderLogoClick,\n onDesktopHeaderLoginBtnClick,\n onDesktopHeaderSignupBtnClick,\n onMobileHeaderLogoClick,\n onMobileHeaderSignupBtnClick,\n onMobileHeaderMenuOpen,\n onMobileHeaderMenuClose,\n onMobileHeaderMenuLoginBtnClick,\n onMobileHeaderMenuSignupBtnClick,\n onFooterAppStoreBadgeClick\n ]\n );\n\n // screen enter\n // - track analytics\n // - set container-level tags and context for sentry error tracking and performance monitoring\n useEffect(() => {\n setTags({\n 'frontDoorsPageContainer.locale': locale,\n 'frontDoorsPageContainer.cohort': cohort,\n 'frontDoorsPageContainer.page': page\n });\n setContext('frontDoorsPageContainer', {\n showSmartBanner,\n category\n });\n }, [category, cohort, locale, showSmartBanner, page, setContext, setTags]);\n\n useEffect(() => {\n onScreenEnter();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Note: Empty [] required to ensure that `onScreenEnter` only runs once\n\n useEffect(() => {\n dispatch({ type: UPDATE_WINDOW_SCROLL_TOP, payload: { windowScrollTop } });\n }, [windowScrollTop]);\n\n return (\n \n
\n {showHeader &&
}\n {children}\n {showFooter &&
}\n
\n
\n );\n};\n\nFrontDoorsPageContainer.defaultProps = {\n locale: null,\n showSmartBanner: false,\n cohort: EXPERIMENT_COHORTS.control,\n userAgent:\n typeof window === 'undefined' ? null : window?.navigator?.userAgent,\n className: null,\n cpraI18nPrefix: 'legal',\n menuConfig: {\n showLoginOptionOnly: false\n },\n header: {\n showHeader: true\n },\n footer: {\n showFooter: true\n },\n onScreenEnter: () => {},\n onDesktopHeaderLogoClick: () => {},\n onDesktopHeaderLoginBtnClick: () => {},\n onDesktopHeaderSignupBtnClick: () => {},\n onMobileHeaderLogoClick: () => {},\n onMobileHeaderSignupBtnClick: () => {},\n onMobileHeaderMenuOpen: () => {},\n onMobileHeaderMenuClose: () => {},\n onMobileHeaderMenuLoginBtnClick: () => {},\n onMobileHeaderMenuSignupBtnClick: () => {},\n onFooterAppStoreBadgeClick: () => {}\n};\n\nFrontDoorsPageContainer.propTypes = {\n children: PropTypes.node.isRequired,\n locale: PropTypes.string,\n page: PropTypes.string.isRequired,\n category: PropTypes.string.isRequired,\n showSmartBanner: PropTypes.bool,\n dataSharingOptedOut: PropTypes.bool.isRequired,\n cpraI18nPrefix: PropTypes.string,\n cohort: PropTypes.oneOf(Object.values(EXPERIMENT_COHORTS)),\n userAgent: PropTypes.string,\n className: PropTypes.string,\n menuConfig: PropTypes.shape({\n showLoginOptionOnly: PropTypes.bool\n }),\n header: PropTypes.shape({\n showHeader: PropTypes.bool\n }),\n footer: PropTypes.shape({\n showFooter: PropTypes.bool\n }),\n onScreenEnter: PropTypes.func,\n onDesktopHeaderLogoClick: PropTypes.func,\n onDesktopHeaderLoginBtnClick: PropTypes.func,\n onDesktopHeaderSignupBtnClick: PropTypes.func,\n onMobileHeaderLogoClick: PropTypes.func,\n onMobileHeaderSignupBtnClick: PropTypes.func,\n onMobileHeaderMenuOpen: PropTypes.func,\n onMobileHeaderMenuClose: PropTypes.func,\n onMobileHeaderMenuLoginBtnClick: PropTypes.func,\n onMobileHeaderMenuSignupBtnClick: PropTypes.func,\n onFooterAppStoreBadgeClick: PropTypes.func\n};\n\nexport default FrontDoorsPageContainer;\n","/**\n * This helper function is intended for use with `FrontDoorsPageContainer`\n * It accepts an instance of `track`, an `appLink` and the optional parameter `additionalTrackProperties`\n * It returns default event handlers, each containing a `track` event with the relevant payload\n * These default event handlers can be overriden as required for custom use cases\n *\n * Example Usage:\n *\n * import { getDefaultEventHandlers } from '@strava/front-doors-page-container-ui';\n *\n * const additionalTrackProperties = { myAdditionalTrackProperty: 'my-additional-track-property-value' };\n * const myCustomOnScreenEnterCallback = () => { ... };\n *\n * const { appLink } = useStravaBranch();\n *\n * \n * {children}\n * \n *\n * @param {Function} track Track function (Required)\n * @param {String} appLink Branch link\n * @param {object} additionalTrackProperties object of properties to be added to `properties` within `track` events (Optional)\n * @returns {object} Object containing default event handlers\n *\n */\n\nconst getDefaultEventHandlers = (track, appLink, additionalTrackProperties) => {\n // Common track event used in `onDesktopHeaderLogoClick` and `onMobileHeaderLogoClick`\n const onHeaderLogoClickTrackEvent = () => {\n track({\n element: 'strava_logo',\n action: 'click',\n ...(additionalTrackProperties && {\n properties: additionalTrackProperties\n })\n });\n };\n\n return {\n // Called on screen enter\n onScreenEnter: () => {\n track({\n action: 'screen_enter',\n ...(additionalTrackProperties && {\n properties: additionalTrackProperties\n })\n });\n },\n\n // Called when athlete clicks on Strava logo on desktop header\n onDesktopHeaderLogoClick: () => {\n onHeaderLogoClickTrackEvent();\n },\n\n // Called when athlete clicks on 'Login' button on desktop header\n onDesktopHeaderLoginBtnClick: () => {\n track({\n element: 'login_header',\n action: 'click',\n ...(additionalTrackProperties && {\n properties: additionalTrackProperties\n })\n });\n },\n\n // Called when athlete clicks on the 'Join for Free' button on desktop header\n onDesktopHeaderSignupBtnClick: () => {\n track({\n element: 'start_signup',\n action: 'click',\n properties: {\n signup_copy: 'join_header',\n ...additionalTrackProperties\n }\n });\n },\n\n // Called when athlete clicks on Strava logo on mobile header\n onMobileHeaderLogoClick: () => {\n onHeaderLogoClickTrackEvent();\n },\n\n // Called when athlete clicks on the 'Get the App' button on mobile header\n onMobileHeaderSignupBtnClick: () => {\n track({\n element: 'get_app',\n action: 'click',\n properties: {\n cta_copy: 'get_the_app_header',\n url: appLink,\n ...additionalTrackProperties\n }\n });\n },\n\n // Called when athlete opens the menu on mobile header\n onMobileHeaderMenuOpen: () => {\n track({\n element: 'open_menu',\n action: 'click',\n ...(additionalTrackProperties && {\n properties: additionalTrackProperties\n })\n });\n },\n\n // Called when athlete closes the menu on mobile header\n onMobileHeaderMenuClose: () => {\n track({\n element: 'close_menu',\n action: 'click',\n ...(additionalTrackProperties && {\n properties: additionalTrackProperties\n })\n });\n },\n\n // Called when athlete clicks on the 'Login' button in mobile menu\n onMobileHeaderMenuLoginBtnClick: () => {\n track({\n element: 'drawer_login_btn',\n action: 'click',\n ...(additionalTrackProperties && {\n properties: additionalTrackProperties\n })\n });\n },\n\n // Called when athlete clicks on the 'Get the App' button in mobile menu\n onMobileHeaderMenuSignupBtnClick: () => {\n track({\n element: 'get_app',\n action: 'click',\n properties: {\n cta_copy: 'get_the_app_drawer',\n url: appLink,\n ...additionalTrackProperties\n }\n });\n },\n\n // Called when athlete clicks on app store badges in footer\n onFooterAppStoreBadgeClick: (id) => {\n track({\n element: 'get_app',\n action: 'click',\n properties: {\n url: appLink,\n cta_copy: `${id}_app_store`,\n ...additionalTrackProperties\n }\n });\n }\n };\n};\n\nexport default getDefaultEventHandlers;\n"],"names":["useWindowScrollTop","windowScrollTop","setWindowScrollTop","useState","onScroll","useCallback","window","scrollY","useEffect","addEventListener","removeEventListener","Object","freeze","man","woman","preferNotSay","nonBinary","LOCALE","deDE","enUS","enGB","esES","es419","frFR","itIT","jaJP","koKR","nlNL","ptBR","ptPT","ruRU","zhCN","zhTW","EXPERIMENT_COHORTS","de","es","fr","it","ja","ko","nl","pt","ru","zh","control","variantA","variantB","android","iPhone","iPad","chrome","firefox","safari","optedOut","toVal","mix","k","y","str","Array","isArray","length","_args","_key","arguments","tmp","x","i","FrontDoorsPageContainerContext","createContext","displayName","useFrontDoorsPageContainerContext","context","useContext","Error","FrontDoorsPageContainerContextProvider","props","React","Provider","_ref","className","alt","width","height","fill","color","style","role","viewBox","clsx","xmlns","display","id","fillRule","clipRule","d","ref","children","variant","styles","forwardRef","href","otherProps","IconButton","onClick","ariaLabel","options","Button","_extends","type","defaultProps","propTypes","PropTypes","DesktopNav","t","state","onDesktopHeaderLoginBtnClick","onDesktopHeaderSignupBtnClick","onDesktopHeaderLogoClick","cohort","menuConfig","showLoginOptionOnly","handleLogoClick","location","StravaLogo","handleLoginBtnClick","handleSignupBtnClick","signupBtnCopy","key","SvgNavigationMenuNormalLarge","size","title","titleId","undefined","SvgActionsCancelNormalMedium","assign","target","source","prototype","hasOwnProperty","call","apply","this","open","_props$onClose","onClose","_props$enableOverlay","enableOverlay","_props$overlayColor","overlayColor","_props$overlayOpacity","overlayOpacity","_props$zIndex","zIndex","_props$duration","duration","direction","_props$size","customIdSuffix","_props$lockBackground","lockBackgroundScroll","bodyRef","useRef","current","document","querySelector","overflow","idSuffix","useMemo","Math","random","toString","substring","overlayStyles","backgroundColor","opacity","drawerStyles","transitionDuration","dir","top","left","transform","right","bottom","getDirectionStyle","onChange","checked","htmlFor","observerMap","Map","RootIds","WeakMap","rootId","unsupportedValue","optionsToId","keys","sort","filter","map","root","has","set","get","observe","element","callback","fallbackInView","IntersectionObserver","bounds","getBoundingClientRect","isIntersecting","intersectionRatio","threshold","time","boundingClientRect","intersectionRect","rootBounds","observer","elements","instance","thresholds","entries","forEach","entry","inView","some","trackVisibility","isVisible","createObserver","callbacks","push","splice","indexOf","delete","unobserve","disconnect","SvgActionsCancelNormalXsmall","MOBILE_OS","HIDE_BANNER_STORAGE_KEY","SmartBanner","page","category","mobileOS","showCloseBtn","hasApp","appLink","isProcessing","useStravaBranch","track","_track","useStravaAnalytics","_t","useStravaTranslations","inViewRef","_temp","delay","rootMargin","triggerOnce","skip","initialInView","setRef","React2","setState","entryTarget","_a","previousEntryTarget","result","useInView","hideBanner","setHideBanner","fields","properties","params","hide","isLocalStorageAvailable","localStorage","getItem","action","handleCloseBanner","setItem","dispatchEvent","Event","ActionsCancelNormalXsmall","src","toLowerCase","androidIcon","iOSIcon","includes","LinkButton","disabled","url","CallToAction","label","dataCy","MobileNav","isMenuOpen","toggleMenu","mobileAppDownloadBannerRef","onMobileHeaderLogoClick","onMobileHeaderMenuOpen","onMobileHeaderMenuClose","onMobileHeaderSignupBtnClick","onMobileHeaderMenuSignupBtnClick","onMobileHeaderMenuLoginBtnClick","userAgent","showSmartBanner","branch","forceSmartBanner","setForceSmartbanner","body","queryParams","split","searchParams","URLSearchParams","getMobileOS","handleMenuToggle","ActionsCancelNormalLarge","NavigationMenuNormalLarge","Drawer","_","isScrolling","DEFAULT_LOCALIZED_IMAGES_SIZES","value","minVw","DEFAULT_LOCALIZED_IMAGES_FORMATS","DEFAULT_LOCALIZED_IMAGES_RESOLUTIONS","DEFAULT_LOCALIZED_IMAGES_DIRECTORY","DEFAULT_LOCALIZED_IMAGES_SIZES_ORDER","DEFAULT_LOCALIZED_IMAGES_FORMATS_ORDER","sortImagesBySizeAndFormat","sizeOrder","formatOrder","image1","image2","image1Size","format","image1Format","image2Size","image2Format","getImageLocaleDirectory","locale","defaultDirectory","values","getImageLocale","useLocalizedImages","sizes","formats","resolutions","imageImportCallback","logError","images","setImages","initialState","mountedRef","args","useSafeState","async","file","imageData","error","importImage","imageLocaleDirectory","imageKey","imageSize","imageFormat","imageResolution","resolution","imageLocale","prevImages","initImages","Badge","badge","imgTagFallbackConfig","sources","setSources","fallbackImgSrc","setFallbackImgSrc","isLazy","sourceData","getSourceData","imgWebp1x","find","image","imgWebp2x","imgPng1x","imgPng2x","webp","join","png","defaultImage","_ref2","srcSet","loading","isRequired","APP_STORE_BADGE_SIZES","APP_STORES","google","apple","unknown","onBadgeClick","getLanguage","useStravaErrorLogging","importBadgeImage","path","default","appleBadgeImages","googleBadgeImages","appStore","mobileOsToAppStore","SocialLink","altText","rel","Footer","onFooterAppStoreBadgeClick","dataSharingOptedOut","cpraI18nPrefix","socialLinks","socialTwitterImage","socialYouTubeImage","socialInstagramImage","socialLinkedInImage","socialFacebookImage","socialLink","CPRAComplianceCTA","i18nPrefix","signUpLinkCopy","AppStoreBadges","UPDATE_WINDOW_SCROLL_TOP","reducer","payload","FrontDoorsPageContainer","header","footer","onScreenEnter","noop","showHeader","showFooter","setTags","setContext","headerRef","dispatch","useReducer","providerState","Header","navigator","getDefaultEventHandlers","additionalTrackProperties","onHeaderLogoClickTrackEvent","signup_copy","cta_copy"],"sourceRoot":""}